[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