Reorganize code to test various convolve options Reorganize code to faciliate setting rounding parameters based on bit-depth, and to faciliate testing. After this patch this wil be the behavior for config flags as far as round_0 and round_1 choices are concerned for 8- and 10-bit: 0. CONFIG_LOWPRECISION_BLEND=0 CONFIG_HIGHPRECISION_INTBUF=0: round_0 = 5, round_1 = None (baseline) 1. CONFIG_LOWPRECISION_BLEND=0 CONFIG_HIGHPRECISION_INTBUF=1: round_0 = 3, round_1 = None (to test impact of increase in precision of intermediate buffer) 2. CONFIG_LOWPRECISION_BLEND=1 CONFIG_HIGHPRECISION_INTBUF=0: round_0 = 5, round_1 = 4 3. CONFIG_LOWPRECISION_BLEND=2 CONFIG_HIGHPRECISION_INTBUF=0: round_0 = 5, round_1 = 5 4. CONFIG_LOWPRECISION_BLEND=1 CONFIG_HIGHPRECISION_INTBUF=1: round_0 = 3, round_1 = 6 (ARM proposal except clipping) 5. CONFIG_LOWPRECISION_BLEND=2 CONFIG_HIGHPRECISION_INTBUF=1: round_0 = 3, round_1 = 7 (Google variation proposal) Change-Id: I615348332f5692135352085ca923662f9d52f696
diff --git a/av1/common/convolve.h b/av1/common/convolve.h index 1a19933..f9ee3e3 100644 --- a/av1/common/convolve.h +++ b/av1/common/convolve.h
@@ -43,6 +43,16 @@ #endif } ConvolveParams; +#define ROUND0_BITS (5 - 2 * (CONFIG_HIGHPRECISION_INTBUF)) + +#if CONFIG_LOWPRECISION_BLEND == 1 +#define COMPOUND_ROUND1_BITS (4 + 2 * (CONFIG_HIGHPRECISION_INTBUF)) +#elif CONFIG_LOWPRECISION_BLEND == 2 +#define COMPOUND_ROUND1_BITS (5 + 2 * (CONFIG_HIGHPRECISION_INTBUF)) +#else +#define COMPOUND_ROUND1_BITS 0 +#endif // CONFIG_LOWPRECISION_BLEND + typedef void (*aom_convolve_fn_t)(const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int w, int h, InterpFilterParams *filter_params_x, @@ -50,19 +60,24 @@ const int subpel_x_q4, const int subpel_y_q4, ConvolveParams *conv_params); -static INLINE ConvolveParams get_conv_params(int ref, int do_average, - int plane) { +static INLINE ConvolveParams get_conv_params(int ref, int do_average, int plane, + int bd) { ConvolveParams conv_params; conv_params.ref = ref; conv_params.do_average = do_average; conv_params.round = CONVOLVE_OPT_ROUND; conv_params.plane = plane; conv_params.do_post_rounding = 0; - conv_params.round_0 = 5; + conv_params.round_0 = ROUND0_BITS; conv_params.round_1 = 0; conv_params.is_compound = 0; conv_params.dst = NULL; conv_params.dst_stride = 0; + const int intbufrange = bd + FILTER_BITS - conv_params.round_0 + 2; + if (bd < 12) assert(intbufrange <= 16); + if (intbufrange > 16) { + conv_params.round_0 += intbufrange - 16; + } return conv_params; } @@ -102,14 +117,25 @@ static INLINE ConvolveParams get_conv_params_no_round(int ref, int do_average, int plane, int32_t *dst, int dst_stride, - int is_compound) { + int is_compound, int bd) { ConvolveParams conv_params; conv_params.ref = ref; conv_params.do_average = do_average; conv_params.round = CONVOLVE_OPT_NO_ROUND; - conv_params.round_0 = 5; - conv_params.round_1 = 0; conv_params.is_compound = is_compound; + conv_params.round_0 = ROUND0_BITS; +#if CONFIG_LOWPRECISION_BLEND + conv_params.round_1 = is_compound ? COMPOUND_ROUND1_BITS : 0; +#else + conv_params.round_1 = 0; +#endif + const int intbufrange = bd + FILTER_BITS - conv_params.round_0 + 2; + if (bd < 12) assert(intbufrange <= 16); + if (intbufrange > 16) { + conv_params.round_0 += intbufrange - 16; + if (is_compound && conv_params.round_1 > 0) + conv_params.round_1 -= intbufrange - 16; + } // TODO(yunqing): The following dst should only be valid while // is_compound = 1; conv_params.dst = dst;
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index bd3493f..98597ea 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c
@@ -26,10 +26,6 @@ #include "av1/common/onyxc_int.h" #include "av1/common/obmc.h" -#if CONFIG_LOWPRECISION_BLEND -#define LOWPRECISION_BLEND_BITS 4 // reduction in precision bits -#endif // CONFIG_LOWPRECISION_BLEND - // This function will determine whether or not to create a warped // prediction. static INLINE int allow_warp(const MODE_INFO *const mi, @@ -829,7 +825,7 @@ mv.row += SCALE_EXTRA_OFF; const int subpel_x = mv.col & SCALE_SUBPEL_MASK; const int subpel_y = mv.row & SCALE_SUBPEL_MASK; - ConvolveParams conv_params = get_conv_params(ref, ref, plane); + ConvolveParams conv_params = get_conv_params(ref, ref, plane, xd->bd); src += (mv.row >> SCALE_SUBPEL_BITS) * src_stride + (mv.col >> SCALE_SUBPEL_BITS); @@ -994,13 +990,7 @@ int tmp_dst_stride = 8; assert(w <= 8 && h <= 8); ConvolveParams conv_params = get_conv_params_no_round( - 0, 0, plane, tmp_dst, tmp_dst_stride, is_compound); -#if CONFIG_LOWPRECISION_BLEND == 1 // for masked compound modes only - if (is_masked_compound_type(mi->mbmi.interinter_compound_type)) - conv_params.round_1 = LOWPRECISION_BLEND_BITS; -#elif CONFIG_LOWPRECISION_BLEND == 2 // for all compound modes - if (is_compound) conv_params.round_1 = LOWPRECISION_BLEND_BITS; -#endif // CONFIG_LOWPRECISION_BLEND + 0, 0, plane, tmp_dst, tmp_dst_stride, is_compound, xd->bd); #if CONFIG_JNT_COMP conv_params.use_jnt_comp_avg = 0; #endif // CONFIG_JNT_COMP @@ -1200,13 +1190,7 @@ } ConvolveParams conv_params = get_conv_params_no_round( - ref, ref, plane, tmp_dst, MAX_SB_SIZE, is_compound); -#if CONFIG_LOWPRECISION_BLEND == 1 // for masked compound modes only - if (is_masked_compound_type(mi->mbmi.interinter_compound_type)) - conv_params.round_1 = LOWPRECISION_BLEND_BITS; -#elif CONFIG_LOWPRECISION_BLEND == 2 // for all compound modes - if (is_compound) conv_params.round_1 = LOWPRECISION_BLEND_BITS; -#endif // CONFIG_LOWPRECISION_BLEND + ref, ref, plane, tmp_dst, MAX_SB_SIZE, is_compound, xd->bd); #if CONFIG_JNT_COMP av1_jnt_comp_weight_assign(cm, &mi->mbmi, 0, &conv_params.fwd_offset, &conv_params.bck_offset, @@ -2034,7 +2018,7 @@ uint8_t *pre; int xs, ys, subpel_x, subpel_y; const int is_scaled = av1_is_scaled(sf); - ConvolveParams conv_params = get_conv_params(ref, 0, plane); + ConvolveParams conv_params = get_conv_params(ref, 0, plane, xd->bd); WarpTypesAllowed warp_types; const WarpedMotionParams *const wm = &xd->global_motion[mi->mbmi.ref_frame[ref]];
diff --git a/av1/common/warped_motion.c b/av1/common/warped_motion.c index 3b3eb8c..5daa2cf 100644 --- a/av1/common/warped_motion.c +++ b/av1/common/warped_motion.c
@@ -598,7 +598,7 @@ const int error_bsize_h = AOMMIN(p_height, WARP_ERROR_BLOCK); uint16_t tmp[WARP_ERROR_BLOCK * WARP_ERROR_BLOCK]; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, bd); #if CONFIG_JNT_COMP conv_params.use_jnt_comp_avg = 0; #endif @@ -896,7 +896,7 @@ int error_bsize_w = AOMMIN(p_width, WARP_ERROR_BLOCK); int error_bsize_h = AOMMIN(p_height, WARP_ERROR_BLOCK); uint8_t tmp[WARP_ERROR_BLOCK * WARP_ERROR_BLOCK]; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, 8); #if CONFIG_JNT_COMP conv_params.use_jnt_comp_avg = 0; #endif
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 3250ebe..c7b3d04 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -5973,7 +5973,7 @@ // odd iterations search in the second. The predictor // found for the 'other' reference frame is factored in. const int plane = 0; - ConvolveParams conv_params = get_conv_params(!id, 0, plane); + ConvolveParams conv_params = get_conv_params(!id, 0, plane, xd->bd); #if CONFIG_JNT_COMP conv_params.use_jnt_comp_avg = 0; #endif @@ -6631,7 +6631,7 @@ struct buf_2d ref_yv12; const int plane = 0; - ConvolveParams conv_params = get_conv_params(!ref_idx, 0, plane); + ConvolveParams conv_params = get_conv_params(!ref_idx, 0, plane, xd->bd); WarpTypesAllowed warp_types; warp_types.global_warp_allowed = is_global; warp_types.local_warp_allowed = mbmi->motion_mode == WARPED_CAUSAL;
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c index 987f34c..a7377d5 100644 --- a/av1/encoder/temporal_filter.c +++ b/av1/encoder/temporal_filter.c
@@ -41,7 +41,7 @@ enum mv_precision mv_precision_uv; int uv_stride; // TODO(angiebird): change plane setting accordingly - ConvolveParams conv_params = get_conv_params(which_mv, which_mv, 0); + ConvolveParams conv_params = get_conv_params(which_mv, which_mv, 0, xd->bd); const InterpFilters interp_filters = xd->mi[0]->mbmi.interp_filters; WarpTypesAllowed warp_types; memset(&warp_types, 0, sizeof(WarpTypesAllowed));
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake index a48d42f..13a02a3 100644 --- a/build/cmake/aom_config_defaults.cmake +++ b/build/cmake/aom_config_defaults.cmake
@@ -120,6 +120,7 @@ set(CONFIG_FRAME_SIZE 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_FWD_KF 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_HASH_ME 0 CACHE NUMBER "AV1 experiment flag.") +set(CONFIG_HIGHPRECISION_INTBUF 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_HORZONLY_FRAME_SUPERRES 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_INTER_STATS_ONLY 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_INTRABC 1 CACHE NUMBER "AV1 experiment flag.")
diff --git a/test/av1_convolve_2d_test_util.cc b/test/av1_convolve_2d_test_util.cc index cce9922..e18fc6f 100644 --- a/test/av1_convolve_2d_test_util.cc +++ b/test/av1_convolve_2d_test_util.cc
@@ -63,9 +63,9 @@ av1_get_interp_filter_params((InterpFilter)vfilter); for (int do_average = 0; do_average <= 1; ++do_average) { ConvolveParams conv_params1 = get_conv_params_no_round( - 0, do_average, 0, output, MAX_SB_SIZE, 1); + 0, do_average, 0, output, MAX_SB_SIZE, 1, 8); ConvolveParams conv_params2 = get_conv_params_no_round( - 0, do_average, 0, output2, MAX_SB_SIZE, 1); + 0, do_average, 0, output2, MAX_SB_SIZE, 1, 8); const int subx_range = has_subx ? 16 : 1; const int suby_range = has_suby ? 16 : 1; @@ -121,7 +121,7 @@ av1_get_interp_filter_params((InterpFilter)vfilter); const int do_average = 0; ConvolveParams conv_params2 = - get_conv_params_no_round(0, do_average, 0, output, MAX_SB_SIZE, 1); + get_conv_params_no_round(0, do_average, 0, output, MAX_SB_SIZE, 1, 8); for (int block_idx = BLOCK_4X4; block_idx < BLOCK_SIZES_ALL; ++block_idx) { const int out_w = block_size_wide[block_idx]; @@ -184,9 +184,9 @@ av1_get_interp_filter_params((InterpFilter)vfilter); for (int do_average = 0; do_average <= 1; ++do_average) { ConvolveParams conv_params1 = - get_conv_params_no_round(0, do_average, 0, NULL, 0, 1); + get_conv_params_no_round(0, do_average, 0, NULL, 0, 1, 8); ConvolveParams conv_params2 = - get_conv_params_no_round(0, do_average, 0, NULL, 0, 1); + get_conv_params_no_round(0, do_average, 0, NULL, 0, 1, 8); const int subx_range = has_subx ? 16 : 1; const int suby_range = has_suby ? 16 : 1; @@ -246,7 +246,7 @@ av1_get_interp_filter_params((InterpFilter)vfilter); const int do_average = 0; ConvolveParams conv_params2 = - get_conv_params_no_round(0, do_average, 0, NULL, 0, 1); + get_conv_params_no_round(0, do_average, 0, NULL, 0, 1, 8); for (int block_idx = BLOCK_4X4; block_idx < BLOCK_SIZES_ALL; ++block_idx) { // Make sure that sizes 2xN and Nx2 are also tested for chroma. @@ -310,9 +310,9 @@ av1_get_interp_filter_params((InterpFilter)vfilter); for (int do_average = 0; do_average <= 1; ++do_average) { ConvolveParams conv_params1 = get_conv_params_no_round( - 0, do_average, 0, output, MAX_SB_SIZE, 1); + 0, do_average, 0, output, MAX_SB_SIZE, 1, 8); ConvolveParams conv_params2 = get_conv_params_no_round( - 0, do_average, 0, output2, MAX_SB_SIZE, 1); + 0, do_average, 0, output2, MAX_SB_SIZE, 1, 8); // Test special case where jnt_comp_avg is not used conv_params1.use_jnt_comp_avg = 0; @@ -436,9 +436,9 @@ av1_get_interp_filter_params((InterpFilter)vfilter); for (int do_average = 0; do_average <= 1; ++do_average) { ConvolveParams conv_params1 = get_conv_params_no_round( - 0, do_average, 0, output, MAX_SB_SIZE, 1); + 0, do_average, 0, output, MAX_SB_SIZE, 1, bd); ConvolveParams conv_params2 = get_conv_params_no_round( - 0, do_average, 0, output2, MAX_SB_SIZE, 1); + 0, do_average, 0, output2, MAX_SB_SIZE, 1, bd); for (subx = 0; subx < 16; ++subx) { for (suby = 0; suby < 16; ++suby) { @@ -506,9 +506,9 @@ av1_get_interp_filter_params((InterpFilter)vfilter); for (int do_average = 0; do_average <= 1; ++do_average) { ConvolveParams conv_params1 = get_conv_params_no_round( - 0, do_average, 0, output, MAX_SB_SIZE, 1); + 0, do_average, 0, output, MAX_SB_SIZE, 1, bd); ConvolveParams conv_params2 = get_conv_params_no_round( - 0, do_average, 0, output2, MAX_SB_SIZE, 1); + 0, do_average, 0, output2, MAX_SB_SIZE, 1, bd); // Test special case where jnt_comp_avg is not used conv_params1.use_jnt_comp_avg = 0;
diff --git a/test/av1_convolve_optimz_test.cc b/test/av1_convolve_optimz_test.cc index 188fa2d..288daeb 100644 --- a/test/av1_convolve_optimz_test.cc +++ b/test/av1_convolve_optimz_test.cc
@@ -66,7 +66,7 @@ subpel_ = GET_PARAM(4); int ref = GET_PARAM(5); const int plane = 0; - conv_params_ = get_conv_params(ref, ref, plane); + conv_params_ = get_conv_params(ref, ref, plane, 8); alloc_ = new uint8_t[maxBlockSize * 4]; src_ = alloc_ + (vertiOffset * maxWidth);
diff --git a/test/av1_convolve_scale_test.cc b/test/av1_convolve_scale_test.cc index f776f36..99382e0 100644 --- a/test/av1_convolve_scale_test.cc +++ b/test/av1_convolve_scale_test.cc
@@ -256,7 +256,7 @@ filter_x_.set(ntaps_x_, false); filter_y_.set(ntaps_y_, true); convolve_params_ = - get_conv_params_no_round(0, avg_ != false, 0, NULL, 0, 1); + get_conv_params_no_round(0, avg_ != false, 0, NULL, 0, 1, bd); delete image_; image_ = new TestImage<SrcPixel>(width_, height_, bd_);
diff --git a/test/av1_convolve_test.cc b/test/av1_convolve_test.cc index 9ccd7ea..cb58289 100644 --- a/test/av1_convolve_test.cc +++ b/test/av1_convolve_test.cc
@@ -149,7 +149,7 @@ TEST_P(Av1ConvolveTest, av1_convolve_vert) { const int y_step_q4 = 16; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, 8); int in_stride, out_stride, ref_out_stride, avg_out_stride, ref_avg_out_stride; uint8_t *in = add_input(MAX_SB_SIZE, MAX_SB_SIZE, &in_stride); @@ -202,7 +202,7 @@ TEST_P(Av1ConvolveTest, av1_convolve_horiz) { const int x_step_q4 = 16; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, 8); int in_stride, out_stride, ref_out_stride, avg_out_stride, ref_avg_out_stride; uint8_t *in = add_input(MAX_SB_SIZE, MAX_SB_SIZE, &in_stride);
diff --git a/test/warp_filter_test_util.cc b/test/warp_filter_test_util.cc index 9b51a24..c418855 100644 --- a/test/warp_filter_test_util.cc +++ b/test/warp_filter_test_util.cc
@@ -101,6 +101,7 @@ const int out_w = GET_PARAM(0), out_h = GET_PARAM(1); const int num_iters = GET_PARAM(2); int i, j, sub_x, sub_y; + const int bd = 8; uint8_t *input_ = new uint8_t[h * stride]; uint8_t *input = input_ + border; @@ -112,7 +113,7 @@ uint8_t *output2 = new uint8_t[output_n]; int32_t mat[8]; int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, bd); int32_t *dsta = new int32_t[output_n]; int32_t *dstb = new int32_t[output_n]; @@ -140,9 +141,10 @@ dsta[j] = v; dstb[j] = v; } - conv_params = get_conv_params_no_round(0, 0, 0, dsta, out_w, 1); + conv_params = + get_conv_params_no_round(0, 0, 0, dsta, out_w, 1, bd); } else { - conv_params = get_conv_params(0, 0, 0); + conv_params = get_conv_params(0, 0, 0, bd); } #if CONFIG_JNT_COMP if (jj >= 4) { @@ -158,7 +160,8 @@ out_h, out_w, sub_x, sub_y, &conv_params, alpha, beta, gamma, delta); if (use_no_round) { - conv_params = get_conv_params_no_round(0, 0, 0, dstb, out_w, 1); + conv_params = + get_conv_params_no_round(0, 0, 0, dstb, out_w, 1, bd); } #if CONFIG_JNT_COMP if (jj >= 4) { @@ -241,7 +244,7 @@ uint16_t *output2 = new uint16_t[output_n]; int32_t mat[8]; int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, 0); + ConvolveParams conv_params = get_conv_params(0, 0, 0, bd); int32_t *dsta = new int32_t[output_n]; int32_t *dstb = new int32_t[output_n]; @@ -270,9 +273,10 @@ dsta[j] = v; dstb[j] = v; } - conv_params = get_conv_params_no_round(0, 0, 0, dsta, out_w, 1); + conv_params = + get_conv_params_no_round(0, 0, 0, dsta, out_w, 1, bd); } else { - conv_params = get_conv_params(0, 0, 0); + conv_params = get_conv_params(0, 0, 0, bd); } #if CONFIG_JNT_COMP if (jj >= 4) { @@ -289,7 +293,8 @@ if (use_no_round) { // TODO(angiebird): Change this to test_impl once we have SIMD // implementation - conv_params = get_conv_params_no_round(0, 0, 0, dstb, out_w, 1); + conv_params = + get_conv_params_no_round(0, 0, 0, dstb, out_w, 1, bd); } #if CONFIG_JNT_COMP if (jj >= 4) {