Merge branches 'bestsource', 'vapoursynth' and 'bugfixes' into feature

This commit is contained in:
arch1t3cht 2024-03-08 01:54:29 +01:00
commit cd2e894634
12 changed files with 100 additions and 216 deletions

View File

@ -123,12 +123,21 @@ jobs:
if: matrix.config.os == 'windows-latest' if: matrix.config.os == 'windows-latest'
run: | run: |
choco install ninja innosetup choco install ninja innosetup
$url = "https://github.com/leafo/moonscript/releases/download/win32-v0.5.0/moonscript-187bac54ee5a7450013e9c38e005a0e671b76f45.zip"
$moonscripturl = "https://github.com/leafo/moonscript/releases/download/win32-v0.5.0/moonscript-187bac54ee5a7450013e9c38e005a0e671b76f45.zip"
mkdir moonscript mkdir moonscript
Invoke-WebRequest -Uri $url -OutFile ".\moonscript\moonscript.zip" Invoke-WebRequest -Uri $moonscripturl -OutFile ".\moonscript\moonscript.zip"
cd moonscript pushd moonscript
7z e moonscript.zip 7z e moonscript.zip
Get-Location | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append Get-Location | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
popd
$gettexturl = "https://github.com/mlocati/gettext-iconv-windows/releases/download/v0.21-v1.16/gettext0.21-iconv1.16-static-64.zip"
Invoke-WebRequest -Uri $gettexturl -OutFile ".\gettext.zip"
Expand-Archive ".\gettext.zip" -DestinationPath gettext
pushd gettext/bin
Get-Location | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
popd
- name: Install dependencies (MacOS) - name: Install dependencies (MacOS)
if: matrix.config.os == 'macos-latest' if: matrix.config.os == 'macos-latest'

View File

