diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:40:19 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:40:19 +0000 |
commit | 8559ce3a0ea1394640a00679b7887cb5f564a959 (patch) | |
tree | efa48ebdb8542e1ec6490306d11e5eb32c7f8635 | |
parent | 40ffe23bf439694ae0531ce9e719eae9e289e902 (diff) | |
parent | 949f27ce82a3a82e14bbe45f33cd727bc48db918 (diff) | |
download | libavc-aml_tz3_314012010.tar.gz |
Snap for 8730993 from 949f27ce82a3a82e14bbe45f33cd727bc48db918 to mainline-tzdata3-releaseaml_tz3_314012070aml_tz3_314012050aml_tz3_314012010aml_tz3_313110000aml_tz3_312511020aml_tz3_312511010aml_tz3_312410020aml_tz3_312410010android12-mainline-tzdata3-releaseaml_tz3_314012010
Change-Id: I899b6d6e1f5c4f63b4cabd805b68deb58ae386c6
-rw-r--r-- | Android.bp | 24 | ||||
-rw-r--r-- | CMakeLists.txt | 209 | ||||
-rw-r--r-- | OWNERS | 1 | ||||
-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 | 113 | ||||
-rw-r--r-- | common/ithread.c | 27 | ||||
-rw-r--r-- | common/ithread.h | 12 | ||||
-rw-r--r-- | decoder/ih264d_api.c | 131 | ||||
-rw-r--r-- | decoder/ih264d_parse_pslice.c | 25 | ||||
-rw-r--r-- | decoder/ih264d_parse_slice.c | 25 | ||||
-rw-r--r-- | decoder/ih264d_structs.h | 48 | ||||
-rw-r--r-- | decoder/ih264d_thread_compute_bs.c | 80 | ||||
-rw-r--r-- | decoder/ih264d_thread_parse_decode.c | 123 | ||||
-rw-r--r-- | decoder/libavcdec.cmake | 53 | ||||
-rw-r--r-- | encoder/ih264e_bitstream.h | 6 | ||||
-rw-r--r-- | encoder/libavcenc.cmake | 91 | ||||
-rw-r--r-- | fuzzer/README.md | 84 | ||||
-rw-r--r-- | fuzzer/avc_dec_fuzzer.cmake | 2 | ||||
-rw-r--r-- | fuzzer/avc_enc_fuzzer.cmake | 2 | ||||
-rw-r--r-- | fuzzer/avc_enc_fuzzer.cpp | 1 | ||||
-rwxr-xr-x | fuzzer/ossfuzz.sh | 19 | ||||
-rw-r--r-- | test/decoder/avcdec.cmake | 1 | ||||
-rw-r--r-- | test/encoder/avcenc.cmake | 10 |
26 files changed, 309 insertions, 966 deletions
@@ -15,24 +15,6 @@ license { ], } -cc_library_headers { - name: "libavcdec_headers", - export_include_dirs: [ - "common", - "decoder", - ], - min_sdk_version: "29", -} - -cc_library_headers { - name: "libavcenc_headers", - export_include_dirs: [ - "common", - "encoder", - ], - min_sdk_version: "29", -} - cc_library_static { name: "libavcdec", vendor_available: true, @@ -49,13 +31,11 @@ cc_library_static { "-Werror", "-Wno-unused-variable", "-Wno-null-pointer-arithmetic", - // #KEEP_THREAD_ACTIVE is experimental - "-UKEEP_THREADS_ACTIVE", ], export_include_dirs: [ - "common", "decoder", + "common", ], srcs: [ @@ -300,8 +280,8 @@ cc_library_static { ], export_include_dirs: [ - "common", "encoder", + "common", ], srcs: [ //Rate Control diff --git a/CMakeLists.txt b/CMakeLists.txt index 6caee5c..46c9162 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,4 @@ -cmake_minimum_required(VERSION 3.9.1) -project(libavc C CXX) -enable_language(ASM) +cmake_minimum_required(VERSION 3.5) set(AVC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") set(AVC_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") @@ -16,30 +14,199 @@ if("${AVC_ROOT}" STREQUAL "${AVC_CONFIG_DIR}") "And re-run CMake from the build directory.") endif() -set(THREADS_PREFER_PTHREAD_FLAG TRUE) +set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - set(CMAKE_STATIC_LIBRARY_PREFIX "") -if(${CMAKE_CROSSCOMPILING}) - set(THREADS_PTHREAD_ARG - "2" - CACHE STRING - "Refer https://gitlab.kitware.com/cmake/cmake/-/issues/16920" FORCE) +if(SANITIZE) + string(TOLOWER ${SANITIZE} SANITIZE) + + set(CMAKE_SANITIZER_C_FLAGS "-fno-omit-frame-pointer -fsanitize=${SANITIZE}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_SANITIZER_C_FLAGS}") endif() -include("${AVC_ROOT}/cmake/utils.cmake") +list(APPEND LIBAVCDEC_SRCS + "${AVC_ROOT}/common/ih264_buf_mgr.c" + "${AVC_ROOT}/common/ih264_disp_mgr.c" + "${AVC_ROOT}/common/ih264_inter_pred_filters.c" + "${AVC_ROOT}/common/ih264_luma_intra_pred_filters.c" + "${AVC_ROOT}/common/ih264_chroma_intra_pred_filters.c" + "${AVC_ROOT}/common/ih264_padding.c" + "${AVC_ROOT}/common/ih264_mem_fns.c" + "${AVC_ROOT}/common/ih264_deblk_edge_filters.c" + "${AVC_ROOT}/common/ih264_iquant_itrans_recon.c" + "${AVC_ROOT}/common/ih264_ihadamard_scaling.c" + "${AVC_ROOT}/common/ih264_weighted_pred.c" + "${AVC_ROOT}/common/ithread.c" + "${AVC_ROOT}/decoder/ih264d_cabac.c" + "${AVC_ROOT}/decoder/ih264d_parse_mb_header.c" + "${AVC_ROOT}/decoder/ih264d_parse_cabac.c" + "${AVC_ROOT}/decoder/ih264d_process_intra_mb.c" + "${AVC_ROOT}/decoder/ih264d_inter_pred.c" + "${AVC_ROOT}/decoder/ih264d_parse_bslice.c" + "${AVC_ROOT}/decoder/ih264d_parse_pslice.c" + "${AVC_ROOT}/decoder/ih264d_parse_islice.c" + "${AVC_ROOT}/decoder/ih264d_cabac_init_tables.c" + "${AVC_ROOT}/decoder/ih264d_bitstrm.c" + "${AVC_ROOT}/decoder/ih264d_compute_bs.c" + "${AVC_ROOT}/decoder/ih264d_deblocking.c" + "${AVC_ROOT}/decoder/ih264d_parse_headers.c" + "${AVC_ROOT}/decoder/ih264d_mb_utils.c" + "${AVC_ROOT}/decoder/ih264d_mvpred.c" + "${AVC_ROOT}/decoder/ih264d_utils.c" + "${AVC_ROOT}/decoder/ih264d_process_bslice.c" + "${AVC_ROOT}/decoder/ih264d_process_pslice.c" + "${AVC_ROOT}/decoder/ih264d_parse_slice.c" + "${AVC_ROOT}/decoder/ih264d_quant_scaling.c" + "${AVC_ROOT}/decoder/ih264d_parse_cavlc.c" + "${AVC_ROOT}/decoder/ih264d_dpb_mgr.c" + "${AVC_ROOT}/decoder/ih264d_nal.c" + "${AVC_ROOT}/decoder/ih264d_sei.c" + "${AVC_ROOT}/decoder/ih264d_tables.c" + "${AVC_ROOT}/decoder/ih264d_vui.c" + "${AVC_ROOT}/decoder/ih264d_format_conv.c" + "${AVC_ROOT}/decoder/ih264d_thread_parse_decode.c" + "${AVC_ROOT}/decoder/ih264d_api.c" + "${AVC_ROOT}/decoder/ih264d_thread_compute_bs.c" + "${AVC_ROOT}/decoder/ih264d_function_selector_generic.c") + +list(APPEND LIBAVCDEC_X86_SRCS + "${AVC_ROOT}/decoder/x86/ih264d_function_selector.c" + "${AVC_ROOT}/decoder/x86/ih264d_function_selector_sse42.c" + "${AVC_ROOT}/decoder/x86/ih264d_function_selector_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_inter_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_deblk_luma_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_deblk_chroma_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_padding_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_mem_fns_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_dc_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_luma_intra_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_chroma_intra_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_sse42.c" + "${AVC_ROOT}/common/x86/ih264_weighted_pred_sse42.c" + "${AVC_ROOT}/common/x86/ih264_ihadamard_scaling_sse42.c") + +set(LIBAVCDEC_INCLUDES ${AVC_ROOT}/common ${AVC_ROOT}/decoder) + +set(LIBAVCDEC_X86_C_FLAGS + "-DX86 -DDISABLE_AVX2 -msse4.2 -mno-avx -DDEFAULT_ARCH=D_ARCH_X86_SSE42") +set(LIBAVCDEC_X86_INCLUDES ${AVC_ROOT}/common/x86 ${AVC_ROOT}/decoder/x86) +set(LIBAVCDEC_C_FLAGS "${LIBAVCDEC_X86_C_FLAGS}") + +include_directories(${LIBAVCDEC_INCLUDES} ${LIBAVCDEC_X86_INCLUDES}) +add_library(libavcdec ${LIBAVCDEC_SRCS} ${LIBAVCDEC_X86_SRCS}) +set_target_properties(libavcdec PROPERTIES COMPILE_FLAGS "${LIBAVCDEC_C_FLAGS}") + +list(APPEND AVCDEC_SRCS "${AVC_ROOT}/test/decoder/main.c") + +add_executable(avcdec ${AVCDEC_SRCS}) +set_target_properties(avcdec + PROPERTIES COMPILE_FLAGS "-DMD5_DISABLE -DPROFILE_ENABLE") +target_link_libraries(avcdec libavcdec Threads::Threads) + +list(APPEND LIBAVCENC_SRCS + "${AVC_ROOT}/common/ih264_resi_trans_quant.c" + "${AVC_ROOT}/common/ih264_iquant_itrans_recon.c" + "${AVC_ROOT}/common/ih264_ihadamard_scaling.c" + "${AVC_ROOT}/common/ih264_inter_pred_filters.c" + "${AVC_ROOT}/common/ih264_luma_intra_pred_filters.c" + "${AVC_ROOT}/common/ih264_chroma_intra_pred_filters.c" + "${AVC_ROOT}/common/ih264_padding.c" + "${AVC_ROOT}/common/ih264_mem_fns.c" + "${AVC_ROOT}/common/ih264_deblk_edge_filters.c" + "${AVC_ROOT}/common/ih264_deblk_tables.c" + "${AVC_ROOT}/common/ih264_cavlc_tables.c" + "${AVC_ROOT}/common/ih264_cabac_tables.c" + "${AVC_ROOT}/common/ih264_common_tables.c" + "${AVC_ROOT}/common/ih264_trans_data.c" + "${AVC_ROOT}/common/ih264_buf_mgr.c" + "${AVC_ROOT}/common/ih264_dpb_mgr.c" + "${AVC_ROOT}/common/ih264_list.c" + "${AVC_ROOT}/common/ithread.c" + "${AVC_ROOT}/encoder/ih264e_globals.c" + "${AVC_ROOT}/encoder/ih264e_intra_modes_eval.c" + "${AVC_ROOT}/encoder/ih264e_half_pel.c" + "${AVC_ROOT}/encoder/ih264e_mc.c" + "${AVC_ROOT}/encoder/ih264e_me.c" + "${AVC_ROOT}/encoder/ih264e_rc_mem_interface.c" + "${AVC_ROOT}/encoder/ih264e_time_stamp.c" + "${AVC_ROOT}/encoder/ih264e_modify_frm_rate.c" + "${AVC_ROOT}/encoder/ih264e_rate_control.c" + "${AVC_ROOT}/encoder/ih264e_core_coding.c" + "${AVC_ROOT}/encoder/ih264e_deblk.c" + "${AVC_ROOT}/encoder/ih264e_api.c" + "${AVC_ROOT}/encoder/ih264e_process.c" + "${AVC_ROOT}/encoder/ih264e_encode.c" + "${AVC_ROOT}/encoder/ih264e_utils.c" + "${AVC_ROOT}/encoder/ih264e_version.c" + "${AVC_ROOT}/encoder/ih264e_bitstream.c" + "${AVC_ROOT}/encoder/ih264e_cavlc.c" + "${AVC_ROOT}/encoder/ih264e_cabac_init.c" + "${AVC_ROOT}/encoder/ih264e_cabac.c" + "${AVC_ROOT}/encoder/ih264e_cabac_encode.c" + "${AVC_ROOT}/encoder/ih264e_encode_header.c" + "${AVC_ROOT}/encoder/ih264e_function_selector_generic.c" + "${AVC_ROOT}/encoder/ih264e_fmt_conv.c" + "${AVC_ROOT}/encoder/ih264e_sei.c" + "${AVC_ROOT}/encoder/irc_rate_control_api.c" + "${AVC_ROOT}/encoder/irc_bit_allocation.c" + "${AVC_ROOT}/encoder/irc_cbr_buffer_control.c" + "${AVC_ROOT}/encoder/irc_est_sad.c" + "${AVC_ROOT}/encoder/irc_fixed_point_error_bits.c" + "${AVC_ROOT}/encoder/irc_frame_info_collector.c" + "${AVC_ROOT}/encoder/irc_mb_model_based.c" + "${AVC_ROOT}/encoder/irc_picture_type.c" + "${AVC_ROOT}/encoder/irc_rd_model.c" + "${AVC_ROOT}/encoder/irc_vbr_storage_vbv.c" + "${AVC_ROOT}/encoder/irc_vbr_str_prms.c" + "${AVC_ROOT}/encoder/ime.c" + "${AVC_ROOT}/encoder/ime_distortion_metrics.c") + +list(APPEND LIBAVCENC_X86_SRCS + "${AVC_ROOT}/encoder/x86/ih264e_function_selector.c" + "${AVC_ROOT}/encoder/x86/ih264e_function_selector_sse42.c" + "${AVC_ROOT}/encoder/x86/ih264e_function_selector_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_dc_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_ihadamard_scaling_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_inter_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_mem_fns_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_padding_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_luma_intra_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_chroma_intra_pred_filters_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_deblk_chroma_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_deblk_luma_ssse3.c" + "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_sse42.c" + "${AVC_ROOT}/common/x86/ih264_ihadamard_scaling_sse42.c" + "${AVC_ROOT}/common/x86/ih264_resi_trans_quant_sse42.c" + "${AVC_ROOT}/common/x86/ih264_weighted_pred_sse42.c" + "${AVC_ROOT}/encoder/x86/ih264e_half_pel_ssse3.c" + "${AVC_ROOT}/encoder/x86/ih264e_intra_modes_eval_ssse3.c" + "${AVC_ROOT}/encoder/x86/ime_distortion_metrics_sse42.c") + +set(LIBAVCENC_INCLUDES ${AVC_ROOT}/common ${AVC_ROOT}/encoder) -libavc_add_compile_options() -libavc_add_definitions() -libavc_set_link_libraries() +set(LIBAVCENC_X86_C_FLAGS "-msse4.2 -mno-avx -UHP_PL -DN_MB_ENABLE") +set(LIBAVCENC_C_FLAGS "${LIBAVCENC_X86_C_FLAGS}") +set(LIBAVCENC_X86_INCLUDES ${AVC_ROOT}/common/x86 ${AVC_ROOT}/encoder/x86) -include("${AVC_ROOT}/common/common.cmake") -include("${AVC_ROOT}/decoder/libavcdec.cmake") -include("${AVC_ROOT}/encoder/libavcenc.cmake") +include_directories(${LIBAVCENC_INCLUDES} ${LIBAVCENC_X86_INCLUDES}) +add_library(libavcenc ${LIBAVCENC_SRCS} ${LIBAVCENC_X86_SRCS}) +set_target_properties(libavcenc PROPERTIES COMPILE_FLAGS "${LIBAVCENC_C_FLAGS}") -include("${AVC_ROOT}/test/decoder/avcdec.cmake") -include("${AVC_ROOT}/test/encoder/avcenc.cmake") +list(APPEND AVCENC_SRCS + "${AVC_ROOT}/test/encoder/main.c" + "${AVC_ROOT}/test/encoder/psnr.c" + "${AVC_ROOT}/test/encoder/input.c" + "${AVC_ROOT}/test/encoder/output.c" + "${AVC_ROOT}/test/encoder/recon.c") -include("${AVC_ROOT}/fuzzer/avc_dec_fuzzer.cmake") -include("${AVC_ROOT}/fuzzer/avc_enc_fuzzer.cmake") +add_executable(avcenc ${AVCENC_SRCS}) +set_target_properties(avcenc + PROPERTIES COMPILE_FLAGS + "-DARM -DMD5_DISABLE -DPROFILE_ENABLE") +target_link_libraries(avcenc + libavcenc + Threads::Threads + m) @@ -1,3 +1,4 @@ # owners for external/libavc include platform/frameworks/av:/media/janitors/codec_OWNERS essick@google.com +hkuang@google.com diff --git a/README.md b/README.md deleted file mode 100644 index 5b0663a..0000000 --- a/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# LIBAVC -## Getting Started Document - -# LibAVC 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/libavc -$ mkdir build -$ cd build -$ cmake .. -$ make -``` - -## Cross-compiler based builds - -### Building for x86_32 on a x86_64 Linux machine -``` -$ cd external/libavc -$ 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/libavc -$ 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 deleted file mode 100644 index 5fabde2..0000000 --- a/cmake/toolchains/aarch32_toolchain.cmake +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 5efbf77..0000000 --- a/cmake/toolchains/aarch64_toolchain.cmake +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 85ada3b..0000000 --- a/cmake/utils.cmake +++ /dev/null @@ -1,115 +0,0 @@ -include(CheckCXXCompilerFlag) - -# Adds compiler options for all targets -function(libavc_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(libavc_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(libavc_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(libavc_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 libavc_add_executable with all arguments with FUZZER set to 1 -# Arguments: -# Refer to libavc_add_executable's arguments -# cmake-format: on - -function(libavc_add_fuzzer NAME LIB) - libavc_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV}) -endfunction() diff --git a/common/common.cmake b/common/common.cmake deleted file mode 100644 index a8e599b..0000000 --- a/common/common.cmake +++ /dev/null @@ -1,113 +0,0 @@ -# src files -list( - APPEND - LIBAVC_COMMON_SRCS - "${AVC_ROOT}/common/ih264_buf_mgr.c" - "${AVC_ROOT}/common/ih264_cabac_tables.c" - "${AVC_ROOT}/common/ih264_cavlc_tables.c" - "${AVC_ROOT}/common/ih264_chroma_intra_pred_filters.c" - "${AVC_ROOT}/common/ih264_common_tables.c" - "${AVC_ROOT}/common/ih264_deblk_edge_filters.c" - "${AVC_ROOT}/common/ih264_deblk_tables.c" - "${AVC_ROOT}/common/ih264_disp_mgr.c" - "${AVC_ROOT}/common/ih264_dpb_mgr.c" - "${AVC_ROOT}/common/ih264_ihadamard_scaling.c" - "${AVC_ROOT}/common/ih264_inter_pred_filters.c" - "${AVC_ROOT}/common/ih264_iquant_itrans_recon.c" - "${AVC_ROOT}/common/ih264_list.c" - "${AVC_ROOT}/common/ih264_luma_intra_pred_filters.c" - "${AVC_ROOT}/common/ih264_mem_fns.c" - "${AVC_ROOT}/common/ih264_padding.c" - "${AVC_ROOT}/common/ih264_resi_trans_quant.c" - "${AVC_ROOT}/common/ih264_trans_data.c" - "${AVC_ROOT}/common/ih264_weighted_pred.c" - "${AVC_ROOT}/common/ithread.c") - -include_directories(${AVC_ROOT}/common) - -# arm/x86 sources -if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") - list( - APPEND - LIBAVC_COMMON_ASMS - "${AVC_ROOT}/common/armv8/ih264_deblk_chroma_av8.s" - "${AVC_ROOT}/common/armv8/ih264_deblk_luma_av8.s" - "${AVC_ROOT}/common/armv8/ih264_default_weighted_pred_av8.s" - "${AVC_ROOT}/common/armv8/ih264_ihadamard_scaling_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_chroma_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_filters_luma_horz_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_filters_luma_vert_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_copy_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_horz_hpel_vert_hpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_horz_hpel_vert_qpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_horz_qpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_horz_qpel_vert_hpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_horz_qpel_vert_qpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_inter_pred_luma_vert_qpel_av8.s" - "${AVC_ROOT}/common/armv8/ih264_intra_pred_chroma_av8.s" - "${AVC_ROOT}/common/armv8/ih264_intra_pred_luma_16x16_av8.s" - "${AVC_ROOT}/common/armv8/ih264_intra_pred_luma_4x4_av8.s" - "${AVC_ROOT}/common/armv8/ih264_intra_pred_luma_8x8_av8.s" - "${AVC_ROOT}/common/armv8/ih264_iquant_itrans_recon_av8.s" - "${AVC_ROOT}/common/armv8/ih264_iquant_itrans_recon_dc_av8.s" - "${AVC_ROOT}/common/armv8/ih264_mem_fns_neon_av8.s" - "${AVC_ROOT}/common/armv8/ih264_padding_neon_av8.s" - "${AVC_ROOT}/common/armv8/ih264_resi_trans_quant_av8.s" - "${AVC_ROOT}/common/armv8/ih264_weighted_bi_pred_av8.s" - "${AVC_ROOT}/common/armv8/ih264_weighted_pred_av8.s") - - include_directories(${AVC_ROOT}/common/arm) - include_directories(${AVC_ROOT}/common/armv8) -elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32") - list( - APPEND - LIBAVC_COMMON_ASMS - "${AVC_ROOT}/common/arm/ih264_deblk_chroma_a9.s" - "${AVC_ROOT}/common/arm/ih264_deblk_luma_a9.s" - "${AVC_ROOT}/common/arm/ih264_default_weighted_pred_a9q.s" - "${AVC_ROOT}/common/arm/ih264_ihadamard_scaling_a9.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_chroma_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_filters_luma_horz_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_filters_luma_vert_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_bilinear_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_copy_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_horz_hpel_vert_hpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_horz_qpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_horz_qpel_vert_hpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_horz_qpel_vert_qpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_inter_pred_luma_vert_qpel_a9q.s" - "${AVC_ROOT}/common/arm/ih264_intra_pred_chroma_a9q.s" - "${AVC_ROOT}/common/arm/ih264_intra_pred_luma_16x16_a9q.s" - "${AVC_ROOT}/common/arm/ih264_intra_pred_luma_4x4_a9q.s" - "${AVC_ROOT}/common/arm/ih264_intra_pred_luma_8x8_a9q.s" - "${AVC_ROOT}/common/arm/ih264_iquant_itrans_recon_a9.s" - "${AVC_ROOT}/common/arm/ih264_iquant_itrans_recon_dc_a9.s" - "${AVC_ROOT}/common/arm/ih264_mem_fns_neon.s" - "${AVC_ROOT}/common/arm/ih264_padding_neon.s" - "${AVC_ROOT}/common/arm/ih264_resi_trans_quant_a9.s" - "${AVC_ROOT}/common/arm/ih264_weighted_bi_pred_a9q.s" - "${AVC_ROOT}/common/arm/ih264_weighted_pred_a9q.s") - - include_directories(${AVC_ROOT}/common/arm) -else() - list( - APPEND - LIBAVC_COMMON_SRCS - "${AVC_ROOT}/common/x86/ih264_chroma_intra_pred_filters_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_deblk_chroma_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_deblk_luma_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_ihadamard_scaling_sse42.c" - "${AVC_ROOT}/common/x86/ih264_ihadamard_scaling_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_inter_pred_filters_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_dc_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_sse42.c" - "${AVC_ROOT}/common/x86/ih264_iquant_itrans_recon_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_luma_intra_pred_filters_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_mem_fns_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_padding_ssse3.c" - "${AVC_ROOT}/common/x86/ih264_resi_trans_quant_sse42.c" - "${AVC_ROOT}/common/x86/ih264_weighted_pred_sse42.c") - - include_directories(${AVC_ROOT}/common/x86) -endif() diff --git a/common/ithread.c b/common/ithread.c index e7f63ad..d19bdec 100644 --- a/common/ithread.c +++ b/common/ithread.c @@ -209,30 +209,3 @@ WORD32 ithread_set_affinity(WORD32 core_id) return 1; } - -#ifdef KEEP_THREADS_ACTIVE -WORD32 ithread_get_cond_struct_size(void) -{ - return (sizeof(pthread_cond_t)); -} - -WORD32 ithread_cond_init(void *cond) -{ - return pthread_cond_init((pthread_cond_t *)cond, NULL); -} - -WORD32 ithread_cond_destroy(void *cond) -{ - return pthread_cond_destroy((pthread_cond_t *)cond); -} - -WORD32 ithread_cond_wait(void *cond, void *mutex) -{ - return pthread_cond_wait((pthread_cond_t *)cond, (pthread_mutex_t *)mutex); -} - -WORD32 ithread_cond_signal(void *cond) -{ - return pthread_cond_signal((pthread_cond_t *)cond); -} -#endif diff --git a/common/ithread.h b/common/ithread.h index c2843f8..3e5aa9c 100644 --- a/common/ithread.h +++ b/common/ithread.h @@ -98,16 +98,4 @@ WORD32 ithread_set_affinity(WORD32 core_id); void ithread_set_name(CHAR *pc_thread_name); -#ifdef KEEP_THREADS_ACTIVE -WORD32 ithread_get_cond_struct_size(void); - -WORD32 ithread_cond_init(void *cond); - -WORD32 ithread_cond_destroy(void *cond); - -WORD32 ithread_cond_wait(void *cond, void *mutex); - -WORD32 ithread_cond_signal(void *cond); -#endif - #endif /* _ITHREAD_H_ */ diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index 923c519..2508d7b 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -1328,57 +1328,6 @@ WORD32 ih264d_free_static_bufs(iv_obj_t *dec_hdl) pf_aligned_free = ps_dec->pf_aligned_free; pv_mem_ctxt = ps_dec->pv_mem_ctxt; -#ifdef KEEP_THREADS_ACTIVE - /* Wait for threads */ - ps_dec->i4_break_threads = 1; - if(ps_dec->u4_dec_thread_created) - { - ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); - - ps_dec->ai4_process_start[0] = PROC_START; - - ithread_cond_signal(ps_dec->apv_proc_start_condition[0]); - - ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); - - ithread_join(ps_dec->pv_dec_thread_handle, NULL); - - ps_dec->u4_dec_thread_created = 0; - } - - if(ps_dec->u4_bs_deblk_thread_created) - { - ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); - - ps_dec->ai4_process_start[1] = PROC_START; - - ithread_cond_signal(ps_dec->apv_proc_start_condition[1]); - - ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); - - ithread_join(ps_dec->pv_bs_deblk_thread_handle, NULL); - - ps_dec->u4_bs_deblk_thread_created = 0; - } - - // destroy mutex and condition variable for both the threads - // 1. ih264d_decode_picture_thread - // 2. ih264d_recon_deblk_thread - { - UWORD32 i; - for(i = 0; i < 2; i++) - { - ithread_cond_destroy(ps_dec->apv_proc_start_condition[i]); - ithread_cond_destroy(ps_dec->apv_proc_done_condition[i]); - - ithread_mutex_destroy(ps_dec->apv_proc_start_mutex[i]); - ithread_mutex_destroy(ps_dec->apv_proc_done_mutex[i]); - } - } - PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_mutex[0]); - PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->apv_proc_start_condition[0]); -#endif - PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sps); PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pps); PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_dec_thread_handle); @@ -1520,59 +1469,6 @@ WORD32 ih264d_allocate_static_bufs(iv_obj_t **dec_hdl, void *pv_api_ip, void *pv memset(pv_buf, 0, size); ps_dec->pv_bs_deblk_thread_handle = pv_buf; -#ifdef KEEP_THREADS_ACTIVE - { - UWORD32 i; - /* Request memory to hold mutex (start/done) for both threads */ - size = ithread_get_mutex_lock_size() << 2; - pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size); - RETURN_IF((NULL == pv_buf), IV_FAIL); - memset(pv_buf, 0, size); - - // init mutex variable for both the threads - // 1. ih264d_decode_picture_thread - // 2. ih264d_recon_deblk_thread - for(i = 0; i < 2; i++) - { - WORD32 ret; - WORD32 mutex_size = ithread_get_mutex_lock_size(); - - ps_dec->apv_proc_start_mutex[i] = - (UWORD8 *)pv_buf + (2 * i * mutex_size); - ps_dec->apv_proc_done_mutex[i] = - (UWORD8 *)pv_buf + ((2 * i + 1) * mutex_size); - - ret = ithread_mutex_init(ps_dec->apv_proc_start_mutex[0]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_mutex_init(ps_dec->apv_proc_done_mutex[i]); - RETURN_IF((ret != IV_SUCCESS), ret); - } - - size = ithread_get_cond_struct_size() << 2; - pv_buf = pf_aligned_alloc(pv_mem_ctxt, 8, size); - RETURN_IF((NULL == pv_buf), IV_FAIL); - memset(pv_buf, 0, size); - - // init condition variable for both the threads - for(i = 0; i < 2; i++) - { - WORD32 ret; - WORD32 cond_size = ithread_get_cond_struct_size(); - ps_dec->apv_proc_start_condition[i] = - (UWORD8 *)pv_buf + (2 * i * cond_size); - ps_dec->apv_proc_done_condition[i] = - (UWORD8 *)pv_buf + ((2 * i + 1) * cond_size); - - ret = ithread_cond_init(ps_dec->apv_proc_start_condition[i]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_cond_init(ps_dec->apv_proc_done_condition[i]); - RETURN_IF((ret != IV_SUCCESS), ret); - } - } -#endif - size = sizeof(dpb_manager_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); @@ -2122,26 +2018,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) } ps_dec->u1_pic_decode_done = 0; -#ifdef KEEP_THREADS_ACTIVE - { - UWORD32 i; - ps_dec->i4_break_threads = 0; - for (i = 0; i < 2; i++) - { - ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[i]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ps_dec->ai4_process_start[i] = PROC_INIT; - - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[i]); - RETURN_IF((ret != IV_SUCCESS), ret); - } - } -#else - ps_dec->u4_dec_thread_created = 0; - ps_dec->u4_bs_deblk_thread_created = 0; -#endif - ps_dec_op->u4_num_bytes_consumed = 0; ps_dec_op->i4_reorder_depth = -1; ps_dec_op->i4_display_index = DEFAULT_POC; @@ -2247,7 +2123,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) if(ps_pic_buf == NULL) { - UWORD32 display_queued = 0; + UWORD32 i, display_queued = 0; /* check if any buffer was given for display which is not returned yet */ for(i = 0; i < (MAX_DISP_BUFS_NEW); i++) @@ -2377,6 +2253,9 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ps_dec->u4_first_slice_in_pic = 1; ps_dec->u1_slice_header_done = 0; ps_dec->u1_dangling_field = 0; + + ps_dec->u4_dec_thread_created = 0; + ps_dec->u4_bs_deblk_thread_created = 0; ps_dec->u4_cur_bs_mb_num = 0; ps_dec->u4_start_recon_deblk = 0; ps_dec->u4_sps_cnt_in_process = 0; @@ -2733,12 +2612,10 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) } /* close deblock thread if it is not closed yet*/ -#ifndef KEEP_THREADS_ACTIVE if(ps_dec->u4_num_cores == 3) { ih264d_signal_bs_deblk_thread(ps_dec); } -#endif { diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c index 77ea4b3..6f8df9e 100644 --- a/decoder/ih264d_parse_pslice.c +++ b/decoder/ih264d_parse_pslice.c @@ -1566,17 +1566,6 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, ps_dec->u4_dec_thread_created = 1; } -#ifdef KEEP_THREADS_ACTIVE - ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ps_dec->ai4_process_start[0] = PROC_START; - ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); - RETURN_IF((ret != IV_SUCCESS), ret); -#endif if((ps_dec->u4_num_cores == 3) && ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) @@ -1588,20 +1577,6 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, (void *)ps_dec); ps_dec->u4_bs_deblk_thread_created = 1; } -#ifdef KEEP_THREADS_ACTIVE - if (ps_dec->u4_bs_deblk_thread_created) - { - ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ps_dec->ai4_process_start[1] = PROC_START; - ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - } -#endif } } } diff --git a/decoder/ih264d_parse_slice.c b/decoder/ih264d_parse_slice.c index 12fbeeb..ad033be 100644 --- a/decoder/ih264d_parse_slice.c +++ b/decoder/ih264d_parse_slice.c @@ -1598,17 +1598,6 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, ps_dec->u4_dec_thread_created = 1; } -#ifdef KEEP_THREADS_ACTIVE - ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ps_dec->ai4_process_start[0] = PROC_START; - ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); - RETURN_IF((ret != IV_SUCCESS), ret); -#endif if((ps_dec->u4_num_cores == 3) && ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) @@ -1620,20 +1609,6 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, (void *)ps_dec); ps_dec->u4_bs_deblk_thread_created = 1; } -#ifdef KEEP_THREADS_ACTIVE - if (ps_dec->u4_bs_deblk_thread_created) - { - ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ps_dec->ai4_process_start[1] = PROC_START; - ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); - RETURN_IF((ret != IV_SUCCESS), ret); - } -#endif } } diff --git a/decoder/ih264d_structs.h b/decoder/ih264d_structs.h index e6a962c..fdfbada 100644 --- a/decoder/ih264d_structs.h +++ b/decoder/ih264d_structs.h @@ -123,16 +123,6 @@ typedef enum COEFF_ABS_LEVEL_CAT_5_OFFSET = 0 } cabac_blk_cat_offset_t; -#ifdef KEEP_THREADS_ACTIVE -typedef enum -{ - PROC_INIT, - PROC_START, - PROC_IN_PROGRESS, - PROC_DONE, -} proc_state_t; -#endif - /** Structure for the MV bank */ typedef struct _mv_pred_t { @@ -1287,44 +1277,6 @@ typedef struct _DecStruct UWORD8 u1_separate_parse; UWORD32 u4_dec_thread_created; void *pv_dec_thread_handle; - -#ifdef KEEP_THREADS_ACTIVE - /** - * Condition variable to signal process start - One for each thread - */ - void *apv_proc_start_condition[2]; - - /** - * Mutex used to keep the functions thread-safe - One for each thread - */ - void *apv_proc_start_mutex[2]; - - /** - * Condition variable to signal process done - One for each thread - */ - void *apv_proc_done_condition[2]; - - /** - * Mutex used to keep the functions thread-safe - One for each thread - */ - void *apv_proc_done_mutex[2]; - - /** - * Process state start - One for each thread - */ - proc_state_t ai4_process_start[2]; - - /** - * Process state end - One for each thread - */ - proc_state_t ai4_process_done[2]; - - /** - * Flag to signal processing thread to exit - */ - WORD32 i4_break_threads; -#endif - volatile UWORD8 *pu1_dec_mb_map; volatile UWORD8 *pu1_recon_mb_map; volatile UWORD16 *pu2_slice_num_map; diff --git a/decoder/ih264d_thread_compute_bs.c b/decoder/ih264d_thread_compute_bs.c index e647a60..951cef4 100644 --- a/decoder/ih264d_thread_compute_bs.c +++ b/decoder/ih264d_thread_compute_bs.c @@ -697,73 +697,41 @@ void ih264d_recon_deblk_thread(dec_struct_t *ps_dec) while(1) { -#ifdef KEEP_THREADS_ACTIVE - UWORD32 ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); - if(OK != ret) - break; - while(ps_dec->ai4_process_start[1] != PROC_START) - { - ithread_cond_wait(ps_dec->apv_proc_start_condition[1], - ps_dec->apv_proc_start_mutex[1]); - } - ps_dec->ai4_process_start[1] = PROC_IN_PROGRESS; + DEBUG_THREADS_PRINTF(" Entering compute bs slice\n"); + ih264d_recon_deblk_slice(ps_dec, ps_tfr_cxt); - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); - if(OK != ret || ps_dec->i4_break_threads == 1) - break; -#endif + DEBUG_THREADS_PRINTF(" Exit compute bs slice \n"); - while(1) + if(ps_dec->cur_recon_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr) { - - DEBUG_THREADS_PRINTF(" Entering compute bs slice\n"); - ih264d_recon_deblk_slice(ps_dec, ps_tfr_cxt); - - DEBUG_THREADS_PRINTF(" Exit compute bs slice \n"); - - if(ps_dec->cur_recon_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr) - { - break; - } - else - { - ps_dec->ps_computebs_cur_slice++; - ps_dec->u2_cur_slice_num_bs++; - } - DEBUG_THREADS_PRINTF("CBS thread:Got next slice/end of frame signal \n "); - + break; } - - if(ps_dec->u4_output_present && - (3 == ps_dec->u4_num_cores) && - (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht)) + else { - ps_dec->u4_fmt_conv_num_rows = - (ps_dec->s_disp_frame_info.u4_y_ht - - ps_dec->u4_fmt_conv_cur_row); - ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), - ps_dec->u4_fmt_conv_cur_row, - ps_dec->u4_fmt_conv_num_rows); - ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows; - + ps_dec->ps_computebs_cur_slice++; + ps_dec->u2_cur_slice_num_bs++; } + DEBUG_THREADS_PRINTF("CBS thread:Got next slice/end of frame signal \n "); -#ifdef KEEP_THREADS_ACTIVE - ret = ithread_mutex_lock(ps_dec->apv_proc_done_mutex[1]); - if(OK != ret) - break; + } - ps_dec->ai4_process_done[1] = PROC_DONE; - ithread_cond_signal(ps_dec->apv_proc_done_condition[1]); + if(ps_dec->u4_output_present && + (3 == ps_dec->u4_num_cores) && + (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht)) + { + ps_dec->u4_fmt_conv_num_rows = + (ps_dec->s_disp_frame_info.u4_y_ht + - ps_dec->u4_fmt_conv_cur_row); + ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), + ps_dec->u4_fmt_conv_cur_row, + ps_dec->u4_fmt_conv_num_rows); + ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows; - ret = ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[1]); - if(OK != ret) - break; -#else - break; -#endif } + + + } diff --git a/decoder/ih264d_thread_parse_decode.c b/decoder/ih264d_thread_parse_decode.c index 47571b3..131c808 100644 --- a/decoder/ih264d_thread_parse_decode.c +++ b/decoder/ih264d_thread_parse_decode.c @@ -593,74 +593,39 @@ WORD32 ih264d_decode_slice_thread(dec_struct_t *ps_dec) void ih264d_decode_picture_thread(dec_struct_t *ps_dec ) { ithread_set_name("ih264d_decode_picture_thread"); - while(1) { -#ifdef KEEP_THREADS_ACTIVE - WORD32 ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); - if(OK != ret) - break; + /*Complete all writes before processing next slice*/ - while(ps_dec->ai4_process_start[0] != PROC_START) - { - ithread_cond_wait(ps_dec->apv_proc_start_condition[0], - ps_dec->apv_proc_start_mutex[0]); - } - ps_dec->ai4_process_start[0] = PROC_IN_PROGRESS; + DEBUG_THREADS_PRINTF(" Entering decode slice\n"); - ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); - if(OK != ret || ps_dec->i4_break_threads == 1) - break; -#endif - while(1) - { - /*Complete all writes before processing next slice*/ - - DEBUG_THREADS_PRINTF(" Entering decode slice\n"); + ih264d_decode_slice_thread(ps_dec); + DEBUG_THREADS_PRINTF(" Exit ih264d_decode_slice_thread \n"); - ih264d_decode_slice_thread(ps_dec); - DEBUG_THREADS_PRINTF(" Exit ih264d_decode_slice_thread \n"); - - - if(ps_dec->cur_dec_mb_num - > ps_dec->ps_cur_sps->u2_max_mb_addr) - { - /*Last slice in frame*/ - break; - } - else - { - ps_dec->ps_decode_cur_slice++; - ps_dec->u2_cur_slice_num_dec_thread++; - } + if(ps_dec->cur_dec_mb_num + > ps_dec->ps_cur_sps->u2_max_mb_addr) + { + /*Last slice in frame*/ + break; } - if(ps_dec->u4_output_present && (2 == ps_dec->u4_num_cores) && - (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht)) + else { - ps_dec->u4_fmt_conv_num_rows = - (ps_dec->s_disp_frame_info.u4_y_ht - - ps_dec->u4_fmt_conv_cur_row); - ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), - ps_dec->u4_fmt_conv_cur_row, - ps_dec->u4_fmt_conv_num_rows); - ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows; + ps_dec->ps_decode_cur_slice++; + ps_dec->u2_cur_slice_num_dec_thread++; } -#ifdef KEEP_THREADS_ACTIVE - ret = ithread_mutex_lock(ps_dec->apv_proc_done_mutex[0]); - if(OK != ret) - break; - - ps_dec->ai4_process_done[0] = PROC_DONE; - ithread_cond_signal(ps_dec->apv_proc_done_condition[0]); - - ret = ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[0]); - if(OK != ret) - break; -#else - break; -#endif + } + if(ps_dec->u4_output_present && (2 == ps_dec->u4_num_cores) && + (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht)) + { + ps_dec->u4_fmt_conv_num_rows = + (ps_dec->s_disp_frame_info.u4_y_ht + - ps_dec->u4_fmt_conv_cur_row); + ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op), + ps_dec->u4_fmt_conv_cur_row, + ps_dec->u4_fmt_conv_num_rows); + ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows; } } @@ -668,58 +633,16 @@ void ih264d_signal_decode_thread(dec_struct_t *ps_dec) { if(ps_dec->u4_dec_thread_created == 1) { -#ifdef KEEP_THREADS_ACTIVE - proc_state_t i4_process_state; - ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); - i4_process_state = ps_dec->ai4_process_start[0]; - ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); - - // only wait if the thread has started decoding - if(i4_process_state != PROC_INIT) - { - ithread_mutex_lock(ps_dec->apv_proc_done_mutex[0]); - - while(ps_dec->ai4_process_done[0] != PROC_DONE) - { - ithread_cond_wait(ps_dec->apv_proc_done_condition[0], - ps_dec->apv_proc_done_mutex[0]); - } - ps_dec->ai4_process_done[0] = PROC_INIT; - ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[0]); - } -#else ithread_join(ps_dec->pv_dec_thread_handle, NULL); ps_dec->u4_dec_thread_created = 0; -#endif } } void ih264d_signal_bs_deblk_thread(dec_struct_t *ps_dec) { if(ps_dec->u4_bs_deblk_thread_created) { -#ifdef KEEP_THREADS_ACTIVE - proc_state_t i4_process_state; - ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); - i4_process_state = ps_dec->ai4_process_start[1]; - ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); - - // only wait if the thread has started deblking - if(i4_process_state != PROC_INIT) - { - ithread_mutex_lock(ps_dec->apv_proc_done_mutex[1]); - - while(ps_dec->ai4_process_done[1] != PROC_DONE) - { - ithread_cond_wait(ps_dec->apv_proc_done_condition[1], - ps_dec->apv_proc_done_mutex[1]); - } - ps_dec->ai4_process_done[1] = PROC_INIT; - ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[1]); - } -#else ithread_join(ps_dec->pv_bs_deblk_thread_handle, NULL); ps_dec->u4_bs_deblk_thread_created = 0; -#endif } } diff --git a/decoder/libavcdec.cmake b/decoder/libavcdec.cmake deleted file mode 100644 index 911c328..0000000 --- a/decoder/libavcdec.cmake +++ /dev/null @@ -1,53 +0,0 @@ -# src files -list( - APPEND - LIBAVCDEC_SRCS - "${AVC_ROOT}/decoder/ih264d_api.c" - "${AVC_ROOT}/decoder/ih264d_bitstrm.c" - "${AVC_ROOT}/decoder/ih264d_cabac.c" - "${AVC_ROOT}/decoder/ih264d_cabac_init_tables.c" - "${AVC_ROOT}/decoder/ih264d_compute_bs.c" - "${AVC_ROOT}/decoder/ih264d_deblocking.c" - "${AVC_ROOT}/decoder/ih264d_dpb_mgr.c" - "${AVC_ROOT}/decoder/ih264d_format_conv.c" - "${AVC_ROOT}/decoder/ih264d_function_selector_generic.c" - "${AVC_ROOT}/decoder/ih264d_inter_pred.c" - "${AVC_ROOT}/decoder/ih264d_mb_utils.c" - "${AVC_ROOT}/decoder/ih264d_mvpred.c" - "${AVC_ROOT}/decoder/ih264d_nal.c" - "${AVC_ROOT}/decoder/ih264d_parse_bslice.c" - "${AVC_ROOT}/decoder/ih264d_parse_cabac.c" - "${AVC_ROOT}/decoder/ih264d_parse_cavlc.c" - "${AVC_ROOT}/decoder/ih264d_parse_headers.c" - "${AVC_ROOT}/decoder/ih264d_parse_islice.c" - "${AVC_ROOT}/decoder/ih264d_parse_mb_header.c" - "${AVC_ROOT}/decoder/ih264d_parse_pslice.c" - "${AVC_ROOT}/decoder/ih264d_parse_slice.c" - "${AVC_ROOT}/decoder/ih264d_process_bslice.c" - "${AVC_ROOT}/decoder/ih264d_process_intra_mb.c" - "${AVC_ROOT}/decoder/ih264d_process_pslice.c" - "${AVC_ROOT}/decoder/ih264d_quant_scaling.c" - "${AVC_ROOT}/decoder/ih264d_sei.c" - "${AVC_ROOT}/decoder/ih264d_tables.c" - "${AVC_ROOT}/decoder/ih264d_thread_compute_bs.c" - "${AVC_ROOT}/decoder/ih264d_thread_parse_decode.c" - "${AVC_ROOT}/decoder/ih264d_utils.c" - "${AVC_ROOT}/decoder/ih264d_vui.c") - -include_directories(${AVC_ROOT}/decoder) - -if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_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" - "${AVC_ROOT}/decoder/arm/ih264d_function_selector_av8.c") -else() - list( - APPEND LIBAVCDEC_SRCS "${AVC_ROOT}/decoder/x86/ih264d_function_selector.c" - "${AVC_ROOT}/decoder/x86/ih264d_function_selector_sse42.c" - "${AVC_ROOT}/decoder/x86/ih264d_function_selector_ssse3.c") -endif() - -add_library(libavcdec STATIC ${LIBAVC_COMMON_SRCS} ${LIBAVC_COMMON_ASMS} - ${LIBAVCDEC_SRCS} ${LIBAVCDEC_ASMS}) diff --git a/encoder/ih264e_bitstream.h b/encoder/ih264e_bitstream.h index 4f592f3..5b5c700 100644 --- a/encoder/ih264e_bitstream.h +++ b/encoder/ih264e_bitstream.h @@ -82,7 +82,7 @@ * @brief Macro to check if emulation prevention byte insertion is required ****************************************************************************** */ -#define SHOULD_INSERT_EPB(zero_run, next_byte) \ +#define INSERT_EPB(zero_run, next_byte) \ ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte) & 0xFC)) /** @@ -129,7 +129,7 @@ */ #define PUTBYTE_EPB(ptr,off,byte,zero_run) \ { \ - if( SHOULD_INSERT_EPB(zero_run, byte) ) \ + if( INSERT_EPB(zero_run, byte) ) \ { \ ptr[off] = EPB_BYTE; \ off++; \ @@ -231,7 +231,7 @@ typedef struct bitstrm */ static inline IH264E_ERROR_T ih264e_put_byte_epb(bitstrm_t *ps_bitstrm, UWORD8 byte) { - if (SHOULD_INSERT_EPB(ps_bitstrm->i4_zero_bytes_run, byte)) + if (INSERT_EPB(ps_bitstrm->i4_zero_bytes_run, byte)) { if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size) { diff --git a/encoder/libavcenc.cmake b/encoder/libavcenc.cmake deleted file mode 100644 index b948a6e..0000000 --- a/encoder/libavcenc.cmake +++ /dev/null @@ -1,91 +0,0 @@ -# src files -list( - APPEND - LIBAVCENC_SRCS - "${AVC_ROOT}/encoder/ih264e_api.c" - "${AVC_ROOT}/encoder/ih264e_bitstream.c" - "${AVC_ROOT}/encoder/ih264e_cabac.c" - "${AVC_ROOT}/encoder/ih264e_cabac_encode.c" - "${AVC_ROOT}/encoder/ih264e_cabac_init.c" - "${AVC_ROOT}/encoder/ih264e_cavlc.c" - "${AVC_ROOT}/encoder/ih264e_core_coding.c" - "${AVC_ROOT}/encoder/ih264e_deblk.c" - "${AVC_ROOT}/encoder/ih264e_encode.c" - "${AVC_ROOT}/encoder/ih264e_encode_header.c" - "${AVC_ROOT}/encoder/ih264e_fmt_conv.c" - "${AVC_ROOT}/encoder/ih264e_function_selector_generic.c" - "${AVC_ROOT}/encoder/ih264e_globals.c" - "${AVC_ROOT}/encoder/ih264e_half_pel.c" - "${AVC_ROOT}/encoder/ih264e_intra_modes_eval.c" - "${AVC_ROOT}/encoder/ih264e_mc.c" - "${AVC_ROOT}/encoder/ih264e_me.c" - "${AVC_ROOT}/encoder/ih264e_modify_frm_rate.c" - "${AVC_ROOT}/encoder/ih264e_process.c" - "${AVC_ROOT}/encoder/ih264e_rate_control.c" - "${AVC_ROOT}/encoder/ih264e_rc_mem_interface.c" - "${AVC_ROOT}/encoder/ih264e_sei.c" - "${AVC_ROOT}/encoder/ih264e_time_stamp.c" - "${AVC_ROOT}/encoder/ih264e_utils.c" - "${AVC_ROOT}/encoder/ih264e_version.c" - "${AVC_ROOT}/encoder/ime.c" - "${AVC_ROOT}/encoder/ime_distortion_metrics.c" - "${AVC_ROOT}/encoder/irc_bit_allocation.c" - "${AVC_ROOT}/encoder/irc_cbr_buffer_control.c" - "${AVC_ROOT}/encoder/irc_est_sad.c" - "${AVC_ROOT}/encoder/irc_fixed_point_error_bits.c" - "${AVC_ROOT}/encoder/irc_frame_info_collector.c" - "${AVC_ROOT}/encoder/irc_mb_model_based.c" - "${AVC_ROOT}/encoder/irc_picture_type.c" - "${AVC_ROOT}/encoder/irc_rate_control_api.c" - "${AVC_ROOT}/encoder/irc_rd_model.c" - "${AVC_ROOT}/encoder/irc_vbr_storage_vbv.c" - "${AVC_ROOT}/encoder/irc_vbr_str_prms.c") - -include_directories(${AVC_ROOT}/encoder) - -if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") - list( - APPEND - LIBAVCENC_ASMS - "${AVC_ROOT}/encoder/arm/ih264e_function_selector.c" - "${AVC_ROOT}/encoder/arm/ih264e_function_selector_a9q.c" - "${AVC_ROOT}/encoder/arm/ih264e_function_selector_av8.c" - "${AVC_ROOT}/encoder/armv8/ih264e_evaluate_intra16x16_modes_av8.s" - "${AVC_ROOT}/encoder/armv8/ih264e_evaluate_intra_chroma_modes_av8.s" - "${AVC_ROOT}/encoder/armv8/ih264e_half_pel_av8.s" - "${AVC_ROOT}/encoder/armv8/ime_distortion_metrics_av8.s") - - include_directories(${AVC_ROOT}/encoder/armv8) -elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") - list( - APPEND - LIBAVCENC_ASMS - "${AVC_ROOT}/encoder/arm/ih264e_function_selector.c" - "${AVC_ROOT}/encoder/arm/ih264e_function_selector_a9q.c" - "${AVC_ROOT}/encoder/arm/ih264e_function_selector_av8.c" - "${AVC_ROOT}/encoder/arm/ih264e_evaluate_intra16x16_modes_a9q.s" - "${AVC_ROOT}/encoder/arm/ih264e_evaluate_intra4x4_modes_a9q.s" - "${AVC_ROOT}/encoder/arm/ih264e_evaluate_intra_chroma_modes_a9q.s" - "${AVC_ROOT}/encoder/arm/ih264e_fmt_conv.s" - "${AVC_ROOT}/encoder/arm/ih264e_half_pel.s" - "${AVC_ROOT}/encoder/arm/ime_distortion_metrics_a9q.s") - - include_directories(${AVC_ROOT}/encoder/armv8) -else() - list( - APPEND - LIBAVCENC_SRCS - "${AVC_ROOT}/encoder/x86/ih264e_function_selector.c" - "${AVC_ROOT}/encoder/x86/ih264e_function_selector_sse42.c" - "${AVC_ROOT}/encoder/x86/ih264e_function_selector_ssse3.c" - "${AVC_ROOT}/encoder/x86/ih264e_half_pel_ssse3.c" - "${AVC_ROOT}/encoder/x86/ih264e_intra_modes_eval_ssse3.c" - "${AVC_ROOT}/encoder/x86/ime_distortion_metrics_sse42.c") - - include_directories(${AVC_ROOT}/encoder/x86) -endif() - -add_library(libavcenc STATIC ${LIBAVC_COMMON_SRCS} ${LIBAVC_COMMON_ASMS} - ${LIBAVCENC_SRCS} ${LIBAVCENC_ASMS}) - -target_compile_definitions(libavcenc PRIVATE N_MB_ENABLE) diff --git a/fuzzer/README.md b/fuzzer/README.md index f848629..8e29ec6 100644 --- a/fuzzer/README.md +++ b/fuzzer/README.md @@ -1,11 +1,11 @@ -# Fuzzer for libavc decoder and encoder +# Fuzzer for libavc decoder -This describes steps to build avc_dec_fuzzer and avc_enc_fuzzer. +This describes steps to build avc_dec_fuzzer binary. ## Linux x86/x64 ### Requirements -- cmake (3.9.1 or above) +- cmake (3.5 or above) - make - clang (6.0 or above) needs to support -fsanitize=fuzzer, -fsanitize=fuzzer-no-link @@ -21,62 +21,51 @@ Create a directory inside libavc and change directory $ mkdir build $ cd build ``` -Build fuzzer with required sanitizers (-DSANITIZE=fuzzer-no-link is mandatory - to enable fuzzers) +Build libavc using cmake ``` - $ cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ - -DCMAKE_BUILD_TYPE=Debug -DSANITIZE=fuzzer-no-link,address + $ CC=clang CXX=clang++ cmake ../ \ + -DSANITIZE=fuzzer-no-link,address,signed-integer-overflow $ make ``` +Build the fuzzer +``` + $ clang++ -std=c++11 -fsanitize=fuzzer,address -I. -I../ -I../common \ + -I../decoder -Wl,--start-group ../fuzzer/avc_dec_fuzzer.cpp \ + -o ./avc_dec_fuzzer ./libavcdec.a -Wl,--end-group +``` ### Steps to run -Create a directory CORPUS_DIR and copy some elementary h264 files -(for avc_dec_fuzzer) or yuv files (for avc_enc_fuzzer) to that directory - -To run the fuzzers +Create a directory CORPUS_DIR and copy some elementary h264 files to that folder +To run the fuzzer ``` $ ./avc_dec_fuzzer CORPUS_DIR -$ ./avc_enc_fuzzer CORPUS_DIR ``` ## Android ### Steps to build -Build the fuzzers +Build the fuzzer ``` - $ mm -j$(nproc) avc_dec_fuzzer - $ mm -j$(nproc) avc_enc_fuzzer + $ SANITIZE_TARGET=address SANITIZE_HOST=address mmma -j$(nproc) \ + external/libavc/fuzzer ``` ### Steps to run -Create a directory CORPUS_DIR and copy some elementary h264 files -(for avc_dec_fuzzer) or yuv files (for avc_enc_fuzzer) to that folder -Push this directory to device +Create a directory CORPUS_DIR and copy some elementary h264 files to that folder +Push this directory to device. -To run avc_dec_fuzzer on device -``` - $ adb sync data - $ adb shell /data/fuzz/arm64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR -``` -To run avc_enc_fuzzer on device +To run on device ``` $ adb sync data - $ adb shell /data/fuzz/arm64/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR + $ adb shell /data/fuzz/avc_dec_fuzzer CORPUS_DIR ``` - -To run avc_dec_fuzzer on host +To run on host ``` - $ $ANDROID_HOST_OUT/fuzz/x86_64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR -``` - -To run avc_enc_fuzzer on host -``` - $ $ANDROID_HOST_OUT/fuzz/x86_64/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR + $ $ANDROID_HOST_OUT/fuzz/avc_dec_fuzzer CORPUS_DIR ``` -# Appendix -## libavc encoder fuzzer +# Fuzzer for libavc encoder ## Plugin Design Considerations The fuzzer plugin for AVC is designed based on the understanding of the @@ -181,6 +170,31 @@ 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 avc_enc_fuzzer binary. + +### Android + +#### Steps to build +Build the fuzzer +``` + $ mm -j$(nproc) avc_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/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR +``` +To run on host +``` + $ $ANDROID_HOST_OUT/fuzz/x86_64/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR +``` ## References: * http://llvm.org/docs/LibFuzzer.html diff --git a/fuzzer/avc_dec_fuzzer.cmake b/fuzzer/avc_dec_fuzzer.cmake deleted file mode 100644 index c20aaed..0000000 --- a/fuzzer/avc_dec_fuzzer.cmake +++ /dev/null @@ -1,2 +0,0 @@ -libavc_add_fuzzer(avc_dec_fuzzer libavcdec SOURCES - ${AVC_ROOT}/fuzzer/avc_dec_fuzzer.cpp) diff --git a/fuzzer/avc_enc_fuzzer.cmake b/fuzzer/avc_enc_fuzzer.cmake deleted file mode 100644 index d6cb551..0000000 --- a/fuzzer/avc_enc_fuzzer.cmake +++ /dev/null @@ -1,2 +0,0 @@ -libavc_add_fuzzer(avc_enc_fuzzer libavcenc SOURCES - ${AVC_ROOT}/fuzzer/avc_enc_fuzzer.cpp) diff --git a/fuzzer/avc_enc_fuzzer.cpp b/fuzzer/avc_enc_fuzzer.cpp index ce36756..426eedb 100644 --- a/fuzzer/avc_enc_fuzzer.cpp +++ b/fuzzer/avc_enc_fuzzer.cpp @@ -19,7 +19,6 @@ */ #include <malloc.h> #include <algorithm> -#include <string.h> #include <vector> #include "ih264_defs.h" diff --git a/fuzzer/ossfuzz.sh b/fuzzer/ossfuzz.sh index b1328ab..e5bed08 100755 --- a/fuzzer/ossfuzz.sh +++ b/fuzzer/ossfuzz.sh @@ -22,12 +22,23 @@ test "${OUT}" != "" || exit 1 build_dir=$WORK/build rm -rf ${build_dir} mkdir -p ${build_dir} - pushd ${build_dir} -cmake ${SRC}/libavc -make -j$(nproc) avc_dec_fuzzer -cp ${build_dir}/avc_dec_fuzzer $OUT/avc_dec_fuzzer + +cmake $SRC/libavc +make -j$(nproc) popd +# build fuzzers +$CXX $CXXFLAGS -std=c++11 \ + -I$SRC/libavc \ + -I$SRC/libavc/common \ + -I$SRC/libavc/decoder \ + -I${build_dir} \ + -Wl,--start-group \ + $LIB_FUZZING_ENGINE \ + $SRC/libavc/fuzzer/avc_dec_fuzzer.cpp -o $OUT/avc_dec_fuzzer \ + ${build_dir}/libavcdec.a \ + -Wl,--end-group + cp $SRC/avc_dec_fuzzer_seed_corpus.zip $OUT/avc_dec_fuzzer_seed_corpus.zip cp $SRC/libavc/fuzzer/avc_dec_fuzzer.dict $OUT/avcdec_fuzzer.dict diff --git a/test/decoder/avcdec.cmake b/test/decoder/avcdec.cmake deleted file mode 100644 index e626611..0000000 --- a/test/decoder/avcdec.cmake +++ /dev/null @@ -1 +0,0 @@ -libavc_add_executable(avcdec libavcdec SOURCES ${AVC_ROOT}/test/decoder/main.c) diff --git a/test/encoder/avcenc.cmake b/test/encoder/avcenc.cmake deleted file mode 100644 index 99f93db..0000000 --- a/test/encoder/avcenc.cmake +++ /dev/null @@ -1,10 +0,0 @@ -list( - APPEND - AVCENC_SRCS - "${AVC_ROOT}/test/encoder/input.c" - "${AVC_ROOT}/test/encoder/main.c" - "${AVC_ROOT}/test/encoder/output.c" - "${AVC_ROOT}/test/encoder/psnr.c" - "${AVC_ROOT}/test/encoder/recon.c") - -libavc_add_executable(avcenc libavcenc SOURCES ${AVCENC_SRCS}) |