[FFmpeg-devel] [PATCH] lavf: make avformat_network_init() explicitly optional
wm4
nfxjfg at googlemail.com
Mon Jan 15 13:41:07 EET 2018
On Thu, 4 Jan 2018 17:02:41 +0100
wm4 <nfxjfg at 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.
More information about the ffmpeg-devel
mailing list