mirror of
https://github.com/ittiam-systems/libhevc.git
synced 2026-04-02 20:30:49 +07:00
libhevc: Enable support for MacOS
Test: ./hevcenc Test: ./hevcdec Change-Id: Iafd43c61d80ddc46807441bcda97bb72edd76850
This commit is contained in:
parent
8dd2b3392a
commit
45c10b2003
15 changed files with 175 additions and 21 deletions
|
|
@ -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}")
|
||||
|
|
|
|||
28
README.md
28
README.md
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
34
cmake/toolchains/android_toolchain.cmake
Normal file
34
cmake/toolchains/android_toolchain.cmake
Normal 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")
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue