From 05685e9a69cd4bbea6d1762a9c5e99a0d3d3194e Mon Sep 17 00:00:00 2001 From: Angie Chiang Date: Mon, 8 May 2017 12:55:39 -0700 Subject: [PATCH] Make convolve_round work with warped_motion Warped_motion doesn't go through inter_predictor() function to generate prediction where convolve_round is activated. Therefore, we could avoid doing post rounding when the warped_motion mode is on. We use do_post_rounding to indicate whether post rounding is needed Change-Id: Ib17a0c0d4e6e5232e9682afa8cfdb9576f5cf4c0 --- av1/common/convolve.h | 3 +++ av1/common/reconinter.c | 24 +++++++++++++----------- av1/common/reconinter.h | 2 ++ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/av1/common/convolve.h b/av1/common/convolve.h index 15a308798..48b476ed5 100644 --- a/av1/common/convolve.h +++ b/av1/common/convolve.h @@ -33,6 +33,7 @@ typedef struct ConvolveParams { int round_0; int round_1; int plane; + int do_post_rounding; } ConvolveParams; static INLINE ConvolveParams get_conv_params(int ref, int plane) { @@ -40,6 +41,7 @@ static INLINE ConvolveParams get_conv_params(int ref, int plane) { conv_params.ref = ref; conv_params.round = CONVOLVE_OPT_ROUND; conv_params.plane = plane; + conv_params.do_post_rounding = 0; return conv_params; } struct AV1Common; @@ -73,6 +75,7 @@ static INLINE ConvolveParams get_conv_params_no_round(int ref, int plane, conv_params.dst = dst; conv_params.dst_stride = dst_stride; conv_params.plane = plane; + conv_params.do_post_rounding = 0; return conv_params; } diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index 8bb4a9b4f..8975b1710 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c @@ -1151,19 +1151,21 @@ void build_inter_predictors(MACROBLOCKD *xd, int plane, } #if CONFIG_CONVOLVE_ROUND -// TODO(angiebird): This part needs optimization + // TODO(angiebird): This part needs optimization + if (conv_params.do_post_rounding) { #if CONFIG_HIGHBITDEPTH - if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) - av1_highbd_convolve_rounding(tmp_dst, MAX_SB_SIZE, dst, dst_buf->stride, - w, h, FILTER_BITS * 2 + is_compound - - conv_params.round_0 - - conv_params.round_1, - xd->bd); - else + if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) + av1_highbd_convolve_rounding(tmp_dst, MAX_SB_SIZE, dst, dst_buf->stride, + w, h, FILTER_BITS * 2 + is_compound - + conv_params.round_0 - + conv_params.round_1, + xd->bd); + else #endif // CONFIG_HIGHBITDEPTH - av1_convolve_rounding(tmp_dst, MAX_SB_SIZE, dst, dst_buf->stride, w, h, - FILTER_BITS * 2 + is_compound - - conv_params.round_0 - conv_params.round_1); + av1_convolve_rounding(tmp_dst, MAX_SB_SIZE, dst, dst_buf->stride, w, h, + FILTER_BITS * 2 + is_compound - + conv_params.round_0 - conv_params.round_1); + } #endif // CONFIG_CONVOLVE_ROUND } } diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h index 1a6c7b8ce..8dcea8877 100644 --- a/av1/common/reconinter.h +++ b/av1/common/reconinter.h @@ -72,6 +72,7 @@ static INLINE void inter_predictor(const uint8_t *src, int src_stride, &interp_filter, #endif // CONFIG_DUAL_FILTER subpel_x, xs, subpel_y, ys, conv_params); + conv_params->do_post_rounding = 1; #else assert(0); #endif // CONFIG_CONVOLVE_ROUND @@ -136,6 +137,7 @@ static INLINE void highbd_inter_predictor(const uint8_t *src, int src_stride, &interp_filter, #endif // CONFIG_DUAL_FILTER subpel_x, xs, subpel_y, ys, conv_params, bd); + conv_params->do_post_rounding = 1; #else assert(0); #endif // CONFIG_CONVOLVE_ROUND -- GitLab