[FFmpeg-devel] [PATCH 01/48] avcodec/packet: deprecate av_init_packet()

James Almer jamrial at gmail.com
Sun Mar 21 22:01:27 EET 2021


On 3/21/2021 3:37 PM, James Almer wrote:
> On 3/21/2021 3:15 PM, Marton Balint wrote:
>>
>>
>> On Sun, 21 Mar 2021, James Almer wrote:
>>
>>> On 3/21/2021 11:16 AM, Anton Khirnov wrote:
>>>> Quoting James Almer (2021-03-21 14:54:22)
>>>>> On 3/21/2021 9:28 AM, Anton Khirnov wrote:
>>>>>> Quoting James Almer (2021-03-05 17:32:52)
>>>>>>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>>>>>>> index 7da2f3d98e..783cc1b591 100644
>>>>>>> --- a/libavformat/avformat.h
>>>>>>> +++ b/libavformat/avformat.h
>>>>>>> @@ -954,7 +954,11 @@ typedef struct AVStream {
>>>>>>>         * decoding: set by libavformat, must not be modified by the 
>>> caller.
>>>>>>>         * encoding: unused
>>>>>>>         */
>>>>>>> +#if FF_API_INIT_PACKET
>>>>>>>        AVPacket attached_pic;
>>>>>>> +#else
>>>>>>> +    AVPacket *attached_pic;
>>>>>>> +#endif
>>>>>>
>>>>>> Sorry I'm late to the party, but as we are changing the type of an
>>>>>> existing field, we need to explicitly spell out a way for the 
>>>>>> callers to
>>>>>> make their code forward compatible. E.g. similarly to what I made for
>>>>>> thread_safe_callbacks deprecation.
>>>>>
>>>>> What do you suggest? The field is not printing deprecation 
>>>>> warnings, so
>>>>> would a doxy comment be enough for people to notice it?
>>>>> Have we done a similar change before? I know at least for symbols like
>>>>> public functions we never change their signature in an incompatible 
>>>>> way,
>>>>> and instead replace them altogether.
>>>>>
>>>>> Maybe we could add the deprecated attribute to attached_pic, 
>>>>> introduce a
>>>>> temporary getter function that returns a pointer to the packet, 
>>>>> mention
>>>>> in the doxy that the field is not going away, is just changing types,
>>>>> and they have the option of using the getter for a fire-and-forget
>>>>> migration process, then maybe deprecate and eventually remove the 
>>>>> getter
>>>>> after the switch is done.
>>>>
>>>> This seems like a lot of hoops to jump through. Wouldn't it then be
>>>> better to just add a new field with a new name?
>>>
>>> A name change just because it's now a pointer seems overkill.
>>
>> I don't think it is. A name change guarantees that existing code won't 
>> compile to something that will surely crash. IMHO the clean solution 
>> is to keep the old field with deprecation, and add a new field. Same 
>> what I did with AVFormat->filename / AVFormat->url.
> 
> Compilation will fail if your code doesn't treat the field as a pointer 
> after the switch, printing something like
> 
> error: 'st->attached_pic' is a pointer; did you mean to use '->'?
>    123 |     st->attached_pic.flags |= AV_PKT_FLAG_KEY;
>        |                     ^
> 
> So it's not like it will compile and then crash at runtime by accessing 
> the wrong thing.

After looking a bit more, it will fail if you try to access fields like 
i mentioned above, but if you pass it as argument to some function it 
will only warn about mismatching types.

So i guess yeah, a new field with a new name would be the cleanest 
solution. So as i said, field name suggestions welcome.

> 
> But if you still feel more inclined to replace the field, can you 
> suggest a name for the new one?



More information about the ffmpeg-devel mailing list