summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cross/x86_64-w64-clang.txt19
-rw-r--r--cross/x86_64-w64-mingw32.txt1
-rw-r--r--docs/references/references.txt5
-rw-r--r--env/build_cmds.txt50
-rw-r--r--env/msvc_build.sh6
-rw-r--r--env/nixpkgs-patches/539430.diff81
-rw-r--r--flake.lock30
-rw-r--r--flake.nix107
-rw-r--r--meson.build91
-rw-r--r--meson_options.txt27
-rwxr-xr-xscripts/line_count.sh4
-rwxr-xr-xscripts/shaderc_deps.sh15
-rw-r--r--src/buffer/clock.c5
-rw-r--r--src/cache/backings/memory.c6
-rw-r--r--src/cache/handlers/file.c8
-rw-r--r--src/cache/meson.build8
-rw-r--r--src/codec/codec.h6
-rw-r--r--src/codec/ffmpeg/meson.build14
-rw-r--r--src/codec/ffmpeg/packet_ext.c14
-rw-r--r--src/codec/meson.build19
-rw-r--r--src/codec/stb_image.c23
-rw-r--r--src/codec/wuffs.c2
-rw-r--r--src/fruits/cmc/meson.build5
-rw-r--r--src/fruits/cmsrv/cmsrv.c2
-rw-r--r--src/fruits/cmv/cmv.c19
-rw-r--r--src/fruits/meson.build24
-rw-r--r--src/liana/handlers/codec_client.c4
-rw-r--r--src/liana/handlers/codec_server.c1
-rw-r--r--src/portal/src/search.c3
-rw-r--r--src/render/meson.build56
-rw-r--r--src/render/shaders/vr_video.h16
-rw-r--r--src/server/server.c2
-rw-r--r--src/util/color_palette.h14
-rw-r--r--src/util/meson.build5
-rw-r--r--subprojects/SPIRV-Tools.wrap4
-rw-r--r--subprojects/ffmpeg9.wrap8
-rw-r--r--subprojects/glslang.wrap4
-rw-r--r--subprojects/harfbuzz.wrap4
-rw-r--r--subprojects/libalabaster.wrap4
-rw-r--r--subprojects/libcdio-paranoia.wrap6
-rw-r--r--subprojects/libnaunet.wrap4
-rw-r--r--subprojects/libplacebo.wrap4
-rw-r--r--subprojects/packagefiles/ffmpeg/meson.build9
-rw-r--r--subprojects/packagefiles/ffmpeg/meson_options.txt3
-rw-r--r--subprojects/packagefiles/ffmpeg/version_9.0.1.diff29
-rw-r--r--subprojects/packagefiles/libcdio-paranoia/meson.build3
-rw-r--r--subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff54
-rw-r--r--subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff40
-rw-r--r--subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff89
-rw-r--r--subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff13
-rw-r--r--subprojects/shaderc.wrap5
-rw-r--r--subprojects/stela.wrap4
-rw-r--r--tests/cue_splitter.c2
53 files changed, 729 insertions, 252 deletions
diff --git a/cross/x86_64-w64-clang.txt b/cross/x86_64-w64-clang.txt
new file mode 100644
index 0000000..251122c
--- /dev/null
+++ b/cross/x86_64-w64-clang.txt
@@ -0,0 +1,19 @@
+[binaries]
+c = ['x86_64-w64-mingw32-clang', '-fuse-ld=lld']
+cpp = ['x86_64-w64-mingw32-clang++', '-fuse-ld=lld']
+ar = 'x86_64-w64-mingw32-ar'
+strip = 'x86_64-w64-mingw32-strip'
+windres = 'x86_64-w64-mingw32-windres'
+dlltool = 'x86_64-w64-mingw32-dlltool'
+exe_wrapper = 'wine64'
+
+[properties]
+ar = 'x86_64-w64-mingw32-ar'
+nm = 'x86_64-w64-mingw32-nm'
+needs_exe_wrapper = true
+
+[host_machine]
+system = 'windows'
+cpu_family = 'x86_64'
+cpu = 'x86_64'
+endian = 'little'
diff --git a/cross/x86_64-w64-mingw32.txt b/cross/x86_64-w64-mingw32.txt
index 8d75e8d..13289b2 100644
--- a/cross/x86_64-w64-mingw32.txt
+++ b/cross/x86_64-w64-mingw32.txt
@@ -8,6 +8,7 @@ cpp = 'x86_64-w64-mingw32-g++'
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106103
# https://embeddedartistry.com/blog/2020/04/13/prefer-gcc-ar-to-ar-in-your-buildsystems/
ar = 'x86_64-w64-mingw32-gcc-ar'
+nm = 'x86_64-w64-mingw32-gcc-nm'
strip = 'x86_64-w64-mingw32-strip'
windres = 'x86_64-w64-mingw32-windres'
dlltool = 'x86_64-w64-mingw32-dlltool'
diff --git a/docs/references/references.txt b/docs/references/references.txt
index f39942c..cbd1702 100644
--- a/docs/references/references.txt
+++ b/docs/references/references.txt
@@ -28,6 +28,11 @@ Vsync/VRR
* https://blurbusters.com/gsync/gsync101-input-lag-tests-and-settings/15/
* https://old.reddit.com/r/Amd/comments/4ypw5k/freesync_is_so_fcking_awesome/d6zl13v/
+Displays
+~~~~~~~~
+* https://forums.blurbusters.com/viewtopic.php?t=12235
+* https://app.box.com/s/vcocw3z73ta09txiskj7cnk6289j356b/folder/143475297509
+
Latency/Present
~~~~~~~~~~~~~~~
* https://themaister.net/blog/2023/11/12/my-scuffed-game-streaming-adventure-pyrofling/
diff --git a/env/build_cmds.txt b/env/build_cmds.txt
index 06dab23..896ba55 100644
--- a/env/build_cmds.txt
+++ b/env/build_cmds.txt
@@ -1,39 +1,37 @@
# Testing
-meson setup build -Dserver=enabled -Dclient=enabled -Dportal=enabled -Dtests=enabled \
- --force-fallback-for=libplacebo
+meson setup build -Dfruits=cmsrv,cmc,cmv \
+ -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo
# Android
-meson setup build-android -Dserver=disabled -Drenderer-api=gl -Dwindow=glfm \
- -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=mediacodec -Dtests=disabled \
- --cross-file ./cross/aarch64-linux-android.txt --default-library=static
+meson setup build-android -Dfruits=cmv \
+ -Dsources=file,http -Dcodec-hwaccels=mediacodec \
+ --cross-file ./cross/aarch64-linux-android.txt \
+ --default-library=static
# MingW DX11 (Preferred)
-meson setup build-mingw64-dx11 -Drenderer-api=dx11 -Drenderer=libplacebo -Dwindow=win32 \
- -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \
- -Dsources=file -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=d3d11va -Dsubtitles=enabled \
- -Dtests=disabled -Dwin32-compat=false --cross-file ./cross/x86_64-w64-mingw32.txt \
- --default-library=static --strip --buildtype=release -Ddebug=false --optimization=s -Db_lto=true
+meson setup build-mingw64-dx11 -Dfruits=cmv \
+ -Dcodecs=ffmpeg -Dcodec-hwaccels=d3d11va \
+ --cross-file ./cross/x86_64-w64-mingw32.txt \
+ --default-library=static --buildtype=release --optimization=s -Db_lto=true
# MingW Vulkan
-meson setup build-mingw64-vulkan -Drenderer-api=vulkan -Drenderer=libplacebo -Dwindow=win32 \
- -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \
- -Dsources=file -Dcodecs=ffmpeg,stb_image -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=vulkan -Dsubtitles=enabled \
- -Dtests=disabled -Dwin32-compat=false --cross-file ./cross/x86_64-w64-mingw32.txt \
- --default-library=static --strip --buildtype=release -Ddebug=false --optimization=2
+meson setup build-mingw64-vulkan -Dfruits=cmv \
+ -Drenderer-api=vulkan -Dcodecs=ffmpeg -Dcodec-hwaccels=vulkan \
+ --cross-file ./cross/x86_64-w64-mingw32.txt \
+ --default-library=static --buildtype=release --optimization=2
# Windows XP 32bit Support.
-meson setup build-mingw32-min -Drenderer-api=gl -Drenderer=momo -Dwindow=win32 \
- -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \
- -Dsources=file -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=3 -Dsubtitles=enabled \
- -Dtests=disabled -Dwin32-compat=true --cross-file ./cross/i686-w64-mingw32.txt \
- --default-library=static --strip --buildtype=release -Ddebug=false --optimization=s -Db_lto=true
+meson setup build-mingw32-min -Dfruits=cmv \
+ -Drenderer-api=gl -Drenderer=momo -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=3 \
+ -Dwin32-compat=true --cross-file ./cross/i686-w64-mingw32.txt \
+ --default-library=static --buildtype=release --optimization=s -Db_lto=true
# ASan
-meson setup build-asan --buildtype=debug -Db_sanitize=address -Db_lundef=false \
- -Dclient=enabled -Dportal=enabled -Dtests=enabled \
- -Dcodecs=ffmpeg,wuffs,stb_image --force-fallback-for=libplacebo
+meson setup build-asan -Dfruits=cmsrv,cmc,cmv \
+ -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo \
+ --buildtype=debug -Db_sanitize=address -Db_lundef=false
# UBSan
-meson setup build-ubsan --buildtype=debug -Db_sanitize=undefined -Db_lundef=false \
- -Dclient=enabled -Dportal=enabled -Dtests=enabled \
- -Dcodecs=ffmpeg --force-fallback-for=libplacebo
+meson setup build-ubsan -Dfruits=cmsrv,cmc,cmv \
+ -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo \
+ --buildtype=debug -Db_sanitize=undefined -Db_lundef=false
diff --git a/env/msvc_build.sh b/env/msvc_build.sh
index 13c4eca..bf077a9 100644
--- a/env/msvc_build.sh
+++ b/env/msvc_build.sh
@@ -3,10 +3,10 @@
# nix develop .#mingw64
# meson subprojects download msvc-wine
# cd subprojects/msvc-wine-514f8ea/
-# ./vsdownload.py --dest ../../env/msvc-root
-# ./install.sh ../../env/msvc-root
+# ./vsdownload.py --dest /opt/msvc-root
+# ./install.sh /opt/msvc-root
-BIN=env/msvc-root/bin/x64 . subprojects/msvc-wine-514f8ea/msvcenv-native.sh
+BIN=/opt/msvc-root/bin/x64 . subprojects/msvc-wine-514f8ea/msvcenv-native.sh
export INCLUDE="$INCLUDE:$HOME/c/camu/subprojects/vulkan-headers-1.4.325/include"
diff --git a/env/nixpkgs-patches/539430.diff b/env/nixpkgs-patches/539430.diff
new file mode 100644
index 0000000..9c4ec07
--- /dev/null
+++ b/env/nixpkgs-patches/539430.diff
@@ -0,0 +1,81 @@
+diff --git a/pkgs/development/compilers/llvm/common/compiler-rt/default.nix b/pkgs/development/compilers/llvm/common/compiler-rt/default.nix
+index 567462e3eba68..da799c93d08e0 100644
+--- a/pkgs/development/compilers/llvm/common/compiler-rt/default.nix
++++ b/pkgs/development/compilers/llvm/common/compiler-rt/default.nix
+@@ -36,7 +36,8 @@
+ # implementation of the routines instead of the implementation
+ # using ad-hoc mutexes (which doesn't depend on libc at all).
+ # Use of pthreads helps code play better with sanitizers.
+- withAtomicsPthread ? lib.versionAtLeast release_version "19" && stdenv.cc.libc != null,
++ withAtomicsPthread ?
++ lib.versionAtLeast release_version "19" && stdenv.cc.libc != null && !stdenv.hostPlatform.isMinGW,
+
+ # In recent releases, the compiler-rt build seems to produce
+ # many `libclang_rt*` libraries, but not a single unified
+@@ -214,7 +215,7 @@ stdenv.mkDerivation (finalAttrs: {
+ # Fixes https://github.com/NixOS/nixpkgs/issues/393603
+ (lib.cmakeBool "COMPILER_RT_DISABLE_AARCH64_FMV" true)
+ ++ lib.optionals withAtomics [
+- (lib.cmakeBool "COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN" (!withAtomicsLib))
++ (lib.cmakeBool "COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN" withAtomicsLib)
+ (lib.cmakeBool "COMPILER_RT_BUILD_STANDALONE_LIBATOMIC" withAtomicsLib)
+ (lib.cmakeBool "COMPILER_RT_LIBATOMIC_USE_PTHREAD" withAtomicsPthread)
+ ]
+@@ -291,11 +292,21 @@ stdenv.mkDerivation (finalAttrs: {
+ + lib.optionalString forceLinkCompilerRt ''
+ ln -s $out/lib/*/libclang_rt.builtins-*.a $out/lib/libcompiler_rt.a
+ ''
+- + lib.optionalString (withAtomics && withAtomicsLib) ''
+- ln -s $out/lib/*/libclang_rt.atomic-*.so $out/lib/libatomic.so
+- # create a link with the original soname as well, so it's found at runtime
+- ln -s $out/lib/*/libclang_rt.atomic-*.so $out/lib/
+- '';
++ + lib.optionalString (withAtomics && withAtomicsLib) (
++ let
++ isMinGW = stdenv.hostPlatform.isMinGW;
++ sharedLibrary = stdenv.hostPlatform.extensions.sharedLibrary;
++ linkLibrarySuffix = lib.optionalString isMinGW ".a";
++ runtimeDirectory = if isMinGW then "$out/bin" else "$out/lib";
++ atomicLibrary = "libclang_rt.atomic" + lib.optionalString isMinGW "_dynamic" + "-*${sharedLibrary}";
++ in
++ ''
++ mkdir -p ${runtimeDirectory}
++ ln -s $out/lib/*/${atomicLibrary}${linkLibrarySuffix} $out/lib/libatomic${sharedLibrary}${linkLibrarySuffix}
++ # Link the original runtime name where the loader searches for shared libraries.
++ ln -s $out/lib/*/${atomicLibrary} ${runtimeDirectory}/
++ ''
++ );
+
+ meta = llvm_meta // {
+ homepage = "https://compiler-rt.llvm.org/";
+diff --git a/pkgs/development/compilers/llvm/common/default.nix b/pkgs/development/compilers/llvm/common/default.nix
+index af2e39dced099..9afc972ce7c31 100644
+--- a/pkgs/development/compilers/llvm/common/default.nix
++++ b/pkgs/development/compilers/llvm/common/default.nix
+@@ -308,9 +308,11 @@ makeScopeWithSplicing' {
+ && stdenv.targetPlatform.useLLVM or false
+ ) "-lunwind"
+ ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions";
+- nixSupport.cc-ldflags = lib.optionals (
+- !stdenv.targetPlatform.isWasm && !stdenv.targetPlatform.isFreeBSD
+- ) [ "-L${targetLlvmPackages.libunwind}/lib" ];
++ nixSupport.cc-ldflags =
++ lib.optionals (!stdenv.targetPlatform.isWasm && !stdenv.targetPlatform.isFreeBSD) [
++ "-L${targetLlvmPackages.libunwind}/lib"
++ ]
++ ++ lib.optional stdenv.targetPlatform.isMinGW "-L${targetLlvmPackages.compiler-rt}/lib";
+ };
+
+ clangWithLibcAndBasicRtAndLibcxx = wrapCCWith rec {
+@@ -424,6 +426,11 @@ makeScopeWithSplicing' {
+
+ compiler-rt-no-libc = callPackage ./compiler-rt {
+ doFakeLibgcc = stdenv.hostPlatform.useLLVM or false;
++ # This runtime is used to bootstrap the libc-capable toolchain. Keep
++ # atomics in builtins.a until that toolchain can link the shared atomic
++ # runtime against libc (and pthreads, when enabled).
++ withAtomicsLib = false;
++ withAtomicsPthread = false;
+ stdenv =
+ # Darwin needs to use a bootstrap stdenv to avoid an infinite recursion when cross-compiling.
+ if stdenv.hostPlatform.isDarwin then
diff --git a/flake.lock b/flake.lock
index fcc10a7..d9d541a 100644
--- a/flake.lock
+++ b/flake.lock
@@ -41,11 +41,11 @@
]
},
"locked": {
- "lastModified": 1783358420,
- "narHash": "sha256-UEyBpf+XmQe8laXfDzIlo11Er7E0rKrLS8jeMnMj0Ds=",
+ "lastModified": 1787540599,
+ "narHash": "sha256-MHwk52ty3NsLhq9a1IbIfBJZlCUJIdiUYFo52JLK9hY=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "0d33882bd46c1f9ef62276700f5e5f2bd6ff6604",
+ "rev": "03f4cd46bc1dd4f3a96da778d2ce9f7ce39dd450",
"type": "github"
},
"original": {
@@ -79,11 +79,11 @@
"nixpkgs": "nixpkgs_2"
},
"locked": {
- "lastModified": 1782562157,
- "narHash": "sha256-a7+T6QSeowynwZ1ZJJbP8T8ntAytvrui8kFGJmIZt2c=",
+ "lastModified": 1787144466,
+ "narHash": "sha256-HHfv2/HkNSKbbSyU9iD/g8lbP6r4tl33sSw1W4rXCk0=",
"owner": "NixOS",
"repo": "nixos-hardware",
- "rev": "a9cf7546a938c737b079e738de73934a13de9784",
+ "rev": "0471accf8d0a8210b31d947497d179ecc99e0021",
"type": "github"
},
"original": {
@@ -99,11 +99,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
- "lastModified": 1783336371,
- "narHash": "sha256-ZisTtweyb7JUwPP54HAXE9TypT8m89dIxDI36Ak0hAs=",
+ "lastModified": 1784642409,
+ "narHash": "sha256-hcbDqFuySAJawljt5r0sKBCJKYnbtGD0T/ZIozH1Dq0=",
"owner": "nix-community",
"repo": "NixOS-WSL",
- "rev": "a9620cfa43f0c1c30a46c31ae3c6e58cdb124a14",
+ "rev": "eaeb18da90024448a60eb1ec7132eafa4003404e",
"type": "github"
},
"original": {
@@ -143,11 +143,11 @@
},
"nixpkgs_3": {
"locked": {
- "lastModified": 1780243769,
- "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=",
+ "lastModified": 1783776592,
+ "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c",
+ "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3",
"type": "github"
},
"original": {
@@ -159,11 +159,11 @@
},
"nixpkgs_4": {
"locked": {
- "lastModified": 1783224372,
- "narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=",
+ "lastModified": 1787498568,
+ "narHash": "sha256-9i/VTdusq/+NM/tz+J1Re+ojkMB8MBf0QshnYfzHz30=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "d407951447dcd00442e97087bf374aad70c04cea",
+ "rev": "56c02bc00adcf003215cc4bd996d6efaf4cff188",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 8caf0fa..fc793c4 100644
--- a/flake.nix
+++ b/flake.nix
@@ -69,7 +69,9 @@
function (import (nixpkgs.legacyPackages.${system}.applyPatches {
src = nixpkgs;
name = "nixpkgs-camu";
- patches = [ ];
+ patches = [
+ ./env/nixpkgs-patches/539430.diff
+ ];
}) {
inherit system;
inherit overlays;
@@ -227,7 +229,22 @@
'';
});
- devShells = forAllDevSystems (pkgs: rec {
+ devShells = forAllDevSystems (pkgs: let
+ mingw-deps = crossPkgs: with crossPkgs; [
+ ((buildWithFlags zlib "-Os").override { shared = false; })
+ ((buildWithFlags bzip2 "-Os").override { enableStatic = true; enableShared = false; })
+ ((buildWithFlags soxr "-Os").overrideAttrs (oldAttrs: {
+ cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ];
+ }))
+ ((buildWithFlags dav1d "-Os").overrideAttrs (oldAttrs: {
+ mesonFlags = oldAttrs.mesonFlags ++ [ "--default-library=static" ];
+ }))
+ ((buildWithFlags openssl "-Os").override { static = true; })
+ (buildWithFlags xxhash "-Os")
+ ((buildWithFlags libiconv "-Os").override { enableStatic = true; enableShared = false; })
+ vulkan-headers
+ ];
+ in rec {
default = with pkgs; mkShell rec {
NIX_HARDENING_ENABLE = "";
nativeBuildInputs = packages.${stdenv.hostPlatform.system}.default.nativeBuildInputs ++ [
@@ -245,7 +262,8 @@
#pandoc
#emscripten
#makemkv
- mesa-demos
+ #mesa-demos
+ vulkan-validation-layers
# mesa build
#buildPackages.mesa.cross_tools
#mesa.depsBuildBuild
@@ -325,20 +343,22 @@
};
mingw64 = with pkgs; let
- gcc = pkgsCross.ucrt64.buildPackages.wrapCCWith {
- cc = (pkgsCross.ucrt64.buildPackages.gcc.cc.override ({
+ crossPkgs = pkgsCross.ucrt64;
+ gcc = crossPkgs.buildPackages.wrapCCWith {
+ cc = (crossPkgs.buildPackages.gcc.cc.override ({
+ # @TODO: gcc 16 native tls.
+ # https://github.com/msys2/MINGW-packages/issues/29272
threadsCross = { model = "win32"; package = null; };
}));
};
- gccWin32Stdenv = overrideCC pkgsCross.ucrt64.stdenv gcc;
- in mkShell.override { stdenv = gccWin32Stdenv; } {
+ gccWin32Stdenv = overrideCC crossPkgs.stdenv gcc;
+ in crossPkgs.mkShell.override { stdenv = gccWin32Stdenv; } {
# Note that `cc` has to invoke a native compiler not a cross compiler.
# If meson complains that a compiler for the "build machine" is not found,
# it may be due to NIX_COMPILE_FLAGS, or NIX_LDFLAGS.
NIX_HARDENING_ENABLE = "";
nativeBuildInputs = [
git
- buildPackages.gcc
nasm
pkg-config
autoconf
@@ -374,41 +394,53 @@
# vkd3d-proton build
glslang
];
- buildInputs = with pkgsCross.ucrt64; [
- (zlib.override { shared = false; })
- (bzip2.override { enableStatic = true; enableShared = false; })
- (soxr.overrideAttrs (oldAttrs: {
- cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ];
- }))
- (dav1d.overrideAttrs (oldAttrs: {
- mesonFlags = oldAttrs.mesonFlags ++ [ "--default-library=static" ];
- }))
- (openssl.override { static = true; })
- xxhash
- (libiconv.override { enableStatic = true; enableShared = false; })
- vulkan-headers
- #(shaderc.overrideAttrs (oldAttrs: {
- # cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ];
- #}))
- ];
+ buildInputs = mingw-deps pkgsStatic.pkgsCross.ucrt64;
# https://old.reddit.com/r/NixOS/comments/1c4lc1n/how_to_run_this_minimal_python_script_with/kzpao62/
shellHook = ''
export SHELL="${pkgs.bashInteractive}/bin/bash"
- # For native compiler.
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.stdenv.cc.cc.lib}/lib"
export XDG_DATA_DIRS="${pkgs.mesa}/share:$XDG_DATA_DIRS"
# Using x86_64-w64-mingw32-ar (as opposed to x86_64-w64-mingw32-gcc-ar) breaks lto.
unset AR NM
#alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine"
# Silence Wine logging and enable Esync by default.
export WINEDEBUG=-all
- export WINEESYNC=1
export NIX_BUILD_SHELL=$SHELL
export NIX_SHELL="camu-mingw64"
export PS1="(\$NIX_SHELL)"$PS1
'';
};
+ mingw64-clang = with pkgs; let
+ crossPkgs = pkgsCross.ucrt64.pkgsLLVM;
+ clang = crossPkgs.buildPackages.wrapCCWith {
+ cc = crossPkgs.buildPackages.llvmPackages.clang;
+ bintools = crossPkgs.buildPackages.llvmPackages.bintools;
+ libcxx = crossPkgs.llvmPackages.libcxx;
+ };
+ clangWin32Stdenv = overrideCC crossPkgs.llvmPackages.libcxxStdenv clang;
+ #clang = crossPkgs.buildPackages.wrapCCWith {
+ # cc = crossPkgs.buildPackages.llvmPackages.clangUseLLVM;
+ # bintools = crossPkgs.buildPackages.llvmPackages.bintools;
+ # libc = crossPkgs.buildPackages.llvmPackages.bintools.libc;
+ # libcxx = crossPkgs.buildPackages.llvmPackages.libcxx;
+ #};
+ #clangWin32Stdenv = crossPkgs.overrideCC (crossPkgs.llvmPackages.libcxxStdenv.override {
+ # targetPlatform.useLLVM = true;
+ #}) clang;
+ in crossPkgs.mkShell.override { stdenv = clangWin32Stdenv; } {
+ nativeBuildInputs = mingw64.nativeBuildInputs;
+ buildInputs = mingw-deps pkgsStatic.pkgsCross.ucrt64;
+ shellHook = ''
+ export SHELL="${pkgs.bashInteractive}/bin/bash"
+ unset AR NM
+ alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine"
+ export WINEDEBUG=-all
+ export NIX_BUILD_SHELL=$SHELL
+ export NIX_SHELL="camu-mingw64-clang"
+ export PS1="(\$NIX_SHELL)"$PS1
+ '';
+ };
+
mingw32 = with pkgs; let
gcc = pkgsCross.mingw32.buildPackages.wrapCCWith {
cc = (pkgsCross.mingw32.buildPackages.gcc-unwrapped.override (old: {
@@ -419,23 +451,12 @@
in mkShell.override { stdenv = gccWin32Stdenv; } {
NIX_HARDENING_ENABLE = "";
nativeBuildInputs = mingw64.nativeBuildInputs;
- buildInputs = with pkgsCross.mingw32; [
- (buildWithFlags (zlib.override { shared = false; }) "-Os")
- ((buildWithFlags bzip2 "-Os").override { enableStatic = true; enableShared = false; })
- ((buildWithFlags soxr "-Os").overrideAttrs (oldAttrs: {
- cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ];
- }))
- ((buildWithFlags openssl "-Os").override { static = true; })
- (buildWithFlags xxhash "-Os")
- ((buildWithFlags libiconv "-Os").override { enableStatic = true; enableShared = false; })
- vulkan-headers
- ];
+ buildInputs = mingw-deps pkgsStatic.pkgsCross.mingw32;
shellHook = ''
export SHELL="${pkgs.bashInteractive}/bin/bash"
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.stdenv.cc.cc.lib}/lib"
+ unset AR NM
alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine"
export WINEDEBUG=-all
- export WINEESYNC=1
export NIX_BUILD_SHELL=$SHELL
export NIX_SHELL="camu-mingw32"
export PS1="(\$NIX_SHELL)"$PS1
@@ -447,7 +468,7 @@
androidComposition = androidenv.composeAndroidPackages {
cmdLineToolsVersion = "19.0";
toolsVersion = "26.1.1";
- platformToolsVersion = "36.0.2";
+ platformToolsVersion = "37.0.1";
buildToolsVersions = [ "36.1.0" ];
includeEmulator = false;
emulatorVersion = "35.2.5";
@@ -459,7 +480,7 @@
cmakeVersions = [ cmakeVersion ];
includeNDK = true;
# latest = 28.0.13004108, _counted_by conflict.
- ndkVersion = "23.2.8568313";
+ ndkVersion = "29.0.14206865";
useGoogleAPIs = false;
useGoogleTVAddOns = false;
includeExtras = [ "extras;google;gcm" ];
diff --git a/meson.build b/meson.build
index e817842..2126ef2 100644
--- a/meson.build
+++ b/meson.build
@@ -8,7 +8,6 @@ project('camu', ['c', 'cpp'], # Marking cpp here is required for subproject cros
add_languages('c', 'cpp', native: true)
compiler = meson.get_compiler('c')
-cmake = import('cmake')
is_debug = get_option('debug')
is_minsize = get_option('optimization') == 's'
@@ -16,33 +15,85 @@ is_linux = host_machine.system() == 'linux'
is_windows = host_machine.system() == 'windows'
is_msvc = compiler.get_id() == 'msvc' or compiler.get_id() == 'clang-cl'
is_android = host_machine.system() == 'android'
+is_static_shared_lib = is_android
+
+cmake = import('cmake')
+cmake_reltype = is_minsize ? 'MinSizeRel' : 'Release'
+
+need_server = get_option('server').enabled()
+need_client = get_option('client').enabled()
+need_sink = get_option('sink').enabled()
+no_video = get_option('sink-no-video')
+if 'cmsrv' in get_option('fruits')
+ if get_option('server').disabled()
+ error('cmsrv requires the server component.')
+ endif
+ need_server = true
+endif
+if 'cmc' in get_option('fruits')
+ if get_option('client').disabled()
+ error('cmc requires the client component.')
+ endif
+ need_client = true
+endif
+if 'cmv' in get_option('fruits')
+ if get_option('sink').disabled()
+ error('cmv requires the sink component.')
+ endif
+ if not get_option('sink-only')
+ if get_option('server').disabled()
+ error('cmv requires the server component unless in a sink-only configuration.')
+ endif
+ need_server = true
+ endif
+ need_sink = true
+endif
alabaster = subproject('libalabaster')
naunet_opts = []
+if need_server and 'http' in get_option('sources')
+ naunet_opts += ['curl=enabled']
+endif
if get_option('portal').enabled()
- naunet_opts += ['json=enabled', 'curl=enabled']
+ naunet_opts += ['json=enabled']
endif
naunet = subproject('libnaunet', default_options: naunet_opts)
naunet_has_curl = naunet.get_variable('naunet_has_curl')
naunet_has_mmap = naunet.get_variable('naunet_has_mmap')
common_deps = [alabaster.get_variable('alabaster'), naunet.get_variable('naunet')]
-no_video = meson.is_subproject()
-# @TODO: Does it make sense for stela to be a dependency for server-side (headless) transcode.
-#if not no_video
- stela_opts = ['poll=inline', 'event-buffer=false', 'pause=true', 'window=' + get_option('window')]
- if get_option('renderer-api') == 'vulkan'
- stela_opts += ['api=vulkan']
- elif get_option('renderer-api') == 'dx11'
- stela_opts += ['api=dx11']
+window = get_option('window')
+if window == 'auto'
+ if is_windows
+ window = 'win32'
+ elif is_android
+ window = 'glfm'
else
- stela_opts += [is_android ? 'api=gles' : 'api=gl']
- if get_option('renderer-api') == 'gl-rpi'
- stela_opts += ['egl-brcm=true']
- endif
+ window = 'wayland'
+ endif
+endif
+renderer_api = get_option('renderer-api')
+if renderer_api == 'auto'
+ if is_windows
+ renderer_api = 'dx11'
+ elif is_android
+ renderer_api = 'gl'
+ else
+ renderer_api = 'vulkan'
endif
- stela = subproject('stela', default_options: stela_opts).get_variable('stela')
-#endif
+endif
+stela_opts = ['poll=inline', 'event-buffer=false', 'pause=true', 'window=' + window]
+if renderer_api == 'vulkan'
+ stela_opts += ['api=vulkan']
+elif renderer_api == 'dx11'
+ stela_opts += ['api=dx11']
+elif renderer_api in ['gl', 'gl-rpi']
+ stela_opts += [is_android ? 'api=gles' : 'api=gl']
+ if renderer_api == 'gl-rpi'
+ stela_opts += ['egl-brcm=true']
+ endif
+endif
+stela = subproject('stela', default_options: stela_opts).get_variable('stela')
subdir('src/util')
common_deps += [util]
@@ -55,15 +106,15 @@ if get_option('portal').enabled()
subdir('src/portal')
endif
-if get_option('server').enabled()
+if need_server
subdir('src/server')
endif
-if get_option('client').enabled()
+if need_client
subdir('src/libclient')
endif
-if get_option('sink').enabled()
+if need_sink
subdir('src/buffer')
subdir('src/mixer')
if not no_video
@@ -73,7 +124,7 @@ if get_option('sink').enabled()
subdir('src/libsink')
endif
-if not meson.is_subproject()
+if get_option('fruits') != []
subdir('src/fruits')
endif
diff --git a/meson_options.txt b/meson_options.txt
index f7d0f7d..23df945 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,21 +1,24 @@
+# Executables ("Fruits")
+option('fruits', type: 'array', choices: ['cmsrv', 'cmc', 'cmv'], value: [])
+# Core components
+option('server', type: 'feature', value: 'auto')
+option('client', type: 'feature', value: 'auto')
+option('sink', type: 'feature', value: 'auto')
+option('portal', type: 'feature', value: 'disabled')
# Options
-option('sources', type: 'array', choices: ['file', 'http', 'cdio', 'libdvd'], value: ['file', 'http'])
+option('sink-only', type: 'boolean', value: false, yield: true)
+option('sink-no-video', type: 'boolean', value: false)
+option('sources', type: 'array', choices: ['file', 'http', 'cdio', 'libdvd'], value: ['file'])
option('codecs', type: 'array', choices: ['ffmpeg', 'stb_image', 'wuffs', 'spng'], value: ['ffmpeg', 'stb_image'])
option('codec-hwaccels', type: 'array', choices: ['vulkan', 'vaapi', 'mediacodec', 'd3d11va', 'dxva2'], value: [], yield: true)
-option('codec-ffmpeg-version', type: 'combo', choices: ['system', '8', '7', '6', '5', '4', '3', '2'], value: 'system')
+option('codec-ffmpeg-version', type: 'combo', choices: ['auto', 'system', '9', '8', '7', '6', '5', '4', '3', '2'], value: 'auto')
+option('codec-stbi-use-wuffs', type: 'boolean', value: true)
option('audio-backends', type: 'array', choices: ['miniaudio'], value: ['miniaudio'])
option('renderer', type: 'combo', choices: ['libplacebo', 'momo'], value: 'libplacebo')
-option('renderer-api', type: 'combo', choices: ['vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'vulkan', yield: true)
+option('renderer-api', type: 'combo', choices: ['auto', 'vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'auto', yield: true)
option('renderer-compiler', type: 'combo', choices: ['glslang', 'shaderc'], value: 'shaderc')
option('subtitles', type: 'feature', value: 'enabled', yield: true)
-option('window', type: 'combo', choices: ['wayland', 'x11', 'win32', 'glfw', 'glfm'], value: 'wayland')
+option('window', type: 'combo', choices: ['auto', 'wayland', 'x11', 'win32', 'glfw', 'glfm'], value: 'auto')
option('win32-compat', type: 'boolean', value: false, yield: true)
option('release-asserts', type: 'boolean', value: true, yield: true)
-option('tests', type: 'feature', value: 'auto', yield: true)
-
-# Executables ("Fruits")
-option('portal', type: 'feature', value: 'disabled')
-option('server', type: 'feature', value: 'enabled')
-option('sink', type: 'feature', value: 'enabled')
-option('sink-only', type: 'boolean', value: false, yield: true)
-option('client', type: 'feature', value: 'disabled')
+option('tests', type: 'feature', value: 'disabled', yield: true)
diff --git a/scripts/line_count.sh b/scripts/line_count.sh
index 215c7d0..83b89bb 100755
--- a/scripts/line_count.sh
+++ b/scripts/line_count.sh
@@ -2,15 +2,15 @@
export LC_ALL="C"
find ./src ./scripts ./env -type f \
-not -path "*__pycache__*" \
- -not -path "./env/msvc-root/*" \
-not -path "./env/nixpkgs-patches/*" \
+ -not -path "./src/fruits/cmv/icon.*" \
-not -path "./src/fruits/droid/*" \
-not -path "./src/portal/cpy/portal.c" \
-not -path "./src/portal/cpy/portal.h" \
-not -path "./src/portal/patches/*" \
- -not -path "./src/portal/py/.mypy_cache/*" \
-not -path "./src/portal/py/tests/*" \
-not -path "./src/portal/vendor/*" \
+ -not -path "./src/render/shaders/*.glsl" \
-exec sloccount {} +
#-exec sed -i 's///g' {} +
diff --git a/scripts/shaderc_deps.sh b/scripts/shaderc_deps.sh
index c9c793f..fb3991a 100755
--- a/scripts/shaderc_deps.sh
+++ b/scripts/shaderc_deps.sh
@@ -4,17 +4,18 @@
# https://github.com/google/shaderc/blob/known-good/known_good.json
+git clone https://github.com/KhronosGroup/glslang.git glslang
+cd glslang
+git checkout 168d452a4f460d24b588fed08477a81c44ee27a1
+cd ../
+
git clone https://github.com/KhronosGroup/SPIRV-Tools.git spirv-tools
cd spirv-tools
-git checkout c1cb30bb04e2bf911755a40df1242cc6e3d83e26
+git checkout b707790a898e44038547df54580022fc1cf89c3d
+git apply ../../../packagefiles/shaderc/spirv_tools_build_version.diff
cd ../
git clone https://github.com/KhronosGroup/SPIRV-Headers.git spirv-headers
cd spirv-headers
-git checkout ad9184e76a66b1001c29db9b0a3e87f646c64de0
-cd ../
-
-git clone https://github.com/KhronosGroup/glslang.git glslang
-cd glslang
-git checkout 5ed4003a18a10a9d1bd7e43aaf1664499abffa83
+git checkout 29981f65241605e08b0ede4cfeb999fe3b723c6a
cd ../
diff --git a/src/buffer/clock.c b/src/buffer/clock.c
index 86d6739..fbe7ec5 100644
--- a/src/buffer/clock.c
+++ b/src/buffer/clock.c
@@ -40,6 +40,7 @@ static inline void offset_tick(struct camu_clock *clock, f64 diff)
void camu_clock_set(struct camu_clock *clock, f64 base)
{
clock->base = base;
+ clock->offset = 0.0;
atomic_store(f64)(&clock->tick, SET, AL_ATOMIC_RELAXED);
atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELAXED);
atomic_store(bool)(&clock->external_pause, false, AL_ATOMIC_RELAXED);
@@ -165,7 +166,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo
}
}
- f64 pts = (clock->base - clock->offset) + (current - tick);
+ f64 pts = clock->base + (current - tick);
bool signal_pause = false;
*armed_for_pause = pause != RUNNING || atomic_load(bool)(&clock->external_pause, AL_ATOMIC_RELAXED);
@@ -182,7 +183,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo
atomic_store(f64)(&clock->last_pts, pts, AL_ATOMIC_RELAXED);
}
- return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : pts + latency;
+ return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : (pts - clock->offset) + latency;
}
f64 camu_clock_get_last_pts(struct camu_clock *clock)
diff --git a/src/cache/backings/memory.c b/src/cache/backings/memory.c
index 063c1c5..ba0bb54 100644
--- a/src/cache/backings/memory.c
+++ b/src/cache/backings/memory.c
@@ -6,7 +6,11 @@ static void ensure_allocated(struct cch_backing_memory *mem, off_t amount)
{
if (amount > mem->expanse) mem->expanse = amount;
if (amount > mem->alloc) {
- mem->alloc = al_next_power_of_two(amount);
+ if (amount < MB(8)) {
+ mem->alloc = al_next_power_of_two(amount);
+ } else {
+ mem->alloc = amount;
+ }
mem->data = (u8 *)al_realloc(mem->data, mem->alloc);
}
}
diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c
index 1a70350..4ca8f47 100644
--- a/src/cache/handlers/file.c
+++ b/src/cache/handlers/file.c
@@ -30,11 +30,11 @@ static s32 handler_file_guess_format(struct cch_handler *handler)
struct cch_backing_file *backing = (struct cch_backing_file *)file->backing;
str *path = &backing->file.path;
u32 dot = al_str_rfind(path, '.');
- if (dot != AL_STR_NO_POS) {
- str ext = al_str_substr(path, dot, path->length);
- return camu_guess_format(NULL, &ext, NULL);
+ if (dot == AL_STR_NO_POS) {
+ return CAMU_CODEC_FALLBACK;
}
- return -1;
+ str ext = al_str_substr(path, dot, path->length);
+ return camu_guess_format(NULL, &ext, NULL);
}
static void handler_file_free(struct cch_handler **handler)
diff --git a/src/cache/meson.build b/src/cache/meson.build
index 816b101..8243893 100644
--- a/src/cache/meson.build
+++ b/src/cache/meson.build
@@ -8,7 +8,8 @@ cache_deps = []
cache_args = []
if 'file' in get_option('sources')
- if naunet_has_mmap
+ # @TODO: file mapped vs non-mapped should be selectable at runtime.
+ if naunet_has_mmap and not is_android
cache_src += ['backings/file_mapped.c']
else
cache_src += ['backings/file.c']
@@ -22,11 +23,12 @@ if 'http' in get_option('sources') and naunet_has_curl
endif
if 'cdio' in get_option('sources')
+ libcdio = dependency('libcdio', allow_fallback: true)
libcdio_paranoia = dependency('libcdio_paranoia', allow_fallback: true)
libcdio_cdda = dependency('libcdio_cdda', allow_fallback: true)
- if libcdio_paranoia.found() and libcdio_cdda.found()
+ if libcdio.found() and libcdio_paranoia.found() and libcdio_cdda.found()
cache_src += ['handlers/cdio.c']
- cache_deps += [libcdio_paranoia, libcdio_cdda]
+ cache_deps += [libcdio, libcdio_paranoia, libcdio_cdda]
cache_args += ['-DCACHE_HAVE_CDIO']
endif
endif
diff --git a/src/codec/codec.h b/src/codec/codec.h
index f1c979b..bb54b3b 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -210,7 +210,7 @@ struct camu_demuxer {
bool (*seek)(struct camu_demuxer *, u64, bool);
void (*free)(struct camu_demuxer **);
array(struct camu_codec_stream) streams;
- // @TODO: .mkv can probably have more than 64 streams.
+ // @TODO: .mkv (at least) can probably have more than 64 streams.
u64 subscribed;
};
@@ -440,7 +440,7 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type)
char *c_short_name = short_name ? al_str_to_c_str(short_name) : NULL;
char *c_ext = ext ? al_str_to_c_str(ext) : NULL;
char *c_mime_type = mime_type ? al_str_to_c_str(mime_type) : NULL;
- // Empty short_name to attempt avoiding image2 probing.
+ // Empty short_name to avoid image2 probing.
const AVOutputFormat *fmt = av_guess_format(c_short_name ? c_short_name : "", c_ext, c_mime_type);
if (c_short_name) al_free(c_short_name);
if (c_ext) al_free(c_ext);
@@ -448,5 +448,5 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type)
// In FFmpeg AV_CODEC_ID_MJPEG also means "image2".
if (fmt) return (fmt->audio_codec != AV_CODEC_ID_NONE) ? fmt->audio_codec : fmt->video_codec;
#endif
- return -1;
+ return CAMU_CODEC_FALLBACK;
}
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
index e34cc92..1691c29 100644
--- a/src/codec/ffmpeg/meson.build
+++ b/src/codec/ffmpeg/meson.build
@@ -19,15 +19,23 @@ foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice',
endif
endforeach
ffmpeg_version_option = get_option('codec-ffmpeg-version')
+if ffmpeg_version_option == 'auto'
+ expect_system = not (is_windows or is_android)
+ if expect_system
+ ffmpeg_version_option = 'system'
+ else # Latest.
+ ffmpeg_version_option = '9'
+ endif
+endif
# Check for FFmpeg version in the environment.
if not ffmpeg_force_fallback
- libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8' }
- libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60' }
+ libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8', '61': '9' }
+ libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60', '9': '61' }
if ffmpeg_version_option != 'system'
ffmpeg_version_int = ffmpeg_version_option.to_int()
# Overriding a found dependency will error but overriding a found dependency of the wrong version is allowed.
libavutil_version_request = ['>=' + libavutil_version_rev[(ffmpeg_version_int).to_string()] + '.0.0']
- if ffmpeg_version_int < 8
+ if ffmpeg_version_int < 9
libavutil_version_request += ['<' + libavutil_version_rev[(ffmpeg_version_int + 1).to_string()] + '.0.0']
endif
libavutil = dependency('libavutil', required: false, allow_fallback: false, version: libavutil_version_request)
diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c
index 6934cfe..8f44caa 100644
--- a/src/codec/ffmpeg/packet_ext.c
+++ b/src/codec/ffmpeg/packet_ext.c
@@ -6,7 +6,9 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame
NNWT_PACKET_WRITE_TYPE(packet, enum AVCodecID, codecpar->codec_id);
NNWT_PACKET_WRITE_TYPE(packet, u32, codecpar->codec_tag);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->extradata_size);
- NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size);
+ if (codecpar->extradata_size) {
+ NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size);
+ }
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->format);
NNWT_PACKET_WRITE_TYPE(packet, s64, codecpar->bit_rate);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->bits_per_coded_sample);
@@ -118,10 +120,12 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet
NNWT_PACKET_READ_TYPE(packet, enum AVCodecID, codecpar->codec_id);
NNWT_PACKET_READ_TYPE(packet, u32, codecpar->codec_tag);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->extradata_size);
- codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size);
- u8 *extradata;
- NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata);
- al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size);
+ if (codecpar->extradata_size > 0) {
+ codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size);
+ u8 *extradata;
+ NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata);
+ al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size);
+ }
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->format);
NNWT_PACKET_READ_TYPE(packet, s64, codecpar->bit_rate);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->bits_per_coded_sample);
diff --git a/src/codec/meson.build b/src/codec/meson.build
index a92a23d..7dfc668 100644
--- a/src/codec/meson.build
+++ b/src/codec/meson.build
@@ -10,12 +10,23 @@ endif
if 'stb_image' in get_option('codecs')
stb = []
stb_args = ['-DCAMU_HAVE_STB_IMAGE']
- if not compiler.check_header('stb/stb_image.h')
- stb = [subproject('stb').get_variable('stb')]
- stb_args += ['-DCAMU_LOCAL_STB']
+ stb_deps = []
+ if get_option('codec-stbi-use-wuffs')
+ stb_args += ['-DCAMU_STBI_USE_WUFFS']
+ if not compiler.check_header('wuffs/wuffs-v0.4.c')
+ wuffs = [subproject('wuffs').get_variable('wuffs')]
+ stb_deps += [wuffs]
+ stb_args += ['-DCAMU_LOCAL_WUFFS']
+ endif
+ else
+ if not compiler.check_header('stb/stb_image.h')
+ stb = [subproject('stb').get_variable('stb')]
+ stb_deps += [stb]
+ stb_args += ['-DCAMU_LOCAL_STB']
+ endif
endif
stb_codec = declare_dependency(sources: ['stb_image.c'],
- dependencies: stb, compile_args: stb_args)
+ dependencies: stb_deps, compile_args: stb_args)
codec_server_deps += [stb_codec]
codec_client_deps += [stb_codec]
endif
diff --git a/src/codec/stb_image.c b/src/codec/stb_image.c
index b37d6da..39b3a13 100644
--- a/src/codec/stb_image.c
+++ b/src/codec/stb_image.c
@@ -1,5 +1,27 @@
#define AL_LOG_SECTION "stb_image"
#include <al/log.h>
+
+#ifdef CAMU_STBI_USE_WUFFS
+#define WUFFS_IMPLEMENTATION
+#define WUFFS_CONFIG__MODULES
+#define WUFFS_CONFIG__MODULE__BASE
+#define WUFFS_CONFIG__MODULE__ADLER32
+#define WUFFS_CONFIG__MODULE__DEFLATE
+#define WUFFS_CONFIG__MODULE__ZLIB
+#define WUFFS_CONFIG__MODULE__CRC32
+#define WUFFS_CONFIG__MODULE__PNG
+#define WUFFS_CONFIG__MODULE__JPEG
+#define WUFFS_CONFIG__MODULE__IMAGE
+#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST
+#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y
+#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL
+#define WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB
+#ifdef CAMU_LOCAL_WUFFS
+#include <wuffs-unsupported-snapshot.c>
+#else
+#include <wuffs/wuffs-v0.4.c>
+#endif
+#else
#include "common.h"
#define STBI_MALLOC camu_page_alloc
#define STBI_FREE al_free
@@ -13,6 +35,7 @@
#else
#include <stb/stb_image.h>
#endif
+#endif
#include "stb_image.h"
diff --git a/src/codec/wuffs.c b/src/codec/wuffs.c
index 7050fb4..53d181b 100644
--- a/src/codec/wuffs.c
+++ b/src/codec/wuffs.c
@@ -1,3 +1,4 @@
+#define WUFFS_IMPLEMENTATION
#define WUFFS_CONFIG__MODULES
#define WUFFS_CONFIG__MODULE__BASE
#define WUFFS_CONFIG__MODULE__ADLER32
@@ -7,7 +8,6 @@
#define WUFFS_CONFIG__MODULE__PNG
#define WUFFS_CONFIG__MODULE__JPEG
#define WUFFS_CONFIG__MODULE__IMAGE
-#define WUFFS_IMPLEMENTATION
#ifdef CAMU_LOCAL_WUFFS
#include <wuffs-unsupported-snapshot.c>
#else
diff --git a/src/fruits/cmc/meson.build b/src/fruits/cmc/meson.build
index bb9d38d..0728532 100644
--- a/src/fruits/cmc/meson.build
+++ b/src/fruits/cmc/meson.build
@@ -19,8 +19,9 @@ if use_tui
cmc_deps += [notcurses, notcurses_core, codecs_client]
endif
+cmc_link_args = []
if is_windows and not is_msvc
- cmc_args += ['-static', '-static-libgcc', '-static-libstdc++', '-mwindows', '-municode']
+ cmc_link_args += ['-mconsole', '-municode', '-static', '-static-libgcc', '-static-libstdc++']
endif
-executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_args, install: true)
+executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_link_args, install: true)
diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c
index 53fbc98..b0793d1 100644
--- a/src/fruits/cmsrv/cmsrv.c
+++ b/src/fruits/cmsrv/cmsrv.c
@@ -1,7 +1,9 @@
#define AL_LOG_SECTION "cmsrv"
#include <al/log.h>
#include <nnwt/common.h>
+#ifndef NAUNET_ON_WINDOWS
#define CMSRV_LOCAL_SOCKET
+#endif
#ifdef CMSRV_LOCAL_SOCKET
#include <nnwt/line_processor.h>
#endif
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index a525377..58c8e32 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -109,12 +109,20 @@ s32 window_system_main(u32 argc, str *argv, void *extra)
{
(void)extra;
- bool local = argc > 1;
+ bool local;
#ifdef CAMU_SINK_ONLY
+ local = argc > 1;
if (local) {
log_warn("Got arguments in a sink-only configuration.");
return EXIT_FAILURE;
}
+#else
+ char *SINK_SERVER = getenv("SINK_SERVER");
+ if (SINK_SERVER && al_strscmp(SINK_SERVER, "1") == 0) {
+ local = true;
+ } else {
+ local = argc > 1;
+ }
#endif
#ifdef CAMU_HAVE_FFMPEG
@@ -177,14 +185,7 @@ s32 window_system_main(u32 argc, str *argv, void *extra)
}
#endif
- char *home_env = getenv("HOME");
- if (home_env) {
- str color_palette;
- al_str_from(&color_palette, home_env);
- al_str_cat(&color_palette, &al_str_c("/.config/colors.json"));
- camu_colors_maybe_init(&color_palette);
- al_str_free(&color_palette);
- }
+ camu_colors_default_init();
str window_name;
al_str_from(&window_name, "Sink (");
diff --git a/src/fruits/meson.build b/src/fruits/meson.build
index f53a653..b152990 100644
--- a/src/fruits/meson.build
+++ b/src/fruits/meson.build
@@ -1,6 +1,6 @@
-use_tuis = not is_windows
-
-if use_tuis and (get_option('server').enabled() or get_option('client').enabled())
+use_tuis = not is_windows and not is_android
+use_tuis = use_tuis and ('cmsrv' in get_option('fruits') or 'cmc' in get_option('fruits'))
+if use_tuis
notcurses = dependency('notcurses', required: false, allow_fallback: false)
notcurses_core = dependency('notcurses-core', required: false, allow_fallback: false)
if not notcurses.found() or not notcurses_core.found()
@@ -26,18 +26,6 @@ if use_tuis and (get_option('server').enabled() or get_option('client').enabled(
endif
endif
-if get_option('server').enabled()
- subdir('cmsrv')
-endif
-
-if get_option('client').enabled()
- subdir('cmc')
-endif
-
-if get_option('sink').enabled()
- if is_android
- subdir('ctv')
- else
- subdir('cmv')
- endif
-endif
+foreach fruit : get_option('fruits')
+ subdir(fruit)
+endforeach
diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c
index c3dded1..5c8e94d 100644
--- a/src/liana/handlers/codec_client.c
+++ b/src/liana/handlers/codec_client.c
@@ -84,7 +84,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
}
// Push packet.
- u32 rindex = packet->rindex;
+ const u32 rindex = packet->rindex;
bool success;
u8 mode = nn_packet_read_u8(packet);
// @TODO: default: shouldn't be a case. We should check for an invalid packet.
@@ -138,7 +138,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
al_assert_and_return(false);
}
- // Restore packet rindex in case we resue it.
+ // Restore packet rindex in case we reuse it.
packet->rindex = rindex;
if (!success) {
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index a7fc587..31fbef8 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -17,6 +17,7 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han
codec->demux = NULL;
codec->codec_info = camu_codec_info_by_type(cch_entry_guess_format(handle->entry));
if (!codec->codec_info) {
+ log_warn("No codec for this format.");
return false;
}
log_info("Selected demuxer: %.*s.", al_str_x(&codec->codec_info->name));
diff --git a/src/portal/src/search.c b/src/portal/src/search.c
index d442d94..7af4bea 100644
--- a/src/portal/src/search.c
+++ b/src/portal/src/search.c
@@ -3,6 +3,8 @@
#include "../../server/common.h"
+#undef _XOPEN_SOURCE
+#undef _POSIX_C_SOURCE
#include "../cpy/portal.c"
#include "search.h"
@@ -174,6 +176,7 @@ static void results_signal_callback(void *userdata)
}
// @TODO: Fully defer init.
+// - And fix init() -> (no close()) -> free() complications.
void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache *cache,
struct nn_event_loop *loop, void *userdata)
{
diff --git a/src/render/meson.build b/src/render/meson.build
index d342312..ee0017a 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -23,15 +23,11 @@ elif get_option('renderer') == 'libplacebo'
'xxhash=auto'
]
- if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11'
+ if renderer_api == 'vulkan' or renderer_api == 'dx11'
if get_option('renderer-compiler') == 'shaderc'
shaderc_found = false
if 'shaderc' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback'
- if is_windows
- shaderc = dependency('shaderc_combined', required: false, allow_fallback: false)
- else
- shaderc = dependency('shaderc', required: false, allow_fallback: false)
- endif
+ shaderc = dependency('shaderc', required: false, allow_fallback: false)
shaderc_found = shaderc.found()
endif
if shaderc_found
@@ -39,30 +35,35 @@ elif get_option('renderer') == 'libplacebo'
else
shaderc_opts = cmake.subproject_options()
shaderc_opts.set_override_option('warning_level', '0') # Doesn't work.
- reltype = is_minsize ? 'MinSizeRel' : 'Release'
- shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype })
+ shaderc_opts.add_cmake_defines({ 'BUILD_SHARED_LIBS': false })
shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true })
shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true })
shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true })
shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_ENABLE_HLSL': false })
+ # glslang & spirv-tools
+ shaderc_opts.add_cmake_defines({ 'ENABLE_RTTI': false })
# glslang
shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false })
+ shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_JS': false })
shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false })
- shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false })
shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS': false })
spirv_optimizer = true
shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer })
# spirv-tools
+ shaderc_opts.add_cmake_defines({ 'SPIRV_ALLOW_TIMERS': false })
+ shaderc_opts.add_cmake_defines({ 'SPIRV_COLOR_TERMINAL': false })
shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false })
shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts)
shaderc = shaderc_proj.dependency('shaderc')
meson.override_dependency('shaderc', declare_dependency(dependencies: shaderc, version: '2026.2'))
render_deps += [
shaderc_proj.dependency('shaderc_util'),
- shaderc_proj.dependency('glslang'),
shaderc_proj.dependency('MachineIndependent'),
shaderc_proj.dependency('OSDependent'),
shaderc_proj.dependency('GenericCodeGen'),
+ shaderc_proj.dependency('glslang'),
shaderc_proj.dependency('SPIRV'),
shaderc_proj.dependency('SPIRV-Tools-static')
]
@@ -72,17 +73,21 @@ elif get_option('renderer') == 'libplacebo'
endif
libplacebo_opts += ['shaderc=enabled', 'glslang=disabled']
else
- glslang = dependency('glslang', required: false, allow_fallback: false)
- if glslang.found()
+ glslang_found = false
+ if 'glslang' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback'
+ glslang = dependency('glslang', required: false, allow_fallback: false)
+ glslang_found = glslang.found()
+ endif
+ if glslang_found
render_deps += [glslang]
else
# Currently does not build.
- prefer_static = get_option('prefer_static')
+ spirv_headers_proj = cmake.subproject('SPIRV-Headers')
+ spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers')
spirv_optimizer = false
if spirv_optimizer
- spirv_headers_proj = cmake.subproject('SPIRV-Headers')
- spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers')
spirv_tools_opts = cmake.subproject_options()
+ spirv_tools_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype })
spirv_tools_opts.add_cmake_defines({ 'SPIRV-Headers_SOURCE_DIR': meson.source_root() + '/subprojects/SPIRV-Headers-b824a46' })
spirv_tools_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false })
spirv_tools_proj = cmake.subproject('SPIRV-Tools', options: spirv_tools_opts)
@@ -91,8 +96,7 @@ elif get_option('renderer') == 'libplacebo'
endif
glslang_opts = cmake.subproject_options()
glslang_opts.set_override_option('warning_level', '0')
- reltype = is_minsize ? 'MinSizeRel' : 'Release'
- glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype })
glslang_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false })
glslang_opts.add_cmake_defines({ 'ENABLE_HLSL': false })
glslang_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false })
@@ -100,24 +104,25 @@ elif get_option('renderer') == 'libplacebo'
glslang_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer })
glslang_opts.add_cmake_defines({ 'ALLOW_EXTERNAL_SPIRV_TOOLS': spirv_optimizer })
glslang_proj = cmake.subproject('glslang', options: glslang_opts)
- spirv = glslang_proj.dependency('SPIRV')
glslang = glslang_proj.dependency('glslang')
glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits')
- meson.override_dependency('SPIRV', spirv, static: prefer_static)
+ spirv = glslang_proj.dependency('SPIRV')
+ prefer_static = get_option('prefer_static')
meson.override_dependency('glslang', glslang, static: prefer_static)
meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits, static: prefer_static)
+ meson.override_dependency('SPIRV', spirv, static: prefer_static)
render_deps += [
glslang_proj.dependency('MachineIndependent'),
glslang_proj.dependency('OSDependent'),
glslang_proj.dependency('GenericCodeGen'),
- spirv,
glslang,
- glslang_default_resource_limits
+ glslang_default_resource_limits,
+ spirv,
+ spirv_headers
]
if spirv_optimizer
render_deps += [
spirv_tools,
- spirv_headers,
spirv_tools_opt
]
endif
@@ -128,12 +133,11 @@ elif get_option('renderer') == 'libplacebo'
libplacebo_opts += ['glslang=disabled', 'shaderc=disabled']
endif
- if get_option('renderer-api') == 'vulkan'
+ if renderer_api == 'vulkan'
libplacebo_opts += ['vulkan=enabled', 'd3d11=disabled', 'opengl=disabled']
- elif get_option('renderer-api') == 'dx11'
+ elif renderer_api == 'dx11'
spirv_cross_opts = cmake.subproject_options()
- reltype = is_minsize ? 'MinSizeRel' : 'Release'
- spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype })
spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false })
spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false })
spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false })
diff --git a/src/render/shaders/vr_video.h b/src/render/shaders/vr_video.h
index c892601..2dc54bd 100644
--- a/src/render/shaders/vr_video.h
+++ b/src/render/shaders/vr_video.h
@@ -33,18 +33,18 @@ static char vr_video_shader[] = \
"vec4 hook() {"
" float yaw = M_PI*mouse_x;"
" float pitch = M_PI*(-0.5+mouse_y);"
-" float roll = M_PI*0.0;"
-" float t = tan(fov/2.0);"
+" float roll = M_PI*0.;"
+" float t = tan(fov/2.);"
" float c = cos(pitch);"
" float s = sin(pitch);"
" float r = target_size.y/target_size.x;"
" float sR = sin(roll);"
" float cR = cos(roll);"
-" mat3 m = mat3(2.0*t*cR, 2.0*sR*t*r, -t*(cR+sR*r), -2.0*sR*t*c, 2.0*cR*t*c*r, t*c*(sR-cR*r)-s, -2.0*sR*t*s, 2.0*cR*t*s*r, t*s*(sR-cR*r)+c);"
-" vec3 p = vec3(HOOKED_pos, 1.0)*m;"
-" float theta = atan(p.x, p.z)+yaw;"
-" float phi = atan(p.y, length(p.xz))+M_PI/2.0;"
-" float x = fract(theta/(2.0*M_PI));"
+" mat3 m = mat3(2.*t*cR,2.*sR*t*r,-t*(cR+sR*r),-2.*sR*t*c,2.*cR*t*c*r,t*c*(sR-cR*r)-s,-2.*sR*t*s,2.*cR*t*s*r,t*s*(sR-cR*r)+c);"
+" vec3 p = vec3(HOOKED_pos,1.)*m;"
+" float theta = atan(p.x,p.z)+yaw;"
+" float phi = atan(p.y,length(p.xz))+M_PI/2.;"
+" float x = fract(theta/(2.*M_PI));"
" float y = phi/M_PI;" // Range: [M_PI, 2.0*M_PI] = Right eye 180 degrees. float(max(theta, mode-1.0) > 0.0) = Always true except mode = 0.0 and theta < 0.0.
-" return HOOKED_tex(vec2(x, y))*clamp(abs((1.0-mode)-(step(M_PI, theta)-step(2.0*M_PI, theta)))*float(max(theta, mode-1.0)>=0.0), 0.0, 1.0);"
+" return HOOKED_tex(vec2(x,y))*clamp(abs((1.-mode)-(step(M_PI,theta)-step(2.*M_PI,theta)))*float(max(theta,mode-1.)>=0.),0.,1.);"
"}";
diff --git a/src/server/server.c b/src/server/server.c
index 41633d2..c547b5d 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -862,7 +862,7 @@ static bool multiplex_callback(void *userdata, u8 id, struct nn_packet_stream *s
void camu_server_init(struct camu_server *server, struct nn_event_loop *loop)
{
server->loop = loop;
- server->addr = al_str_null();
+ server->addr = AL_STR_EMPTY;
al_array_init(server->users);
al_array_init(server->nodes);
al_array_init(server->clients);
diff --git a/src/util/color_palette.h b/src/util/color_palette.h
index 7330135..b0cc9f4 100644
--- a/src/util/color_palette.h
+++ b/src/util/color_palette.h
@@ -2,6 +2,7 @@
#include <al/types.h>
#include <al/str.h>
+#include <nnwt/file.h>
enum {
CAMU_COLOR_BACKGROUND = 0,
@@ -33,3 +34,16 @@ struct camu_color_palette {
extern struct camu_color_palette global_color_palette;
bool camu_colors_maybe_init(str *path);
+
+static inline void camu_colors_default_init()
+{
+ char *home_env = getenv("HOME");
+ if (home_env) {
+ str color_palette;
+ al_str_from(&color_palette, home_env);
+ nn_path_append(&color_palette, &al_str_c(".config"));
+ nn_path_append(&color_palette, &al_str_c("colors.json"));
+ camu_colors_maybe_init(&color_palette);
+ al_str_free(&color_palette);
+ }
+}
diff --git a/src/util/meson.build b/src/util/meson.build
index c2c3c3d..2da5b08 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -4,9 +4,8 @@ if get_option('portal').enabled()
blake3 = dependency('libblake3', required: false, allow_fallback: false)
if not blake3.found()
blake3_opts = cmake.subproject_options()
- reltype = is_minsize ? 'MinSizeRel' : 'Release'
- blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
- blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': true })
+ blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype })
+ blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': is_static_shared_lib })
blake3 = cmake.subproject('BLAKE3', options: blake3_opts).dependency('blake3')
endif
util_deps += [blake3]
diff --git a/subprojects/SPIRV-Tools.wrap b/subprojects/SPIRV-Tools.wrap
index 1586b61..347a62d 100644
--- a/subprojects/SPIRV-Tools.wrap
+++ b/subprojects/SPIRV-Tools.wrap
@@ -1,6 +1,6 @@
[wrap-git]
-directory = SPIRV-Tools-v2025.4
+directory = SPIRV-Tools-v2026.2
url = https://github.com/KhronosGroup/SPIRV-Tools.git
-revision = v2025.4
+revision = v2026.2
depth = 1
method = cmake
diff --git a/subprojects/ffmpeg9.wrap b/subprojects/ffmpeg9.wrap
new file mode 100644
index 0000000..313d731
--- /dev/null
+++ b/subprojects/ffmpeg9.wrap
@@ -0,0 +1,8 @@
+[wrap-file]
+directory = ffmpeg-9.0.1
+source_url = https://ffmpeg.org/releases/ffmpeg-9.0.1.tar.gz
+source_filename = ffmpeg-9.0.1.tar.gz
+source_hash = 657dbf258cce6c0681714b6e40b8ca69e988c67ecfc2f7aab47574e6ebaceb38
+
+patch_directory = ffmpeg
+diff_files = ffmpeg/version_9.0.1.diff
diff --git a/subprojects/glslang.wrap b/subprojects/glslang.wrap
index e06e2f6..ef7a4dc 100644
--- a/subprojects/glslang.wrap
+++ b/subprojects/glslang.wrap
@@ -1,6 +1,6 @@
[wrap-git]
-directory = glslang-16.0.0
+directory = glslang-16.4.0
url = https://github.com/KhronosGroup/glslang.git
-revision = 16.0.0
+revision = 16.4.0
depth = 1
method = cmake
diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap
index 5d721b0..a497a7d 100644
--- a/subprojects/harfbuzz.wrap
+++ b/subprojects/harfbuzz.wrap
@@ -1,7 +1,7 @@
[wrap-git]
-directory = harfbuzz-14.2.1
+directory = harfbuzz-14.3.1
url = https://github.com/harfbuzz/harfbuzz.git
-revision = 14.2.1
+revision = 14.3.1
depth = 1
patch_directory = harfbuzz
diff_files = harfbuzz/no_bigobj_windows.diff
diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap
index 7a55d18..f2c94fd 100644
--- a/subprojects/libalabaster.wrap
+++ b/subprojects/libalabaster.wrap
@@ -1,5 +1,5 @@
[wrap-git]
-directory = libalabaster-c633226
+directory = libalabaster-b617e3c
url = https://git.akon.city/libalabaster.git
push-url = git@git.akon.city:libalabaster.git
-revision = c633226d2b615f46ef38cc99603775dccdf96ecd
+revision = b617e3ccb25a0ac3c22f8c02722c8108b2f78d6e
diff --git a/subprojects/libcdio-paranoia.wrap b/subprojects/libcdio-paranoia.wrap
index c271d48..b408b0f 100644
--- a/subprojects/libcdio-paranoia.wrap
+++ b/subprojects/libcdio-paranoia.wrap
@@ -1,7 +1,7 @@
[wrap-git]
-directory = libcdio-paranoia-717f126
-url = https://github.com/rocky/libcdio-paranoia.git
-revision = 717f1263910695e8bc66ad33d08a61ff572c0691
+directory = libcdio-paranoia-384f4da
+url = https://github.com/libcdio/libcdio-paranoia.git
+revision = 384f4dac7e211cce67a14f3df53fc596965b6c94
depth = 1
patch_directory = libcdio-paranoia
diff --git a/subprojects/libnaunet.wrap b/subprojects/libnaunet.wrap
index 25cdba2..df8ee63 100644
--- a/subprojects/libnaunet.wrap
+++ b/subprojects/libnaunet.wrap
@@ -1,5 +1,5 @@
[wrap-git]
-directory = libnaunet-a389b8f
+directory = libnaunet-3a51988
url = https://git.akon.city/libnaunet.git
push-url = git@git.akon.city:libnaunet.git
-revision = a389b8f2f9c55b76fe5a28c3f1fea798ed37aa98
+revision = 3a51988d764d54723288dc31a1779ece44cac1e9
diff --git a/subprojects/libplacebo.wrap b/subprojects/libplacebo.wrap
index a16dd82..e960982 100644
--- a/subprojects/libplacebo.wrap
+++ b/subprojects/libplacebo.wrap
@@ -1,7 +1,7 @@
[wrap-git]
-directory = libplacebo-05ac2cc
+directory = libplacebo-22ee762
url = https://code.videolan.org/videolan/libplacebo.git
-revision = 05ac2cca6571c04d06369a26825d207781b73f32
+revision = 22ee762e8e0890fc54068beb670310f0edce7263
clone-recursive = true
depth = 1
diff --git a/subprojects/packagefiles/ffmpeg/meson.build b/subprojects/packagefiles/ffmpeg/meson.build
index ed3617c..aa881bc 100644
--- a/subprojects/packagefiles/ffmpeg/meson.build
+++ b/subprojects/packagefiles/ffmpeg/meson.build
@@ -12,6 +12,7 @@ is_windows = host_machine.system() == 'windows'
is_msvc = compiler.get_id() == 'msvc' or compiler.get_id() == 'clang-cl'
is_mingw = is_windows and not is_msvc
is_android = host_machine.system() == 'android'
+is_static_shared_lib = is_android
args = ['-DFFMPEG_VERSION="' + meson.project_version() + '"']
deps = []
@@ -33,9 +34,6 @@ endif
extra_options += ['--arch=' + cpu]
extra_options += ['--cc=' + compiler.cmd_array()[0]]
if meson.is_cross_build()
- if is_msvc
- extra_options += ['--ld=' + meson.get_external_property('ld')]
- endif
extra_options += ['--ar=' + meson.get_external_property('ar', 'ar')]
extra_options += ['--nm=' + meson.get_external_property('nm', 'nm')]
endif
@@ -45,6 +43,9 @@ if cpu == 'x86_64' or cpu == 'x86'
endif
extra_options += ['--enable-static', '--disable-shared']
+if is_static_shared_lib
+ extra_options += ['--enable-pic']
+endif
if is_windows
if get_option('win32-compat')
@@ -211,7 +212,6 @@ extra_options += [
'--disable-nvdec',
'--disable-nvenc',
'--disable-vdpau',
- '--disable-audiotoolbox',
'--disable-videotoolbox'
]
@@ -262,7 +262,6 @@ proj = ext_proj.add_project('configure',
'--prefix=@PREFIX@',
'--libdir=@PREFIX@/@LIBDIR@',
'--incdir=@PREFIX@/@INCLUDEDIR@',
- '--enable-pic',
'--disable-all',
'--disable-autodetect',
'--disable-everything',
diff --git a/subprojects/packagefiles/ffmpeg/meson_options.txt b/subprojects/packagefiles/ffmpeg/meson_options.txt
index d58d8fd..7854d28 100644
--- a/subprojects/packagefiles/ffmpeg/meson_options.txt
+++ b/subprojects/packagefiles/ffmpeg/meson_options.txt
@@ -1,6 +1,5 @@
# Copy-paste from top-level project.
+option('sink-only', type: 'boolean', value: false, yield: true)
option('codec-hwaccels', type: 'array', choices: ['vulkan', 'vaapi', 'mediacodec', 'd3d11va', 'dxva2'], value: [], yield: true)
-option('renderer-api', type: 'combo', choices: ['vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'vulkan', yield: true)
option('subtitles', type: 'feature', value: 'enabled', yield: true)
option('win32-compat', type: 'boolean', value: false, yield: true)
-option('sink-only', type: 'boolean', value: false, yield: true)
diff --git a/subprojects/packagefiles/ffmpeg/version_9.0.1.diff b/subprojects/packagefiles/ffmpeg/version_9.0.1.diff
new file mode 100644
index 0000000..8c10f1c
--- /dev/null
+++ b/subprojects/packagefiles/ffmpeg/version_9.0.1.diff
@@ -0,0 +1,29 @@
+--- a/meson.build 2025-08-23 18:44:34.634014892 -0400
++++ b/meson.build 2025-08-25 15:33:36.209533531 -0400
+@@ -1,4 +1,4 @@
+-project('ffmpeg', 'c', version: '', meson_version: '>=0.57.0')
++project('ffmpeg', 'c', version: '9.0.1', meson_version: '>=0.57.0')
+
+ compiler = meson.get_compiler('c')
+
+@@ -268,14 +268,14 @@
+ swscale = proj.dependency('swscale')
+ include = include_directories('.', 'build/')
+ meson.override_dependency('libavutil', declare_dependency(
+- dependencies: [avutil, deps], compile_args: args, include_directories: include, version: ''))
++ dependencies: [avutil, deps], compile_args: args, include_directories: include, version: '61.1.100'))
+ meson.override_dependency('libavformat', declare_dependency(
+- dependencies: [avformat], include_directories: include, version: ''))
++ dependencies: [avformat], include_directories: include, version: '63.1.100'))
+ meson.override_dependency('libavcodec', declare_dependency(
+- dependencies: [avcodec], include_directories: include, version: ''))
++ dependencies: [avcodec], include_directories: include, version: '63.1.100'))
+ meson.override_dependency('libavdevice', declare_dependency(
+- dependencies: [avdevice], include_directories: include, version: ''))
++ dependencies: [avdevice], include_directories: include, version: '63.1.100'))
+ meson.override_dependency('libswresample', declare_dependency(
+- dependencies: [swresample], include_directories: include, version: ''))
++ dependencies: [swresample], include_directories: include, version: '7.1.100'))
+ meson.override_dependency('libswscale', declare_dependency(
+- dependencies: [swscale], include_directories: include, version: ''))
++ dependencies: [swscale], include_directories: include, version: '10.1.100'))
diff --git a/subprojects/packagefiles/libcdio-paranoia/meson.build b/subprojects/packagefiles/libcdio-paranoia/meson.build
index 82b07b3..c8ee719 100644
--- a/subprojects/packagefiles/libcdio-paranoia/meson.build
+++ b/subprojects/packagefiles/libcdio-paranoia/meson.build
@@ -1,7 +1,8 @@
-project('libcdio-paranoia', 'c', version: 'git-717f126', meson_version: '>=0.57.0')
+project('libcdio-paranoia', 'c', version: 'git-384f4da', meson_version: '>=0.57.0')
ext_proj = import('unstable-external_project')
+# @TODO: Couldn't this work for shaderc?
run_command('autoreconf', '-fi', check: true)
proj = ext_proj.add_project('configure',
diff --git a/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff b/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff
new file mode 100644
index 0000000..e8b2ecf
--- /dev/null
+++ b/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff
@@ -0,0 +1,54 @@
+diff --git a/src/dispatch.c b/src/dispatch.c
+index 218b556..70be9aa 100644
+--- a/src/dispatch.c
++++ b/src/dispatch.c
+@@ -1541,7 +1541,7 @@ bool pl_dispatch_vertex(pl_dispatch dp, const struct pl_dispatch_vertex_params *
+ case PL_COORDS_NORMALIZED:
+ if (params->vertex_flipped) {
+ proj.mat.m[1][1] = -proj.mat.m[1][1];
+- proj.c[1] += 2.0;
++ //proj.c[1] += 2.0;
+ }
+ break;
+ }
+@@ -1566,7 +1566,7 @@ bool pl_dispatch_vertex(pl_dispatch dp, const struct pl_dispatch_vertex_params *
+
+ // Update the scissors
+ rparams->scissors = params->scissors;
+- if (params->vertex_flipped) {
++ if (params->vertex_flipped && rparams->scissors.y0 != rparams->scissors.y1) {
+ rparams->scissors.y0 = tpars->h - rparams->scissors.y0;
+ rparams->scissors.y1 = tpars->h - rparams->scissors.y1;
+ }
+diff --git a/src/shaders/custom_mpv.c b/src/shaders/custom_mpv.c
+index 1c93da5..bd6450d 100644
+--- a/src/shaders/custom_mpv.c
++++ b/src/shaders/custom_mpv.c
+@@ -1191,10 +1191,10 @@ static bool bind_pass_tex(pl_shader sh, pl_str name,
+ GLSLH("#define HOOKED_pt %.*s_pt \n", PL_STR_FMT(name));
+ GLSLH("#define HOOKED_map %.*s_map \n", PL_STR_FMT(name));
+ GLSLH("#define HOOKED_mul %.*s_mul \n", PL_STR_FMT(name));
+- GLSLH("#define HOOKED_tex %.*s_tex \n", PL_STR_FMT(name));
+- GLSLH("#define HOOKED_texOff %.*s_texOff \n", PL_STR_FMT(name));
++ GLSLH("#define HOOKED_tex(pos) %.*s_tex(pos) \n", PL_STR_FMT(name));
++ GLSLH("#define HOOKED_texOff(off) %.*s_texOff(off) \n", PL_STR_FMT(name));
+ if (can_gather)
+- GLSLH("#define HOOKED_gather %.*s_gather \n", PL_STR_FMT(name));
++ GLSLH("#define HOOKED_gather(pos, c) %.*s_gather(pos, c) \n", PL_STR_FMT(name));
+ }
+
+ if (mainpresub) {
+@@ -1206,10 +1206,10 @@ static bool bind_pass_tex(pl_shader sh, pl_str name,
+ GLSLH("#define MAIN_pt MAINPRESUB_pt \n");
+ GLSLH("#define MAIN_map MAINPRESUB_map \n");
+ GLSLH("#define MAIN_mul MAINPRESUB_mul \n");
+- GLSLH("#define MAIN_tex MAINPRESUB_tex \n");
+- GLSLH("#define MAIN_texOff MAINPRESUB_texOff \n");
++ GLSLH("#define MAIN_tex(pos) MAINPRESUB_tex(pos) \n");
++ GLSLH("#define MAIN_texOff(off) MAINPRESUB_texOff(off) \n");
+ if (can_gather)
+- GLSLH("#define MAIN_gather MAINPRESUB_gather \n");
++ GLSLH("#define MAIN_gather(pos, c) MAINPRESUB_gather(pos, c) \n");
+ }
+
+ return true;
diff --git a/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff b/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff
new file mode 100644
index 0000000..d722bef
--- /dev/null
+++ b/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff
@@ -0,0 +1,40 @@
+diff --git a/src/glsl/meson.build b/src/glsl/meson.build
+index c9a8542..499042a 100644
+--- a/src/glsl/meson.build
++++ b/src/glsl/meson.build
+@@ -30,7 +30,7 @@ if glslang_req.auto() and shaderc.found()
+ elif not glslang_req.disabled()
+
+ glslang_deps = [
+- cxx.find_library('glslang-default-resource-limits', required: false)
++ dependency('glslang-default-resource-limits', required: false)
+ ]
+
+ # meson doesn't respect generator expressions in INTERFACE_LINK_LIBRARIES
+@@ -49,7 +49,7 @@ elif not glslang_req.disabled()
+ static = arg[0]
+ required = arg[1]
+
+- spirv = cxx.find_library('SPIRV', required: required, static: static, dirs: vulkan_lib_dirs)
++ spirv = dependency('SPIRV', required: required, static: static)
+
+ if not spirv.found()
+ continue
+@@ -59,7 +59,7 @@ elif not glslang_req.disabled()
+
+ # Glslang 15.0.0 moved some code around, add also linking to glslang, while
+ # this is not needed for older versions, it will still work.
+- glslang_deps += cxx.find_library('glslang', required: required, static: static)
++ glslang_deps += dependency('glslang', required: required, static: static)
+
+ if static
+ glslang_deps += [
+@@ -78,7 +78,7 @@ elif not glslang_req.disabled()
+ break
+ endforeach
+
+- if found_lib and cc.has_header('glslang/build_info.h')
++ if found_lib
+ glslang = declare_dependency(dependencies: glslang_deps)
+ endif
+
diff --git a/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff b/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff
new file mode 100644
index 0000000..8797d34
--- /dev/null
+++ b/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff
@@ -0,0 +1,89 @@
+diff --git a/src/dispatch.c b/src/dispatch.c
+index 218b556..067efc7 100644
+--- a/src/dispatch.c
++++ b/src/dispatch.c
+@@ -29,6 +29,7 @@
+
+ enum {
+ TMP_PRELUDE, // GLSL version, global definitions, etc.
++ TMP_UNIFORMS,
+ TMP_MAIN, // main GLSL shader body
+ TMP_VERT_HEAD, // vertex shader inputs/outputs
+ TMP_VERT_BODY, // vertex shader body
+@@ -304,15 +305,16 @@ static void generate_shaders(pl_dispatch dp,
+ pl_str_builder shader_body = sh_finalize_internal(sh);
+
+ pl_str_builder pre = dp->tmp[TMP_PRELUDE];
++ pl_str_builder uni = dp->tmp[TMP_UNIFORMS];
+ ADD(pre, "#version %d%s\n", gpu->glsl.version,
+ (gpu->glsl.gles && gpu->glsl.version > 100) ? " es" : "");
+ if (pass_params->type == PL_PASS_COMPUTE)
+- ADD(pre, "#extension GL_ARB_compute_shader : enable\n");
++ ADD(uni, "#extension GL_ARB_compute_shader : enable\n");
+
+ // Enable this unconditionally if the GPU supports it, since we have no way
+ // of knowing whether subgroups are being used or not
+ if (gpu->glsl.subgroup_size) {
+- ADD(pre, "#extension GL_KHR_shader_subgroup_basic : enable \n"
++ ADD(uni, "#extension GL_KHR_shader_subgroup_basic : enable \n"
+ "#extension GL_KHR_shader_subgroup_vote : enable \n"
+ "#extension GL_KHR_shader_subgroup_arithmetic : enable \n"
+ "#extension GL_KHR_shader_subgroup_ballot : enable \n"
+@@ -360,24 +362,24 @@ static void generate_shaders(pl_dispatch dp,
+ }
+
+ if (has_img && !gpu->glsl.gles)
+- ADD(pre, "#extension GL_ARB_shader_image_load_store : enable\n");
++ ADD(uni, "#extension GL_ARB_shader_image_load_store : enable\n");
+ if (has_ubo)
+- ADD(pre, "#extension GL_ARB_uniform_buffer_object : enable\n");
++ ADD(uni, "#extension GL_ARB_uniform_buffer_object : enable\n");
+ if (has_ssbo)
+- ADD(pre, "#extension GL_ARB_shader_storage_buffer_object : enable\n");
++ ADD(uni, "#extension GL_ARB_shader_storage_buffer_object : enable\n");
+ if (has_texel)
+- ADD(pre, "#extension GL_ARB_texture_buffer_object : enable\n");
++ ADD(uni, "#extension GL_ARB_texture_buffer_object : enable\n");
+ if (has_ext) {
+ if (gpu->glsl.version >= 300) {
+- ADD(pre, "#extension GL_OES_EGL_image_external_essl3 : enable\n");
++ ADD(uni, "#extension GL_OES_EGL_image_external_essl3 : enable\n");
+ } else {
+- ADD(pre, "#extension GL_OES_EGL_image_external : enable\n");
++ ADD(uni, "#extension GL_OES_EGL_image_external : enable\n");
+ }
+ }
+ if (has_nofmt)
+- ADD(pre, "#extension GL_EXT_shader_image_load_formatted : enable\n");
++ ADD(uni, "#extension GL_EXT_shader_image_load_formatted : enable\n");
+ if (has_gather && !gpu->glsl.gles)
+- ADD(pre, "#extension GL_ARB_texture_gather : enable\n");
++ ADD(uni, "#extension GL_ARB_texture_gather : enable\n");
+
+ if (gpu->glsl.gles) {
+ // Use 32-bit precision for floats if possible
+@@ -527,12 +529,12 @@ static void generate_shaders(pl_dispatch dp,
+
+ case PL_DESC_BUF_UNIFORM:
+ if (gpu->glsl.vulkan) {
+- ADD(pre, "layout(std140, binding=%d) ", desc->binding);
++ ADD(uni, "layout(std140, binding=%d) ", desc->binding);
+ } else {
+- ADD(pre, "layout(std140) ");
++ ADD(uni, "layout(std140) ");
+ }
+- ADD(pre, "uniform "$" ", sh_ident_unpack(desc->name));
+- add_buffer_vars(dp, tmp, pre, sd->buffer_vars, sd->num_buffer_vars);
++ ADD(uni, "uniform "$" ", sh_ident_unpack(desc->name));
++ add_buffer_vars(dp, tmp, uni, sd->buffer_vars, sd->num_buffer_vars);
+ break;
+
+ case PL_DESC_BUF_STORAGE:
+@@ -599,6 +601,7 @@ static void generate_shaders(pl_dispatch dp,
+
+ pl_str_builder glsl = dp->tmp[TMP_MAIN];
+ ADD_CAT(glsl, pre);
++ ADD_CAT(glsl, uni);
+
+ switch(pass_params->type) {
+ case PL_PASS_RASTER: {
diff --git a/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff b/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff
new file mode 100644
index 0000000..90d75e1
--- /dev/null
+++ b/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff
@@ -0,0 +1,13 @@
+diff --git a/src/glsl/spirv_shaderc.c b/src/glsl/spirv_shaderc.c
+index 3afd750..8c3d5e0 100644
+--- a/src/glsl/spirv_shaderc.c
++++ b/src/glsl/spirv_shaderc.c
+@@ -112,7 +112,7 @@ static pl_str shaderc_compile(pl_spirv spirv, void *alloc,
+ return (pl_str) {0};
+
+ shaderc_compile_options_set_optimization_level(opts,
+- shaderc_optimization_level_performance);
++ shaderc_optimization_level_size);
+ shaderc_compile_options_set_target_spirv(opts, spirv->version.spv_version);
+ shaderc_compile_options_set_target_env(opts, shaderc_target_env_vulkan,
+ spirv->version.env_version);
diff --git a/subprojects/shaderc.wrap b/subprojects/shaderc.wrap
index f541df9..9bbe1d7 100644
--- a/subprojects/shaderc.wrap
+++ b/subprojects/shaderc.wrap
@@ -1,8 +1,7 @@
[wrap-git]
-directory = shaderc-v2026.2
+directory = shaderc-v2026.3
url = https://github.com/google/shaderc.git
-revision = v2026.2
+revision = v2026.3
depth = 1
method = cmake
patch_directory = shaderc
-diff_files = shaderc/third_party_fix_build.diff, shaderc/no_hlsl_compile.diff
diff --git a/subprojects/stela.wrap b/subprojects/stela.wrap
index a1889c4..40cb968 100644
--- a/subprojects/stela.wrap
+++ b/subprojects/stela.wrap
@@ -1,5 +1,5 @@
[wrap-git]
-directory = stela-a35c47d
+directory = stela-0c43dca
url = https://git.akon.city/stela.git
push-url = git@git.akon.city:stela.git
-revision = a35c47d401335e81f25c2c78611dcb7785f703da
+revision = 0c43dcac12f606c0ac46b5f87dd3de324ff9ef04
diff --git a/tests/cue_splitter.c b/tests/cue_splitter.c
index 3450aaa..47171f2 100644
--- a/tests/cue_splitter.c
+++ b/tests/cue_splitter.c
@@ -129,7 +129,7 @@ s32 main(s32 argc, char *argv[])
return EXIT_FAILURE;
}
- str output_dir = al_str_null();
+ str output_dir = AL_STR_EMPTY;
if (argc == 3) {
output_dir = al_str_cr(argv[2]);
if (!nn_dir_exists(&output_dir)) {