libfreerdp-codec: add support for android cpu-features module

This commit is contained in:
Marc-André Moreau 2012-10-22 19:01:19 -04:00
parent a79e913e6d
commit 158030c57a
4 changed files with 45 additions and 28 deletions

View File

@ -61,9 +61,12 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release") set(CMAKE_BUILD_TYPE "Release")
endif() endif()
# Default to build shared libs
if(NOT DEFINED BUILD_SHARED_LIBS) if(NOT DEFINED BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON) if(ANDROID)
set(BUILD_SHARED_LIBS OFF)
else()
set(BUILD_SHARED_LIBS ON)
endif()
endif() endif()
if(NOT DEFINED EXPORT_ALL_SYMBOLS) if(NOT DEFINED EXPORT_ALL_SYMBOLS)

View File

@ -3,6 +3,8 @@ if((CMAKE_SYSTEM_PROCESSOR MATCHES "i386|i686|x86") AND (CMAKE_SIZEOF_VOID_P EQU
set(TARGET_ARCH "x86") set(TARGET_ARCH "x86")
elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") AND (CMAKE_SIZEOF_VOID_P EQUAL 8)) elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") AND (CMAKE_SIZEOF_VOID_P EQUAL 8))
set(TARGET_ARCH "x64") set(TARGET_ARCH "x64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm*")
set(TARGET_ARCH "ARM")
endif() endif()
option(WITH_MANPAGES "Generate manpages." ON) option(WITH_MANPAGES "Generate manpages." ON)
@ -14,7 +16,11 @@ else()
option(WITH_SSE2 "Enable SSE2 optimization." OFF) option(WITH_SSE2 "Enable SSE2 optimization." OFF)
endif() endif()
option(WITH_NEON "Enable NEON optimization." OFF) if((TARGET_ARCH MATCHES "ARM") AND (NOT DEFINED WITH_NEON))
option(WITH_NEON "Enable NEON optimization." ON)
else()
option(WITH_NEON "Enable NEON optimization." OFF)
endif()
option(WITH_JPEG "Use JPEG decoding." OFF) option(WITH_JPEG "Use JPEG decoding." OFF)
@ -31,13 +37,18 @@ option(BUILD_TESTING "Build unit tests" OFF)
option(WITH_SAMPLE "Build sample code" OFF) option(WITH_SAMPLE "Build sample code" OFF)
if(${CMAKE_VERSION} VERSION_GREATER 2.8.8) if(${CMAKE_VERSION} VERSION_GREATER 2.8.8)
option(MONOLITHIC_BUILD "Use monolithic build" OFF) if(ANDROID)
option(MONOLITHIC_BUILD "Use monolithic build" ON)
else()
option(MONOLITHIC_BUILD "Use monolithic build" OFF)
endif()
endif() endif()
option(WITH_CLIENT "Build client binaries" ON) option(WITH_CLIENT "Build client binaries" ON)
option(WITH_SERVER "Build server binaries" OFF) option(WITH_SERVER "Build server binaries" OFF)
option(STATIC_CHANNELS "Build channels statically" ON) option(STATIC_CHANNELS "Build channels statically" ON)
option(WITH_CHANNELS "Build virtual channel plugins" ON) option(WITH_CHANNELS "Build virtual channel plugins" ON)
if(WITH_CLIENT AND WITH_CHANNELS) if(WITH_CLIENT AND WITH_CHANNELS)

View File

@ -61,17 +61,24 @@ if(WITH_SSE2)
set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_SSE2_SRCS}) set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_SSE2_SRCS})
if(CMAKE_COMPILER_IS_GNUCC) if(CMAKE_COMPILER_IS_GNUCC)
set_property(SOURCE rfx_sse2.c nsc_sse2.c PROPERTY COMPILE_FLAGS "-msse2") set_source_files_properties(${${MODULE_PREFIX}_SSE2_SRCS} PROPERTIES COMPILE_FLAGS "-msse2")
endif() endif()
if(MSVC) if(MSVC)
set_property(SOURCE rfx_sse2.c nsc_sse2.c PROPERTY COMPILE_FLAGS "/arch:SSE2") set_source_files_properties(${${MODULE_PREFIX}_SSE2_SRCS} PROPERTIES COMPILE_FLAGS "/arch:SSE2")
endif() endif()
endif() endif()
if(WITH_NEON) if(WITH_NEON)
if(ANDROID)
set(ANDROID_CPU_FEATURES_PATH "${ANDROID_NDK}/sources/android/cpufeatures")
include_directories(${ANDROID_CPU_FEATURES_PATH})
set(${MODULE_PREFIX}_NEON_SRCS ${${MODULE_PREFIX}_NEON_SRCS}
${ANDROID_CPU_FEATURES_PATH}/cpu-features.c
${ANDROID_CPU_FEATURES_PATH}/cpu-features.h)
endif()
set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_NEON_SRCS}) set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_NEON_SRCS})
set_property(SOURCE rfx_neon.c PROPERTY COMPILE_FLAGS "-mfpu=neon -mfloat-abi=softfp") set_source_files_properties(${${MODULE_PREFIX}_NEON_SRCS} PROPERTIES COMPILE_FLAGS "-mfpu=neon -mfloat-abi=softfp -Wno-unused-variable")
endif() endif()
if(WITH_JPEG) if(WITH_JPEG)

