Use highbd for obmc dsp functions
Low bd functions were used for obmc dsp functions for 8 bits input,
however this caused crash when forcing 16bits pipeline.
Add example test.
Bug: aomedia:2940
Change-Id: I41e3845b410ea258ed05ae66926d34212e86788e
diff --git a/av1/encoder/encoder_utils.h b/av1/encoder/encoder_utils.h
index 4e854ab..40652e9 100644
--- a/av1/encoder/encoder_utils.h
+++ b/av1/encoder/encoder_utils.h
@@ -479,17 +479,13 @@
#if !CONFIG_REALTIME_ONLY
-#define LOWBD_OBFP(BT, OSDF, OVF, OSVF) \
- cpi->fn_ptr[BT].osdf = OSDF; \
- cpi->fn_ptr[BT].ovf = OVF; \
- cpi->fn_ptr[BT].osvf = OSVF;
-
-#define LOWBD_OBFP_WRAPPER(WIDTH, HEIGHT) \
- LOWBD_OBFP(BLOCK_##WIDTH##X##HEIGHT, aom_obmc_sad##WIDTH##x##HEIGHT, \
- aom_obmc_variance##WIDTH##x##HEIGHT, \
- aom_obmc_sub_pixel_variance##WIDTH##x##HEIGHT)
-
#if CONFIG_AV1_HIGHBITDEPTH
+#define HIGHBD_OBFP_WRAPPER_8(WIDTH, HEIGHT) \
+ HIGHBD_OBFP(BLOCK_##WIDTH##X##HEIGHT, \
+ aom_highbd_obmc_sad##WIDTH##x##HEIGHT##_bits8, \
+ aom_highbd_obmc_variance##WIDTH##x##HEIGHT, \
+ aom_highbd_obmc_sub_pixel_variance##WIDTH##x##HEIGHT)
+
#define HIGHBD_OBFP(BT, OSDF, OVF, OSVF) \
cpi->fn_ptr[BT].osdf = OSDF; \
cpi->fn_ptr[BT].ovf = OVF; \
@@ -502,6 +498,11 @@
aom_highbd_##BD##_obmc_sub_pixel_variance##WIDTH##x##HEIGHT)
#define MAKE_OBFP_SAD_WRAPPER(fnname) \
+ static unsigned int fnname##_bits8(const uint8_t *ref, int ref_stride, \
+ const int32_t *wsrc, \
+ const int32_t *msk) { \
+ return fnname(ref, ref_stride, wsrc, msk); \
+ } \
static unsigned int fnname##_bits10(const uint8_t *ref, int ref_stride, \
const int32_t *wsrc, \
const int32_t *msk) { \
@@ -598,28 +599,28 @@
// OBMC excluded from realtime only build.
#if !CONFIG_REALTIME_ONLY
- LOWBD_OBFP_WRAPPER(128, 128)
- LOWBD_OBFP_WRAPPER(128, 64)
- LOWBD_OBFP_WRAPPER(64, 128)
- LOWBD_OBFP_WRAPPER(64, 64)
- LOWBD_OBFP_WRAPPER(64, 32)
- LOWBD_OBFP_WRAPPER(32, 64)
- LOWBD_OBFP_WRAPPER(32, 32)
- LOWBD_OBFP_WRAPPER(32, 16)
- LOWBD_OBFP_WRAPPER(16, 32)
- LOWBD_OBFP_WRAPPER(16, 16)
- LOWBD_OBFP_WRAPPER(8, 16)
- LOWBD_OBFP_WRAPPER(16, 8)
- LOWBD_OBFP_WRAPPER(8, 8)
- LOWBD_OBFP_WRAPPER(4, 8)
- LOWBD_OBFP_WRAPPER(8, 4)
- LOWBD_OBFP_WRAPPER(4, 4)
- LOWBD_OBFP_WRAPPER(64, 16)
- LOWBD_OBFP_WRAPPER(16, 64)
- LOWBD_OBFP_WRAPPER(32, 8)
- LOWBD_OBFP_WRAPPER(8, 32)
- LOWBD_OBFP_WRAPPER(16, 4)
- LOWBD_OBFP_WRAPPER(4, 16)
+ HIGHBD_OBFP_WRAPPER_8(128, 128)
+ HIGHBD_OBFP_WRAPPER_8(128, 64)
+ HIGHBD_OBFP_WRAPPER_8(64, 128)
+ HIGHBD_OBFP_WRAPPER_8(64, 64)
+ HIGHBD_OBFP_WRAPPER_8(64, 32)
+ HIGHBD_OBFP_WRAPPER_8(32, 64)
+ HIGHBD_OBFP_WRAPPER_8(32, 32)
+ HIGHBD_OBFP_WRAPPER_8(32, 16)
+ HIGHBD_OBFP_WRAPPER_8(16, 32)
+ HIGHBD_OBFP_WRAPPER_8(16, 16)
+ HIGHBD_OBFP_WRAPPER_8(8, 16)
+ HIGHBD_OBFP_WRAPPER_8(16, 8)
+ HIGHBD_OBFP_WRAPPER_8(8, 8)
+ HIGHBD_OBFP_WRAPPER_8(4, 8)
+ HIGHBD_OBFP_WRAPPER_8(8, 4)
+ HIGHBD_OBFP_WRAPPER_8(4, 4)
+ HIGHBD_OBFP_WRAPPER_8(64, 16)
+ HIGHBD_OBFP_WRAPPER_8(16, 64)
+ HIGHBD_OBFP_WRAPPER_8(32, 8)
+ HIGHBD_OBFP_WRAPPER_8(8, 32)
+ HIGHBD_OBFP_WRAPPER_8(16, 4)
+ HIGHBD_OBFP_WRAPPER_8(4, 16)
#endif
HIGHBD_SDSFP_WRAPPER(128, 128, 8);
diff --git a/test/aomenc.sh b/test/aomenc.sh
index 0c0d1b1..86fe5f6 100755
--- a/test/aomenc.sh
+++ b/test/aomenc.sh
@@ -98,6 +98,25 @@
fi
}
+aomenc_av1_ivf_use_16bit_internal() {
+ if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
+ local output="${AV1_IVF_FILE}"
+ if [ -e "${AV1_IVF_FILE}" ]; then
+ output="${AOM_TEST_OUTPUT_DIR}/av1_test_16bit.ivf"
+ fi
+ aomenc $(yuv_raw_input) \
+ $(aomenc_encode_test_fast_params) \
+ --ivf \
+ --use-16bit-internal \
+ --output="${output}" || return 1
+
+ if [ ! -e "${output}" ]; then
+ elog "Output file does not exist."
+ return 1
+ fi
+ fi
+}
+
aomenc_av1_obu_annexb() {
if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
local output="${AV1_OBU_ANNEXB_FILE}"
@@ -262,6 +281,7 @@
aomenc_av1_webm_1pass
aomenc_av1_ivf_lossless
aomenc_av1_ivf_minq0_maxq0
+ aomenc_av1_ivf_use_16bit_internal
aomenc_av1_webm_lag5_frames10
aomenc_av1_webm_non_square_par
aomenc_av1_webm_cdf_update_mode"