[FFmpeg-devel] [PATCH 01/48] avcodec/packet: deprecate av_init_packet()
James Almer
jamrial at gmail.com
Sun Mar 21 20:37:15 EET 2021
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.
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