View File

@ -31,28 +31,27 @@
#include "rfx_types.h" #include "rfx_types.h"
#include "rfx_neon.h" #include "rfx_neon.h"
#if defined(ANDROID) #if ANDROID
#include <cpu-features.h> #include "cpu-features.h"
#endif #endif
void rfx_decode_YCbCr_to_RGB_NEON(INT16 * y_r_buffer, INT16 * cb_g_buffer, INT16 * cr_b_buffer) void rfx_decode_YCbCr_to_RGB_NEON(INT16 * y_r_buffer, INT16 * cb_g_buffer, INT16 * cr_b_buffer)
{ {
int16x8_t zero = vdupq_n_s16(0); int16x8_t zero = vdupq_n_s16(0);
int16x8_t max = vdupq_n_s16(255); int16x8_t max = vdupq_n_s16(255);
int16x8_t y_add = vdupq_n_s16(128); int16x8_t y_add = vdupq_n_s16(128);
int16x8_t* y_r_buf = (int16x8_t*)y_r_buffer; int16x8_t* y_r_buf = (int16x8_t*) y_r_buffer;
int16x8_t* cb_g_buf = (int16x8_t*)cb_g_buffer; int16x8_t* cb_g_buf = (int16x8_t*) cb_g_buffer;
int16x8_t* cr_b_buf = (int16x8_t*)cr_b_buffer; int16x8_t* cr_b_buf = (int16x8_t*) cr_b_buffer;
int i; int i;
for (i = 0; i < 4096 / 8; i++) for (i = 0; i < 4096 / 8; i++)
{ {
int16x8_t y = vld1q_s16((INT16*)&y_r_buf[i]); int16x8_t y = vld1q_s16((INT16*) &y_r_buf[i]);
y = vaddq_s16(y, y_add); y = vaddq_s16(y, y_add);
int16x8_t cr = vld1q_s16((INT16*)&cr_b_buf[i]); int16x8_t cr = vld1q_s16((INT16*) &cr_b_buf[i]);
// r = between((y + cr + (cr >> 2) + (cr >> 3) + (cr >> 5)), 0, 255); // r = between((y + cr + (cr >> 2) + (cr >> 3) + (cr >> 5)), 0, 255);
int16x8_t r = vaddq_s16(y, cr); int16x8_t r = vaddq_s16(y, cr);
@ -295,50 +294,47 @@ rfx_dwt_2d_decode_block_NEON(INT16 * buffer, INT16 * idwt, int subband_width)
rfx_dwt_2d_decode_block_vert_NEON(l_dst, h_dst, buffer, subband_width); rfx_dwt_2d_decode_block_vert_NEON(l_dst, h_dst, buffer, subband_width);
} }
void void rfx_dwt_2d_decode_NEON(INT16 * buffer, INT16 * dwt_buffer)
rfx_dwt_2d_decode_NEON(INT16 * buffer, INT16 * dwt_buffer)
{ {
rfx_dwt_2d_decode_block_NEON(buffer + 3840, dwt_buffer, 8); rfx_dwt_2d_decode_block_NEON(buffer + 3840, dwt_buffer, 8);
rfx_dwt_2d_decode_block_NEON(buffer + 3072, dwt_buffer, 16); rfx_dwt_2d_decode_block_NEON(buffer + 3072, dwt_buffer, 16);
rfx_dwt_2d_decode_block_NEON(buffer, dwt_buffer, 32); rfx_dwt_2d_decode_block_NEON(buffer, dwt_buffer, 32);
} }
int isNeonSupported() int isNeonSupported()
{ {
#if defined(ANDROID) #if ANDROID
if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM) if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM)
{ {
DEBUG_RFX("NEON optimization disabled - No ARM CPU found"); DEBUG_RFX("NEON optimization disabled - No ARM CPU found");
return 0; return 0;
} }
UINT64_t features = android_getCpuFeatures(); UINT64 features = android_getCpuFeatures();
if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7)) if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7))
{ {
if (features & ANDROID_CPU_ARM_FEATURE_NEON) if (features & ANDROID_CPU_ARM_FEATURE_NEON)
{ {
DEBUG_RFX("NEON optimization enabled!"); DEBUG_RFX("NEON optimization enabled!");
return 1; return FALSE;
} }
DEBUG_RFX("NEON optimization disabled - CPU not NEON capable"); DEBUG_RFX("NEON optimization disabled - CPU not NEON capable");
} }
else else
{
DEBUG_RFX("NEON optimization disabled - No ARMv7 CPU found"); DEBUG_RFX("NEON optimization disabled - No ARMv7 CPU found");
}
return 0; return FALSE;
#else #else
return 1; return TRUE;
#endif #endif
} }
void rfx_init_neon(RFX_CONTEXT * context) void rfx_init_neon(RFX_CONTEXT * context)
{ {
if (isNeonSupported())
if(isNeonSupported())
{ {
DEBUG_RFX("Using NEON optimizations"); DEBUG_RFX("Using NEON optimizations");