Use google cpu_features library

Currently, ndk cpu-features is being used.
This is now deprecated and google open-source
cpu_features library is recommended.

PiperOrigin-RevId: 273987647
This commit is contained in:
sofijajvc 2019-10-10 18:29:56 +01:00 committed by Andrew Lewis
parent 58cb7d29ca
commit d01d8f0344
3 changed files with 37 additions and 18 deletions

View File

@ -17,7 +17,8 @@ To use this extension you need to clone the ExoPlayer repository and depend on
its modules locally. Instructions for doing this can be found in ExoPlayer's
[top level README][].
In addition, it's necessary to fetch libgav1 and its dependencies as follows:
In addition, it's necessary to fetch cpu_features library and libgav1 with its
dependencies as follows:
* Set the following environment variables:
@ -27,6 +28,13 @@ EXOPLAYER_ROOT="$(pwd)"
AV1_EXT_PATH="${EXOPLAYER_ROOT}/extensions/av1/src/main"
```
* Fetch cpu_features library:
```
cd "${AV1_EXT_PATH}/jni" && \
git clone https://github.com/google/cpu_features
```
* Fetch libgav1:
```

View File

@ -11,6 +11,7 @@ project(libgav1JNI C CXX)
# armeabi-v7a build. This flag enables it.
if(${ANDROID_ABI} MATCHES "armeabi-v7a")
add_compile_options("-mfpu=neon")
add_compile_options("-fPIC")
endif()
set(libgav1_jni_root "${CMAKE_CURRENT_SOURCE_DIR}")
@ -21,6 +22,14 @@ set(libgav1_jni_output_directory
set(libgav1_root "${libgav1_jni_root}/libgav1")
set(libgav1_build "${libgav1_jni_build}/libgav1")
set(cpu_features_root "${libgav1_jni_root}/cpu_features")
set(cpu_features_build "${libgav1_jni_build}/cpu_features")
# Build cpu_features library.
add_subdirectory("${cpu_features_root}"
"${cpu_features_build}"
EXCLUDE_FROM_ALL)
# Build libgav1.
add_subdirectory("${libgav1_root}"
"${libgav1_build}"
@ -34,14 +43,10 @@ add_library(gav1JNI
# Locate NDK log library.
find_library(android_log_lib log)
# Build cpufeatures library.
include(AndroidNdkModules)
android_ndk_import_module_cpufeatures()
# Link libgav1JNI against used libraries.
target_link_libraries(gav1JNI
PRIVATE android
PRIVATE cpufeatures
PRIVATE cpu_features
PRIVATE libgav1_static
PRIVATE ${android_log_lib})

View File

@ -17,10 +17,14 @@
#include <android/log.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
#ifdef __ARM_NEON
#include "cpu_features_macros.h" // NOLINT
#ifdef CPU_FEATURES_ARCH_ARM
#include "cpuinfo_arm.h" // NOLINT
#endif // CPU_FEATURES_ARCH_ARM
#ifdef CPU_FEATURES_COMPILED_ANY_ARM_NEON
#include <arm_neon.h>
#endif // __ARM_NEON
#include <cpu-features.h>
#endif // CPU_FEATURES_COMPILED_ANY_ARM_NEON
#include <jni.h>
#include <cstring>
@ -380,7 +384,7 @@ void Convert10BitFrameTo8BitDataBuffer(
}
}
#ifdef __ARM_NEON
#ifdef CPU_FEATURES_COMPILED_ANY_ARM_NEON
void Convert10BitFrameTo8BitDataBufferNeon(
const libgav1::DecoderBuffer* decoder_buffer, jbyte* data) {
uint32x2_t lcg_value = vdup_n_u32(random());
@ -477,7 +481,7 @@ void Convert10BitFrameTo8BitDataBufferNeon(
}
}
}
#endif // __ARM_NEON
#endif // CPU_FEATURES_COMPILED_ANY_ARM_NEON
} // namespace
@ -487,18 +491,20 @@ DECODER_FUNC(jlong, gav1Init, jint threads) {
return kStatusError;
}
#ifdef __arm__
#ifdef CPU_FEATURES_ARCH_ARM
// Libgav1 requires NEON with arm ABIs.
#ifdef __ARM_NEON
if (!(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)) {
#ifdef CPU_FEATURES_COMPILED_ANY_ARM_NEON
const cpu_features::ArmFeatures arm_features =
cpu_features::GetArmInfo().features;
if (!arm_features.neon) {
context->jni_status_code = kJniStatusNeonNotSupported;
return reinterpret_cast<jlong>(context);
}
#else
context->jni_status_code = kJniStatusNeonNotSupported;
return reinterpret_cast<jlong>(context);
#endif // __ARM_NEON
#endif // __arm__
#endif // CPU_FEATURES_COMPILED_ANY_ARM_NEON
#endif // CPU_FEATURES_ARCH_ARM
libgav1::DecoderSettings settings;
settings.threads = threads;
@ -590,11 +596,11 @@ DECODER_FUNC(jint, gav1GetFrame, jlong jContext, jobject jOutputBuffer,
CopyFrameToDataBuffer(decoder_buffer, data);
break;
case 10:
#ifdef __ARM_NEON
#ifdef CPU_FEATURES_COMPILED_ANY_ARM_NEON
Convert10BitFrameTo8BitDataBufferNeon(decoder_buffer, data);
#else
Convert10BitFrameTo8BitDataBuffer(decoder_buffer, data);
#endif // __ARM_NEON
#endif // CPU_FEATURES_COMPILED_ANY_ARM_NEON
break;
default:
context->jni_status_code = kJniStatusBitDepth12NotSupportedWithYuv;