From 6874cc80cfae2a6c1338719ce09eaaa3155e989c Mon Sep 17 00:00:00 2001 From: Alexey Rochev Date: Wed, 6 Dec 2023 21:32:58 +0300 Subject: [PATCH 1/3] ffmpeg: add support of specifying Android ABI version when building FFmpeg Also add proper error message when using NDK that doesn't support requested ABI version. --- libraries/decoder_ffmpeg/README.md | 10 ++++- .../src/main/jni/build_ffmpeg.sh | 40 ++++++++++++++----- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/libraries/decoder_ffmpeg/README.md b/libraries/decoder_ffmpeg/README.md index 2ee4fc3989..053a227e32 100644 --- a/libraries/decoder_ffmpeg/README.md +++ b/libraries/decoder_ffmpeg/README.md @@ -29,7 +29,7 @@ FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main" ``` * Download the [Android NDK][] and set its location in a shell variable. - This build configuration has been tested on NDK r21. + This build configuration has been tested on NDK r26b (r23c if ANDROID_ABI is 16). ``` NDK_PATH="" @@ -41,6 +41,12 @@ NDK_PATH="" HOST_PLATFORM="linux-x86_64" ``` +* Set the ABI version for native code (typically it's equal to minSdk and must not exceed it): + +``` +ANDROID_ABI=16 +``` + * Fetch FFmpeg and checkout an appropriate branch. We cannot guarantee compatibility with all versions of FFmpeg. We currently recommend version 6.0: @@ -74,7 +80,7 @@ ln -s "$FFMPEG_PATH" ffmpeg ``` cd "${FFMPEG_MODULE_PATH}/jni" && \ ./build_ffmpeg.sh \ - "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}" + "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}" ``` ## Build instructions (Windows) diff --git a/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh b/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh index 0ab1231c0b..3a4ca4753c 100755 --- a/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh +++ b/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh @@ -16,11 +16,17 @@ # set -eu -FFMPEG_MODULE_PATH=$1 -NDK_PATH=$2 -HOST_PLATFORM=$3 -ENABLED_DECODERS=("${@:4}") -JOBS=$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4) +FFMPEG_MODULE_PATH="$1" +echo "FFMPEG_MODULE_PATH is ${FFMPEG_MODULE_PATH}" +NDK_PATH="$2" +echo "NDK path is ${NDK_PATH}" +HOST_PLATFORM="$3" +echo "Host platform is ${HOST_PLATFORM}" +ANDROID_ABI="$4" +echo "ANDROID_ABI is ${ANDROID_ABI}" +ENABLED_DECODERS=("${@:5}") +echo "Enabled decoders are ${ENABLED_DECODERS[@]}" +JOBS="$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4)" echo "Using $JOBS jobs for make" COMMON_OPTIONS=" --target-os=android @@ -45,12 +51,28 @@ for decoder in "${ENABLED_DECODERS[@]}" do COMMON_OPTIONS="${COMMON_OPTIONS} --enable-decoder=${decoder}" done + +ARMV7_CLANG="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-clang" +if [[ -e "${TOOLCHAIN_PREFIX}" && ! -e "$ARMV7_CLANG" ]] +then + echo "AVMv7 Clang compiler with path $ARMV7_CLANG does not exist" + echo "It's likely your NDK version doesn't support ANDROID_ABI $ANDROID_ABI" + echo "Either use older version of NDK or raise ANDROID_ABI (be aware that ANDROID_ABI must not be greater than your application's minSdk)" + exit 1 +fi +ANDROID_ABI_64BIT="$ANDROID_ABI" +if [[ "$ANDROID_ABI_64BIT" -lt 21 ]] +then + echo "Using ANDROID_ABI 21 for 64-bit architectures" + ANDROID_ABI_64BIT=21 +fi + cd "${FFMPEG_MODULE_PATH}/jni/ffmpeg" ./configure \ --libdir=android-libs/armeabi-v7a \ --arch=arm \ --cpu=armv7-a \ - --cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-" \ + --cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ @@ -65,7 +87,7 @@ make clean --libdir=android-libs/arm64-v8a \ --arch=aarch64 \ --cpu=armv8-a \ - --cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android21-" \ + --cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android${ANDROID_ABI_64BIT}-" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ @@ -78,7 +100,7 @@ make clean --libdir=android-libs/x86 \ --arch=x86 \ --cpu=i686 \ - --cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android16-" \ + --cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android${ANDROID_ABI}-" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ @@ -92,7 +114,7 @@ make clean --libdir=android-libs/x86_64 \ --arch=x86_64 \ --cpu=x86_64 \ - --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \ + --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android${ANDROID_ABI_64BIT}-" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ From 38b5b03ebbb96ee6f0acb69bc26bfd8cbeecff9c Mon Sep 17 00:00:00 2001 From: Alexey Rochev Date: Wed, 6 Dec 2023 21:36:52 +0300 Subject: [PATCH 2/3] Fix error with NDK r26 --- libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh b/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh index 3a4ca4753c..dc996fd196 100755 --- a/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh +++ b/libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh @@ -113,7 +113,7 @@ make clean ./configure \ --libdir=android-libs/x86_64 \ --arch=x86_64 \ - --cpu=x86_64 \ + --cpu=x86-64 \ --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android${ANDROID_ABI_64BIT}-" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ From ce67b4d72362b1e9b55e91257727ddaa78841a02 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 12 Dec 2023 10:42:35 +0000 Subject: [PATCH 3/3] Add release notes --- RELEASENOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d7144a557a..ae85d9ad7e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -117,8 +117,8 @@ ([#710](https://github.com/androidx/media/pull/710)). * MIDI: Fix issue where seeking forward skips the Program Change events ([#704](https://github.com/androidx/media/issues/704). - * Migrate to FFmpeg 6.0 - ([#707](https://github.com/androidx/media/pull/707)). + * Migrate to FFmpeg 6.0 and update supported NDK to `r26b` + ([#707](https://github.com/androidx/media/pull/707), [#867](https://github.com/androidx/media/pull/867)). * Leanback extension: * Cast Extension: * Sanitize creation of a `Timeline` to not crash the app when loading