@ -308,15 +308,15 @@ def get_keyframes(filename: str, clip: vs.VideoNode, fallback: str | List[int],
def check_audio(filename: str, **kwargs: Any) -> bool: def check_audio(filename: str, **kwargs: Any) -> bool:
""" """
Checks whether the given file has an audio track by trying to open it with Checks whether the given file has an audio track by trying to open it with
BestAudioSource. Requires the `bas` plugin to return correct results, but BestSource. Requires the `bs` plugin to return correct results, but
won't crash if it's not installed. won't crash if it's not installed.
Additional keyword arguments are passed on to BestAudioSource. Additional keyword arguments are passed on to BestSource.
""" """
progress_set_message("Checking if the file has an audio track") progress_set_message("Checking if the file has an audio track")
progress_set_indeterminate() progress_set_indeterminate()
try: try:
ensure_plugin("bas", "BestAudioSource", "") ensure_plugin("bs", "BestSource", "")
vs.core.bas.Source(source=filename, **kwargs) vs.core.bs.AudioSource(source=filename, **kwargs)
return True return True
except AttributeError: except AttributeError:
pass pass

View File

@ -7,6 +7,6 @@ DestDir: {app}; Source: {#DEPS_DIR}\AvisynthPlus64\x64\Output\plugins\DirectShow
DestDir: {app}\csri; Source: {#DEPS_DIR}\VSFilter\x64\VSFilter.dll; Flags: ignoreversion; Components: main DestDir: {app}\csri; Source: {#DEPS_DIR}\VSFilter\x64\VSFilter.dll; Flags: ignoreversion; Components: main
; VapourSynth ; VapourSynth
DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\L-SMASH-Works\libvslsmashsource.dll; Flags: ignoreversion; Components: vapoursynth DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\L-SMASH-Works\libvslsmashsource.dll; Flags: ignoreversion; Components: vapoursynth
DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\bestaudiosource\win64\BestAudioSource.dll; Flags: ignoreversion; Components: vapoursynth DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\BestSource\x64\BestSource.dll; Flags: ignoreversion; Components: vapoursynth
DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\SCXVid\libscxvid.dll; Flags: ignoreversion; Components: vapoursynth DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\SCXVid\libscxvid.dll; Flags: ignoreversion; Components: vapoursynth
DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\WWXD\libwwxd64.dll; Flags: ignoreversion; Components: vapoursynth DestDir: {app}\vapoursynth; Source: {#DEPS_DIR}\WWXD\libwwxd64.dll; Flags: ignoreversion; Components: vapoursynth

View File

@ -52,7 +52,7 @@ public:
/// @param filename The filename to open /// @param filename The filename to open
BSAudioProvider::BSAudioProvider(agi::fs::path const& filename, agi::BackgroundRunner *br) try BSAudioProvider::BSAudioProvider(agi::fs::path const& filename, agi::BackgroundRunner *br) try
: bsopts() : bsopts()
, bs(filename.string(), -1, -1, GetBSCacheFile(filename), &bsopts) , bs(filename.string(), -1, -1, 0, GetBSCacheFile(filename), &bsopts)
{ {
bs.SetMaxCacheSize(OPT_GET("Provider/Audio/BestSource/Max Cache Size")->GetInt() << 20); bs.SetMaxCacheSize(OPT_GET("Provider/Audio/BestSource/Max Cache Size")->GetInt() << 20);
br->Run([&](agi::ProgressSink *ps) { br->Run([&](agi::ProgressSink *ps) {

View File

@ -352,7 +352,7 @@
"Aegisub Cache" : true "Aegisub Cache" : true
}, },
"VapourSynth" : { "VapourSynth" : {
"Default Script" : "# This default script will load an audio file using BestAudioSource.\n# It requires the `bas` plugin.\n\nimport vapoursynth as vs\nimport aegisub_vs as a\na.set_paths(locals())\n\na.ensure_plugin(\"bas\", \"BestAudioSource\", \"To use Aegisub's default audio loader, the `bas` plugin for VapourSynth must be installed\")\nvs.core.bas.Source(source=filename).set_output()" "Default Script" : "# This default script will load an audio file using BestSource.\n# It requires the `bs` plugin.\n\nimport vapoursynth as vs\nimport aegisub_vs as a\na.set_paths(locals())\n\na.ensure_plugin(\"bs\", \"BestSource\", \"To use Aegisub's default audio loader, the `bs` plugin for VapourSynth must be installed\")\nvs.core.bs.AudioSource(source=filename).set_output()"
} }
}, },
"Avisynth" : { "Avisynth" : {

View File

@ -352,7 +352,7 @@
"Aegisub Cache" : true "Aegisub Cache" : true
}, },
"VapourSynth" : { "VapourSynth" : {
"Default Script" : "# This default script will load an audio file using BestAudioSource.\n# It requires the `bas` plugin.\n\nimport vapoursynth as vs\nimport aegisub_vs as a\na.set_paths(globals())\n\na.ensure_plugin(\"bas\", \"BestAudioSource\", \"To use Aegisub's default audio loader, the `bas` plugin for VapourSynth must be installed\")\nvs.core.bas.Source(source=filename).set_output()" "Default Script" : "# This default script will load an audio file using BestSource.\n# It requires the `bs` plugin.\n\nimport vapoursynth as vs\nimport aegisub_vs as a\na.set_paths(locals())\n\na.ensure_plugin(\"bs\", \"BestSource\", \"To use Aegisub's default audio loader, the `bs` plugin for VapourSynth must be installed\")\nvs.core.bs.AudioSource(source=filename).set_output()"
} }
}, },
"Avisynth" : { "Avisynth" : {

View File

@ -103,12 +103,12 @@ std::string colormatrix_description(const AVFrame *frame) {
BSVideoProvider::BSVideoProvider(agi::fs::path const& filename, std::string const& colormatrix, agi::BackgroundRunner *br) try BSVideoProvider::BSVideoProvider(agi::fs::path const& filename, std::string const& colormatrix, agi::BackgroundRunner *br) try
: bsopts() : bsopts()
, bs(filename.string(), "", -1, false, OPT_GET("Provider/Video/BestSource/Threads")->GetInt(), GetBSCacheFile(filename), &bsopts) , bs(filename.string(), "", 0, -1, false, OPT_GET("Provider/Video/BestSource/Threads")->GetInt(), GetBSCacheFile(filename), &bsopts)
{ {
bs.SetMaxCacheSize(OPT_GET("Provider/Video/BestSource/Max Cache Size")->GetInt() << 20); bs.SetMaxCacheSize(OPT_GET("Provider/Video/BestSource/Max Cache Size")->GetInt() << 20);
bs.SetSeekPreRoll(OPT_GET("Provider/Video/BestSource/Seek Preroll")->GetInt()); bs.SetSeekPreRoll(OPT_GET("Provider/Video/BestSource/Seek Preroll")->GetInt());
try { try {
BestAudioSource dummysource(filename.string(), -1, 0, ""); BestAudioSource dummysource(filename.string(), -1, 0, 0, "");
has_audio = true; has_audio = true;
} catch (AudioException const& err) { } catch (AudioException const& err) {
has_audio = false; has_audio = false;

View File

@ -1,7 +1,8 @@
[wrap-git] [wrap-git]
url = https://github.com/vapoursynth/bestsource url = https://github.com/vapoursynth/bestsource
revision = ba1249c1f5443be6d0ec2be32490af5bbc96bf99 revision = R1
patch_directory = bestsource clone-recursive = true
diff_files = bestsource/0001.patch
[provide] [provide]
bestsource = bestsource_dep bestsource = bestsource_dep

View File

@ -0,0 +1,66 @@
diff --git a/meson.build b/meson.build
index 38de461..d56af62 100644
--- a/meson.build
+++ b/meson.build
@@ -2,10 +2,6 @@ project('BestSource', 'cpp',
default_options: ['buildtype=release', 'b_lto=true', 'b_ndebug=if-release', 'cpp_std=c++14'],
license: 'MIT',
meson_version: '>=0.53.0',
- version: '.'.join([
- run_command('grep', 'BEST_SOURCE_VERSION_MAJOR', 'src/version.h', check: true).stdout().strip().split()[2],
- run_command('grep', 'BEST_SOURCE_VERSION_MINOR', 'src/version.h', check: true).stdout().strip().split()[2]
- ])
)
link_static = get_option('link_static')
@@ -15,7 +11,6 @@ sources = [
'src/BSRational.cpp',
'src/BSShared.cpp',
'src/SrcAttribCache.cpp',
- 'src/vapoursynth.cpp',
'src/videosource.cpp'
]
@@ -46,17 +41,23 @@ if host_machine.cpu_family().startswith('x86')
)
endif
-vapoursynth_dep = dependency('vapoursynth', version: '>=55').partial_dependency(compile_args: true, includes: true)
-
deps = [
- vapoursynth_dep,
- dependency('jansson', version: '>=2.12', static: link_static),
dependency('libavcodec', version: '>=60.31.0', static: link_static),
dependency('libavformat', version: '>=60.16.0', static: link_static),
dependency('libavutil', version: '>=58.29.0', static: link_static),
dependency('libswscale', version: '>=7.5.0', static: link_static)
]
+jansson_dep = dependency('jansson', version: '>= 2.12', required: false)
+
+if jansson_dep.found()
+ deps += jansson_dep
+else
+ cmake = import('cmake')
+ jansson = cmake.subproject('jansson')
+ deps += jansson.dependency('jansson')
+endif
+
is_gnu_linker = meson.get_compiler('cpp').get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.mold']
link_args = []
@@ -66,11 +67,11 @@ elif is_gnu_linker
link_args += ['-Wl,-Bsymbolic']
endif
-shared_module('bestsource', sources,
+bs_lib = static_library('bestsource', sources,
dependencies: deps,
gnu_symbol_visibility: 'hidden',
- install: true,
- install_dir: vapoursynth_dep.get_variable(pkgconfig: 'libdir') / 'vapoursynth',
link_args: link_args,
link_with: libs
)
+
+bestsource_dep = declare_dependency(link_with: bs_lib, include_directories: include_directories('src'))

View File

@ -1,156 +0,0 @@
// Since we don't use ExportAsPlanar, we don't actually need libp2p.
// So instead of adding another wrap and meson build file, and *also*
// patching the include statement in videosource.cpp, we throw a dummy
// header file in the folder that should contain the checkout of libp2p.
#ifndef P2P_API_H_
#define P2P_API_H_
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Notation: [Xa-Ya-Za]
*
* [] denotes a machine word of the specified endianness. Xa-Ya-Za denote
* component X, Y, and Z packed in the word, with bit depths a, b, c, in order
* from MSB to LSB. Padding bits are represented by the component '!'.
*/
enum p2p_packing {
/** [R8-G8-B8] */
p2p_rgb24_be, /* RGB */
p2p_rgb24_le, /* BGR */
p2p_rgb24,
/** [A8-R8-G8-B8] */
p2p_argb32_be, /* ARGB */
p2p_argb32_le, /* BGRA */
p2p_argb32,
/** [A8-Y8-U8-V8] */
p2p_ayuv_be, /* AYUV */
p2p_ayuv_le, /* VUYA */
p2p_ayuv,
/** [R16-G16-B16] */
p2p_rgb48_be, /* RGB, big-endian components */
p2p_rgb48_le, /* BGR, little-endian components */
p2p_rgb48,
/** [A16-R16-G16-B16] */
p2p_argb64_be, /* ARGB big-endian components */
p2p_argb64_le, /* BGRA little-endian components */
p2p_argb64,
/** [A2-R10-G10-B10] */
p2p_rgb30_be, /* ARGB packed in big-endian DWORD */
p2p_rgb30_le, /* ARGB packed in little-endian DWORD */
p2p_rgb30,
/** [A2-V10-Y10-U10] */
p2p_y410_be, /* AVYU packed in big-endian DWORD */
p2p_y410_le, /* AVYU packed in little-endian DWORD */
p2p_y410,
/** [A16-V16-Y16-U16] */
p2p_y416_be, /* AVYU, big-endian components */
p2p_y416_le, /* UYVA, little-endian components */
p2p_y416,
/** [Y8] [U8] [Y8] [V8] */
p2p_yuy2,
/** [U8] [Y8] [V8] [Y8] */
p2p_uyvy,
/** [Y10-!6] [U10-!6] [Y10-!6] [V10-!6] */
p2p_y210_be, /* YUYV, big-endian components, lower 6 bits zero */
p2p_y210_le, /* YUYV, little-endian components, lower 6 bits zero. Microsoft Y210. */
p2p_y210,
/** [Y16] [U16] [Y16] [V16] */
p2p_y216_be, /* YUYV, big-endian components */
p2p_y216_le, /* YUYV, little-endian components. Microsoft Y216. */
p2p_y216,
/** [!2-V10-Y10-U10] [!2-Y10-U10-Y10] [!2-U10-Y10-V10] [!2-Y10-V10-Y10] */
p2p_v210_be, /* v210 with big-endian DWORDs */
p2p_v210_le, /* Apple/QuickTime v210 */
p2p_v210,
/** [U16] [Y16] [V16] [Y16] */
p2p_v216_be, /* UYVY, big-endian components */
p2p_v216_le, /* UYVY, little-endian components. Apple/QuickTime v216. */
p2p_v216,
/** [U8-V8] */
p2p_nv12_be, /* aka NV21, V first */
p2p_nv12_le, /* NV12 */
p2p_nv12,
/** [U10-!6-V10-!6] */
p2p_p010_be, /* NV21, big-endian components, lower 6 bits zero */
p2p_p010_le, /* NV12, little-endian components, lower 6 bits zero. Microsoft P010. */
p2p_p010,
/** [U16-V16] */
p2p_p016_be, /* NV21, big-endian components */
p2p_p016_le, /* NV12, little-endian components. Microsoft P016. */
p2p_p016,
/** [U10-!6-V10-!6] */
p2p_p210_be, /* NV21, big-endian components, lower 6 bits zero */
p2p_p210_le, /* NV12, little-endian components, lower 6 bits zero. Microsoft P210. */
p2p_p210,
/** [U16-V16] */
p2p_p216_be, /* NV21, big-endian components */
p2p_p216_le, /* NV12, little-endian components. Microsoft P216. */
p2p_p216,
/** [R8-G8-B8-A8] */
p2p_rgba32_be, /* RGBA */
p2p_rgba32_le, /* ABGR */
p2p_rgba32,
/** [R16-G16-B16-A16] */
p2p_rgba64_be, /* RGBA, big-endian components */
p2p_rgba64_le, /* ABGR, little-endian components */
p2p_rgba64,
/** [A16-B16-G16-R16] */
p2p_abgr64_be, /* ABGR, big-endian components */
p2p_abgr64_le, /* RGBA, little-endian components */
p2p_abgr64,
/** [B16-G16-R16] */
p2p_bgr48_be, /* BGR, big-endian components */
p2p_bgr48_le, /* RGB, little-endian components */
p2p_bgr48,
/** [B16-G16-R16-A16] */
p2p_bgra64_be, /* BGRA, big-endian components */
p2p_bgra64_le, /* ARGB, little-endian components */
p2p_bgra64,
p2p_packing_max,
};
struct p2p_buffer_param {
/**
* Planar order: R-G-B-A or Y-U-V-A. Alpha is optional.
* Packed order: Y-UV if NV12/21, else single plane. Y optional for NV12/21.
*/
const void *src[4];
void *dst[4];
ptrdiff_t src_stride[4];
ptrdiff_t dst_stride[4];
unsigned width;
unsigned height;
enum p2p_packing packing;
};
/** Pack/unpack a range of pixels from a scanline. */
typedef void (*p2p_unpack_func)(const void *src, void * const dst[4], unsigned left, unsigned right);
typedef void (*p2p_pack_func)(const void * const src[4], void *dst, unsigned left, unsigned right);
/** Select a line pack/unpack function. */
p2p_unpack_func p2p_select_unpack_func(enum p2p_packing packing);
p2p_pack_func p2p_select_pack_func(enum p2p_packing packing);
p2p_pack_func p2p_select_pack_func_ex(enum p2p_packing packing, int alpha_one_fill);
/** When processing formats like NV12, ignore the unpacked plane. */
#define P2P_SKIP_UNPACKED_PLANES (1UL << 0)
/** When packing, store a bit pattern of all ones in the alpha channel instead of all zeros. */
#define P2P_ALPHA_SET_ONE (1UL << 1)
/** Helper function to pack/unpack between memory locations. */
void p2p_unpack_frame(const struct p2p_buffer_param *param, unsigned long flags) {};
void p2p_pack_frame(const struct p2p_buffer_param *param, unsigned long flags) {};
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* P2P_API_H_ */

View File

@ -1,36 +0,0 @@
project('BestSource', 'cpp',
default_options: ['buildtype=release', 'b_ndebug=if-release', 'cpp_std=c++14'],
meson_version: '>=0.48.0'
)
cmake = import('cmake')
sources = [
'src/audiosource.cpp',
'src/videosource.cpp',
'src/SrcAttribCache.cpp',
'src/BSRational.cpp',
]
deps = [
dependency('libavcodec'),
dependency('libavformat'),
dependency('libavutil'),
]
jansson_dep = dependency('jansson', version: '>= 2.7', required: false)
if jansson_dep.found()
deps += jansson_dep
else
jansson = cmake.subproject('jansson')
deps += jansson.dependency('jansson')
endif
bs_lib = static_library('bestsource', sources,
dependencies: deps,
gnu_symbol_visibility: 'hidden'
)
bestsource_dep = declare_dependency(link_with: bs_lib, include_directories: include_directories('src'))

View File

@ -75,15 +75,15 @@ if (!(Test-Path L-SMASH-Works)) {
Remove-Item release-x86_64-cachedir-cwd.zip Remove-Item release-x86_64-cachedir-cwd.zip
} }
# bestaudiosource # BestSource
if (!(Test-Path bestaudiosource)) { if (!(Test-Path BestSource)) {
$basDir = New-Item -ItemType Directory bestaudiosource $bsDir = New-Item -ItemType Directory BestSource
Set-Location $basDir Set-Location $bsDir
$basReleases = Invoke-WebRequest "https://api.github.com/repos/vapoursynth/bestaudiosource/releases/latest" -Headers $GitHeaders -UseBasicParsing | ConvertFrom-Json $basReleases = Invoke-WebRequest "https://api.github.com/repos/vapoursynth/bestsource/releases/latest" -Headers $GitHeaders -UseBasicParsing | ConvertFrom-Json
$basUrl = $basReleases.assets[0].browser_download_url $bsUrl = $basReleases.assets[0].browser_download_url
Invoke-WebRequest $basUrl -OutFile bas-r1.7z -UseBasicParsing Invoke-WebRequest $bsUrl -OutFile bestsource.7z -UseBasicParsing
7z x bas-r1.7z 7z x bestsource.7z
Remove-Item bas-r1.7z Remove-Item bestsource.7z
Set-Location $DepsDir Set-Location $DepsDir
} }