aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2023-04-25 16:58:19 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-25 16:58:19 +0000
commitf0da762222537f0b268614a241af0d72a377cd7f (patch)
treecb57f1324e06ae5b9ab39def1b9739218105bffb
parent27691ed00242920ecdebbbfdaeb2d3e0d12ef103 (diff)
parentc849052c7f43136e057ca7e45af1c7c30a71fe87 (diff)
downloadlibhevc-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.yml27
-rw-r--r--.github/workflows/cmake.yml23
-rw-r--r--METADATA6
-rw-r--r--cmake/utils.cmake5
-rw-r--r--common/common.cmake14
-rw-r--r--decoder/ihevcd_iquant_itrans_recon_ctb.c21
-rwxr-xr-xdecoder/libhevcdec.cmake2
-rw-r--r--encoder/ihevce_frame_process.c1
-rw-r--r--encoder/ihevce_rc_interface.c3
-rw-r--r--encoder/libhevcenc.cmake2
-rw-r--r--fuzzer/Android.bp18
-rw-r--r--fuzzer/hevc_enc_fuzzer.cpp5
-rwxr-xr-xfuzzer/ossfuzz.sh11
-rw-r--r--test/decoder/main.c12
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}}
diff --git a/METADATA b/METADATA
index ab5f378..c196d34 100644
--- a/METADATA
+++ b/METADATA
@@ -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: