diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2023-04-25 16:58:19 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-25 16:58:19 +0000 |
commit | f0da762222537f0b268614a241af0d72a377cd7f (patch) | |
tree | cb57f1324e06ae5b9ab39def1b9739218105bffb | |
parent | 27691ed00242920ecdebbbfdaeb2d3e0d12ef103 (diff) | |
parent | c849052c7f43136e057ca7e45af1c7c30a71fe87 (diff) | |
download | libhevc-f0da762222537f0b268614a241af0d72a377cd7f.tar.gz |
Merge v1.1.1 into master am: 6f2a30d049 am: 6deb3d62ee am: c8c9f4aa5b am: c849052c7f
Original change: https://android-review.googlesource.com/c/platform/external/libhevc/+/2557890
Change-Id: I267a63cc8252192fc7d3114496c93c03ac92efa8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | .github/workflows/cifuzz.yml | 27 | ||||
-rw-r--r-- | .github/workflows/cmake.yml | 23 | ||||
-rw-r--r-- | METADATA | 6 | ||||
-rw-r--r-- | cmake/utils.cmake | 5 | ||||
-rw-r--r-- | common/common.cmake | 14 | ||||
-rw-r--r-- | decoder/ihevcd_iquant_itrans_recon_ctb.c | 21 | ||||
-rwxr-xr-x | decoder/libhevcdec.cmake | 2 | ||||
-rw-r--r-- | encoder/ihevce_frame_process.c | 1 | ||||
-rw-r--r-- | encoder/ihevce_rc_interface.c | 3 | ||||
-rw-r--r-- | encoder/libhevcenc.cmake | 2 | ||||
-rw-r--r-- | fuzzer/Android.bp | 18 | ||||
-rw-r--r-- | fuzzer/hevc_enc_fuzzer.cpp | 5 | ||||
-rwxr-xr-x | fuzzer/ossfuzz.sh | 11 | ||||
-rw-r--r-- | test/decoder/main.c | 12 |
14 files changed, 120 insertions, 30 deletions
diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml new file mode 100644 index 0000000..fddb28f --- /dev/null +++ b/.github/workflows/cifuzz.yml @@ -0,0 +1,27 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + strategy: + matrix: + sanitizer: [address, memory] + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'libhevc' + language: c++ + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'libhevc' + language: c++ + fuzz-seconds: 600 + - name: Upload Crash + uses: actions/upload-artifact@v3 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 0000000..0ec6d70 --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,23 @@ +name: CMake + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + BUILD_TYPE: Release + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Configure CMake + run: cmake -B ${{github.workspace}}/out -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + + - name: Build + run: cmake --build ${{github.workspace}}/out --config ${{env.BUILD_TYPE}} @@ -6,11 +6,11 @@ third_party { type: GIT value: "https://github.com/ittiam-systems/libhevc.git" } - version: "a3cac8c9d79968772272fff97a98d4edaf3132c1" + version: "v1.1.1" license_type: NOTICE last_upgrade_date { year: 2023 - month: 03 - day: 04 + month: 04 + day: 24 } } diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 1476f19..e8b97ac 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -33,9 +33,10 @@ endfunction() # Adds defintions for all targets function(libhevc_add_definitions) if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") - add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC) + add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC -DENABLE_NEON) elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") - add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q) + add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q -DENABLE_NEON + -DDISABLE_NEONINTR) else() add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 -DDEFAULT_ARCH=D_ARCH_X86_SSE42) diff --git a/common/common.cmake b/common/common.cmake index 12ac33a..839bd78 100644 --- a/common/common.cmake +++ b/common/common.cmake @@ -59,13 +59,19 @@ list( "${HEVC_ROOT}/common/ihevc_trans_tables.c" "${HEVC_ROOT}/common/ihevc_weighted_pred.c") - include_directories(${HEVC_ROOT}/common) +include_directories(${HEVC_ROOT}/common) # arm/x86 sources if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") list( APPEND LIBHEVC_COMMON_ASMS + "${HEVC_ROOT}/common/arm/ihevc_intra_pred_filters_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_quant_iquant_ssd_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_weighted_pred_neon_intr.c" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans_neon_32x32.c" + "${HEVC_ROOT}/common/arm/ihevc_resi_trans_neon.c" + "${HEVC_ROOT}/common/arm/ihevc_intra_ref_substitution_a9q.c" "${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" @@ -128,7 +134,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") "${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_bi.s" "${HEVC_ROOT}/common/arm64/ihevc_weighted_pred_uni.s") - include_directories(${HEVC_ROOT}/common/arm64) + include_directories(${HEVC_ROOT}/common/arm64 ${HEVC_ROOT}/common/arm) elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32") list( APPEND @@ -204,7 +210,7 @@ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32") "${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) + include_directories(${HEVC_ROOT}/common/arm) else() list( APPEND @@ -229,5 +235,5 @@ else() "${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) + include_directories(${HEVC_ROOT}/common/x86) endif() diff --git a/decoder/ihevcd_iquant_itrans_recon_ctb.c b/decoder/ihevcd_iquant_itrans_recon_ctb.c index 504271c..6af3001 100644 --- a/decoder/ihevcd_iquant_itrans_recon_ctb.c +++ b/decoder/ihevcd_iquant_itrans_recon_ctb.c @@ -945,8 +945,11 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc) { /* While (MAX_TU_SIZE * 2 * 2) + 1 is the actaul size needed, au1_ref_sub_out size is kept as multiple of 8, - so that SIMD functions can load 64 bits */ - UWORD8 au1_ref_sub_out[(MAX_TU_SIZE * 2 * 2) + 8] = {0}; + so that SIMD functions can load 64 bits. Also some SIMD + modules read few bytes before the start of the array, so + allocate 16 extra bytes at the start */ + UWORD8 au1_ref_sub_out[16 + (MAX_TU_SIZE * 2 * 2) + 8] = {0}; + UWORD8 *pu1_ref_sub_out = &au1_ref_sub_out[16]; UWORD8 *pu1_top_left, *pu1_top, *pu1_left; WORD32 luma_pred_func_idx, chroma_pred_func_idx; @@ -980,23 +983,23 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc) if(luma_nbr_flags == 0x1ffff) ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_subst_all_avlble_fptr( pu1_top_left, - pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1); + pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, pu1_ref_sub_out, 1); else ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_substitution_fptr( pu1_top_left, - pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1); + pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, pu1_ref_sub_out, 1); /* call reference filtering */ ps_codec->s_func_selector.ihevc_intra_pred_ref_filtering_fptr( - au1_ref_sub_out, trans_size, - au1_ref_sub_out, + pu1_ref_sub_out, trans_size, + pu1_ref_sub_out, u1_luma_pred_mode, ps_sps->i1_strong_intra_smoothing_enable_flag); /* use the look up to get the function idx */ luma_pred_func_idx = g_i4_ip_funcs[u1_luma_pred_mode]; /* call the intra prediction function */ - ps_codec->apf_intra_pred_luma[luma_pred_func_idx](au1_ref_sub_out, 1, pu1_pred, pred_strd, trans_size, u1_luma_pred_mode); + ps_codec->apf_intra_pred_luma[luma_pred_func_idx](pu1_ref_sub_out, 1, pu1_pred, pred_strd, trans_size, u1_luma_pred_mode); } else { @@ -1048,14 +1051,14 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc) /* call the chroma reference array substitution */ ps_codec->s_func_selector.ihevc_intra_pred_chroma_ref_substitution_fptr( pu1_top_left, - pu1_top, pu1_left, pic_strd, trans_size, chroma_nbr_flags, au1_ref_sub_out, 1); + pu1_top, pu1_left, pic_strd, trans_size, chroma_nbr_flags, pu1_ref_sub_out, 1); /* use the look up to get the function idx */ chroma_pred_func_idx = g_i4_ip_funcs[u1_chroma_pred_mode]; /* call the intra prediction function */ - ps_codec->apf_intra_pred_chroma[chroma_pred_func_idx](au1_ref_sub_out, 1, pu1_pred_orig, pred_strd, trans_size, u1_chroma_pred_mode); + ps_codec->apf_intra_pred_chroma[chroma_pred_func_idx](pu1_ref_sub_out, 1, pu1_pred_orig, pred_strd, trans_size, u1_chroma_pred_mode); } } diff --git a/decoder/libhevcdec.cmake b/decoder/libhevcdec.cmake index 87ea024..35812d4 100755 --- a/decoder/libhevcdec.cmake +++ b/decoder/libhevcdec.cmake @@ -40,6 +40,8 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") "${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/arm/ihevcd_function_selector.c" + "${HEVC_ROOT}/decoder/arm/ihevcd_function_selector_noneon.c" "${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") diff --git a/encoder/ihevce_frame_process.c b/encoder/ihevce_frame_process.c index 9cbcddf..ea4952c 100644 --- a/encoder/ihevce_frame_process.c +++ b/encoder/ihevce_frame_process.c @@ -5175,6 +5175,7 @@ void ihevce_pre_enc_init( case IHEVCE_QUALITY_P4: case IHEVCE_QUALITY_P5: case IHEVCE_QUALITY_P6: + case IHEVCE_QUALITY_P7: max_merge_candidates = 2; break; diff --git a/encoder/ihevce_rc_interface.c b/encoder/ihevce_rc_interface.c index ada9190..d17dffc 100644 --- a/encoder/ihevce_rc_interface.c +++ b/encoder/ihevce_rc_interface.c @@ -4015,7 +4015,8 @@ static WORD32 ihevce_get_offline_index(rc_context_t *ps_rc_ctxt, WORD32 i4_num_p } else if( (i4_rc_quality_preset == IHEVCE_QUALITY_P5) || - (i4_rc_quality_preset == IHEVCE_QUALITY_P6)) /*Extreme speed */ + (i4_rc_quality_preset == IHEVCE_QUALITY_P6) || + (i4_rc_quality_preset == IHEVCE_QUALITY_P7)) /*Extreme speed */ { return base + 4; } diff --git a/encoder/libhevcenc.cmake b/encoder/libhevcenc.cmake index 1fcb2b5..2a0cc59 100644 --- a/encoder/libhevcenc.cmake +++ b/encoder/libhevcenc.cmake @@ -130,7 +130,7 @@ if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" "${HEVC_ROOT}/encoder/arm/ihevce_subpel_neon.c" "${HEVC_ROOT}/encoder/arm/ihevce_subpel_neon.c") - include_directories(${HEVC_ROOT}/encoder/arm) + include_directories(${HEVC_ROOT}/encoder/arm ${HEVC_ROOT}/encoder) endif() add_library(libhevcenc STATIC ${LIBHEVC_COMMON_SRCS} ${LIBHEVC_COMMON_ASMS} diff --git a/fuzzer/Android.bp b/fuzzer/Android.bp index 4cc9113..17bcca0 100644 --- a/fuzzer/Android.bp +++ b/fuzzer/Android.bp @@ -27,6 +27,15 @@ cc_fuzz { "android-media-fuzzing-reports@google.com", ], componentid: 155276, + hotlists: [ + "4593311", + "2281331", + ], + description: "The fuzzer targets the APIs of libhevcdec", + vector: "remote", + service_privilege: "constrained", + users: "multi_user", + fuzzed_code_usage: "shipped", }, } @@ -49,5 +58,14 @@ cc_fuzz { "android-media-fuzzing-reports@google.com", ], componentid: 155276, + hotlists: [ + "4593311", + "2281331", + ], + description: "The fuzzer targets the APIs of libhevcenc", + vector: "local_no_privileges_required", + service_privilege: "constrained", + users: "multi_user", + fuzzed_code_usage: "shipped", }, } diff --git a/fuzzer/hevc_enc_fuzzer.cpp b/fuzzer/hevc_enc_fuzzer.cpp index c92d67e..3dc2f4d 100644 --- a/fuzzer/hevc_enc_fuzzer.cpp +++ b/fuzzer/hevc_enc_fuzzer.cpp @@ -27,13 +27,14 @@ #include "ihevce_plugin.h" #include "ihevce_profile.h" +#define NELEMENTS(x) (sizeof(x) / sizeof(x[0])) constexpr size_t kRcType[] = {2, 3, 5}; constexpr IHEVCE_QUALITY_CONFIG_T kQuality[] = { IHEVCE_QUALITY_P0, IHEVCE_QUALITY_P2, IHEVCE_QUALITY_P3, IHEVCE_QUALITY_P4, IHEVCE_QUALITY_P5, IHEVCE_QUALITY_P6, IHEVCE_QUALITY_P7}; -constexpr size_t kRcTypeNum = std::size(kRcType); -constexpr size_t kQualityNum = std::size(kQuality); +constexpr size_t kRcTypeNum = NELEMENTS(kRcType); +constexpr size_t kQualityNum = NELEMENTS(kQuality); constexpr size_t kMaxQP = 51; constexpr size_t kMaxGopPeriod = 16; constexpr size_t kMaxWidth = 10240; diff --git a/fuzzer/ossfuzz.sh b/fuzzer/ossfuzz.sh index 2b0f0f9..ee1f1c7 100755 --- a/fuzzer/ossfuzz.sh +++ b/fuzzer/ossfuzz.sh @@ -18,6 +18,12 @@ test "${SRC}" != "" || exit 1 test "${WORK}" != "" || exit 1 test "${OUT}" != "" || exit 1 +#Opt out of null and shift sanitizers in undefined sanitizer +if [[ $SANITIZER = *undefined* ]]; then + CFLAGS="$CFLAGS -fno-sanitize=null,shift" + CXXFLAGS="$CXXFLAGS -fno-sanitize=null,shift" +fi + # Build libhevc build_dir=$WORK/build rm -rf ${build_dir} @@ -25,8 +31,9 @@ mkdir -p ${build_dir} pushd ${build_dir} cmake ${SRC}/libhevc -make -j$(nproc) hevc_dec_fuzzer -cp ${build_dir}/hevc_dec_fuzzer $OUT/hevc_dec_fuzzer +make -j$(nproc) hevc_dec_fuzzer hevc_enc_fuzzer +cp ${build_dir}/hevc_dec_fuzzer $OUT/ +cp ${build_dir}/hevc_enc_fuzzer $OUT/ popd cp $SRC/hevc_dec_fuzzer_seed_corpus.zip $OUT/hevc_dec_fuzzer_seed_corpus.zip diff --git a/test/decoder/main.c b/test/decoder/main.c index 421f81f..8028de3 100644 --- a/test/decoder/main.c +++ b/test/decoder/main.c @@ -1195,24 +1195,24 @@ void parse_argument(vid_dec_ctx_t *ps_app_ctx, CHAR *argument, CHAR *value) case VERSION: break; case INPUT_FILE: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_ip_fname); + sscanf(value, "%s", ps_app_ctx->ac_ip_fname); //input_passed = 1; break; case OUTPUT: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_op_fname); + sscanf(value, "%s", ps_app_ctx->ac_op_fname); break; case QP_MAP_FILE: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_qp_map_fname); + sscanf(value, "%s", ps_app_ctx->ac_qp_map_fname); break; case BLK_TYPE_MAP_FILE: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_blk_type_map_fname); + sscanf(value, "%s", ps_app_ctx->ac_blk_type_map_fname); break; case CHKSUM: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_op_chksum_fname); + sscanf(value, "%s", ps_app_ctx->ac_op_chksum_fname); break; case SAVE_OUTPUT: @@ -1332,7 +1332,7 @@ void parse_argument(vid_dec_ctx_t *ps_app_ctx, CHAR *argument, CHAR *value) break; case PICLEN_FILE: - snprintf(value, STRLENGTH, "%s", ps_app_ctx->ac_piclen_fname); + sscanf(value, "%s", ps_app_ctx->ac_piclen_fname); break; case INVALID: |