diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 15:59:07 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 15:59:07 +0000 |
commit | 8f5121e002c625b5e3505ce2dc2000540ea6a646 (patch) | |
tree | 593d6ce54298be2f99429f640d100338e21b1752 | |
parent | 7e4cc1a1336ee3f5b1406b9e43409909e261e55a (diff) | |
parent | c087ee43dcf56e7b588efda38738c7f39c9755ec (diff) | |
download | libhevc-android13-frc-permission-release.tar.gz |
Snap for 8512216 from c087ee43dcf56e7b588efda38738c7f39c9755ec to tm-frc-permission-releaset_frc_per_330444010android13-frc-permission-release
Change-Id: I9998c57356d46bee4c28ed59151b3b8cb8caba6f
-rw-r--r-- | CMakeLists.txt | 133 | ||||
-rw-r--r-- | README.md | 53 | ||||
-rw-r--r-- | cmake/toolchains/aarch32_toolchain.cmake | 7 | ||||
-rw-r--r-- | cmake/toolchains/aarch64_toolchain.cmake | 13 | ||||
-rw-r--r-- | cmake/utils.cmake | 115 | ||||
-rw-r--r-- | common/common.cmake | 233 | ||||
-rwxr-xr-x | decoder/libhevcdec.cmake | 78 | ||||
-rw-r--r-- | encoder/hme_err_compute.c | 24 | ||||
-rw-r--r-- | encoder/hme_refine.c | 5 | ||||
-rw-r--r-- | encoder/ihevce_enc_loop_pass.c | 10 | ||||
-rw-r--r-- | encoder/ihevce_error_check.c | 33 | ||||
-rw-r--r-- | encoder/libhevcenc.cmake | 140 | ||||
-rw-r--r-- | fuzzer/README.md | 82 | ||||
-rw-r--r-- | fuzzer/hevc_dec_fuzzer.cmake | 2 | ||||
-rw-r--r-- | fuzzer/hevc_enc_fuzzer.cmake | 2 | ||||
-rw-r--r-- | fuzzer/hevc_enc_fuzzer.cpp | 1 | ||||
-rwxr-xr-x | fuzzer/ossfuzz.sh | 19 | ||||
-rw-r--r-- | test/decoder/hevcdec.cmake | 2 | ||||
-rw-r--r-- | test/encoder/hevcenc.cmake | 2 |
19 files changed, 728 insertions, 226 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a0116f5..590f117 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,6 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.9.1) +project(libhevc C CXX) +enable_language(ASM) set(HEVC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") set(HEVC_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") @@ -14,123 +16,30 @@ if("${HEVC_ROOT}" STREQUAL "${HEVC_CONFIG_DIR}") "And re-run CMake from the build directory.") endif() -set(THREADS_PREFER_PTHREAD_FLAG ON) +set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) -set(CMAKE_STATIC_LIBRARY_PREFIX "") -if(SANITIZE) - string(TOLOWER ${SANITIZE} SANITIZE) +set(CMAKE_STATIC_LIBRARY_PREFIX "") - set(CMAKE_SANITIZER_C_FLAGS "-fno-omit-frame-pointer -fsanitize=${SANITIZE}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_SANITIZER_C_FLAGS}") +if(${CMAKE_CROSSCOMPILING}) + set(THREADS_PTHREAD_ARG + "2" + CACHE STRING + "Refer https://gitlab.kitware.com/cmake/cmake/-/issues/16920" FORCE) endif() -list(APPEND LIBHEVCDEC_SRCS - "${HEVC_ROOT}/common/ithread.c" - "${HEVC_ROOT}/decoder/ihevcd_api.c" - "${HEVC_ROOT}/common/ihevc_quant_tables.c" - "${HEVC_ROOT}/common/ihevc_inter_pred_filters.c" - "${HEVC_ROOT}/common/ihevc_weighted_pred.c" - "${HEVC_ROOT}/common/ihevc_padding.c" - "${HEVC_ROOT}/common/ihevc_deblk_edge_filter.c" - "${HEVC_ROOT}/common/ihevc_deblk_tables.c" - "${HEVC_ROOT}/common/ihevc_cabac_tables.c" - "${HEVC_ROOT}/common/ihevc_common_tables.c" - "${HEVC_ROOT}/common/ihevc_intra_pred_filters.c" - "${HEVC_ROOT}/common/ihevc_chroma_intra_pred_filters.c" - "${HEVC_ROOT}/common/ihevc_mem_fns.c" - "${HEVC_ROOT}/common/ihevc_sao.c" - "${HEVC_ROOT}/common/ihevc_trans_tables.c" - "${HEVC_ROOT}/common/ihevc_recon.c" - "${HEVC_ROOT}/common/ihevc_itrans.c" - "${HEVC_ROOT}/common/ihevc_itrans_recon.c" - "${HEVC_ROOT}/common/ihevc_iquant_recon.c" - "${HEVC_ROOT}/common/ihevc_iquant_itrans_recon.c" - "${HEVC_ROOT}/common/ihevc_itrans_recon_32x32.c" - "${HEVC_ROOT}/common/ihevc_itrans_recon_16x16.c" - "${HEVC_ROOT}/common/ihevc_itrans_recon_8x8.c" - "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon.c" - "${HEVC_ROOT}/common/ihevc_chroma_iquant_recon.c" - "${HEVC_ROOT}/common/ihevc_chroma_iquant_itrans_recon.c" - "${HEVC_ROOT}/common/ihevc_chroma_recon.c" - "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_16x16.c" - "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_8x8.c" - "${HEVC_ROOT}/common/ihevc_buf_mgr.c" - "${HEVC_ROOT}/common/ihevc_disp_mgr.c" - "${HEVC_ROOT}/common/ihevc_dpb_mgr.c" - "${HEVC_ROOT}/common/ithread.c" - "${HEVC_ROOT}/decoder/ihevcd_version.c" - "${HEVC_ROOT}/decoder/ihevcd_api.c" - "${HEVC_ROOT}/decoder/ihevcd_decode.c" - "${HEVC_ROOT}/decoder/ihevcd_nal.c" - "${HEVC_ROOT}/decoder/ihevcd_bitstream.c" - "${HEVC_ROOT}/decoder/ihevcd_parse_headers.c" - "${HEVC_ROOT}/decoder/ihevcd_parse_slice_header.c" - "${HEVC_ROOT}/decoder/ihevcd_parse_slice.c" - "${HEVC_ROOT}/decoder/ihevcd_parse_residual.c" - "${HEVC_ROOT}/decoder/ihevcd_cabac.c" - "${HEVC_ROOT}/decoder/ihevcd_intra_pred_mode_prediction.c" - "${HEVC_ROOT}/decoder/ihevcd_process_slice.c" - "${HEVC_ROOT}/decoder/ihevcd_utils.c" - "${HEVC_ROOT}/decoder/ihevcd_job_queue.c" - "${HEVC_ROOT}/decoder/ihevcd_ref_list.c" - "${HEVC_ROOT}/decoder/ihevcd_get_mv.c" - "${HEVC_ROOT}/decoder/ihevcd_mv_pred.c" - "${HEVC_ROOT}/decoder/ihevcd_mv_merge.c" - "${HEVC_ROOT}/decoder/ihevcd_iquant_itrans_recon_ctb.c" - "${HEVC_ROOT}/decoder/ihevcd_itrans_recon_dc.c" - "${HEVC_ROOT}/decoder/ihevcd_common_tables.c" - "${HEVC_ROOT}/decoder/ihevcd_boundary_strength.c" - "${HEVC_ROOT}/decoder/ihevcd_deblk.c" - "${HEVC_ROOT}/decoder/ihevcd_inter_pred.c" - "${HEVC_ROOT}/decoder/ihevcd_sao.c" - "${HEVC_ROOT}/decoder/ihevcd_ilf_padding.c" - "${HEVC_ROOT}/decoder/ihevcd_fmt_conv.c") - -list( - APPEND LIBHEVCDEC_X86_SRCS - "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_generic.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_ssse3.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_sse42.c" - "${HEVC_ROOT}/common/x86/ihevc_inter_pred_filters_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_weighted_pred_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_intra_pred_filters_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_chroma_intra_pred_filters_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_16x16_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_32x32_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_sao_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_deblk_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_padding_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_mem_fns_ssse3_intr.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_fmt_conv_ssse3_intr.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_it_rec_dc_ssse3_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_inter_pred_filters_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_weighted_pred_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_intra_pred_filters_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_chroma_intra_pred_filters_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_16x16_itrans_recon_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_32x32_itrans_recon_sse42_intr.c" - "${HEVC_ROOT}/decoder/x86/ihevcd_it_rec_dc_sse42_intr.c" - "${HEVC_ROOT}/common/x86/ihevc_tables_x86_intr.c") - -set(LIBHEVCDEC_INCLUDES ${HEVC_ROOT}/common ${HEVC_ROOT}/decoder) +include("${HEVC_ROOT}/cmake/utils.cmake") -set(LIBHEVCDEC_X86_C_FLAGS "-DX86 -DDISABLE_AVX2 -msse4.2 -mno-avx \ - -DDEFAULT_ARCH=D_ARCH_X86_SSE42 -DMULTICORE") -set(LIBHEVCDEC_X86_INCLUDES ${HEVC_ROOT}/common/x86 ${HEVC_ROOT}/decoder/x86) -set(LIBHEVCDEC_C_FLAGS "${LIBHEVCDEC_X86_C_FLAGS}") +libhevc_add_compile_options() +libhevc_add_definitions() +libhevc_set_link_libraries() -include_directories(${LIBHEVCDEC_INCLUDES} ${LIBHEVCDEC_X86_INCLUDES}) -add_library(libhevcdec ${LIBHEVCDEC_SRCS} ${LIBHEVCDEC_X86_SRCS}) -set_target_properties(libhevcdec - PROPERTIES COMPILE_FLAGS "${LIBHEVCDEC_C_FLAGS}") +include("${HEVC_ROOT}/common/common.cmake") +include("${HEVC_ROOT}/decoder/libhevcdec.cmake") +include("${HEVC_ROOT}/encoder/libhevcenc.cmake") -list(APPEND HEVCDEC_SRCS "${HEVC_ROOT}/test/decoder/main.c") +include("${HEVC_ROOT}/test/decoder/hevcdec.cmake") +include("${HEVC_ROOT}/test/encoder/hevcenc.cmake") -add_executable(hevcdec ${HEVCDEC_SRCS}) -set_target_properties(hevcdec PROPERTIES COMPILE_FLAGS "-DMD5_DISABLE \ - -DPROFILE_ENABLE") -target_link_libraries(hevcdec libhevcdec Threads::Threads) +include("${HEVC_ROOT}/fuzzer/hevc_dec_fuzzer.cmake") +include("${HEVC_ROOT}/fuzzer/hevc_enc_fuzzer.cmake") diff --git a/README.md b/README.md new file mode 100644 index 0000000..a9e5758 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# LIBHEVC +## Getting Started Document + +# LibHEVC build steps + +Supports: +- aarch32/aarch64 on Linux. +- aarch32/aarch64 on Android. +- x86_32/x86_64 on Linux. + +## Native Builds +Use the following commands for building on the target machine + +``` +$ cd external/libhevc +$ mkdir build +$ cd build +$ cmake .. +$ make +``` + +## Cross-compiler based builds + +### Building for x86_32 on a x86_64 Linux machine +``` +$ cd external/libhevc +$ mkdir build +$ cd build +$ CFLAGS="-m32" CXXFLAGS="-m32" LDFLAGS="-m32" cmake .. +$ make +``` + +### Building for aarch32/aarch64 +Update 'CMAKE_C_COMPILER', 'CMAKE_CXX_COMPILER', 'CMAKE_C_COMPILER_AR', and +'CMAKE_CXX_COMPILER_AR' in CMAKE_TOOLCHAIN_FILE passed below + +``` +$ cd external/libhevc +$ mkdir build +$ cd build +``` + +#### For aarch64 +``` +$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch64_toolchain.cmake +$ make +``` + +#### For aarch32 +``` +$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch32_toolchain.cmake +$ make +``` diff --git a/cmake/toolchains/aarch32_toolchain.cmake b/cmake/toolchains/aarch32_toolchain.cmake new file mode 100644 index 0000000..5fabde2 --- /dev/null +++ b/cmake/toolchains/aarch32_toolchain.cmake @@ -0,0 +1,7 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch32) + +# Modify these variables with paths to appropriate compilers that can produce +# armv7 targets +set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) +set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) diff --git a/cmake/toolchains/aarch64_toolchain.cmake b/cmake/toolchains/aarch64_toolchain.cmake new file mode 100644 index 0000000..5efbf77 --- /dev/null +++ b/cmake/toolchains/aarch64_toolchain.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +# Modify these variables with paths to appropriate compilers that can produce +# armv8 targets +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +set(CMAKE_C_COMPILER_AR + aarch64-linux-gnu-gcc-ar + CACHE FILEPATH "Archiver") +set(CMAKE_CXX_COMPILER_AR + aarch64-linux-gnu-gcc-ar + CACHE FILEPATH "Archiver") diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 0000000..57b939f --- /dev/null +++ b/cmake/utils.cmake @@ -0,0 +1,115 @@ +include(CheckCXXCompilerFlag) + +# Adds compiler options for all targets +function(libhevc_add_compile_options) + if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + add_compile_options(-march=armv8-a) + elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") + add_compile_options(-march=armv7-a -mfpu=neon) + else() + add_compile_options(-msse4.2 -mno-avx) + endif() + + set(CMAKE_REQUIRED_FLAGS -fsanitize=fuzzer-no-link) + check_cxx_compiler_flag(-fsanitize=fuzzer-no-link + COMPILER_HAS_SANITIZE_FUZZER) + unset(CMAKE_REQUIRED_FLAGS) + + if(DEFINED SANITIZE) + set(CMAKE_REQUIRED_FLAGS -fsanitize=${SANITIZE}) + check_cxx_compiler_flag(-fsanitize=${SANITIZE} COMPILER_HAS_SANITIZER) + unset(CMAKE_REQUIRED_FLAGS) + + if(NOT COMPILER_HAS_SANITIZER) + message( + FATAL_ERROR "ERROR: Compiler doesn't support -fsanitize=${SANITIZE}") + return() + endif() + add_compile_options(-fno-omit-frame-pointer -fsanitize=${SANITIZE}) + endif() + +endfunction() + +# Adds defintions for all targets +function(libhevc_add_definitions) + add_definitions(-DPROFILE_ENABLE -DMD5_DISABLE) + + if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC) + elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") + add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q) + else() + add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 + -DDEFAULT_ARCH=D_ARCH_X86_SSE42) + endif() +endfunction() + +# Adds libraries needed for executables +function(libhevc_set_link_libraries) + link_libraries(Threads::Threads m) +endfunction() + +# cmake-format: off +# Adds a target for an executable +# +# Arguments: +# NAME: Name of the executatble +# LIB: Library that executable depends on +# SOURCES: Source files +# +# Optional Arguments: +# INCLUDES: Include paths +# LIBS: Additional libraries +# FUZZER: flag to specify if the target is a fuzzer binary +# cmake-format: on + +function(libhevc_add_executable NAME LIB) + set(multi_value_args SOURCES INCLUDES LIBS) + set(optional_args FUZZER) + cmake_parse_arguments(ARG "${optional_args}" "${single_value_args}" + "${multi_value_args}" ${ARGN}) + + # Check if compiler supports -fsanitize=fuzzer. If not, skip building fuzzer + # binary + if(ARG_FUZZER) + if(NOT COMPILER_HAS_SANITIZE_FUZZER) + message("Compiler doesn't support -fsanitize=fuzzer. Skipping ${NAME}") + return() + endif() + endif() + + add_executable(${NAME} ${ARG_SOURCES}) + target_include_directories(${NAME} PRIVATE ${ARG_INCLUDES}) + add_dependencies(${NAME} ${LIB} ${ARG_LIBS}) + + target_link_libraries(${NAME} ${LIB} ${ARG_LIBS}) + if(ARG_FUZZER) + target_compile_options(${NAME} + PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>) + if(DEFINED ENV{LIB_FUZZING_ENGINE}) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + $ENV{LIB_FUZZING_ENGINE}) + elseif(DEFINED SANITIZE) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + -fsanitize=fuzzer,${SANITIZE}) + else() + set_target_properties(${NAME} PROPERTIES LINK_FLAGS -fsanitize=fuzzer) + endif() + else() + if(DEFINED SANITIZE) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + -fsanitize=${SANITIZE}) + endif() + endif() +endfunction() + +# cmake-format: off +# Adds a target for a fuzzer binary +# Calls libhevc_add_executable with all arguments with FUZZER set to 1 +# Arguments: +# Refer to libhevc_add_executable's arguments +# cmake-format: on + +function(libhevc_add_fuzzer NAME LIB) + libhevc_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV}) +endfunction() diff --git a/common/common.cmake b/common/common.cmake new file mode 100644 index 0000000..12ac33a --- /dev/null +++ b/common/common.cmake @@ -0,0 +1,233 @@ +# src files +list( + APPEND + LIBHEVC_COMMON_SRCS + "${HEVC_ROOT}/common/ithread.c" + "${HEVC_ROOT}/common/ihevc_quant_tables.c" + "${HEVC_ROOT}/common/ihevc_inter_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_weighted_pred.c" + "${HEVC_ROOT}/common/ihevc_padding.c" + "${HEVC_ROOT}/common/ihevc_deblk_edge_filter.c" + "${HEVC_ROOT}/common/ihevc_deblk_tables.c" + "${HEVC_ROOT}/common/ihevc_cabac_tables.c" + "${HEVC_ROOT}/common/ihevc_common_tables.c" + "${HEVC_ROOT}/common/ihevc_intra_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_chroma_intra_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_mem_fns.c" + "${HEVC_ROOT}/common/ihevc_sao.c" + "${HEVC_ROOT}/common/ihevc_trans_tables.c" + "${HEVC_ROOT}/common/ihevc_recon.c" + "${HEVC_ROOT}/common/ihevc_itrans.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_iquant_recon.c" + "${HEVC_ROOT}/common/ihevc_iquant_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_32x32.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_16x16.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_8x8.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_chroma_iquant_recon.c" + "${HEVC_ROOT}/common/ihevc_chroma_iquant_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_chroma_recon.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_16x16.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_8x8.c" + "${HEVC_ROOT}/common/ihevc_buf_mgr.c" + "${HEVC_ROOT}/common/ihevc_disp_mgr.c" + "${HEVC_ROOT}/common/ihevc_dpb_mgr.c" + "${HEVC_ROOT}/common/ithread.c" + "${HEVC_ROOT}/common/ihevc_cabac_tables.c" + "${HEVC_ROOT}/common/ihevc_chroma_intra_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_16x16.c" + "${HEVC_ROOT}/common/ihevc_chroma_itrans_recon_8x8.c" + "${HEVC_ROOT}/common/ihevc_common_tables.c" + "${HEVC_ROOT}/common/ihevc_deblk_edge_filter.c" + "${HEVC_ROOT}/common/ihevc_deblk_tables.c" + "${HEVC_ROOT}/common/ihevc_hbd_deblk_edge_filter.c" + "${HEVC_ROOT}/common/ihevc_inter_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_intra_pred_filters.c" + "${HEVC_ROOT}/common/ihevc_iquant_recon.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_16x16.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_32x32.c" + "${HEVC_ROOT}/common/ihevc_itrans_recon_8x8.c" + "${HEVC_ROOT}/common/ihevc_mem_fns.c" + "${HEVC_ROOT}/common/ihevc_padding.c" + "${HEVC_ROOT}/common/ihevc_quant_iquant_ssd.c" + "${HEVC_ROOT}/common/ihevc_quant_tables.c" + "${HEVC_ROOT}/common/ihevc_resi_trans.c" + "${HEVC_ROOT}/common/ihevc_sao.c" + "${HEVC_ROOT}/common/ihevc_trans_tables.c" + "${HEVC_ROOT}/common/ihevc_weighted_pred.c") + + include_directories(${HEVC_ROOT}/common) + +# arm/x86 sources +if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") + list( + APPEND + LIBHEVC_COMMON_ASMS + "${HEVC_ROOT}/common/arm64/ihevc_deblk_chroma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_deblk_chroma_vert.s" + "${HEVC_ROOT}/common/arm64/ihevc_deblk_luma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_deblk_luma_vert.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_copy.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_copy_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_horz_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_vert.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_vert_w16inp.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_vert_w16inp_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_chroma_vert_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_filters_luma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_filters_luma_vert.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_filters_luma_vert_w16inp.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_filters_luma_vert_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_luma_copy.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_luma_copy_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_luma_horz_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_inter_pred_luma_vert_w16inp_w16out.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_dc.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_mode_18_34.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_mode_27_to_33.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_mode2.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_mode_3_to_9.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_planar.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_chroma_ver.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_filters_chroma_mode_11_to_17.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_filters_chroma_mode_19_to_25.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_filters_luma_mode_11_to_17.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_filters_luma_mode_19_to_25.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_dc.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_horz.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_mode_18_34.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_mode_27_to_33.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_mode2.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_mode_3_to_9.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_planar.s" + "${HEVC_ROOT}/common/arm64/ihevc_intra_pred_luma_vert.s" + "${HEVC_ROOT}/common/arm64/ihevc_itrans_recon_16x16.s" + "${HEVC_ROOT}/common/arm64/ihevc_itrans_recon_32x32.s" + "${HEVC_ROOT}/common/arm64/ihevc_itrans_recon_4x4.s" + "${HEVC_ROOT}/common/arm64/ihevc_itrans_recon_4x4_ttype1.s" + "${HEVC_ROOT}/common/arm64/ihevc_itrans_recon_8x8.s" + "${HEVC_ROOT}/common/arm64/ihevc_mem_fns.s" + "${HEVC_ROOT}/common/arm64/ihevc_neon_macros.s" + "${HEVC_ROOT}/common/arm64/ihevc_padding.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_band_offset_chroma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_band_offset_luma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class0_chroma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class0.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class1_chroma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class1.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class2_chroma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class2.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class3_chroma.s" + "${HEVC_ROOT}/common/arm64/ihevc_sao_edge_offset_class3.s" + "${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_bi_default.s" + "${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_bi.s" + "${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_uni.s") + + include_directories(${HEVC_ROOT}/common/arm64) +elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32") + list( + APPEND + LIBHEVC_COMMON_ASMS + "${HEVC_ROOT}/common/arm/ihevc_cmn_utils_neon.h" + "${HEVC_ROOT}/common/arm/ihevc_deblk_chroma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_deblk_chroma_vert.s" + "${HEVC_ROOT}/common/arm/ihevc_deblk_luma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_deblk_luma_vert.s" + "${HEVC_ROOT}/common/arm/ihevc_func_selector.h" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_copy.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_copy_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_horz_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_vert.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_vert_w16inp.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_vert_w16inp_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_chroma_vert_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_filters_luma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_filters_luma_vert.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_filters_luma_vert_w16inp.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_luma_copy.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_luma_copy_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_luma_horz_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_inter_pred_luma_vert_w16inp_w16out.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_dc.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_mode_18_34.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_mode_27_to_33.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_mode2.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_mode_3_to_9.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_planar.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_chroma_ver.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_chroma_mode_11_to_17.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_chroma_mode_19_to_25.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_luma_mode_11_to_17.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_luma_mode_19_to_25.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_dc.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_horz.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_mode_18_34.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_mode_27_to_33.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_mode2.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_mode_3_to_9.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_planar.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_luma_vert.s" + "${HEVC_ROOT}/common/arm/ihevc_intra_ref_substitution_a9q.c" + "${HEVC_ROOT}/common/arm/ihevc_itrans_recon_16x16.s" + "${HEVC_ROOT}/common/arm/ihevc_itrans_recon_32x32.s" + "${HEVC_ROOT}/common/arm/ihevc_itrans_recon_4x4.s" + "${HEVC_ROOT}/common/arm/ihevc_itrans_recon_4x4_ttype1.s" + "${HEVC_ROOT}/common/arm/ihevc_itrans_recon_8x8.s" + "${HEVC_ROOT}/common/arm/ihevc_mem_fns.s" + "${HEVC_ROOT}/common/arm/ihevc_padding.s" + "${HEVC_ROOT}/common/arm/ihevc_platform_macros.h" + "${HEVC_ROOT}/common/arm/ihevc_quant_iquant_ssd_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans_32x32_a9q.s" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans_neon_32x32.c" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans_neon.c" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_band_offset_chroma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_band_offset_luma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class0_chroma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class0.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class1_chroma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class1.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class2_chroma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class2.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class3_chroma.s" + "${HEVC_ROOT}/common/arm/ihevc_sao_edge_offset_class3.s" + "${HEVC_ROOT}/common/arm/ihevc_weighted_pred_bi_default.s" + "${HEVC_ROOT}/common/arm/ihevc_weighted_pred_bi.s" + "${HEVC_ROOT}/common/arm/ihevc_weighted_pred_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_weighted_pred_uni.s") + + include_directories(${HEVC_ROOT}/common/arm) +else() + list( + APPEND + LIBHEVC_COMMON_SRCS + "${HEVC_ROOT}/common/x86/ihevc_inter_pred_filters_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_weighted_pred_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_intra_pred_filters_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_chroma_intra_pred_filters_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_16x16_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_32x32_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_sao_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_deblk_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_padding_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_mem_fns_ssse3_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_inter_pred_filters_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_weighted_pred_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_intra_pred_filters_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_chroma_intra_pred_filters_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_itrans_recon_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_16x16_itrans_recon_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_32x32_itrans_recon_sse42_intr.c" + "${HEVC_ROOT}/common/x86/ihevc_tables_x86_intr.c") + + include_directories(${HEVC_ROOT}/common/x86) +endif() diff --git a/decoder/libhevcdec.cmake b/decoder/libhevcdec.cmake new file mode 100755 index 0000000..87ea024 --- /dev/null +++ b/decoder/libhevcdec.cmake @@ -0,0 +1,78 @@ +# src files +list( + APPEND + LIBHEVCDEC_SRCS + "${HEVC_ROOT}/decoder/ihevcd_version.c" + "${HEVC_ROOT}/decoder/ihevcd_api.c" + "${HEVC_ROOT}/decoder/ihevcd_decode.c" + "${HEVC_ROOT}/decoder/ihevcd_nal.c" + "${HEVC_ROOT}/decoder/ihevcd_bitstream.c" + "${HEVC_ROOT}/decoder/ihevcd_parse_headers.c" + "${HEVC_ROOT}/decoder/ihevcd_parse_slice_header.c" + "${HEVC_ROOT}/decoder/ihevcd_parse_slice.c" + "${HEVC_ROOT}/decoder/ihevcd_parse_residual.c" + "${HEVC_ROOT}/decoder/ihevcd_cabac.c" + "${HEVC_ROOT}/decoder/ihevcd_intra_pred_mode_prediction.c" + "${HEVC_ROOT}/decoder/ihevcd_process_slice.c" + "${HEVC_ROOT}/decoder/ihevcd_utils.c" + "${HEVC_ROOT}/decoder/ihevcd_job_queue.c" + "${HEVC_ROOT}/decoder/ihevcd_ref_list.c" + "${HEVC_ROOT}/decoder/ihevcd_get_mv.c" + "${HEVC_ROOT}/decoder/ihevcd_mv_pred.c" + "${HEVC_ROOT}/decoder/ihevcd_mv_merge.c" + "${HEVC_ROOT}/decoder/ihevcd_iquant_itrans_recon_ctb.c" + "${HEVC_ROOT}/decoder/ihevcd_itrans_recon_dc.c" + "${HEVC_ROOT}/decoder/ihevcd_common_tables.c" + "${HEVC_ROOT}/decoder/ihevcd_boundary_strength.c" + "${HEVC_ROOT}/decoder/ihevcd_deblk.c" + "${HEVC_ROOT}/decoder/ihevcd_inter_pred.c" + "${HEVC_ROOT}/decoder/ihevcd_sao.c" + "${HEVC_ROOT}/decoder/ihevcd_ilf_padding.c" + "${HEVC_ROOT}/decoder/ihevcd_fmt_conv.c") + +include_directories(${HEVC_ROOT}/decoder) + +# arm/x86 sources +if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") + list( + APPEND + LIBHEVCDEC_ASMS + "${HEVC_ROOT}/decoder/arm64/ihevcd_fmt_conv_420sp_to_420p.s" + "${HEVC_ROOT}/decoder/arm64/ihevcd_fmt_conv_420sp_to_420sp.s" + "${HEVC_ROOT}/decoder/arm64/ihevcd_fmt_conv_420sp_to_rgba8888.s" + "${HEVC_ROOT}/decoder/arm64/ihevcd_function_selector_av8.c" + "${HEVC_ROOT}/decoder/arm64/ihevcd_itrans_recon_dc_chroma.s" + "${HEVC_ROOT}/decoder/arm64/ihevcd_itrans_recon_dc_luma.s") + + include_directories(${HEVC_ROOT}/decoder/arm64) +elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32") + list( + APPEND + LIBHEVCDEC_ASMS + "${HEVC_ROOT}/decoder/arm/ihevcd_fmt_conv_420sp_to_420p.s" + "${HEVC_ROOT}/decoder/arm/ihevcd_fmt_conv_420sp_to_420sp.s" + "${HEVC_ROOT}/decoder/arm/ihevcd_fmt_conv_420sp_to_rgba8888.s" + "${HEVC_ROOT}/decoder/arm/ihevcd_function_selector_a9q.c" + "${HEVC_ROOT}/decoder/arm/ihevcd_function_selector.c" + "${HEVC_ROOT}/decoder/arm/ihevcd_function_selector_noneon.c" + "${HEVC_ROOT}/decoder/arm/ihevcd_itrans_recon_dc_chroma.s" + "${HEVC_ROOT}/decoder/arm/ihevcd_itrans_recon_dc_luma.s") + + include_directories(${HEVC_ROOT}/decoder/arm) +else() + list( + APPEND + LIBHEVCDEC_SRCS + "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_generic.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_ssse3.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_function_selector_sse42.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_fmt_conv_ssse3_intr.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_it_rec_dc_ssse3_intr.c" + "${HEVC_ROOT}/decoder/x86/ihevcd_it_rec_dc_sse42_intr.c") + + include_directories(${HEVC_ROOT}/decoder/x86) +endif() + +add_library(libhevcdec STATIC ${LIBHEVC_COMMON_SRCS} ${LIBHEVC_COMMON_ASMS} + ${LIBHEVCDEC_ASMS} ${LIBHEVCDEC_SRCS}) diff --git a/encoder/hme_err_compute.c b/encoder/hme_err_compute.c index febffce..d145f42 100644 --- a/encoder/hme_err_compute.c +++ b/encoder/hme_err_compute.c @@ -1797,14 +1797,13 @@ void hme_update_results_grid_pu_bestn_no_encode(result_upd_prms_t *ps_result_prm /*****************************************************************/ if(i4_tot_cost < ps_best_node[num_results - 1].i4_tot_cost) { - S32 eq_cost = 0; /*************************************************************/ /* Identify where the current result isto be placed.Basically*/ /* find the node which has cost just higher thannodeundertest*/ /*************************************************************/ for(i = 0; i < num_results - 1; i++) { - if(i4_tot_cost < ps_best_node[i].i4_tot_cost) + if(i4_tot_cost <= ps_best_node[i].i4_tot_cost) { memmove( ps_best_node + i + 1, @@ -1812,24 +1811,11 @@ void hme_update_results_grid_pu_bestn_no_encode(result_upd_prms_t *ps_result_prm sizeof(search_node_t) * (num_results - 1 - i)); break; } - else if(i4_tot_cost == ps_best_node[i].i4_tot_cost) - { - //if (0 == hme_cmp_nodes(ps_search_node_grid, ps_best_node+i)) - // break; - /* When cost is same we comp. the nodes and if it's same skip. */ - /* We don't want to add this code to intrinsic. So we are */ - /* commenting it. The quality impact was minor when we did the */ - /* regression. */ - eq_cost = 1; - } - } - if(!eq_cost) - { - ps_best_node[i] = *ps_search_node_grid; - ps_best_node[i].i4_sad = i4_sad; - ps_best_node[i].i4_mv_cost = i4_mv_cost; - ps_best_node[i].i4_tot_cost = i4_tot_cost; } + ps_best_node[i] = *ps_search_node_grid; + ps_best_node[i].i4_sad = i4_sad; + ps_best_node[i].i4_mv_cost = i4_mv_cost; + ps_best_node[i].i4_tot_cost = i4_tot_cost; } i4_count++; } diff --git a/encoder/hme_refine.c b/encoder/hme_refine.c index c8e6b38..2932bd1 100644 --- a/encoder/hme_refine.c +++ b/encoder/hme_refine.c @@ -2011,8 +2011,9 @@ void hme_update_mv_bank_in_l1_me( pi1_ref_idx4 = pi1_ref_idx3 + (ps_layer_mv->i4_num_mvs_per_blk); { - search_node_t *aps_result_nodes_sorted[2][MAX_NUM_REF * 4]; - U08 au1_cost_shifts_for_sorted_node[2][MAX_NUM_REF * 4]; + /* max ref frames * max results per partition * number of partitions (4x4, 8x8) */ + search_node_t *aps_result_nodes_sorted[2][MAX_NUM_REF * MAX_RESULTS_PER_PART * 2]; + U08 au1_cost_shifts_for_sorted_node[2][MAX_NUM_REF * MAX_RESULTS_PER_PART * 2]; S32 i; diff --git a/encoder/ihevce_enc_loop_pass.c b/encoder/ihevce_enc_loop_pass.c index c73c7ff..b1a8b71 100644 --- a/encoder/ihevce_enc_loop_pass.c +++ b/encoder/ihevce_enc_loop_pass.c @@ -3018,14 +3018,10 @@ void ihevce_enc_loop_process( ps_ctxt->pv_err_func_selector = ps_func_selector; #endif - /*Bit0 - of this Flag indicates whether current pictute needs to be deblocked, - padded and hpel planes need to be generated. - Bit1 - of this flag set to 1 if sao is enabled. This is to enable deblocking when sao is enabled*/ ps_ctxt->i4_deblk_pad_hpel_cur_pic = - (ps_frm_recon->i4_deblk_pad_hpel_cur_pic) || - ((ps_ctxt->s_sao_ctxt_t.ps_slice_hdr->i1_slice_sao_luma_flag || - ps_ctxt->s_sao_ctxt_t.ps_slice_hdr->i1_slice_sao_chroma_flag) - << 1); + ps_frm_recon->i4_deblk_pad_hpel_cur_pic || + ps_ctxt->s_sao_ctxt_t.ps_slice_hdr->i1_slice_sao_luma_flag || + ps_ctxt->s_sao_ctxt_t.ps_slice_hdr->i1_slice_sao_chroma_flag; /* Share all reference pictures with nbr clients. This flag will be used only in case of dist-enc mode */ diff --git a/encoder/ihevce_error_check.c b/encoder/ihevce_error_check.c index 223ea12..9295b29 100644 --- a/encoder/ihevce_error_check.c +++ b/encoder/ihevce_error_check.c @@ -1170,46 +1170,33 @@ WORD32 ihevce_hle_validate_static_params(ihevce_static_cfg_params_t *ps_static_c .ai4_frame_qp[br_ctr]; WORD32 tgt_bitrate = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] .ai4_tgt_bitrate[br_ctr]; + WORD32 i4_max_bit_rate = + g_as_level_data[codec_level_index] + .i4_max_bit_rate[ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier]; WORD32 peak_bitrate; - if(frame_qp > 51 || frame_qp <= 0) - { - error_code = IHEVCE_UNSUPPORTED_FRAME_QP; - ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_frame_qp out of range\n"); - return IHEVCE_SETUNSUPPORTEDINPUT(error_code); - } - if((frame_qp < ps_static_cfg_prms->s_config_prms.i4_min_frame_qp) || - ((frame_qp + ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers + 1) > - ps_static_cfg_prms->s_config_prms.i4_max_frame_qp)) + if(frame_qp > MAX_HEVC_QP || frame_qp < MIN_HEVC_QP) { error_code = IHEVCE_UNSUPPORTED_FRAME_QP; ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_frame_qp out of range\n"); return IHEVCE_SETUNSUPPORTEDINPUT(error_code); } - if(tgt_bitrate > - g_as_level_data[codec_level_index] - .i4_max_bit_rate[ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier] * - CBP_VCL_FACTOR || - tgt_bitrate < MIN_BITRATE) + if(tgt_bitrate > i4_max_bit_rate * CBP_VCL_FACTOR || tgt_bitrate < MIN_BITRATE) { error_code = IHEVCE_BITRATE_NOT_SUPPORTED; ps_sys_api->ihevce_printf( pv_cb_handle, - "IHEVCE ERROR: i4_tgt_bitrate %d out of range for resolution number %d bitrate " - "number %d\n", + "IHEVCE ERROR: i4_tgt_bitrate %d out of range for resolution %dX%d " + "bitrate should be within [%d .. %d]\n", tgt_bitrate, - i4_resolution_id, - br_ctr); + width, height, + MIN_BITRATE, i4_max_bit_rate * CBP_VCL_FACTOR); return (IHEVCE_SETUNSUPPORTEDINPUT(error_code)); } peak_bitrate = tgt_bitrate << 1; - peak_bitrate = - MIN(peak_bitrate, - g_as_level_data[codec_level_index] - .i4_max_bit_rate[ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier] * - 1000); + peak_bitrate = MIN(peak_bitrate, i4_max_bit_rate * 1000); ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] .ai4_peak_bitrate[br_ctr] = peak_bitrate; ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] diff --git a/encoder/libhevcenc.cmake b/encoder/libhevcenc.cmake new file mode 100644 index 0000000..1fcb2b5 --- /dev/null +++ b/encoder/libhevcenc.cmake @@ -0,0 +1,140 @@ +# src files +list( + APPEND + LIBHEVCENC_SRCS + "${HEVC_ROOT}/encoder/bit_allocation.c" + "${HEVC_ROOT}/encoder/cbr_buffer_control.c" + "${HEVC_ROOT}/encoder/common_rom.c" + "${HEVC_ROOT}/encoder/convert_float_to_fix.c" + "${HEVC_ROOT}/encoder/est_sad.c" + "${HEVC_ROOT}/encoder/fixed_point_error_bits.c" + "${HEVC_ROOT}/encoder/frame_info_collector.c" + "${HEVC_ROOT}/encoder/hme_coarse.c" + "${HEVC_ROOT}/encoder/hme_common_utils.c" + "${HEVC_ROOT}/encoder/hme_err_compute.c" + "${HEVC_ROOT}/encoder/hme_fullpel.c" + "${HEVC_ROOT}/encoder/hme_function_selector.c" + "${HEVC_ROOT}/encoder/hme_globals.c" + "${HEVC_ROOT}/encoder/hme_interface.c" + "${HEVC_ROOT}/encoder/hme_refine.c" + "${HEVC_ROOT}/encoder/hme_search_algo.c" + "${HEVC_ROOT}/encoder/hme_subpel.c" + "${HEVC_ROOT}/encoder/hme_utils.c" + "${HEVC_ROOT}/encoder/ihevce_bitstream.c" + "${HEVC_ROOT}/encoder/ihevce_bs_compute_ctb.c" + "${HEVC_ROOT}/encoder/ihevce_buffer_que.c" + "${HEVC_ROOT}/encoder/ihevce_cabac.c" + "${HEVC_ROOT}/encoder/ihevce_cabac_cu_pu.c" + "${HEVC_ROOT}/encoder/ihevce_cabac_rdo.c" + "${HEVC_ROOT}/encoder/ihevce_cabac_tu.c" + "${HEVC_ROOT}/encoder/ihevce_chroma_had_satd.c" + "${HEVC_ROOT}/encoder/ihevce_cmn_utils_instr_set_router.c" + "${HEVC_ROOT}/encoder/ihevce_coarse_me_pass.c" + "${HEVC_ROOT}/encoder/ihevce_common_utils.c" + "${HEVC_ROOT}/encoder/ihevce_deblk.c" + "${HEVC_ROOT}/encoder/ihevce_decomp_pre_intra_pass.c" + "${HEVC_ROOT}/encoder/ihevce_dep_mngr.c" + "${HEVC_ROOT}/encoder/ihevce_enc_cu_recursion.c" + "${HEVC_ROOT}/encoder/ihevce_enc_loop_inter_mode_sifter.c" + "${HEVC_ROOT}/encoder/ihevce_enc_loop_pass.c" + "${HEVC_ROOT}/encoder/ihevce_enc_loop_utils.c" + "${HEVC_ROOT}/encoder/ihevce_enc_sbh_funcs.c" + "${HEVC_ROOT}/encoder/ihevce_enc_subpel_gen.c" + "${HEVC_ROOT}/encoder/ihevce_encode_header.c" + "${HEVC_ROOT}/encoder/ihevce_encode_header_sei_vui.c" + "${HEVC_ROOT}/encoder/ihevce_entropy_cod.c" + "${HEVC_ROOT}/encoder/ihevce_entropy_interface.c" + "${HEVC_ROOT}/encoder/ihevce_error_check.c" + "${HEVC_ROOT}/encoder/ihevce_frame_process.c" + "${HEVC_ROOT}/encoder/ihevce_frame_process_utils.c" + "${HEVC_ROOT}/encoder/ihevce_function_selector.c" + "${HEVC_ROOT}/encoder/ihevce_global_tables.c" + "${HEVC_ROOT}/encoder/ihevce_had_satd.c" + "${HEVC_ROOT}/encoder/ihevce_hle_interface.c" + "${HEVC_ROOT}/encoder/ihevce_hle_q_func.c" + "${HEVC_ROOT}/encoder/ihevce_inter_pred.c" + "${HEVC_ROOT}/encoder/ihevce_ipe_instr_set_router.c" + "${HEVC_ROOT}/encoder/ihevce_ipe_pass.c" + "${HEVC_ROOT}/encoder/ihevce_lap_interface.c" + "${HEVC_ROOT}/encoder/ihevce_me_instr_set_router.c" + "${HEVC_ROOT}/encoder/ihevce_me_pass.c" + "${HEVC_ROOT}/encoder/ihevce_memory_init.c" + "${HEVC_ROOT}/encoder/ihevce_multi_thrd_funcs.c" + "${HEVC_ROOT}/encoder/ihevce_mv_pred.c" + "${HEVC_ROOT}/encoder/ihevce_mv_pred_merge.c" + "${HEVC_ROOT}/encoder/ihevce_nbr_avail.c" + "${HEVC_ROOT}/encoder/ihevce_plugin.c" + "${HEVC_ROOT}/encoder/ihevce_profile.c" + "${HEVC_ROOT}/encoder/ihevce_rc_interface.c" + "${HEVC_ROOT}/encoder/ihevce_recur_bracketing.c" + "${HEVC_ROOT}/encoder/ihevce_sao.c" + "${HEVC_ROOT}/encoder/ihevce_stasino_helpers.c" + "${HEVC_ROOT}/encoder/ihevce_sub_pic_rc.c" + "${HEVC_ROOT}/encoder/ihevce_sys_api.c" + "${HEVC_ROOT}/encoder/ihevce_tile_interface.c" + "${HEVC_ROOT}/encoder/ihevce_trace.c" + "${HEVC_ROOT}/encoder/ihevce_tu_tree_selector.c" + "${HEVC_ROOT}/encoder/init_qp.c" + "${HEVC_ROOT}/encoder/mb_model_based.c" + "${HEVC_ROOT}/encoder/osal.c" + "${HEVC_ROOT}/encoder/osal_cond_var.c" + "${HEVC_ROOT}/encoder/osal_error.c" + "${HEVC_ROOT}/encoder/osal_mutex.c" + "${HEVC_ROOT}/encoder/osal_semaphore.c" + "${HEVC_ROOT}/encoder/osal_thread.c" + "${HEVC_ROOT}/encoder/picture_type.c" + "${HEVC_ROOT}/encoder/rate_control_api.c" + "${HEVC_ROOT}/encoder/rc_rd_model.c" + "${HEVC_ROOT}/encoder/rc_rd_model_fix.c" + "${HEVC_ROOT}/encoder/rc_sad_acc.c" + "${HEVC_ROOT}/encoder/sqrt_interp.c" + "${HEVC_ROOT}/encoder/var_q_operator.c" + "${HEVC_ROOT}/encoder/vbr_storage_vbv.c" + "${HEVC_ROOT}/encoder/vbr_str_prms.c") + +include_directories(${HEVC_ROOT}/encoder) + +# arm/x86 sources +if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" + STREQUAL "aarch32") + list( + APPEND + LIBHEVCENC_ASMS + "${HEVC_ROOT}/encoder/arm/ihevce_coarse_layer_sad_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_coarse_layer_sad_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_common_utils_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_common_utils_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_copy_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_copy_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_decomp_pre_intra_pass_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_decomp_pre_intra_pass_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_had_compute_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_had_compute_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_hme_utils_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_hme_utils_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_itrans_recon_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_itrans_recon_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_me_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_me_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_sad_compute_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_sad_compute_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_scale_by_2_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_scale_by_2_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_scan_coeffs_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_scan_coeffs_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_ssd_and_sad_calculator_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_ssd_and_sad_calculator_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_ssd_calculator_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_ssd_calculator_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_subpel_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_subpel_neon.c" + "${HEVC_ROOT}/encoder/arm/ihevce_subpel_neon.c") + + include_directories(${HEVC_ROOT}/encoder/arm) +endif() + +add_library(libhevcenc STATIC ${LIBHEVC_COMMON_SRCS} ${LIBHEVC_COMMON_ASMS} + ${LIBHEVCENC_ASMS} ${LIBHEVCENC_SRCS}) + +target_compile_definitions(libhevcenc PRIVATE N_MB_ENABLE + ENABLE_MAIN_REXT_PROFILE) diff --git a/fuzzer/README.md b/fuzzer/README.md index 49353da..0df4e6e 100644 --- a/fuzzer/README.md +++ b/fuzzer/README.md @@ -1,11 +1,11 @@ -# Fuzzer for libhevc decoder +# Fuzzer for libhevc decoder and encoder -This describes steps to build hevc_dec_fuzzer binary. +This describes steps to build hevc_dec_fuzzer and hevc_enc_fuzzer binary. ## Linux x86/x64 ### Requirements -- cmake (3.5 or above) +- cmake (3.9.1 or above) - make - clang (6.0 or above) needs to support -fsanitize=fuzzer, -fsanitize=fuzzer-no-link @@ -21,51 +21,62 @@ Create a directory inside libhevc and change directory $ mkdir build $ cd build ``` -Build libhevc using cmake +Build fuzzer with required sanitizers (-DSANITIZE=fuzzer-no-link is mandatory + to enable fuzzers) ``` - $ CC=clang CXX=clang++ cmake ../ \ - -DSANITIZE=fuzzer-no-link,address,signed-integer-overflow + $ cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_BUILD_TYPE=Debug -DSANITIZE=fuzzer-no-link,address $ make ``` -Build the fuzzer -``` - $ clang++ -std=c++11 -fsanitize=fuzzer,address -I. -I../ -I../common \ - -I../decoder -Wl,--start-group ../fuzzer/hevc_dec_fuzzer.cpp \ - -o ./hevc_dec_fuzzer ./libhevcdec.a -Wl,--end-group -``` ### Steps to run -Create a directory CORPUS_DIR and copy some elementary hevc files to that folder -To run the fuzzer +Create a directory CORPUS_DIR and copy some elementary hevc files +(for hevc_dec_fuzzer) or yuv files (for hevc_enc_fuzzer) to that directory + +To run the fuzzers ``` $ ./hevc_dec_fuzzer CORPUS_DIR +$ ./hevc_enc_fuzzer CORPUS_DIR ``` ## Android ### Steps to build -Build the fuzzer +Build the fuzzers ``` - $ SANITIZE_TARGET=address SANITIZE_HOST=address mmma -j$(nproc) \ - external/libhevc/fuzzer + $ mm -j$(nproc) hevc_dec_fuzzer + $ mm -j$(nproc) hevc_enc_fuzzer ``` ### Steps to run -Create a directory CORPUS_DIR and copy some elementary hevc files to that folder -Push this directory to device. +Create a directory CORPUS_DIR and copy some elementary hevc files +(for hevc_dec_fuzzer) or yuv files (for hevc_enc_fuzzer) to that folder +Push this directory to device -To run on device +To run hevc_dec_fuzzer on device ``` $ adb sync data $ adb shell /data/fuzz/hevc_dec_fuzzer CORPUS_DIR ``` -To run on host +To run hevc_enc_fuzzer on device +``` + $ adb sync data + $ adb shell /data/fuzz/arm64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR +``` + +To run hevc_dec_fuzzer on host ``` - $ $ANDROID_HOST_OUT/fuzz/hevc_dec_fuzzer CORPUS_DIR + $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_dec_fuzzer/hevc_dec_fuzzer CORPUS_DIR +``` + +To run hevc_enc_fuzzer on host +``` + $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR ``` -# Fuzzer for libhevc encoder +# Appendix +## libhevc encoder fuzzer ## Plugin Design Considerations The fuzzer plugin for HEVC is designed based on the understanding of the @@ -142,31 +153,6 @@ This ensures that the plugin tolerates any kind of input (empty, huge, malformed, etc) and doesnt `exit()` on any input and thereby increasing the chance of identifying vulnerabilities. -## Build - -This describes steps to build hevc_enc_fuzzer binary. - -### Android - -#### Steps to build -Build the fuzzer -``` - $ mm -j$(nproc) hevc_enc_fuzzer -``` - -#### Steps to run -Create a directory CORPUS_DIR and copy some yuv files to that folder -Push this directory to device. - -To run on device -``` - $ adb sync data - $ adb shell /data/fuzz/arm64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR -``` -To run on host -``` - $ $ANDROID_HOST_OUT/fuzz/x86_64/hevc_enc_fuzzer/hevc_enc_fuzzer CORPUS_DIR -``` ## References: * http://llvm.org/docs/LibFuzzer.html diff --git a/fuzzer/hevc_dec_fuzzer.cmake b/fuzzer/hevc_dec_fuzzer.cmake new file mode 100644 index 0000000..28e89fd --- /dev/null +++ b/fuzzer/hevc_dec_fuzzer.cmake @@ -0,0 +1,2 @@ +libhevc_add_fuzzer(hevc_dec_fuzzer libhevcdec SOURCES + ${HEVC_ROOT}/fuzzer/hevc_dec_fuzzer.cpp) diff --git a/fuzzer/hevc_enc_fuzzer.cmake b/fuzzer/hevc_enc_fuzzer.cmake new file mode 100644 index 0000000..908b2f1 --- /dev/null +++ b/fuzzer/hevc_enc_fuzzer.cmake @@ -0,0 +1,2 @@ +libhevc_add_fuzzer(hevc_enc_fuzzer libhevcenc SOURCES + ${HEVC_ROOT}/fuzzer/hevc_enc_fuzzer.cpp) diff --git a/fuzzer/hevc_enc_fuzzer.cpp b/fuzzer/hevc_enc_fuzzer.cpp index 9d0d370..c92d67e 100644 --- a/fuzzer/hevc_enc_fuzzer.cpp +++ b/fuzzer/hevc_enc_fuzzer.cpp @@ -19,6 +19,7 @@ */ #include <algorithm> #include <memory> +#include <string.h> #include "ihevc_typedefs.h" #include "itt_video_api.h" diff --git a/fuzzer/ossfuzz.sh b/fuzzer/ossfuzz.sh index dc5683c..2b0f0f9 100755 --- a/fuzzer/ossfuzz.sh +++ b/fuzzer/ossfuzz.sh @@ -22,23 +22,12 @@ test "${OUT}" != "" || exit 1 build_dir=$WORK/build rm -rf ${build_dir} mkdir -p ${build_dir} -pushd ${build_dir} -cmake $SRC/libhevc -make -j$(nproc) +pushd ${build_dir} +cmake ${SRC}/libhevc +make -j$(nproc) hevc_dec_fuzzer +cp ${build_dir}/hevc_dec_fuzzer $OUT/hevc_dec_fuzzer popd -# build fuzzers -$CXX $CXXFLAGS -std=c++11 \ --I$SRC/libhevc \ --I$SRC/libhevc/common \ --I$SRC/libhevc/decoder \ --I${build_dir} \ --Wl,--start-group \ -$LIB_FUZZING_ENGINE \ -$SRC/libhevc/fuzzer/hevc_dec_fuzzer.cpp -o $OUT/hevc_dec_fuzzer \ -${build_dir}/libhevcdec.a \ --Wl,--end-group - cp $SRC/hevc_dec_fuzzer_seed_corpus.zip $OUT/hevc_dec_fuzzer_seed_corpus.zip cp $SRC/libhevc/fuzzer/hevc_dec_fuzzer.dict $OUT/hevc_dec_fuzzer.dict diff --git a/test/decoder/hevcdec.cmake b/test/decoder/hevcdec.cmake new file mode 100644 index 0000000..7eccf9d --- /dev/null +++ b/test/decoder/hevcdec.cmake @@ -0,0 +1,2 @@ +libhevc_add_executable(hevcdec libhevcdec SOURCES + ${HEVC_ROOT}/test/decoder/main.c) diff --git a/test/encoder/hevcenc.cmake b/test/encoder/hevcenc.cmake new file mode 100644 index 0000000..8dfc29b --- /dev/null +++ b/test/encoder/hevcenc.cmake @@ -0,0 +1,2 @@ +libhevc_add_executable(hevcenc libhevcenc SOURCES + ${HEVC_ROOT}/test/encoder/main.c) |