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.rheinha...@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.
- Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".