diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d7144a557a..e4ba426d23 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -117,8 +117,9 @@ ([#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 diff --git a/libraries/decoder_ffmpeg/README.md b/libraries/decoder_ffmpeg/README.md index 2ee4fc3989..21f80b5188 100644 --- a/libraries/decoder_ffmpeg/README.md +++ b/libraries/decoder_ffmpeg/README.md @@ -28,8 +28,8 @@ cd "" 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. +* Download the [Android NDK][] and set its location in a shell variable. This + build configuration has been tested on NDK r26b (r23c if ANDROID_ABI is 16). ``` NDK_PATH="" @@ -41,6 +41,13 @@ 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 +81,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..dc996fd196 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" \ @@ -91,8 +113,8 @@ make clean ./configure \ --libdir=android-libs/x86_64 \ --arch=x86_64 \ - --cpu=x86_64 \ - --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \ + --cpu=x86-64 \ + --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" \