From fe285678a397d28f791dfdbad8c1b64401788b6a Mon Sep 17 00:00:00 2001 From: arch1t3cht Date: Fri, 6 Mar 2020 00:15:07 -0500 Subject: [PATCH] avisynth: Allow compilation on Linux Co-authored-by: wangqr --- meson.build | 8 ++++-- src/avisynth_wrap.cpp | 40 ++++++++++++++++++++++++---- src/libresrc/default_config.json | 2 +- src/libresrc/osx/default_config.json | 2 +- src/meson.build | 7 ++--- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/meson.build b/meson.build index 39cc7de00..50ec01dde 100644 --- a/meson.build +++ b/meson.build @@ -220,9 +220,9 @@ foreach dep: [ endif endforeach -if host_machine.system() == 'windows' and get_option('avisynth').enabled() +if get_option('avisynth').enabled() conf.set('WITH_AVISYNTH', 1) # bundled separately with installer - deps += cc.find_library('avifil32', required: true) + dep_avail += 'AviSynth' avs_opt = cmake.subproject_options() avs_opt.add_cmake_defines({ @@ -231,6 +231,10 @@ if host_machine.system() == 'windows' and get_option('avisynth').enabled() avs = cmake.subproject('avisynth', options: avs_opt) deps_inc += avs.include_directories('AviSynth-Headers') + + if host_machine.system() == 'windows' + deps += cc.find_library('avifil32', required: true) + endif endif if host_machine.system() == 'windows' and not get_option('directsound').disabled() diff --git a/src/avisynth_wrap.cpp b/src/avisynth_wrap.cpp index fd2246f77..a3b6a3de6 100644 --- a/src/avisynth_wrap.cpp +++ b/src/avisynth_wrap.cpp @@ -40,10 +40,24 @@ #include +#ifndef _WIN32 +#include +#endif + +#ifdef _WIN32 +#define AVISYNTH_SO "avisynth.dll" +#else +#define AVISYNTH_SO "libavisynth.so" +#endif + // Allocate storage for and initialise static members namespace { int avs_refcount = 0; +#ifdef _WIN32 HINSTANCE hLib = nullptr; +#else + void* hLib = nullptr; +#endif IScriptEnvironment *env = nullptr; std::mutex AviSynthMutex; } @@ -54,14 +68,26 @@ typedef IScriptEnvironment* __stdcall FUNC(int); AviSynthWrapper::AviSynthWrapper() { if (!avs_refcount++) { - hLib = LoadLibrary(L"avisynth.dll"); +#ifdef _WIN32 +#define CONCATENATE(x, y) x ## y +#define _Lstr(x) CONCATENATE(L, x) + hLib = LoadLibraryW(_Lstr(AVISYNTH_SO)); +#undef _Lstr +#undef CONCATENATE +#else + hLib = dlopen(AVISYNTH_SO, RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND); +#endif if (!hLib) - throw AvisynthError("Could not load avisynth.dll"); + throw AvisynthError("Could not load " AVISYNTH_SO); - FUNC *CreateScriptEnv = (FUNC*)GetProcAddress(hLib, "CreateScriptEnvironment"); +#ifdef _WIN32 + FUNC* CreateScriptEnv = (FUNC*)GetProcAddress(hLib, "CreateScriptEnvironment"); +#else + FUNC* CreateScriptEnv = (FUNC*)dlsym(hLib, "CreateScriptEnvironment"); +#endif if (!CreateScriptEnv) - throw AvisynthError("Failed to get address of CreateScriptEnv from avisynth.dll"); + throw AvisynthError("Failed to get address of CreateScriptEnv from " AVISYNTH_SO); env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION); @@ -80,8 +106,12 @@ AviSynthWrapper::AviSynthWrapper() { AviSynthWrapper::~AviSynthWrapper() { if (!--avs_refcount) { delete env; - AVS_linkage = nullptr; +#ifdef _WIN32 FreeLibrary(hLib); +#else + dlclose(hLib); +#endif + AVS_linkage = nullptr; } } diff --git a/src/libresrc/default_config.json b/src/libresrc/default_config.json index f83002436..fbc98dc2e 100644 --- a/src/libresrc/default_config.json +++ b/src/libresrc/default_config.json @@ -335,7 +335,7 @@ } }, "Avisynth" : { - "Memory Max" : 128 + "Memory Max" : 1024 }, "FFmpegSource" : { "Cache" : { diff --git a/src/libresrc/osx/default_config.json b/src/libresrc/osx/default_config.json index 66cecd520..7d0cb9b6a 100644 --- a/src/libresrc/osx/default_config.json +++ b/src/libresrc/osx/default_config.json @@ -335,7 +335,7 @@ } }, "Avisynth" : { - "Memory Max" : 128 + "Memory Max" : 1024 }, "FFmpegSource" : { "Cache" : { diff --git a/src/meson.build b/src/meson.build index 9592cf6e0..b5791e558 100644 --- a/src/meson.build +++ b/src/meson.build @@ -171,11 +171,8 @@ if host_machine.system() == 'darwin' ) elif host_machine.system() == 'windows' aegisub_src += files( - 'avisynth_wrap.cpp', 'font_file_lister_gdi.cpp', # 'libass_gdi_fontselect.cpp', - 'audio_provider_avs.cpp', - 'video_provider_avs.cpp', ) if cc.has_header('wingdi.h') @@ -238,6 +235,10 @@ opt_src = [ 'video_provider_ffmpegsource.cpp', 'ffmpegsource_common.cpp']], + ['AviSynth', ['avisynth_wrap.cpp', + 'audio_provider_avs.cpp', + 'video_provider_avs.cpp']], + ['Hunspell', 'spellchecker_hunspell.cpp'], ]