[FFmpeg-devel] [PATCH] avutil/frame: ensure the frame is writable in av_frame_copy()

Anton Khirnov anton at khirnov.net
Sun Mar 14 12:47:00 EET 2021


Quoting James Almer (2021-03-11 15:18:38)
> On 3/11/2021 10:56 AM, Andreas Rheinhardt wrote:
> > James Almer:
> >> Signed-off-by: James Almer <jamrial at gmail.com>
> >> ---
> >>   libavutil/frame.c | 2 ++
> >>   1 file changed, 2 insertions(+)
> >>
> >> diff --git a/libavutil/frame.c b/libavutil/frame.c
> >> index eab51b6a32..ec79d053e1 100644
> >> --- a/libavutil/frame.c
> >> +++ b/libavutil/frame.c
> >> @@ -800,6 +800,8 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src)
> >>   {
> >>       if (dst->format != src->format || dst->format < 0)
> >>           return AVERROR(EINVAL);
> >> +    if (!av_frame_is_writable(dst))
> >> +        return AVERROR(EINVAL);
> >>   
> >>       if (dst->width > 0 && dst->height > 0)
> >>           return frame_copy_video(dst, src);
> >>
> > This will break scenarios where one owns all the references to a frame's
> > data without the frame being writable?
> 
> It would, but that's by design. We define a frame as writable when its 
> buffers are both reference counted and there's at most a single 
> reference to them. Who owns any of the references does not play a part 
> in that.

I disagree that this is a hard definition. It's merely a convention. If
all the references are under control of a single bit of code, it can
have its own convention. E.g. frame threading in libavcodec does exactly
that.

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list