libhevc: Enable support for MacOS

Test: ./hevcenc
Test: ./hevcdec

Change-Id: Iafd43c61d80ddc46807441bcda97bb72edd76850
This commit is contained in:
Suyog Pawar 2024-09-12 12:35:19 +05:30 committed by Harish Mahendrakar
parent 8dd2b3392a
commit 45c10b2003
15 changed files with 175 additions and 21 deletions

View file

@ -1,6 +1,17 @@
cmake_minimum_required(VERSION 3.9.1)
project(libhevc 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(HEVC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
set(HEVC_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")

View file

@ -7,6 +7,8 @@ Supports:
- aarch32/aarch64 on Linux.
- aarch32/aarch64 on Android.
- x86_32/x86_64 on Linux.
- aarch64 on Mac.
- x86_64 on Mac.
## Native Builds
Use the following commands for building on the target machine
@ -51,3 +53,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/libhevc
$ mkdir build
$ cd build
```
#### Armv7 (32-bit)
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/android_toolchain.cmake\
-DHEVC_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\
-DHEVC_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(HEVC_ANDROID_NDK_PATH)
set(ENV{HEVC_ANDROID_NDK_PATH} "${HEVC_ANDROID_NDK_PATH}")
else()
set(HEVC_ANDROID_NDK_PATH "$ENV{HEVC_ANDROID_NDK_PATH}")
endif()
if(NOT HEVC_ANDROID_NDK_PATH)
message(FATAL_ERROR "HEVC_ANDROID_NDK_PATH not set.")
return()
endif()
include("${HEVC_ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake")

View file

@ -2,9 +2,9 @@ include(CheckCXXCompilerFlag)
# Adds compiler options for all targets
function(libhevc_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)
@ -32,9 +32,15 @@ endfunction()
# Adds defintions for all targets
function(libhevc_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 -DENABLE_NEON)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q -DENABLE_NEON
-DDISABLE_NEONINTR)
else()

View file

@ -62,7 +62,7 @@ list(
include_directories(${HEVC_ROOT}/common)
# arm/x86 sources
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64")
list(
APPEND
LIBHEVC_COMMON_ASMS
@ -135,7 +135,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
"${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_uni.s")
include_directories(${HEVC_ROOT}/common/arm64 ${HEVC_ROOT}/common/arm)
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
list(
APPEND
LIBHEVC_COMMON_ASMS

View file

@ -110,8 +110,13 @@ void ihevcd_init_function_ptr(void *pv_codec)
break;
case ARCH_ARMV8_GENERIC:
default:
#ifdef DARWIN
ihevcd_init_function_ptr_noneon(ps_codec);
break;
#else
ihevcd_init_function_ptr_av8(ps_codec);
break;
#endif
}
#endif
}

View file

@ -33,7 +33,7 @@ list(
include_directories(${HEVC_ROOT}/decoder)
# arm/x86 sources
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
if("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}" STREQUAL "arm64")
list(
APPEND
LIBHEVCDEC_ASMS
@ -47,7 +47,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
"${HEVC_ROOT}/decoder/arm64/ihevcd_itrans_recon_dc_luma.s")
include_directories(${HEVC_ROOT}/decoder/arm64)
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch32")
list(
APPEND
LIBHEVCDEC_ASMS

View file

@ -95,7 +95,9 @@ list(
include_directories(${HEVC_ROOT}/encoder)
# arm/x86 sources
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}"
if("${SYSTEM_NAME}" STREQUAL "Darwin")
message("Assembly optimizations not supported for MacOS")
elseif("${SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${SYSTEM_PROCESSOR}"
STREQUAL "aarch32")
list(
APPEND

View file

@ -49,6 +49,10 @@
/* System include files */
#include <stdio.h>
#ifdef DARWIN
#include <string.h>
#include <stdlib.h>
#endif
#include <semaphore.h>
#include <errno.h>
@ -119,6 +123,25 @@ void *osal_sem_create(IN void *osal_handle, IN osal_sem_attr_t *attr)
sem_handle->hdl = handle;
/* Create a sempahore */
#ifdef DARWIN
static int sem_counter = 0;
char sem_name[32];
snprintf(sem_name, sizeof(sem_name), "/osal_sem_%d", sem_counter++);
sem_t *sem = sem_open(sem_name, O_CREAT, 0644, attr->value);
if(sem == SEM_FAILED){
handle->free(sem_handle->mmr_handle, sem_handle);
return 0;
}
sem_handle->sem_handle = sem;
sem_handle->sem_name = strdup(sem_name);
if(sem_handle->sem_name == NULL){
sem_close(sem);
sem_unlink(sem_name);
handle->free(sem_handle->mmr_handle, sem_handle);
return 0;
}
#else
if(-1 == sem_init(
&(sem_handle->sem_handle), /* Semaphore handle */
0, /* Shared only between threads */
@ -127,6 +150,7 @@ void *osal_sem_create(IN void *osal_handle, IN osal_sem_attr_t *attr)
handle->free(sem_handle->mmr_handle, sem_handle);
return 0;
}
#endif
return sem_handle;
}
@ -171,11 +195,20 @@ WORD32 osal_sem_destroy(IN void *sem_handle)
return OSAL_ERROR;
/* Destroy the semaphore */
#ifdef DARWIN
if(0 == sem_close(handle->sem_handle) && 0 == sem_unlink(handle->sem_name))
{
free(handle->sem_name);
handle->hdl->free(handle->mmr_handle, handle);
return OSAL_SUCCESS;
}
#else
if(0 == sem_destroy(&(handle->sem_handle)))
{
handle->hdl->free(handle->mmr_handle, handle);
return OSAL_SUCCESS;
}
#endif
return OSAL_ERROR;
}
@ -219,7 +252,11 @@ WORD32 osal_sem_wait(IN void *sem_handle)
sem_handle_t *handle = (sem_handle_t *)sem_handle;
/* Wait on Semaphore object infinitly */
#ifdef DARWIN
return sem_wait(handle->sem_handle);
#else
return sem_wait(&(handle->sem_handle));
#endif
}
}
@ -258,7 +295,11 @@ WORD32 osal_sem_post(IN void *sem_handle)
sem_handle_t *handle = (sem_handle_t *)sem_handle;
/* Semaphore Post */
#ifdef DARWIN
return sem_post(handle->sem_handle);
#else
return sem_post(&(handle->sem_handle));
#endif
}
}
@ -297,8 +338,13 @@ WORD32 osal_sem_count(IN void *sem_handle, OUT WORD32 *count)
{
sem_handle_t *handle = (sem_handle_t *)sem_handle;
#ifdef DARWIN
if(-1 == sem_getvalue(handle->sem_handle, count))
return OSAL_ERROR;
#else
if(-1 == sem_getvalue(&(handle->sem_handle), count))
return OSAL_ERROR;
#endif
return OSAL_SUCCESS;
}

View file

@ -56,7 +56,12 @@
/* typedef integer. */
typedef struct
{
#ifdef DARWIN
sem_t *sem_handle; /* Semaphore handle */
char *sem_name; /* Semaphore name */
#else
sem_t sem_handle; /* Semaphore handle */
#endif
void *mmr_handle; /* Pointer to memory manager handle */
osal_t *hdl; /* Associated OSAL handle */

View file

@ -66,7 +66,9 @@
#include <unistd.h>
#include <math.h>
#include <sched.h> /*for CPU_SET, etc.. */
#include <linux/unistd.h>
#ifndef DARWIN
#include<linux/unistd.h>
#endif
#include <sys/syscall.h>
/* User include files */
@ -296,14 +298,19 @@ WORD32 osal_thread_sleep(IN UWORD32 milli_seconds)
timer.tv_sec = milli_seconds / 1000;
milli_seconds -= (timer.tv_sec * 1000);
timer.tv_nsec = milli_seconds * MEGA_CONST;
#ifdef DARWIN
if(0 == nanosleep(&timer, NULL))
{
return OSAL_SUCCESS;
}
#else
/* Using Monotonic clock to sleep, also flag is set to 0 for relative */
/* time to current clock time */
if(0 == clock_nanosleep(CLOCK_MONOTONIC, 0, &timer, NULL))
{
return OSAL_SUCCESS;
}
#endif
return OSAL_ERROR;
}
}
@ -703,5 +710,11 @@ void osal_print_last_error(IN const STRWORD8 *string)
WORD32 osal_get_current_tid(void)
{
#ifdef DARWIN
uint64_t tid;
pthread_threadid_np(NULL, &tid);
return tid;
#else
return syscall(__NR_gettid);
#endif
}

View file

@ -1,2 +1,4 @@
libhevc_add_fuzzer(hevc_dec_fuzzer libhevcdec SOURCES
${HEVC_ROOT}/fuzzer/hevc_dec_fuzzer.cpp)
if(NOT "${SYSTEM_NAME}" STREQUAL "Darwin")
libhevc_add_fuzzer(hevc_dec_fuzzer libhevcdec SOURCES
${HEVC_ROOT}/fuzzer/hevc_dec_fuzzer.cpp)
endif()

View file

@ -1,2 +1,4 @@
libhevc_add_fuzzer(hevc_enc_fuzzer libhevcenc SOURCES
${HEVC_ROOT}/fuzzer/hevc_enc_fuzzer.cpp)
if(NOT "${SYSTEM_NAME}" STREQUAL "Darwin")
libhevc_add_fuzzer(hevc_enc_fuzzer libhevcenc SOURCES
${HEVC_ROOT}/fuzzer/hevc_enc_fuzzer.cpp)
endif()