From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id B723342354 for ; Tue, 18 Jan 2022 06:17:48 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D421968B015; Tue, 18 Jan 2022 08:17:45 +0200 (EET) Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E4B6F68AF88 for ; Tue, 18 Jan 2022 08:17:38 +0200 (EET) Received: by mail-ot1-f49.google.com with SMTP id c3-20020a9d6c83000000b00590b9c8819aso22915471otr.6 for ; Mon, 17 Jan 2022 22:17:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:content-transfer-encoding:mime-version:subject:date:references :to:in-reply-to:message-id; bh=70rou/AZXGBq9KTfhjdjZ0KglX/hKFliE39cueq8bR4=; b=PuJLmYFYVBGBZrqaIKcrbOkuwH+Ooxgv0JiCCPh8Vz7lGrYAlrEjaou9tfE6pyR9NH /hoWMfRYwVjJvjEjtsw7wLSPqj3fWxQ83swe9q/y+AFElnM2O2JH0obZG3FjcENkQUpk oks/rWAR91jxpJs8LbRunc9CLtgiJyQDuoVqPZ/XJUV8FVf88D042WHLdUDoXuLrbPc2 tKuxwu1IXA9WAqILeEYxlkVl69k9ou9i9DBlspTq3L6B1enyJbXHmTYgQEBNrg/gTTpa wak7k55zW/kHbJreMxhNrX+4Of8nhkcxyWGSC6UKjMGeJ5Gyg3xMH/eMg94pA5OMZurE p5Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:content-transfer-encoding:mime-version :subject:date:references:to:in-reply-to:message-id; bh=70rou/AZXGBq9KTfhjdjZ0KglX/hKFliE39cueq8bR4=; b=f1EXYdcpHArViL0DZM4Kzj/xysfBeTmYtRvyku1Qix5DyrfK1kh3NI5uYMosl08mOD 2UFeDD6zotKOsoB8Ro9+Q8Hp+J6l5SpsQdshQYuY7ZsvlB+U5Cp6/w9BASLnxF4E9ES8 /5j4JShSdFNk0t7CRdLlZ8zxUr9eTRAaM36tICwgK97ErR97/OV2O9KWReeUWNHvSrzs ebv5Vi1pKggpl6xxKtdsRm8QYMQa7b8uqWqIEz0w08D6WtrjT7mgknsU8r077qw8n0xc gLSaa+vSN72MkPomaaoLe7oiWdJAx04zthJP0CgVYDoj9dtnbtaSioufZiMy47AA/D7F dF6Q== X-Gm-Message-State: AOAM5317Q1IBRe2bPLrv6O/HyeSW74AHcPC6hFZeQAKezobm4DIO6nYy L7h0lOpSVhHB4HBYSLFtCrPa5l+QjnD5/g== X-Google-Smtp-Source: ABdhPJxbbJaRs4590tgmuCRL5p/2gjdMdQgPA3yhw5GpLP1glCLMTG/wu23WqG3DFRr4lva+Et4zUQ== X-Received: by 2002:a9d:644d:: with SMTP id m13mr18632236otl.131.1642486656858; Mon, 17 Jan 2022 22:17:36 -0800 (PST) Received: from smtpclient.apple ([2600:1700:4830:3f7f:b98e:28:5731:ae58]) by smtp.gmail.com with ESMTPSA id 184sm7884025oih.58.2022.01.17.22.17.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jan 2022 22:17:36 -0800 (PST) From: Cameron Gutman Mime-Version: 1.0 (Mac OS X Mail 15.0 \(3693.40.0.1.81\)) Date: Tue, 18 Jan 2022 00:17:35 -0600 References: <20220103003318.442892-1-aicommander@gmail.com> <164172029148.2375.17275383230465998544@lain.red.khirnov.net> <164241044699.23111.6270013532570362968@lain.red.khirnov.net> To: FFmpeg development discussions and patches In-Reply-To: <164241044699.23111.6270013532570362968@lain.red.khirnov.net> Message-Id: <71D45CA6-5DB9-4A72-BA31-2255573BC525@gmail.com> X-Mailer: Apple Mail (2.3693.40.0.1.81) Subject: Re: [FFmpeg-devel] [PATCH] lavu/videotoolbox: add support for memory mapping frames X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: > On Jan 17, 2022, at 3:07 AM, Anton Khirnov wrote: > > Quoting Cameron Gutman (2022-01-10 09:17:37) >> >>> On Jan 9, 2022, at 3:24 AM, Anton Khirnov wrote: >>> >>> Quoting Cameron Gutman (2022-01-03 01:33:19) >>>> Signed-off-by: Cameron Gutman >>>> --- >>>> libavutil/hwcontext_videotoolbox.c | 25 +++++++++++++++++++++++++ >>>> 1 file changed, 25 insertions(+) >>>> >>>> diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c >>>> index 0a8dbe9f33..026127d412 100644 >>>> --- a/libavutil/hwcontext_videotoolbox.c >>>> +++ b/libavutil/hwcontext_videotoolbox.c >>>> @@ -711,6 +711,30 @@ fail: >>>> return err; >>>> } >>>> >>>> +static int vt_map_from(AVHWFramesContext *hwfc, AVFrame *dst, >>>> + const AVFrame *src, int flags) >>>> +{ >>>> + int err; >>>> + >>>> + if (dst->format == AV_PIX_FMT_NONE) >>>> + dst->format = hwfc->sw_format; >>>> + else if (dst->format != hwfc->sw_format) >>>> + return AVERROR(ENOSYS); >>>> + >>>> + err = vt_map_frame(hwfc, dst, src, flags); >>>> + if (err) >>>> + return err; >>>> + >>>> + dst->width = src->width; >>>> + dst->height = src->height; >>>> + >>>> + err = av_frame_copy_props(dst, src); >>>> + if (err) >>>> + return err; >>> >>> Don't you need to unmap the frame in this error path? >>> >> >> Maybe? It's complicated... >> >> The mapping is still written to dst and it will be unmapped when >> av_frame_unref() is called on dst. However, if the caller wants to try again >> with same dst frame for some reason, then it looks like it will leak the first >> "failed" mapping. AFAICT, another call to ff_hwframe_map_create() will >> overwrite dst->buf[0] without unrefing it first, but that makes sense given >> that the docs say "dst should be blank" (arguably that "should" ought to be a >> "must" in this case). However, this isn't the full story. >> >> None of the existing map_from() implementations (VAAPI, DRM, DXVA2) actually >> unmap when av_frame_copy_props() fails. The only ones that don't have this bug >> are OpenCL and Vulkan, and that's only because they forgot to call >> av_frame_copy_props() entirely! >> >> Ideally, you'd have nothing modified in dst when av_hwframe_map() fails, >> but that isn't the case in practice. Much of the mapping process involves >> irreversible changes to the dst frame, including overwriting dst->format, >> dst->width, dst->height, dst->data, dst->linesize, even partially copied >> frame properties prior to av_frame_copy_props() failing. >> >> Given these limitations, it seems like the only sane thing to do with a dst >> frame after failure of av_hwframe_map() (other than ENOSYS) is to unref/free. >> The frame is basically in an undefined state after such a failure. If that's >> the case, then we don't actually have a leak here since av_frame_unref() >> will do the right thing and free the old mapping. > > Right, but who will call this av_frame_unref(). The doxy for > av_hwframe_map() does not specify what precisely happens on failure, but > I would expect it to clean dst. > Whoever allocated the frame will unref/free it when they are done with it. For example, vf_hwmap.c does this: dst = av_frame_alloc(); if (!dst) { av_frame_free(&src); return NULL; } err = av_hwframe_map(dst, src, ctx->mode); if (err) { av_log(avctx, AV_LOG_ERROR, "Failed to map frame to " "software: %d.\n", err); av_frame_free(&src); av_frame_free(&dst); return NULL; } So the mapping will be freed in the call to av_frame_free(&dst) in this case. Where we might run into issues with leaks is if someone does: /* Try NV12 first */ dst->format = AV_PIX_FMT_NV12; err = av_hwframe_map(dst, src, AV_HWFRAME_MAP_READ); if (err) { /* That didn't work. Now try YUV420P */ dst->format = AV_PIX_FMT_YUV420P; err = av_hwframe_map(dst, src, AV_HWFRAME_MAP_READ); } Assuming that first av_hwframe_map() fails in av_frame_copy_props(), the second call (if successful) will cause the first mapping to be leaked. For this case, it makes sense to clear dst on failure. The docs say "dst should be blank", so you could also argue that the second call to av_hwframe_map() is incorrect, since it is not guaranteed that dst is blank at that point (and today it is guaranteed _not_ to be blank for any of the map_from() implementations in the case that av_frame_copy_props() fails). If we do want dst to be cleared upon failure, a good place to do it might be in av_hwframe_map() itself (since none of the existing map_from() implementations do it themselves). That would formalize the behavior of cleaning dst on failure rather than leaving the various hwcontext implementations to handle it how they choose. > -- > Anton Khirnov > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".