Message ID | 20180104160241.19324-1-nfxjfg@googlemail.com |
---|---|
State | New |
Headers | show |
On Thu, 4 Jan 2018 17:02:41 +0100 wm4 <nfxjfg@googlemail.com> wrote: > It was sort of optional before - if you didn't call it, networking was > initialized on demand, and an ugly warning was logged. Also, the doxygen > comments threatened that it would be made strictly required one day. > > Make it explicitly optional. I would prefer to deprecate it fully, but > there might still be legitimate reasons to use this. But the average > user won't need it. > > This is needed only for two reasons: to initialize TLS libraries like > OpenSSL and GnuTLS, and winsock. > > OpenSSL and GnuTLS were already silently initialized on demand if the > global network init function was not called. They also have various > thread-safety acrobatics, which make concurrent initialization within > libavformat safe. In addition, the libraries are moving towards making > their global init functions safe, which removes all need for central > global init. In particular, GnuTLS 3.5.16 and OpenSSL 1.1.0g have been > found to have safe init functions. In all cases, they use internal > reference counters to avoid that the global uninit functions interfere > with concurrent uses of the library by other API users who called global > init. > > winsock should be thread-safe as well, and maintains an internal > reference counter as well. > > Since we still support ancient TLS libraries, which do not have this > fixed, and since it's unknown whether winsock and GnuTLS > reinitialization is costly in any way, don't deprecate the libavformat > functions yet. > --- > doc/APIchanges | 6 ++++++ > libavformat/avformat.h | 19 +++++++++++++------ > libavformat/network.c | 9 --------- > libavformat/network.h | 1 - > libavformat/utils.c | 2 -- > libavformat/version.h | 2 +- > 6 files changed, 20 insertions(+), 19 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 38c1be61c7..87ff51bdc2 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -15,6 +15,12 @@ libavutil: 2017-10-21 > > API changes, most recent first: > > +2017-xx-xx - xxxxxxx - lavf 58.3.101 - avformat.h > + Explicitly make avformat_network_init() and avformat_network_deinit() optional. > + If these are not called, network initialization and deinitialization is > + automatic, and unlike in older versions, fully supported, unless libavformat > + is linked to ancient GnuTLS and OpenSSL. > + > 2017-xx-xx - xxxxxxx - lavr 4.0.0 - avresample.h > Deprecate the entire library. Merged years ago to provide compatibility > with Libav, it remained unmaintained by the FFmpeg project and duplicated > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 4f2798a871..9de851fcc5 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1993,17 +1993,24 @@ void av_register_input_format(AVInputFormat *format); > void av_register_output_format(AVOutputFormat *format); > > /** > - * Do global initialization of network components. This is optional, > - * but recommended, since it avoids the overhead of implicitly > - * doing the setup for each session. > + * Do global initialization of network libraries. This is optional, > + * and not recommended anymore. > * > - * Calling this function will become mandatory if using network > - * protocols at some major version bump. > + * This functions only exists to work around thread-safety issues > + * with older GnuTLS or OpenSSL libraries. If libavformat is linked > + * to newer versions of those libraries, or if you do not use them, > + * calling this function is unnecessary. Otherwise, you need to call > + * this function before any other threads using them are started. > + * > + * This function will be deprecated once support for older GnuTLS and > + * OpenSSL libraries is removed, and this function has no purpose > + * anymore. > */ > int avformat_network_init(void); > > /** > - * Undo the initialization done by avformat_network_init. > + * Undo the initialization done by avformat_network_init. Call it only > + * once for each time you called avformat_network_init. > */ > int avformat_network_deinit(void); > > diff --git a/libavformat/network.c b/libavformat/network.c > index e9eb4b443a..d5c82e9ab9 100644 > --- a/libavformat/network.c > +++ b/libavformat/network.c > @@ -54,20 +54,11 @@ void ff_tls_deinit(void) > #endif > } > > -int ff_network_inited_globally; > - > int ff_network_init(void) > { > #if HAVE_WINSOCK2_H > WSADATA wsaData; > -#endif > > - if (!ff_network_inited_globally) > - av_log(NULL, AV_LOG_WARNING, "Using network protocols without global " > - "network initialization. Please use " > - "avformat_network_init(), this will " > - "become mandatory later.\n"); > -#if HAVE_WINSOCK2_H > if (WSAStartup(MAKEWORD(1,1), &wsaData)) > return 0; > #endif > diff --git a/libavformat/network.h b/libavformat/network.h > index a663115541..22a4fb8950 100644 > --- a/libavformat/network.h > +++ b/libavformat/network.h > @@ -75,7 +75,6 @@ int ff_neterrno(void); > > int ff_socket_nonblock(int socket, int enable); > > -extern int ff_network_inited_globally; > int ff_network_init(void); > void ff_network_close(void); > > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 2185a6f05b..51a510cbb7 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -4873,7 +4873,6 @@ int avformat_network_init(void) > { > #if CONFIG_NETWORK > int ret; > - ff_network_inited_globally = 1; > if ((ret = ff_network_init()) < 0) > return ret; > if ((ret = ff_tls_init()) < 0) > @@ -4887,7 +4886,6 @@ int avformat_network_deinit(void) > #if CONFIG_NETWORK > ff_network_close(); > ff_tls_deinit(); > - ff_network_inited_globally = 0; > #endif > return 0; > } > diff --git a/libavformat/version.h b/libavformat/version.h > index 5ced041f0a..6453d4559f 100644 > --- a/libavformat/version.h > +++ b/libavformat/version.h > @@ -33,7 +33,7 @@ > // Also please add any ticket numbers that you believe might be affected here > #define LIBAVFORMAT_VERSION_MAJOR 58 > #define LIBAVFORMAT_VERSION_MINOR 3 > -#define LIBAVFORMAT_VERSION_MICRO 100 > +#define LIBAVFORMAT_VERSION_MICRO 101 > > #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ > LIBAVFORMAT_VERSION_MINOR, \ Ping.
On Thu, 4 Jan 2018 17:02:41 +0100 wm4 <nfxjfg@googlemail.com> wrote: > It was sort of optional before - if you didn't call it, networking was > initialized on demand, and an ugly warning was logged. Also, the doxygen > comments threatened that it would be made strictly required one day. > > Make it explicitly optional. I would prefer to deprecate it fully, but > there might still be legitimate reasons to use this. But the average > user won't need it. > > This is needed only for two reasons: to initialize TLS libraries like > OpenSSL and GnuTLS, and winsock. > > OpenSSL and GnuTLS were already silently initialized on demand if the > global network init function was not called. They also have various > thread-safety acrobatics, which make concurrent initialization within > libavformat safe. In addition, the libraries are moving towards making > their global init functions safe, which removes all need for central > global init. In particular, GnuTLS 3.5.16 and OpenSSL 1.1.0g have been > found to have safe init functions. In all cases, they use internal > reference counters to avoid that the global uninit functions interfere > with concurrent uses of the library by other API users who called global > init. > > winsock should be thread-safe as well, and maintains an internal > reference counter as well. > > Since we still support ancient TLS libraries, which do not have this > fixed, and since it's unknown whether winsock and GnuTLS > reinitialization is costly in any way, don't deprecate the libavformat > functions yet. > --- > doc/APIchanges | 6 ++++++ > libavformat/avformat.h | 19 +++++++++++++------ > libavformat/network.c | 9 --------- > libavformat/network.h | 1 - > libavformat/utils.c | 2 -- > libavformat/version.h | 2 +- > 6 files changed, 20 insertions(+), 19 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 38c1be61c7..87ff51bdc2 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -15,6 +15,12 @@ libavutil: 2017-10-21 > > API changes, most recent first: > > +2017-xx-xx - xxxxxxx - lavf 58.3.101 - avformat.h > + Explicitly make avformat_network_init() and avformat_network_deinit() optional. > + If these are not called, network initialization and deinitialization is > + automatic, and unlike in older versions, fully supported, unless libavformat > + is linked to ancient GnuTLS and OpenSSL. > + > 2017-xx-xx - xxxxxxx - lavr 4.0.0 - avresample.h > Deprecate the entire library. Merged years ago to provide compatibility > with Libav, it remained unmaintained by the FFmpeg project and duplicated > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 4f2798a871..9de851fcc5 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1993,17 +1993,24 @@ void av_register_input_format(AVInputFormat *format); > void av_register_output_format(AVOutputFormat *format); > > /** > - * Do global initialization of network components. This is optional, > - * but recommended, since it avoids the overhead of implicitly > - * doing the setup for each session. > + * Do global initialization of network libraries. This is optional, > + * and not recommended anymore. > * > - * Calling this function will become mandatory if using network > - * protocols at some major version bump. > + * This functions only exists to work around thread-safety issues > + * with older GnuTLS or OpenSSL libraries. If libavformat is linked > + * to newer versions of those libraries, or if you do not use them, > + * calling this function is unnecessary. Otherwise, you need to call > + * this function before any other threads using them are started. > + * > + * This function will be deprecated once support for older GnuTLS and > + * OpenSSL libraries is removed, and this function has no purpose > + * anymore. > */ > int avformat_network_init(void); > > /** > - * Undo the initialization done by avformat_network_init. > + * Undo the initialization done by avformat_network_init. Call it only > + * once for each time you called avformat_network_init. > */ > int avformat_network_deinit(void); > > diff --git a/libavformat/network.c b/libavformat/network.c > index e9eb4b443a..d5c82e9ab9 100644 > --- a/libavformat/network.c > +++ b/libavformat/network.c > @@ -54,20 +54,11 @@ void ff_tls_deinit(void) > #endif > } > > -int ff_network_inited_globally; > - > int ff_network_init(void) > { > #if HAVE_WINSOCK2_H > WSADATA wsaData; > -#endif > > - if (!ff_network_inited_globally) > - av_log(NULL, AV_LOG_WARNING, "Using network protocols without global " > - "network initialization. Please use " > - "avformat_network_init(), this will " > - "become mandatory later.\n"); > -#if HAVE_WINSOCK2_H > if (WSAStartup(MAKEWORD(1,1), &wsaData)) > return 0; > #endif > diff --git a/libavformat/network.h b/libavformat/network.h > index a663115541..22a4fb8950 100644 > --- a/libavformat/network.h > +++ b/libavformat/network.h > @@ -75,7 +75,6 @@ int ff_neterrno(void); > > int ff_socket_nonblock(int socket, int enable); > > -extern int ff_network_inited_globally; > int ff_network_init(void); > void ff_network_close(void); > > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 2185a6f05b..51a510cbb7 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -4873,7 +4873,6 @@ int avformat_network_init(void) > { > #if CONFIG_NETWORK > int ret; > - ff_network_inited_globally = 1; > if ((ret = ff_network_init()) < 0) > return ret; > if ((ret = ff_tls_init()) < 0) > @@ -4887,7 +4886,6 @@ int avformat_network_deinit(void) > #if CONFIG_NETWORK > ff_network_close(); > ff_tls_deinit(); > - ff_network_inited_globally = 0; > #endif > return 0; > } > diff --git a/libavformat/version.h b/libavformat/version.h > index 5ced041f0a..6453d4559f 100644 > --- a/libavformat/version.h > +++ b/libavformat/version.h > @@ -33,7 +33,7 @@ > // Also please add any ticket numbers that you believe might be affected here > #define LIBAVFORMAT_VERSION_MAJOR 58 > #define LIBAVFORMAT_VERSION_MINOR 3 > -#define LIBAVFORMAT_VERSION_MICRO 100 > +#define LIBAVFORMAT_VERSION_MICRO 101 > > #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ > LIBAVFORMAT_VERSION_MINOR, \ Will push this tomorrow or so.
On Thu, 4 Jan 2018 17:02:41 +0100 wm4 <nfxjfg@googlemail.com> wrote: > It was sort of optional before - if you didn't call it, networking was > initialized on demand, and an ugly warning was logged. Also, the doxygen > comments threatened that it would be made strictly required one day. > > Make it explicitly optional. I would prefer to deprecate it fully, but > there might still be legitimate reasons to use this. But the average > user won't need it. > > This is needed only for two reasons: to initialize TLS libraries like > OpenSSL and GnuTLS, and winsock. > > OpenSSL and GnuTLS were already silently initialized on demand if the > global network init function was not called. They also have various > thread-safety acrobatics, which make concurrent initialization within > libavformat safe. In addition, the libraries are moving towards making > their global init functions safe, which removes all need for central > global init. In particular, GnuTLS 3.5.16 and OpenSSL 1.1.0g have been > found to have safe init functions. In all cases, they use internal > reference counters to avoid that the global uninit functions interfere > with concurrent uses of the library by other API users who called global > init. > > winsock should be thread-safe as well, and maintains an internal > reference counter as well. > > Since we still support ancient TLS libraries, which do not have this > fixed, and since it's unknown whether winsock and GnuTLS > reinitialization is costly in any way, don't deprecate the libavformat > functions yet. > --- > doc/APIchanges | 6 ++++++ > libavformat/avformat.h | 19 +++++++++++++------ > libavformat/network.c | 9 --------- > libavformat/network.h | 1 - > libavformat/utils.c | 2 -- > libavformat/version.h | 2 +- > 6 files changed, 20 insertions(+), 19 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 38c1be61c7..87ff51bdc2 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -15,6 +15,12 @@ libavutil: 2017-10-21 > > API changes, most recent first: > > +2017-xx-xx - xxxxxxx - lavf 58.3.101 - avformat.h > + Explicitly make avformat_network_init() and avformat_network_deinit() optional. > + If these are not called, network initialization and deinitialization is > + automatic, and unlike in older versions, fully supported, unless libavformat > + is linked to ancient GnuTLS and OpenSSL. > + > 2017-xx-xx - xxxxxxx - lavr 4.0.0 - avresample.h > Deprecate the entire library. Merged years ago to provide compatibility > with Libav, it remained unmaintained by the FFmpeg project and duplicated > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 4f2798a871..9de851fcc5 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1993,17 +1993,24 @@ void av_register_input_format(AVInputFormat *format); > void av_register_output_format(AVOutputFormat *format); > > /** > - * Do global initialization of network components. This is optional, > - * but recommended, since it avoids the overhead of implicitly > - * doing the setup for each session. > + * Do global initialization of network libraries. This is optional, > + * and not recommended anymore. > * > - * Calling this function will become mandatory if using network > - * protocols at some major version bump. > + * This functions only exists to work around thread-safety issues > + * with older GnuTLS or OpenSSL libraries. If libavformat is linked > + * to newer versions of those libraries, or if you do not use them, > + * calling this function is unnecessary. Otherwise, you need to call > + * this function before any other threads using them are started. > + * > + * This function will be deprecated once support for older GnuTLS and > + * OpenSSL libraries is removed, and this function has no purpose > + * anymore. > */ > int avformat_network_init(void); > > /** > - * Undo the initialization done by avformat_network_init. > + * Undo the initialization done by avformat_network_init. Call it only > + * once for each time you called avformat_network_init. > */ > int avformat_network_deinit(void); > > diff --git a/libavformat/network.c b/libavformat/network.c > index e9eb4b443a..d5c82e9ab9 100644 > --- a/libavformat/network.c > +++ b/libavformat/network.c > @@ -54,20 +54,11 @@ void ff_tls_deinit(void) > #endif > } > > -int ff_network_inited_globally; > - > int ff_network_init(void) > { > #if HAVE_WINSOCK2_H > WSADATA wsaData; > -#endif > > - if (!ff_network_inited_globally) > - av_log(NULL, AV_LOG_WARNING, "Using network protocols without global " > - "network initialization. Please use " > - "avformat_network_init(), this will " > - "become mandatory later.\n"); > -#if HAVE_WINSOCK2_H > if (WSAStartup(MAKEWORD(1,1), &wsaData)) > return 0; > #endif > diff --git a/libavformat/network.h b/libavformat/network.h > index a663115541..22a4fb8950 100644 > --- a/libavformat/network.h > +++ b/libavformat/network.h > @@ -75,7 +75,6 @@ int ff_neterrno(void); > > int ff_socket_nonblock(int socket, int enable); > > -extern int ff_network_inited_globally; > int ff_network_init(void); > void ff_network_close(void); > > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 2185a6f05b..51a510cbb7 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -4873,7 +4873,6 @@ int avformat_network_init(void) > { > #if CONFIG_NETWORK > int ret; > - ff_network_inited_globally = 1; > if ((ret = ff_network_init()) < 0) > return ret; > if ((ret = ff_tls_init()) < 0) > @@ -4887,7 +4886,6 @@ int avformat_network_deinit(void) > #if CONFIG_NETWORK > ff_network_close(); > ff_tls_deinit(); > - ff_network_inited_globally = 0; > #endif > return 0; > } > diff --git a/libavformat/version.h b/libavformat/version.h > index 5ced041f0a..6453d4559f 100644 > --- a/libavformat/version.h > +++ b/libavformat/version.h > @@ -33,7 +33,7 @@ > // Also please add any ticket numbers that you believe might be affected here > #define LIBAVFORMAT_VERSION_MAJOR 58 > #define LIBAVFORMAT_VERSION_MINOR 3 > -#define LIBAVFORMAT_VERSION_MICRO 100 > +#define LIBAVFORMAT_VERSION_MICRO 101 > > #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ > LIBAVFORMAT_VERSION_MINOR, \ Pushed. Changed the commit prefix, and made the micro bump a minor one.
diff --git a/doc/APIchanges b/doc/APIchanges index 38c1be61c7..87ff51bdc2 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,12 @@ libavutil: 2017-10-21 API changes, most recent first: +2017-xx-xx - xxxxxxx - lavf 58.3.101 - avformat.h + Explicitly make avformat_network_init() and avformat_network_deinit() optional. + If these are not called, network initialization and deinitialization is + automatic, and unlike in older versions, fully supported, unless libavformat + is linked to ancient GnuTLS and OpenSSL. + 2017-xx-xx - xxxxxxx - lavr 4.0.0 - avresample.h Deprecate the entire library. Merged years ago to provide compatibility with Libav, it remained unmaintained by the FFmpeg project and duplicated diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 4f2798a871..9de851fcc5 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1993,17 +1993,24 @@ void av_register_input_format(AVInputFormat *format); void av_register_output_format(AVOutputFormat *format); /** - * Do global initialization of network components. This is optional, - * but recommended, since it avoids the overhead of implicitly - * doing the setup for each session. + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. * - * Calling this function will become mandatory if using network - * protocols at some major version bump. + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. */ int avformat_network_init(void); /** - * Undo the initialization done by avformat_network_init. + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. */ int avformat_network_deinit(void); diff --git a/libavformat/network.c b/libavformat/network.c index e9eb4b443a..d5c82e9ab9 100644 --- a/libavformat/network.c +++ b/libavformat/network.c @@ -54,20 +54,11 @@ void ff_tls_deinit(void) #endif } -int ff_network_inited_globally; - int ff_network_init(void) { #if HAVE_WINSOCK2_H WSADATA wsaData; -#endif - if (!ff_network_inited_globally) - av_log(NULL, AV_LOG_WARNING, "Using network protocols without global " - "network initialization. Please use " - "avformat_network_init(), this will " - "become mandatory later.\n"); -#if HAVE_WINSOCK2_H if (WSAStartup(MAKEWORD(1,1), &wsaData)) return 0; #endif diff --git a/libavformat/network.h b/libavformat/network.h index a663115541..22a4fb8950 100644 --- a/libavformat/network.h +++ b/libavformat/network.h @@ -75,7 +75,6 @@ int ff_neterrno(void); int ff_socket_nonblock(int socket, int enable); -extern int ff_network_inited_globally; int ff_network_init(void); void ff_network_close(void); diff --git a/libavformat/utils.c b/libavformat/utils.c index 2185a6f05b..51a510cbb7 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4873,7 +4873,6 @@ int avformat_network_init(void) { #if CONFIG_NETWORK int ret; - ff_network_inited_globally = 1; if ((ret = ff_network_init()) < 0) return ret; if ((ret = ff_tls_init()) < 0) @@ -4887,7 +4886,6 @@ int avformat_network_deinit(void) #if CONFIG_NETWORK ff_network_close(); ff_tls_deinit(); - ff_network_inited_globally = 0; #endif return 0; } diff --git a/libavformat/version.h b/libavformat/version.h index 5ced041f0a..6453d4559f 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -33,7 +33,7 @@ // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MINOR 3 -#define LIBAVFORMAT_VERSION_MICRO 100 +#define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \