[FFmpeg-devel] [PATCH] lavf/os_support: Add safe win32 dlopen/dlclose/dlsym functions.
Stephen Hutchinson
qyot27 at gmail.com
Wed Nov 2 03:22:58 EET 2016
On 10/30/2016 11:51 PM, Matt Oliver wrote:
> On 31 October 2016 at 05:30, James Almer <jamrial at gmail.com> wrote:
>
>> 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.
>>
>
> Changed, I also moved the avisynth stuff up to the external libraries
> section of configure
>
>
>>
>>> 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
>>>
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Tested under Ubuntu and Windows 10. The AviSynth stuff LGTM.
More information about the ffmpeg-devel
mailing list