[FFmpeg-devel] [PATCH 1/3] lavformat: Prepare to make avio_enum_protocols const correct

Steven Liu lq at chinaffmpeg.org
Fri Nov 22 12:14:43 EET 2019



> 在 2019年11月22日,18:02,Andreas Rheinhardt <andreas.rheinhardt at gmail.com> 写道:
> 
> Andreas Rheinhardt:
>> Andreas Rheinhardt:
>>> Using avio_enum_protocols works as follows: One initializes a pointer to
>>> void and gives avio_enum_protocols the address of said pointer as
>>> argument; the pointer will be updated to point to a member of the
>>> url_protocols array. Now the address of the pointer can be reused for
>>> another call to avio_enum_protocols.
>>> Said array consists of constant pointers (to constant URLProtocols),
>>> but the user now has a pointer to non-const to it; of course it was always
>>> intended that the user is not allowed to modify what the pointer points
>>> to and this has been enforced by hiding the real type of the underlying
>>> object. But it is better to use a const void ** as parameter to enforce
>>> this. This way avio_enum_protocols can be implemented without resorting
>>> to casting a const away or ignoring constness as is done currently.
>>> 
>>> Given that this amounts to an ABI and API break, this can only be done
>>> at the next major version bump; as usual, the break is currently hidden
>>> behind an appropriate #if.
>>> 
>>> It was also necessary to change the type of a pointer used in
>>> avio_enum_protocols. This makes the line that is not const correct move
>>> as long as the old function signature is used. With the new signature,
>>> avio_enum_protocols will be const correct.
>>> 
>>> This change will eventually force changes in their callers, e.g. to
>>> show_protocols in fftools/cmdutils. (This function contains all currently
>>> existing calls to avio_enum_protocols in FFmpeg's codebase. It hasn't
>>> been touched in this commit.)
>>> 
>>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
>>> ---
>>> libavformat/avio.h      | 4 ++++
>>> libavformat/protocols.c | 6 +++++-
>>> libavformat/version.h   | 3 +++
>>> 3 files changed, 12 insertions(+), 1 deletion(-)
>>> 
>>> diff --git a/libavformat/avio.h b/libavformat/avio.h
>>> index 9141642e75..e067ea8985 100644
>>> --- a/libavformat/avio.h
>>> +++ b/libavformat/avio.h
>>> @@ -805,7 +805,11 @@ int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
>>> *
>>> * @return A static string containing the name of current protocol or NULL
>>> */
>>> +#if FF_API_NONCONST_ENUM_PROTOCOLS
>>> const char *avio_enum_protocols(void **opaque, int output);
>>> +#else
>>> +const char *avio_enum_protocols(const void **opaque, int output);
>>> +#endif
>>> 
>>> /**
>>> * Pause and resume playing - only meaningful if using a network streaming
>>> diff --git a/libavformat/protocols.c b/libavformat/protocols.c
>>> index ad95659795..c722f9a897 100644
>>> --- a/libavformat/protocols.c
>>> +++ b/libavformat/protocols.c
>>> @@ -91,9 +91,13 @@ const AVClass *ff_urlcontext_child_class_next(const AVClass *prev)
>>> }
>>> 
>>> 
>>> +#if FF_API_NONCONST_ENUM_PROTOCOLS
>>> const char *avio_enum_protocols(void **opaque, int output)
>>> +#else
>>> +const char *avio_enum_protocols(const void **opaque, int output)
>>> +#endif
>>> {
>>> -    const URLProtocol **p = *opaque;
>>> +    const URLProtocol * const *p = *opaque;
>>> 
>>>    p = p ? p + 1 : url_protocols;
>>>    *opaque = p;
>>> diff --git a/libavformat/version.h b/libavformat/version.h
>>> index 9814db8633..b0b9264382 100644
>>> --- a/libavformat/version.h
>>> +++ b/libavformat/version.h
>>> @@ -106,6 +106,9 @@
>>> #ifndef FF_API_AVIOFORMAT
>>> #define FF_API_AVIOFORMAT               (LIBAVFORMAT_VERSION_MAJOR < 59)
>>> #endif
>>> +#ifndef FF_API_NONCONST_ENUM_PROTOCOLS
>>> +#define FF_API_NONCONST_ENUM_PROTOCOLS  (LIBAVFORMAT_VERSION_MAJOR < 59)
>>> +#endif
>>> 
>>> 
>>> #ifndef FF_API_R_FRAME_RATE
>>> I am unsure what to do next given the feedback I received: If ABI
>> compability is no problem, then should I simply add the const and add
>> an entry to doc/APIchanges? Or is a deprecation period necessary?
>> 
>> - Andreas
>> 
> Ping for all three patches.

You can fix the typo of the title, other things LGTM.
> 
> - Andreas
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


Thanks
--------------------------------
刘歧|CDN|研发总监
吉林省高升科技有限公司北京分公司
地址:北京市海淀区西三环北路87号国际财经中心B座9层
手机:18611075131
邮箱: liuqi at gosun.com
电话:010-82602628



Thanks
Steven







More information about the ffmpeg-devel mailing list