[FFmpeg-devel] [PATCH 8/8] avcodec/avcodec: Document current behaviour for extradata

James Almer jamrial at gmail.com
Sat Apr 24 16:14:36 EEST 2021


On 4/24/2021 9:53 AM, Andreas Rheinhardt wrote:
> James Almer:
>> On 4/24/2021 9:29 AM, Andreas Rheinhardt wrote:
>>> Despite the documentation saying that it is not freed by libavcodec
>>> for a decoder, avcodec_free_context() does so and has been doing so
>>> since this function has been added more than seven years ago.
>>>
>>> Honouring the current documentation in avcodec_free_context() would
>>> add memleaks to all users of it that don't free their extradata
>>> manually; given how long this behaviour has been around we can safely
>>> assume that these are many (i.e. the fftools are among them, as is
>>> libavformat as well as parts of libavcodec itself).
>>>
>>> Therefore adapt the documentation to match actual behaviour.
>>> This fixes ticket #5027.
>>>
>>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
>>> ---
>>>    libavcodec/avcodec.h | 2 ++
>>>    1 file changed, 2 insertions(+)
>>>
>>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>>> index b9b487be41..4596d12647 100644
>>> --- a/libavcodec/avcodec.h
>>> +++ b/libavcodec/avcodec.h
>>> @@ -633,6 +633,8 @@ typedef struct AVCodecContext {
>>>         * Must be allocated with the av_malloc() family of functions.
>>>         * - encoding: Set/allocated/freed by libavcodec.
>>>         * - decoding: Set/allocated/freed by user.
>>> +     * Additionally, avcodec_free_context() frees it regardless of
>>> whether
>>> +     * the context is used for encoding or not.
>>
>> I'd prefer to instead change the decoding line to
>>
>> * - decoding: Set/allocated by user, freed by libavcodec.
> 
> This would be wrong as avcodec_close() does not free it for decoders.
> Changing the behaviour would be a breaking change.

avcodec_free_context() needs to be called to free any AVCodecContext. 
doing avcodec_close(avctx) + av_free(avctx) (Or worse, reusing the avctx 
after avcodec_close()) is not only heavily discouraged by the doxy, but 
already leads to leaks if you don't free a bunch of things, like 
extradata, intra_matrix and inter_matrix.

Maybe also (or instead) change the

* Must be allocated with the av_malloc() family of functions.

line with

* Must be allocated with the av_malloc() family of functions, and will 
be freed in avcodec_free_context().

Which puts the extradata doxy in line with the other two fields, both of 
which are handled in a similar way.
Leaving the line about freed by user is IMO pointless, considering you 
even mentioned in the patch message how nobody ever bothers to free it.

Honestly? avcodec_close() should have been deprecated alongside 
avcodec_get_context_defaults3() and avcodec_copy_context(), so maybe we 
should do it now. Having a function with its doxy saying "Do not use 
this function" is pretty silly.


More information about the ffmpeg-devel mailing list