libavc : Enable support for MacOS

Test: ./avcenc
      ./avcdec

Change-Id: If03196cf979d7f6638b99d5b13afba6df3364178
This commit is contained in:
Suyog Pawar 2024-09-17 11:29:03 +05:30 committed by Harish Mahendrakar
parent 045d0c9156
commit 266cda3c3b
14 changed files with 134 additions and 18 deletions

View file

@ -1,6 +1,17 @@
cmake_minimum_required(VERSION 3.9.1)
project(libavc C CXX)
enable_language(ASM)
if(NOT DEFINED SYSTEM_NAME)
set(SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
endif()
if(NOT DEFINED SYSTEM_PROCESSOR)
set(SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
endif()
if(NOT "${SYSTEM_NAME}" STREQUAL "Darwin")
enable_language(ASM)
endif()
set(AVC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
set(AVC_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
@ -19,6 +30,16 @@ if("${AVC_ROOT}" STREQUAL "${AVC_CONFIG_DIR}")
"And re-run CMake from the build directory.")
endif()
if("${SYSTEM_NAME}" STREQUAL "Android")
find_library(log-lib log QUIET)
if(NOT log-lib)
message(FATAL_ERROR "Could NOT find log library, retry after installing \
log library at sysroot.")
else()
message(STATUS "Found log-lib: ${log-lib}")
endif()
endif()
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)

View file

@ -51,3 +51,29 @@ $ make
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch32_toolchain.cmake
$ make
```
### Building for android
NOTE: This assumes that you are building on a machine that has
[Android NDK](https://developer.android.com/ndk/downloads).
```
$ cd external/libavc
$ mkdir build
$ cd build
```
#### Armv7 (32-bit)
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/android_toolchain.cmake\
-DAVC_ANDROID_NDK_PATH=/opt/android-ndk-r26d/\
-DANDROID_ABI=armeabi-v7a\
-DANDROID_PLATFORM=android-23 ../
make
#### Armv8 (64-bit)
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/android_toolchain.cmake\
-DAVC_ANDROID_NDK_PATH=/opt/android-ndk-r26d/\
-DANDROID_ABI=arm64-v8a\
-DANDROID_PLATFORM=android-23 ../
make

View file

@ -1,5 +1,5 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch32)
set(SYSTEM_NAME Linux)
set(SYSTEM_PROCESSOR aarch32)
# Modify these variables with paths to appropriate compilers that can produce
# armv7 targets

View file

@ -1,5 +1,5 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(SYSTEM_NAME Linux)
set(SYSTEM_PROCESSOR aarch64)
# Modify these variables with paths to appropriate compilers that can produce
# armv8 targets

View file

@ -0,0 +1,34 @@
set(SYSTEM_NAME Android)
set(CMAKE_SYSTEM_NAME Android)
if(NOT ANDROID_PLATFORM)
set(ANDROID_PLATFORM android-23)
endif()
# Choose target architecture with:
# -DANDROID_ABI={armeabi-v7a, arm64-v8a, x86, x86_64}
if(NOT ANDROID_ABI)
set(ANDROID_ABI arm64-v8a)
endif()
if(ANDROID_ABI MATCHES "^armeabi")
set(SYSTEM_PROCESSOR aarch32)
else()
set(SYSTEM_PROCESSOR aarch64)
endif()
# Toolchain files don't have access to cached variables:
# https://gitlab.kitware.com/cmake/cmake/issues/16170. Set an intermediate
# environment variable when loaded the first time.
if(AVC_ANDROID_NDK_PATH)
set(ENV{AVC_ANDROID_NDK_PATH} "${AVC_ANDROID_NDK_PATH}")
else()
set(AVC_ANDROID_NDK_PATH "$ENV{AVC_ANDROID_NDK_PATH}")
endif()
if(NOT AVC_ANDROID_NDK_PATH)
message(FATAL_ERROR "AVC_ANDROID_NDK_PATH not set.")
return()
endif()
include("${AVC_ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake")

View file

@ -3,9 +3,9 @@ set(CMAKE_C_STANDARD 90)
# Adds compiler options for all targets
function(libavc_add_compile_options)
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64")
add_compile_options(-march=armv8-a)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
add_compile_options(-march=armv7-a -mfpu=neon)
else()
add_compile_options(-msse4.2 -mno-avx)
@ -34,9 +34,15 @@ endfunction()
# Adds defintions for all targets
function(libavc_add_definitions)
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
if("${SYSTEM_NAME}" STREQUAL "Darwin")
if("${SYSTEM_PROCESSOR}" STREQUAL "arm64")
add_definitions(-DARMV8 -DDARWIN -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC)
else()
add_definitions(-DX86 -DDARWIN -DDISABLE_AVX2 -DDEFAULT_ARCH=D_ARCH_X86_GENERIC)
endif()
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch64")
add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q)
else()
add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2
@ -83,6 +89,10 @@ function(libavc_add_executable NAME LIB)
add_dependencies(${NAME} ${LIB} ${ARG_LIBS})
target_link_libraries(${NAME} ${LIB} ${ARG_LIBS})
if("${SYSTEM_NAME}" STREQUAL "Android")
target_link_libraries(${NAME} ${log-lib})
endif()
if(ARG_FUZZER)
target_compile_options(${NAME}
PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>)

View file

@ -27,7 +27,7 @@ include_directories(${AVC_ROOT}/common)
include_directories(${AVC_ROOT}/common/mvc)
# arm/x86 sources
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64")
list(
APPEND
LIBAVC_COMMON_ASMS
@ -59,7 +59,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
include_directories(${AVC_ROOT}/common/arm)
include_directories(${AVC_ROOT}/common/armv8)
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
list(
APPEND
LIBAVC_COMMON_ASMS

View file

@ -64,8 +64,13 @@ void ih264d_init_function_ptr(dec_struct_t *ps_codec)
#if defined(ARMV8)
case ARCH_ARMV8_GENERIC:
default:
#ifdef DARWIN
ih264d_init_function_ptr_generic(ps_codec);
break;
#else
ih264d_init_function_ptr_av8(ps_codec);
break;
#endif
#elif !defined(DISABLE_NEON)
case ARCH_ARM_A5:
case ARCH_ARM_A7:

View file

@ -18,7 +18,7 @@
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#ifdef __ANDROID__
#include <log/log.h>
#include <android/log.h>
#endif
#include "ih264_typedefs.h"
#include "ih264_macros.h"
@ -39,6 +39,17 @@
#include "ih264_buf_mgr.h"
#include "assert.h"
#ifdef __ANDROID__
#ifndef ALOG
#define ALOG(priority, tag, ...) ((void)__android_log_print(ANDROID_##priority, tag, __VA_ARGS__))
#define ALOGE(...) ALOG(LOG_ERROR, NULL, __VA_ARGS__)
inline int android_errorWriteLog(int tag, const char* subTag) {
ALOGE("android_errorWriteLog(%x, %s)", tag, subTag);
return 0;
}
#endif
#endif
/*!
***************************************************************************
* \file ih264d_dpb_mgr.c

View file

@ -36,8 +36,8 @@ list(
include_directories(${AVC_ROOT}/decoder)
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}"
STREQUAL "aarch32")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64"
OR "${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
list(
APPEND LIBAVCDEC_ASMS "${AVC_ROOT}/decoder/arm/ih264d_function_selector.c"
"${AVC_ROOT}/decoder/arm/ih264d_function_selector_a9q.c"

View file

@ -119,8 +119,13 @@ void ih264e_init_function_ptr(void *pv_codec)
case ARCH_ARM_A57:
case ARCH_ARM_V8_NEON:
default:
#ifdef DARWIN
ih264e_init_function_ptr_generic(ps_codec);
break;
#else
ih264e_init_function_ptr_neon_av8(ps_codec);
break;
#endif
#elif !defined(DISABLE_NEON)
case ARCH_ARM_A9Q:
case ARCH_ARM_A9A:

View file

@ -44,7 +44,7 @@ list(
include_directories(${AVC_ROOT}/encoder)
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64")
list(
APPEND
LIBAVCENC_ASMS
@ -57,7 +57,7 @@ if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
"${AVC_ROOT}/encoder/armv8/ime_distortion_metrics_av8.s")
include_directories(${AVC_ROOT}/encoder/armv8)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
list(
APPEND
LIBAVCENC_ASMS

View file

@ -1,2 +1,4 @@
libavc_add_fuzzer(avc_dec_fuzzer libavcdec SOURCES
if(NOT "${SYSTEM_NAME}" STREQUAL "Darwin")
libavc_add_fuzzer(avc_dec_fuzzer libavcdec SOURCES
${AVC_ROOT}/fuzzer/avc_dec_fuzzer.cpp)
endif()

View file

@ -1,2 +1,4 @@
libavc_add_fuzzer(avc_enc_fuzzer libavcenc SOURCES
if(NOT "${SYSTEM_NAME}" STREQUAL "Darwin")
libavc_add_fuzzer(avc_enc_fuzzer libavcenc SOURCES
${AVC_ROOT}/fuzzer/avc_enc_fuzzer.cpp)
endif()