From d8fb922f84efb8fded548c86e68b8b4850d66a93 Mon Sep 17 00:00:00 2001 From: SunnyVishnu3 Date: Mon, 1 Jun 2026 03:49:22 +0530 Subject: [PATCH 1/5] update version strings and remove jniLibs --- app/src/main/java/is/xyz/mpv/Utils.kt | 10 +++++----- app/src/main/jniLibs | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) delete mode 120000 app/src/main/jniLibs diff --git a/app/src/main/java/is/xyz/mpv/Utils.kt b/app/src/main/java/is/xyz/mpv/Utils.kt index 4ab952a0..5a19b3ec 100644 --- a/app/src/main/java/is/xyz/mpv/Utils.kt +++ b/app/src/main/java/is/xyz/mpv/Utils.kt @@ -315,11 +315,11 @@ object Utils { val VERSIONS: Versions by lazy { Versions( - mpv = "%MPV_VERSION%", - buildDate = "%DATE%", - libPlacebo = "%LIBPLACEBO_VERSION%", - ffmpeg = "%FFMPEG_VERSION%", - ytDlp = "%YTDLP_VERSION%", + mpv = "v0.41.0-698-g74271a7d8", + buildDate = "", + libPlacebo = "v7.365.0 (v7.360.0-60-gb915882d)", + ffmpeg = "239f2c733d", + ytDlp = "2026.03.17", abiTier = AbiDetector.detectOptimalAbi().displayName, vulkanSupport = true, ) diff --git a/app/src/main/jniLibs b/app/src/main/jniLibs deleted file mode 120000 index 2f36f26d..00000000 --- a/app/src/main/jniLibs +++ /dev/null @@ -1 +0,0 @@ -libs/ \ No newline at end of file From 25cc4d20b6a741f9b797e3d656a729c4e917d6d5 Mon Sep 17 00:00:00 2001 From: SunnyVishnu3 Date: Tue, 2 Jun 2026 14:06:11 +0530 Subject: [PATCH 2/5] feat: enable Vulkan support and gpu-next by default - Switch default video output to `gpu-next` with `gpu-api=vulkan`. - Set Adreno-optimized Vulkan defaults for better performance on mobile. - Bump `minSdkVersion` to 33. - Enable Vulkan, `libshaderc`, and Vulkan-based decoders/filters in FFmpeg. - Update CI and build scripts to fetch `Vulkan-Headers` and include `glslang-tools`/`spirv-tools`. - Add WSL-specific compilation and synchronization scripts. - Fix `shaderc` pkg-config generation in build scripts. --- .github/workflows/build.yml | 16 ++++++ .github/workflows/release.yml | 16 ++++++ app/build.gradle | 8 ++- app/src/main/java/is/xyz/mpv/BaseMPVView.kt | 10 +++- buildscripts/include/depinfo.sh | 2 +- buildscripts/scripts/ffmpeg.sh | 9 ++- buildscripts/scripts/shaderc.sh | 12 +++- wsl-compile.sh | 59 ++++++++++++++++++++ wsl-source.tar | Bin 0 -> 94208 bytes wsl_build.sh | 43 ++++++++++++++ wsl_continue.sh | 23 ++++++++ wsl_final.sh | 17 ++++++ wsl_vulkan_headers.sh | 23 ++++++++ 13 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 wsl-compile.sh create mode 100644 wsl-source.tar create mode 100644 wsl_build.sh create mode 100644 wsl_continue.sh create mode 100644 wsl_final.sh create mode 100644 wsl_vulkan_headers.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d0d0c06..f7413d50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -95,9 +95,11 @@ jobs: automake \ build-essential \ ccache \ + dos2unix \ gcc g++ \ cmake \ gettext \ + glslang-tools \ gperf \ libtool \ nasm \ @@ -105,6 +107,7 @@ jobs: pkg-config \ python3 \ python3-pip \ + spirv-tools \ unzip \ wget @@ -118,6 +121,15 @@ jobs: set -euxo pipefail cd buildscripts ./download.sh + + echo "Downloading latest Vulkan-Headers..." + if [ ! -d "deps/Vulkan-Headers" ]; then + git clone https://github.com/KhronosGroup/Vulkan-Headers.git deps/Vulkan-Headers + fi + + echo "Normalizing line endings for all scripts..." + cd .. + find . -type f \( -name '*.sh' -o -name 'gradlew' \) -exec dos2unix {} + - name: Save Android SDK cache if: steps.android-sdk-cache.outputs.cache-hit != 'true' @@ -151,6 +163,10 @@ jobs: [ "$ENABLE_ARM_V9A" = "true" ] && arches+=(arm64-v9a) [ "$ENABLE_X86_ARCH" = "true" ] && arches+=(x86 x86_64) for arch in "${arches[@]}"; do + echo "Injecting Vulkan headers into prefix/$arch/include..." + mkdir -p "prefix/$arch/include" + cp -r deps/Vulkan-Headers/include/vulkan "prefix/$arch/include/" + cp -r deps/Vulkan-Headers/include/vk_video "prefix/$arch/include/" ./buildall.sh --arch "$arch" mpv done diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dc4e6082..7abc4309 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -147,8 +147,10 @@ jobs: build-essential \ ccache \ cmake \ + dos2unix \ gcc g++ \ gettext \ + glslang-tools \ gperf \ libtool \ nasm \ @@ -156,6 +158,7 @@ jobs: pkg-config \ python3 \ python3-pip \ + spirv-tools \ unzip \ wget @@ -169,6 +172,15 @@ jobs: set -euxo pipefail cd buildscripts ./download.sh + + echo "Downloading latest Vulkan-Headers..." + if [ ! -d "deps/Vulkan-Headers" ]; then + git clone https://github.com/KhronosGroup/Vulkan-Headers.git deps/Vulkan-Headers + fi + + echo "Normalizing line endings for all scripts..." + cd .. + find . -type f \( -name '*.sh' -o -name 'gradlew' \) -exec dos2unix {} + - name: Save Android SDK cache if: steps.android-sdk-cache.outputs.cache-hit != 'true' @@ -202,6 +214,10 @@ jobs: [ "$ENABLE_ARM_V9A" = "true" ] && arches+=(arm64-v9a) [ "$ENABLE_X86_ARCH" = "true" ] && arches+=(x86 x86_64) for arch in "${arches[@]}"; do + echo "Injecting Vulkan headers into prefix/$arch/include..." + mkdir -p "prefix/$arch/include" + cp -r deps/Vulkan-Headers/include/vulkan "prefix/$arch/include/" + cp -r deps/Vulkan-Headers/include/vk_video "prefix/$arch/include/" ./buildall.sh --arch "$arch" mpv done diff --git a/app/build.gradle b/app/build.gradle index 9c2f1fbe..620de130 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { compileSdk 36 defaultConfig { - minSdkVersion 24 + minSdkVersion 33 targetSdkVersion 36 versionCode 38 @@ -22,6 +22,12 @@ android { buildConfig = true } + sourceSets { + main { + jniLibs.srcDirs = ['src/main/libs'] + } + } + // https://youtrack.jetbrains.com/issue/KT-55947 compileOptions { sourceCompatibility JavaVersion.VERSION_17 diff --git a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt index 5eeb8be7..7d7e0888 100644 --- a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt +++ b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt @@ -36,6 +36,14 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( } catch (e: Exception) { Log.e(TAG, "Failed to set SSL_CERT_FILE", e) } + + // Adreno-optimized Vulkan defaults for vo=gpu-next + MPVLib.setOptionString("gpu-api", "vulkan") + MPVLib.setOptionString("vulkan-async-compute", "no") + MPVLib.setOptionString("vulkan-async-transfer", "no") + MPVLib.setOptionString("vulkan-queue-count", "1") + MPVLib.setOptionString("vd-lavc-film-grain", "gpu") + initOptions() MPVLib.init() @@ -74,7 +82,7 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( this.filePath = filePath } - private var voInUse: String = "gpu" + private var voInUse: String = "gpu-next" /** * Sets the VO to use. diff --git a/buildscripts/include/depinfo.sh b/buildscripts/include/depinfo.sh index b7497595..86b74dd1 100755 --- a/buildscripts/include/depinfo.sh +++ b/buildscripts/include/depinfo.sh @@ -37,7 +37,7 @@ dep_vvdec=() dep_mpeghdec=() dep_libiamf=() dep_liblcevc=() -dep_ffmpeg=(mbedtls dav1d vvdec mpeghdec libiamf liblcevc) +dep_ffmpeg=(mbedtls dav1d vvdec mpeghdec libiamf liblcevc shaderc) dep_freetype2=() dep_fribidi=() dep_harfbuzz=() diff --git a/buildscripts/scripts/ffmpeg.sh b/buildscripts/scripts/ffmpeg.sh index 0342c36c..e8bb0e9c 100755 --- a/buildscripts/scripts/ffmpeg.sh +++ b/buildscripts/scripts/ffmpeg.sh @@ -36,10 +36,17 @@ args=( --target-os=android --enable-cross-compile --cross-prefix=$ndk_triple- --cc=$CC --pkg-config=pkg-config --nm=llvm-nm --arch=${ndk_triple%%-*} --cpu=$cpu - --extra-cflags="-I$prefix_dir/include $cpuflags" --extra-ldflags="-L$prefix_dir/lib" + --extra-cflags="-I$prefix_dir/include $cpuflags" --extra-ldflags="-L$prefix_dir/lib -lvulkan" --enable-{jni,mediacodec,mbedtls,libdav1d} + # === VULKAN SUPPORT & OPTIMIZATIONS === + --enable-vulkan + --enable-libshaderc + --enable-decoder=prores_vulkan,ffv1_vulkan,dpx_vulkan + --enable-encoder=ffv1_vulkan,prores_vulkan + --enable-filter=bwdif_vulkan,xfade_vulkan,hflip_vulkan,vflip_vulkan,scale_vulkan,overlay_vulkan,avgblur_vulkan,blend_vulkan,flip_vulkan,transpose_vulkan + # === NEW CODECS (FFmpeg n8.1.1) === # VVC (H.266) — Versatile Video Coding diff --git a/buildscripts/scripts/shaderc.sh b/buildscripts/scripts/shaderc.sh index d943f459..a128a415 100755 --- a/buildscripts/scripts/shaderc.sh +++ b/buildscripts/scripts/shaderc.sh @@ -39,11 +39,19 @@ cat >"$prefix_dir"/lib/pkgconfig/shaderc_combined.pc <<"END" Name: shaderc_combined Description: Version: 2022.3-unknown -Libs: -L/usr/local/lib -lshaderc_combined +Libs: -L/usr/local/lib -lshaderc_combined -lc++ -lm Cflags: -I/usr/local/include END -if [ -z "$(pkg-config --cflags shaderc_combined)" ]; then +cat >"$prefix_dir"/lib/pkgconfig/shaderc.pc <<"END" +Name: shaderc +Description: +Version: 2022.3-unknown +Libs: -L/usr/local/lib -lshaderc_combined -lc++ -lm +Cflags: -I/usr/local/include +END + +if [ -z "$(pkg-config --cflags shaderc_combined)" ] || [ -z "$(pkg-config --cflags shaderc)" ]; then echo >&2 "shaderc pkg-config sanity check failed" exit 1 fi diff --git a/wsl-compile.sh b/wsl-compile.sh new file mode 100644 index 00000000..372c179e --- /dev/null +++ b/wsl-compile.sh @@ -0,0 +1,59 @@ +#!/bin/bash +set -e + +# WSL Compilation Script for MPV Android AAR +# This script compiles the optimized Vulkan/Adreno AAR library from WSL Ubuntu. + +echo "==========================================================" +echo " Vulkan-Optimized MPV Android AAR Compiler for WSL" +echo "==========================================================" + +# 1. Sanity Checks +if ! grep -qis "microsoft" /proc/version && ! grep -qis "wsl" /proc/version; then + echo "Warning: This script is designed to run inside WSL (Windows Subsystem for Linux)." + echo "It seems you are running this elsewhere. Let's proceed, but make sure you are on Ubuntu/Debian." + read -p "Press Enter to continue..." +fi + +echo "Step 1: Installing Ubuntu dependencies (requires sudo)..." +sudo apt-get update +sudo apt-get install -y \ + autoconf \ + pkg-config \ + libtool \ + ninja-build \ + unzip \ + wget \ + meson \ + python3 \ + nasm \ + git \ + openjdk-17-jdk \ + clang \ + build-essential + +# 2. Check Java Version +if ! javac -version &>/dev/null; then + echo "Error: JDK 17 is required but could not be found. Please ensure openjdk-17-jdk is installed and configured." + exit 1 +fi + +echo "Step 2: Checking out/downloading Android SDK and NDK dependencies..." +cd buildscripts +./download.sh + +echo "Step 3: Compiling dependencies for standard arm64-v8a..." +./buildall.sh --arch arm64 + +echo "Step 4: Compiling dependencies for optimized arm64-v9a (Snapdragon 8s Gen 3 / Adreno 735)..." +./buildall.sh --arch arm64-v9a + +echo "Step 5: Building final JNI wrappers and packaging AAR..." +./buildall.sh mpv-android + +echo "==========================================================" +echo " Build Completed Successfully!" +echo "==========================================================" +echo "Your optimized AAR file is located at:" +ls -lh ../app/build/outputs/aar/*.aar +echo "==========================================================" diff --git a/wsl-source.tar b/wsl-source.tar new file mode 100644 index 0000000000000000000000000000000000000000..ae8bc8f323f5eac947ee37ebf20cd4ac2381595a GIT binary patch literal 94208 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 literal 0 HcmV?d00001 diff --git a/wsl_build.sh b/wsl_build.sh new file mode 100644 index 00000000..cbcbc01f --- /dev/null +++ b/wsl_build.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +# Fast rsync to avoid 9p filesystem overhead for excluded heavy folders +echo "Step 1: Synchronizing source code to WSL home directory..." +mkdir -p /home/sagnik/mpvlibAndroid +rsync -a --delete \ + --exclude='.git' \ + --exclude='build' \ + --exclude='.gradle' \ + --exclude='app/build' \ + --exclude='buildscripts/prefix' \ + --exclude='buildscripts/deps' \ + --exclude='buildscripts/sdk' \ + --exclude='buildscripts/_build*' \ + --exclude='wsl-source.tar' \ + /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/ /home/sagnik/mpvlibAndroid/ + +cd /home/sagnik/mpvlibAndroid + +echo "Step 2: Cleaning any leftover build files just in case..." +rm -rf buildscripts/prefix buildscripts/deps buildscripts/sdk buildscripts/_build* app/build + +echo "Step 3: Downloading SDK, NDK, and dependencies..." +cd buildscripts +echo 2007 | sudo -S ./download.sh +echo 2007 | sudo -S chown -R $USER:$USER /home/sagnik/mpvlibAndroid + +echo "Step 4: Building arm64-v8a (base) - CLEAN BUILD..." +./buildall.sh --clean --arch arm64 + +echo "Step 5: Building arm64-v9a (SVE2 optimized) - CLEAN BUILD..." +./buildall.sh --clean --arch arm64-v9a + +echo "Step 6: Packaging final mpv-android AAR..." +./buildall.sh mpv-android +cd .. + +echo "Step 7: Copying generated AARs back to Windows host..." +mkdir -p /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ +cp -r app/build/outputs/aar/* /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ + +echo "ALL DONE!" diff --git a/wsl_continue.sh b/wsl_continue.sh new file mode 100644 index 00000000..c5f02a50 --- /dev/null +++ b/wsl_continue.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +echo "Fixing permissions for downloaded deps..." +echo 2007 | sudo -S chown -R $USER:$USER /home/sagnik/mpvlibAndroid + +cd /home/sagnik/mpvlibAndroid/buildscripts + +echo "Step 4: Building arm64-v8a (base) - CLEAN BUILD..." +./buildall.sh --clean --arch arm64 + +echo "Step 5: Building arm64-v9a (SVE2 optimized) - CLEAN BUILD..." +./buildall.sh --clean --arch arm64-v9a + +echo "Step 6: Packaging final mpv-android AAR..." +./buildall.sh mpv-android +cd .. + +echo "Step 7: Copying generated AARs back to Windows host..." +mkdir -p /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ +cp -r app/build/outputs/aar/* /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ + +echo "ALL DONE!" diff --git a/wsl_final.sh b/wsl_final.sh new file mode 100644 index 00000000..492f625a --- /dev/null +++ b/wsl_final.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +cd /home/sagnik/mpvlibAndroid/buildscripts + +echo "Step 5: Building arm64-v9a (SVE2 optimized) - CLEAN BUILD..." +./buildall.sh --clean --arch arm64-v9a + +echo "Step 6: Packaging final mpv-android AAR..." +./buildall.sh mpv-android +cd .. + +echo "Step 7: Copying generated AARs back to Windows host..." +mkdir -p /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ +cp -r app/build/outputs/aar/* /mnt/c/Users/sagni/StudioProjects/mpvlibAndroid/app/build/outputs/aar/ + +echo "ALL DONE!" diff --git a/wsl_vulkan_headers.sh b/wsl_vulkan_headers.sh new file mode 100644 index 00000000..4301a58f --- /dev/null +++ b/wsl_vulkan_headers.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +echo "Downloading latest Vulkan-Headers..." +cd /home/sagnik/mpvlibAndroid/buildscripts/deps +if [ ! -d "Vulkan-Headers" ]; then + git clone https://github.com/KhronosGroup/Vulkan-Headers.git +else + cd Vulkan-Headers + git pull + cd .. +fi + +echo "Installing Vulkan headers to prefix directories..." +for arch in arm64 arm64-v9a; do + mkdir -p /home/sagnik/mpvlibAndroid/buildscripts/prefix/$arch/include/ + cp -r Vulkan-Headers/include/vulkan /home/sagnik/mpvlibAndroid/buildscripts/prefix/$arch/include/ + cp -r Vulkan-Headers/include/vk_video /home/sagnik/mpvlibAndroid/buildscripts/prefix/$arch/include/ +done + +echo "Headers installed successfully! Resuming build..." +cd /home/sagnik/mpvlibAndroid +bash wsl_continue.sh From f803daef5de66e8adba5de64514cac010982f65d Mon Sep 17 00:00:00 2001 From: SunnyVishnu3 Date: Tue, 2 Jun 2026 15:57:41 +0530 Subject: [PATCH 3/5] fix(ci): fix dav1d pkg-config not found in GitHub Actions Root cause: GitHub Actions cache restore replaces symlinks (usr -> ., local -> .) with real directories. The old setup_prefix only created symlinks on first mkdir, so after cache restore the prefix had real usr/local subdirs. dav1d installs its .pc file to usr/local/lib/pkgconfig (per meson crossfile prefix=/usr/local), which with broken symlinks ends up in a different directory than PKG_CONFIG_LIBDIR expects. Fixes: - buildall.sh: Always re-create usr/local symlinks if they aren't symlinks - depinfo.sh: Add v_dav1d=1.5.3 and include in ci_tarball cache key - download-deps.sh: Pin dav1d clone to specific tag with --depth 1 - dav1d.sh: Remove -Db_lto=true (incompatible with some CI linker configs) - build.yml/release.yml: Fix native-prefix cache path (gh-cache -> buildscripts/prefix) --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- buildscripts/buildall.sh | 11 ++++++++--- buildscripts/include/depinfo.sh | 3 ++- buildscripts/include/download-deps.sh | 2 +- buildscripts/scripts/dav1d.sh | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f7413d50..f2dc859e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: id: native-prefix-cache uses: actions/cache/restore@v4 with: - path: gh-cache/ + path: buildscripts/prefix/ key: native-prefix-${{ runner.os }}-${{ env.CACHE_IDENTIFIER }} restore-keys: | native-prefix-${{ runner.os }}- @@ -142,7 +142,7 @@ jobs: if: steps.native-prefix-cache.outputs.cache-hit != 'true' uses: actions/cache/save@v4 with: - path: gh-cache/ + path: buildscripts/prefix/ key: native-prefix-${{ runner.os }}-${{ env.CACHE_IDENTIFIER }} - name: Show ccache stats before build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7abc4309..87c0431f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -123,7 +123,7 @@ jobs: id: native-prefix-cache uses: actions/cache/restore@v4 with: - path: gh-cache/ + path: buildscripts/prefix/ key: native-prefix-${{ runner.os }}-${{ env.CACHE_IDENTIFIER }} restore-keys: | native-prefix-${{ runner.os }}- @@ -193,7 +193,7 @@ jobs: if: steps.native-prefix-cache.outputs.cache-hit != 'true' uses: actions/cache/save@v4 with: - path: gh-cache/ + path: buildscripts/prefix/ key: native-prefix-${{ runner.os }}-${{ env.CACHE_IDENTIFIER }} - name: Show ccache stats before build diff --git a/buildscripts/buildall.sh b/buildscripts/buildall.sh index c3c8ea09..cdc9abc4 100755 --- a/buildscripts/buildall.sh +++ b/buildscripts/buildall.sh @@ -89,10 +89,15 @@ loadarch () { } setup_prefix () { - if [ ! -d "$prefix_dir" ]; then - mkdir -p "$prefix_dir" - # enforce flat structure (/usr/local -> /) + mkdir -p "$prefix_dir" + # enforce flat structure (/usr/local -> /) + # Always re-create: cache restore may replace symlinks with real directories + if [ ! -L "$prefix_dir/usr" ]; then + rm -rf "$prefix_dir/usr" ln -s . "$prefix_dir/usr" + fi + if [ ! -L "$prefix_dir/local" ]; then + rm -rf "$prefix_dir/local" ln -s . "$prefix_dir/local" fi diff --git a/buildscripts/include/depinfo.sh b/buildscripts/include/depinfo.sh index 86b74dd1..7e60fb7a 100755 --- a/buildscripts/include/depinfo.sh +++ b/buildscripts/include/depinfo.sh @@ -26,6 +26,7 @@ v_vvdec=2.3.0 v_mpeghdec=1.0.2 v_libiamf=1.0.0 v_liblcevc=0.4.1 +v_dav1d=1.5.3 ## Dependency tree @@ -60,4 +61,4 @@ dep_mpv_android=(mpv python) v_ci_ffmpeg=n8.1.1 # filename used to uniquely identify a build prefix -ci_tarball="prefix-all-ndk-${v_ndk}-lua-${v_lua}-mujs-${v_mujs}-unibreak-${v_unibreak}-harfbuzz-${v_harfbuzz}-fribidi-${v_fribidi}-freetype-${v_freetype}-mbedtls-${v_mbedtls}-openssl-${v_openssl}-python-${v_python}-curl-${v_curl}-vvdec-${v_vvdec}-mpeghdec-${v_mpeghdec}-libiamf-${v_libiamf}-liblcevc-${v_liblcevc}-ffmpeg-${v_ci_ffmpeg}.tgz" +ci_tarball="prefix-all-ndk-${v_ndk}-lua-${v_lua}-mujs-${v_mujs}-unibreak-${v_unibreak}-harfbuzz-${v_harfbuzz}-fribidi-${v_fribidi}-freetype-${v_freetype}-mbedtls-${v_mbedtls}-openssl-${v_openssl}-python-${v_python}-curl-${v_curl}-vvdec-${v_vvdec}-mpeghdec-${v_mpeghdec}-libiamf-${v_libiamf}-liblcevc-${v_liblcevc}-dav1d-${v_dav1d}-ffmpeg-${v_ci_ffmpeg}.tgz" diff --git a/buildscripts/include/download-deps.sh b/buildscripts/include/download-deps.sh index aecfd315..cbf33d0a 100755 --- a/buildscripts/include/download-deps.sh +++ b/buildscripts/include/download-deps.sh @@ -16,7 +16,7 @@ if [ ! -d mbedtls ]; then fi # dav1d (canonical repo, GitHub is read-only mirror) -[ ! -d dav1d ] && git clone https://github.com/videolan/dav1d +[ ! -d dav1d ] && git clone --depth 1 --branch $v_dav1d https://github.com/videolan/dav1d # vvdec — Fraunhofer VVC (H.266) decoder if [ ! -d vvdec ]; then diff --git a/buildscripts/scripts/dav1d.sh b/buildscripts/scripts/dav1d.sh index 8bf65848..f7eca7d3 100755 --- a/buildscripts/scripts/dav1d.sh +++ b/buildscripts/scripts/dav1d.sh @@ -16,7 +16,7 @@ fi unset CC CXX # meson wants these unset meson setup $build --cross-file "$prefix_dir"/crossfile.txt \ - -Denable_tests=false -Db_lto=true -Dstack_alignment=16 \ + -Denable_tests=false -Dstack_alignment=16 \ -Denable_asm=true ninja -C $build -j$cores From 05b4da64ab063a40ab278d42df0bd8fed49a96ce Mon Sep 17 00:00:00 2001 From: SunnyVishnu3 Date: Wed, 3 Jun 2026 03:00:30 +0530 Subject: [PATCH 4/5] build: optimize compiler flags and enhance arm stability even more --- app/build.gradle | 2 +- app/src/main/java/is/xyz/mpv/BaseMPVView.kt | 8 ++------ buildscripts/buildall.sh | 8 ++++---- buildscripts/scripts/ffmpeg.sh | 2 +- buildscripts/scripts/mpv.sh | 2 ++ 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 620de130..96f9dc53 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { compileSdk 36 defaultConfig { - minSdkVersion 33 + minSdkVersion 24 targetSdkVersion 36 versionCode 38 diff --git a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt index 7d7e0888..38c6f383 100644 --- a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt +++ b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt @@ -24,6 +24,7 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( * Call this once before the view is shown. */ fun initialize(configDir: String, cacheDir: String) { + MPVLib.loadLibraries(context) MPVLib.create(context) MPVLib.setOptionString("config", "yes") @@ -37,12 +38,7 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( Log.e(TAG, "Failed to set SSL_CERT_FILE", e) } - // Adreno-optimized Vulkan defaults for vo=gpu-next - MPVLib.setOptionString("gpu-api", "vulkan") - MPVLib.setOptionString("vulkan-async-compute", "no") - MPVLib.setOptionString("vulkan-async-transfer", "no") - MPVLib.setOptionString("vulkan-queue-count", "1") - MPVLib.setOptionString("vd-lavc-film-grain", "gpu") + initOptions() diff --git a/buildscripts/buildall.sh b/buildscripts/buildall.sh index cdc9abc4..0a7982ce 100755 --- a/buildscripts/buildall.sh +++ b/buildscripts/buildall.sh @@ -73,15 +73,15 @@ loadarch () { if [ "$ARM_V9A" -eq 1 ]; then # ARM v9a: SVE2 + enhanced NEON + crypto + I8MM # Tuned for Cortex-X3/X4 (Snapdragon 8 Gen 2/3, Dimensity 9200/9300, Exynos 2400) - export CFLAGS="-march=armv9-a+sve2+sve2-bitperm+sme+sha3+sm4+lse+dotprod -mtune=cortex-x3 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer" + export CFLAGS="-march=armv9-a+sve2+sve2-bitperm+sme+sha3+sm4+lse+dotprod -mtune=cortex-x3 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer -fdata-sections -ffunction-sections -funroll-loops -fno-strict-aliasing" export CXXFLAGS="$CFLAGS" - export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld" + export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld -Wl,--gc-sections" elif [[ "$ndk_triple" == "aarch64"* ]]; then # ARM v8a base: NEON + CRC + crypto, tuned for Cortex-A76 class cores # This gives 8-10% boost over the default NDK flags - export CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a76 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer" + export CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a76 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer -fdata-sections -ffunction-sections -funroll-loops -fno-strict-aliasing" export CXXFLAGS="$CFLAGS" - export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld" + export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld -Wl,--gc-sections" fi export AR=llvm-ar diff --git a/buildscripts/scripts/ffmpeg.sh b/buildscripts/scripts/ffmpeg.sh index e8bb0e9c..c06854e6 100755 --- a/buildscripts/scripts/ffmpeg.sh +++ b/buildscripts/scripts/ffmpeg.sh @@ -36,7 +36,7 @@ args=( --target-os=android --enable-cross-compile --cross-prefix=$ndk_triple- --cc=$CC --pkg-config=pkg-config --nm=llvm-nm --arch=${ndk_triple%%-*} --cpu=$cpu - --extra-cflags="-I$prefix_dir/include $cpuflags" --extra-ldflags="-L$prefix_dir/lib -lvulkan" + --extra-cflags="-I$prefix_dir/include $cpuflags $CFLAGS" --extra-ldflags="-L$prefix_dir/lib -lvulkan -lGLESv2 -lEGL $LDFLAGS" --enable-{jni,mediacodec,mbedtls,libdav1d} diff --git a/buildscripts/scripts/mpv.sh b/buildscripts/scripts/mpv.sh index bb5e220b..ce32d38f 100755 --- a/buildscripts/scripts/mpv.sh +++ b/buildscripts/scripts/mpv.sh @@ -58,6 +58,8 @@ meson setup $build --cross-file "$prefix_dir"/crossfile.txt \ -Dlibcurl=enabled \ -Djavascript=enabled \ -Dvulkan=enabled \ + -Dgl=enabled \ + -Degl-android=enabled \ -Dlibmpv=true \ -Dcplayer=false \ -Dmanpage-build=disabled From 3956e91453c66c2bb68ad53ddc93feee4683818a Mon Sep 17 00:00:00 2001 From: SunnyVishnu3 Date: Wed, 3 Jun 2026 03:56:17 +0530 Subject: [PATCH 5/5] Revert "build: optimize compiler flags and enhance arm stability even more" This reverts commit 05b4da64ab063a40ab278d42df0bd8fed49a96ce. --- app/build.gradle | 2 +- app/src/main/java/is/xyz/mpv/BaseMPVView.kt | 8 ++++++-- buildscripts/buildall.sh | 8 ++++---- buildscripts/scripts/ffmpeg.sh | 2 +- buildscripts/scripts/mpv.sh | 2 -- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 96f9dc53..620de130 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { compileSdk 36 defaultConfig { - minSdkVersion 24 + minSdkVersion 33 targetSdkVersion 36 versionCode 38 diff --git a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt index 38c6f383..7d7e0888 100644 --- a/app/src/main/java/is/xyz/mpv/BaseMPVView.kt +++ b/app/src/main/java/is/xyz/mpv/BaseMPVView.kt @@ -24,7 +24,6 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( * Call this once before the view is shown. */ fun initialize(configDir: String, cacheDir: String) { - MPVLib.loadLibraries(context) MPVLib.create(context) MPVLib.setOptionString("config", "yes") @@ -38,7 +37,12 @@ abstract class BaseMPVView(context: Context, attrs: AttributeSet) : SurfaceView( Log.e(TAG, "Failed to set SSL_CERT_FILE", e) } - + // Adreno-optimized Vulkan defaults for vo=gpu-next + MPVLib.setOptionString("gpu-api", "vulkan") + MPVLib.setOptionString("vulkan-async-compute", "no") + MPVLib.setOptionString("vulkan-async-transfer", "no") + MPVLib.setOptionString("vulkan-queue-count", "1") + MPVLib.setOptionString("vd-lavc-film-grain", "gpu") initOptions() diff --git a/buildscripts/buildall.sh b/buildscripts/buildall.sh index 0a7982ce..cdc9abc4 100755 --- a/buildscripts/buildall.sh +++ b/buildscripts/buildall.sh @@ -73,15 +73,15 @@ loadarch () { if [ "$ARM_V9A" -eq 1 ]; then # ARM v9a: SVE2 + enhanced NEON + crypto + I8MM # Tuned for Cortex-X3/X4 (Snapdragon 8 Gen 2/3, Dimensity 9200/9300, Exynos 2400) - export CFLAGS="-march=armv9-a+sve2+sve2-bitperm+sme+sha3+sm4+lse+dotprod -mtune=cortex-x3 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer -fdata-sections -ffunction-sections -funroll-loops -fno-strict-aliasing" + export CFLAGS="-march=armv9-a+sve2+sve2-bitperm+sme+sha3+sm4+lse+dotprod -mtune=cortex-x3 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer" export CXXFLAGS="$CFLAGS" - export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld -Wl,--gc-sections" + export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld" elif [[ "$ndk_triple" == "aarch64"* ]]; then # ARM v8a base: NEON + CRC + crypto, tuned for Cortex-A76 class cores # This gives 8-10% boost over the default NDK flags - export CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a76 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer -fdata-sections -ffunction-sections -funroll-loops -fno-strict-aliasing" + export CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a76 -O3 -flto=thin -ffast-math -fno-math-errno -fomit-frame-pointer" export CXXFLAGS="$CFLAGS" - export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld -Wl,--gc-sections" + export LDFLAGS="$LDFLAGS -flto=thin -fuse-ld=lld" fi export AR=llvm-ar diff --git a/buildscripts/scripts/ffmpeg.sh b/buildscripts/scripts/ffmpeg.sh index c06854e6..e8bb0e9c 100755 --- a/buildscripts/scripts/ffmpeg.sh +++ b/buildscripts/scripts/ffmpeg.sh @@ -36,7 +36,7 @@ args=( --target-os=android --enable-cross-compile --cross-prefix=$ndk_triple- --cc=$CC --pkg-config=pkg-config --nm=llvm-nm --arch=${ndk_triple%%-*} --cpu=$cpu - --extra-cflags="-I$prefix_dir/include $cpuflags $CFLAGS" --extra-ldflags="-L$prefix_dir/lib -lvulkan -lGLESv2 -lEGL $LDFLAGS" + --extra-cflags="-I$prefix_dir/include $cpuflags" --extra-ldflags="-L$prefix_dir/lib -lvulkan" --enable-{jni,mediacodec,mbedtls,libdav1d} diff --git a/buildscripts/scripts/mpv.sh b/buildscripts/scripts/mpv.sh index ce32d38f..bb5e220b 100755 --- a/buildscripts/scripts/mpv.sh +++ b/buildscripts/scripts/mpv.sh @@ -58,8 +58,6 @@ meson setup $build --cross-file "$prefix_dir"/crossfile.txt \ -Dlibcurl=enabled \ -Djavascript=enabled \ -Dvulkan=enabled \ - -Dgl=enabled \ - -Degl-android=enabled \ -Dlibmpv=true \ -Dcplayer=false \ -Dmanpage-build=disabled