[FFmpeg-devel] [PATCH] lavf/os_support: Add safe win32 dlopen/dlclose/dlsym functions.

James Almer jamrial at gmail.com
Sun Oct 30 20:30:48 EET 2016


On 10/30/2016 8:31 AM, Matt Oliver wrote:
> From 1dc1f59158cfb12d9160ee47342f5742d67ad864 Mon Sep 17 00:00:00 2001
> From: Matt Oliver <protogonoi at gmail.com>
> Date: Sun, 30 Oct 2016 15:13:47 +1100
> Subject: [PATCH] avformat/avisynth.c: Use new safe dlopen code.
> 
> ---
>  configure              |  5 ++---
>  libavformat/avisynth.c | 14 +++++---------
>  2 files changed, 7 insertions(+), 12 deletions(-)
> 
> diff --git a/configure b/configure
> index 5993de5..9feb544 100755
> --- a/configure
> +++ b/configure
> @@ -2850,6 +2850,7 @@ asf_stream_muxer_select="asf_muxer"
>  avi_demuxer_select="iso_media riffdec exif"
>  avi_muxer_select="riffenc"
>  avisynth_demuxer_deps="avisynth"
> +avisynth_demuxer_deps_any="dlopen LoadLibrary"
>  avisynth_demuxer_select="riffdec"

With this change and the stuff removed below, avisynth (CONFIG_AVISYNTH)
will always be enabled if you configure with --enable-avisynth, and only
avisynth_demuxer will be disabled depending on the presence of dlopen and
LoadLibrary.
This is probably not intended, seeing how libavformat/Makefile checks for
CONFIG_AVISYNTH and not CONFIG_AVISYNTH_DEMUXER in order to compile the
source file, so you should make it avisynth_deps_any="dlopen LoadLibrary"
since avisynth_demuxer already depends on avisynth.

Also, consider changing libavformat/Makefile to check for the demuxer
rather than the library/feature.

>  caf_demuxer_select="iso_media riffdec"
>  dash_muxer_select="mp4_muxer"
> @@ -5417,6 +5418,7 @@ elif check_func dlopen -ldl && check_func dlsym -ldl; then
>      ldl=-ldl
>  fi
>  
> +avisynth_demuxer_extralibs='$ldl'
>  decklink_outdev_extralibs="$decklink_outdev_extralibs $ldl"
>  decklink_indev_extralibs="$decklink_indev_extralibs $ldl"
>  frei0r_filter_extralibs='$ldl'
> @@ -5664,9 +5666,6 @@ fi
>  enabled avfoundation_indev && { check_header_objcc AVFoundation/AVFoundation.h || disable avfoundation_indev; }
>  enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActiveDisplayList -framework CoreGraphics ||
>                                  check_lib2 ApplicationServices/ApplicationServices.h CGGetActiveDisplayList -framework ApplicationServices; }
> -enabled avisynth          && { { check_lib2 "windows.h" LoadLibrary; } ||
> -                               { check_lib2 "dlfcn.h" dlopen -ldl; } ||
> -                               die "ERROR: LoadLibrary/dlopen not found for avisynth"; }
>  enabled cuda              && { check_lib cuda.h cuInit -lcuda ||
>                                 die "ERROR: CUDA not found"; }
>  enabled cuvid             && { add_cflags -I$source_path;
> diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
> index 1acc44f..514cb99 100644
> --- a/libavformat/avisynth.c
> +++ b/libavformat/avisynth.c
> @@ -29,7 +29,7 @@
>  
>  /* Platform-specific directives for AviSynth vs AvxSynth. */
>  #ifdef _WIN32
> -  #include <windows.h>
> +  #include "compat/w32dlfcn.h"
>    #undef EXTERN_C
>    #include "compat/avisynth/avisynth_c.h"
>    #define AVISYNTH_LIB "avisynth"
> @@ -39,10 +39,6 @@
>    #include "compat/avisynth/avxsynth_c.h"
>    #define AVISYNTH_NAME "libavxsynth"
>    #define AVISYNTH_LIB AVISYNTH_NAME SLIBSUF
> -
> -  #define LoadLibrary(x) dlopen(x, RTLD_NOW | RTLD_LOCAL)
> -  #define GetProcAddress dlsym
> -  #define FreeLibrary dlclose
>  #endif
>  
>  typedef struct AviSynthLibrary {
> @@ -118,13 +114,13 @@ static av_cold void avisynth_atexit_handler(void);
>  
>  static av_cold int avisynth_load_library(void)
>  {
> -    avs_library.library = LoadLibrary(AVISYNTH_LIB);
> +    avs_library.library = dlopen(AVISYNTH_LIB, RTLD_NOW | RTLD_LOCAL);
>      if (!avs_library.library)
>          return AVERROR_UNKNOWN;
>  
>  #define LOAD_AVS_FUNC(name, continue_on_fail)                          \
>          avs_library.name =                                             \
> -            (void *)GetProcAddress(avs_library.library, #name);        \
> +            (void *)dlsym(avs_library.library, #name);                 \
>          if (!continue_on_fail && !avs_library.name)                    \
>              goto fail;
>  
> @@ -157,7 +153,7 @@ static av_cold int avisynth_load_library(void)
>      return 0;
>  
>  fail:
> -    FreeLibrary(avs_library.library);
> +    dlclose(avs_library.library);
>      return AVERROR_UNKNOWN;
>  }
>  
> @@ -225,7 +221,7 @@ static av_cold void avisynth_atexit_handler(void)
>          avisynth_context_destroy(avs);
>          avs = next;
>      }
> -    FreeLibrary(avs_library.library);
> +    dlclose(avs_library.library);
>  
>      avs_atexit_called = 1;
>  }
> -- 2.10.1.windows.1



More information about the ffmpeg-devel mailing list