Skip to content

Commit

Permalink
avisynth: Allow compilation on Linux
Browse files Browse the repository at this point in the history
Co-authored-by: wangqr <[email protected]>
  • Loading branch information
arch1t3cht and wangqr committed Aug 12, 2022
1 parent e2a49b3 commit fe28567
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 12 deletions.
8 changes: 6 additions & 2 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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()
Expand Down
40 changes: 35 additions & 5 deletions src/avisynth_wrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,24 @@

#include <mutex>

#ifndef _WIN32
#include <dlfcn.h>
#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;
}
Expand All @@ -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);

Expand All @@ -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;
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/libresrc/default_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@
}
},
"Avisynth" : {
"Memory Max" : 128
"Memory Max" : 1024
},
"FFmpegSource" : {
"Cache" : {
Expand Down
2 changes: 1 addition & 1 deletion src/libresrc/osx/default_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@
}
},
"Avisynth" : {
"Memory Max" : 128
"Memory Max" : 1024
},
"FFmpegSource" : {
"Cache" : {
Expand Down
7 changes: 4 additions & 3 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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'],
]

Expand Down

0 comments on commit fe28567

Please sign in to comment.