Refactor av1_build_inter_predictor
Make av1_build_inter_predictor() independent of coding state. The
new function will take motion vector and buffer address as input
and produce the inter prediction.
Change-Id: I0580bd0c22e09d76ceb59093b1cd0ef314d1b93d
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 1a0544b..4c57628 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -192,8 +192,11 @@
int zero_rate;
#if CONFIG_RD_DEBUG
int txb_coeff_cost[MAX_MB_PLANE];
- int txb_coeff_cost_map[MAX_MB_PLANE][TXB_COEFF_COST_MAP_SIZE]
- [TXB_COEFF_COST_MAP_SIZE];
+ // TODO(jingning): Temporary solution to silence stack over-size warning
+ // in handle_inter_mode. This should be fixed after rate-distortion
+ // optimization refactoring.
+ int16_t txb_coeff_cost_map[MAX_MB_PLANE][TXB_COEFF_COST_MAP_SIZE]
+ [TXB_COEFF_COST_MAP_SIZE];
#endif // CONFIG_RD_DEBUG
} RD_STATS;
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index 6080804..eaae19e 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -122,7 +122,7 @@
int r, c;
for (r = 0; r < TXB_COEFF_COST_MAP_SIZE; ++r)
for (c = 0; c < TXB_COEFF_COST_MAP_SIZE; ++c)
- rd_stats->txb_coeff_cost_map[plane][r][c] = INT_MAX;
+ rd_stats->txb_coeff_cost_map[plane][r][c] = INT16_MAX;
}
}
#endif
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 7ebef47..bafc308 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -6918,12 +6918,7 @@
const int refs[2] = { mbmi->ref_frame[0], mbmi->ref_frame[1] };
int_mv ref_mv[2];
int ite, ref;
- struct macroblockd_plane *const pd = &xd->plane[0];
- const int p_col = ((mi_col * MI_SIZE) >> pd->subsampling_x);
- const int p_row = ((mi_row * MI_SIZE) >> pd->subsampling_y);
- ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
- conv_params.use_dist_wtd_comp_avg = 0;
WarpTypesAllowed warp_types[2];
for (ref = 0; ref < 2; ++ref) {
const WarpedMotionParams *const wm =
@@ -6933,6 +6928,19 @@
warp_types[ref].local_warp_allowed = mbmi->motion_mode == WARPED_CAUSAL;
}
+ // Get the prediction block from the 'other' reference frame.
+ const int_interpfilters interp_filters =
+ av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
+
+ (void)warp_types;
+
+ InterPredParams inter_pred_params;
+
+ av1_init_inter_params(&inter_pred_params, pw, ph, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
+ &cm->sf_identity, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
+
// Do joint motion search in compound mode to get more accurate mv.
struct buf_2d backup_yv12[2][MAX_MB_PLANE];
int last_besterr[2] = { INT_MAX, INT_MAX };
@@ -6996,18 +7004,12 @@
ref_yv12[0] = xd->plane[plane].pre[0];
ref_yv12[1] = xd->plane[plane].pre[1];
- // Get the prediction block from the 'other' reference frame.
- const int_interpfilters interp_filters =
- av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
-
// Since we have scaled the reference frames to match the size of the
// current frame we must use a unit scaling factor during mode selection.
av1_build_inter_predictor(ref_yv12[!id].buf, ref_yv12[!id].stride,
second_pred, pw, &cur_mv[!id].as_mv,
- &cm->sf_identity, pw, ph, &conv_params,
- interp_filters, &warp_types[!id], p_col, p_row,
- plane, !id, MV_PRECISION_Q3, mi_col * MI_SIZE,
- mi_row * MI_SIZE, xd, cm->allow_warped_motion);
+ mi_col * MI_SIZE, mi_row * MI_SIZE,
+ &inter_pred_params);
const int order_idx = id != 0;
av1_dist_wtd_comp_weight_assign(
@@ -7550,17 +7552,23 @@
av1_setup_scale_factors_for_frame(&sf, ref_yv12.width, ref_yv12.height,
cm->width, cm->height);
- ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
WarpTypesAllowed warp_types;
warp_types.global_warp_allowed = is_global;
warp_types.local_warp_allowed = mbmi->motion_mode == WARPED_CAUSAL;
+ (void)warp_types;
+
+ InterPredParams inter_pred_params;
+
+ av1_init_inter_params(&inter_pred_params, pw, ph, p_col, p_row,
+ pd->subsampling_x, pd->subsampling_y, xd->bd,
+ is_cur_buf_hbd(xd), 0, &sf, mbmi->interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
+
// Get the prediction block from the 'other' reference frame.
av1_build_inter_predictor(ref_yv12.buf, ref_yv12.stride, second_pred, pw,
- other_mv, &sf, pw, ph, &conv_params,
- mbmi->interp_filters, &warp_types, p_col, p_row,
- plane, !ref_idx, MV_PRECISION_Q3, mi_col * MI_SIZE,
- mi_row * MI_SIZE, xd, cm->allow_warped_motion);
+ other_mv, mi_col * MI_SIZE, mi_row * MI_SIZE,
+ &inter_pred_params);
av1_dist_wtd_comp_weight_assign(cm, mbmi, 0, &xd->jcp_param.fwd_offset,
&xd->jcp_param.bck_offset,
@@ -10754,7 +10762,6 @@
(mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]) };
int rate_mv = 0;
int64_t rd = INT64_MAX;
-
// do first prediction into the destination buffer. Do the next
// prediction into a temporary buffer. Then keep track of which one
// of these currently holds the best predictor, and use the other
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index 979a667..b7a8300 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -277,47 +277,27 @@
}
}
-// TODO(sarahparker):
-// av1_build_inter_predictor should be combined with
-// av1_make_inter_predictor
void av1_build_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
- int dst_stride, const MV *src_mv,
- const struct scale_factors *sf, int w, int h,
- ConvolveParams *conv_params,
- int_interpfilters interp_filters,
- const WarpTypesAllowed *warp_types, int p_col,
- int p_row, int plane, int ref,
- mv_precision precision, int x, int y,
- const MACROBLOCKD *xd, int can_use_previous) {
- const struct macroblockd_plane *pd = &xd->plane[conv_params->plane];
- const MV mv_q4 = { pd->subsampling_y ? src_mv->row : src_mv->row * 2,
- pd->subsampling_x ? src_mv->col : src_mv->col * 2 };
+ int dst_stride, const MV *src_mv, int x, int y,
+ InterPredParams *inter_pred_params) {
+ const MV mv_q4 = {
+ inter_pred_params->subsampling_y ? src_mv->row : src_mv->row * 2,
+ inter_pred_params->subsampling_x ? src_mv->col : src_mv->col * 2
+ };
- (void)plane;
- (void)precision;
- (void)warp_types;
- (void)ref;
- (void)can_use_previous;
-
- MV32 mv = av1_scale_mv(&mv_q4, x, y, sf);
+ MV32 mv = av1_scale_mv(&mv_q4, x, y, inter_pred_params->scale_factors);
mv.col += SCALE_EXTRA_OFF;
mv.row += SCALE_EXTRA_OFF;
- InterPredParams inter_pred_params;
- const SubpelParams subpel_params = { sf->x_step_q4, sf->y_step_q4,
- mv.col & SCALE_SUBPEL_MASK,
- mv.row & SCALE_SUBPEL_MASK };
+ const SubpelParams subpel_params = {
+ inter_pred_params->scale_factors->x_step_q4,
+ inter_pred_params->scale_factors->y_step_q4, mv.col & SCALE_SUBPEL_MASK,
+ mv.row & SCALE_SUBPEL_MASK
+ };
src += (mv.row >> SCALE_SUBPEL_BITS) * src_stride +
(mv.col >> SCALE_SUBPEL_BITS);
- inter_pred_params.conv_params = *conv_params;
-
- av1_init_inter_params(&inter_pred_params, w, h, p_col, p_row,
- pd->subsampling_x, pd->subsampling_y, xd->bd,
- is_cur_buf_hbd(xd), xd->mi[0]->use_intrabc, sf,
- interp_filters);
-
- av1_make_inter_predictor(src, src_stride, dst, dst_stride, &inter_pred_params,
+ av1_make_inter_predictor(src, src_stride, dst, dst_stride, inter_pred_params,
&subpel_params);
}
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h
index 6a374a7..a2c580e 100644
--- a/av1/encoder/reconinter_enc.h
+++ b/av1/encoder/reconinter_enc.h
@@ -18,6 +18,7 @@
#include "av1/common/onyxc_int.h"
#include "av1/common/convolve.h"
#include "av1/common/warped_motion.h"
+#include "av1/common/reconinter.h"
#ifdef __cplusplus
extern "C" {
@@ -29,14 +30,8 @@
int plane_from, int plane_to);
void av1_build_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
- int dst_stride, const MV *src_mv,
- const struct scale_factors *sf, int w, int h,
- ConvolveParams *conv_params,
- int_interpfilters interp_filters,
- const WarpTypesAllowed *warp_types, int p_col,
- int p_row, int plane, int ref,
- mv_precision precision, int x, int y,
- const MACROBLOCKD *xd, int can_use_previous);
+ int dst_stride, const MV *src_mv, int x, int y,
+ InterPredParams *inter_pred_params);
// Detect if the block have sub-pixel level motion vectors
// per component.
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 83fc112..2307996 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -54,9 +54,8 @@
static void temporal_filter_predictors_mb_c(
MACROBLOCKD *xd, uint8_t *y_mb_ptr, uint8_t *u_mb_ptr, uint8_t *v_mb_ptr,
int stride, int uv_block_width, int uv_block_height, int mv_row, int mv_col,
- uint8_t *pred, struct scale_factors *scale, int x, int y,
- int can_use_previous, int num_planes, MV *blk_mvs, int use_32x32) {
- mv_precision mv_precision_uv;
+ uint8_t *pred, struct scale_factors *scale, int x, int y, int num_planes,
+ MV *blk_mvs, int use_32x32) {
int uv_stride;
const int_interpfilters interp_filters =
av1_broadcast_interp_filter(MULTITAP_SHARP);
@@ -66,34 +65,36 @@
const int ssx = (uv_block_width == (BW >> 1)) ? 1 : 0;
if (ssx) {
uv_stride = (stride + 1) >> 1;
- mv_precision_uv = MV_PRECISION_Q4;
} else {
uv_stride = stride;
- mv_precision_uv = MV_PRECISION_Q3;
}
- ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
+ InterPredParams inter_pred_params;
+
+ av1_init_inter_params(&inter_pred_params, BW, BH, x, y, 0, 0, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
+
if (use_32x32) {
assert(mv_row >= INT16_MIN && mv_row <= INT16_MAX && mv_col >= INT16_MIN &&
mv_col <= INT16_MAX);
const MV mv = { (int16_t)mv_row, (int16_t)mv_col };
- av1_build_inter_predictor(y_mb_ptr, stride, &pred[0], BW, &mv, scale, BW,
- BH, &conv_params, interp_filters, &warp_types, x,
- y, 0, 0, MV_PRECISION_Q3, x, y, xd,
- can_use_previous);
- if (num_planes > 1) {
- conv_params = get_conv_params(0, 1, xd->bd);
- av1_build_inter_predictor(
- u_mb_ptr, uv_stride, &pred[BLK_PELS], uv_block_width, &mv, scale,
- uv_block_width, uv_block_height, &conv_params, interp_filters,
- &warp_types, x, y, 1, 0, mv_precision_uv, x, y, xd, can_use_previous);
+ av1_build_inter_predictor(y_mb_ptr, stride, &pred[0], BW, &mv, x, y,
+ &inter_pred_params);
- conv_params = get_conv_params(0, 2, xd->bd);
- av1_build_inter_predictor(
- v_mb_ptr, uv_stride, &pred[(BLK_PELS << 1)], uv_block_width, &mv,
- scale, uv_block_width, uv_block_height, &conv_params, interp_filters,
- &warp_types, x, y, 2, 0, mv_precision_uv, x, y, xd, can_use_previous);
+ if (num_planes > 1) {
+ av1_init_inter_params(&inter_pred_params, uv_block_width, uv_block_height,
+ x, y, xd->plane[1].subsampling_x,
+ xd->plane[1].subsampling_y, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
+ av1_build_inter_predictor(u_mb_ptr, uv_stride, &pred[BLK_PELS],
+ uv_block_width, &mv, x, y, &inter_pred_params);
+
+ inter_pred_params.conv_params = get_conv_params(0, 2, xd->bd);
+ av1_build_inter_predictor(v_mb_ptr, uv_stride, &pred[(BLK_PELS << 1)],
+ uv_block_width, &mv, x, y, &inter_pred_params);
}
return;
@@ -103,7 +104,9 @@
// predictors.
int i, j, k = 0, ys = (BH >> 1), xs = (BW >> 1);
// Y predictor
- conv_params = get_conv_params(0, 0, xd->bd);
+ av1_init_inter_params(&inter_pred_params, xs, ys, x, y, 0, 0, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
for (i = 0; i < BH; i += ys) {
for (j = 0; j < BW; j += xs) {
const MV mv = blk_mvs[k];
@@ -111,9 +114,7 @@
const int p_offset = i * BW + j;
av1_build_inter_predictor(y_mb_ptr + y_offset, stride, &pred[p_offset],
- BW, &mv, scale, xs, ys, &conv_params,
- interp_filters, &warp_types, x, y, 0, 0,
- MV_PRECISION_Q3, x, y, xd, can_use_previous);
+ BW, &mv, x, y, &inter_pred_params);
k++;
}
}
@@ -130,19 +131,20 @@
const int uv_offset = i * uv_stride + j;
const int p_offset = i * uv_block_width + j;
- conv_params = get_conv_params(0, 1, xd->bd);
+ av1_init_inter_params(&inter_pred_params, xs, ys, x, y,
+ xd->plane[1].subsampling_x,
+ xd->plane[1].subsampling_y, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
+
av1_build_inter_predictor(u_mb_ptr + uv_offset, uv_stride,
&pred[BLK_PELS + p_offset], uv_block_width,
- &mv, scale, xs, ys, &conv_params,
- interp_filters, &warp_types, x, y, 1, 0,
- mv_precision_uv, x, y, xd, can_use_previous);
+ &mv, x, y, &inter_pred_params);
- conv_params = get_conv_params(0, 2, xd->bd);
+ inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
av1_build_inter_predictor(
v_mb_ptr + uv_offset, uv_stride, &pred[(BLK_PELS << 1) + p_offset],
- uv_block_width, &mv, scale, xs, ys, &conv_params, interp_filters,
- &warp_types, x, y, 2, 0, mv_precision_uv, x, y, xd,
- can_use_previous);
+ uv_block_width, &mv, x, y, &inter_pred_params);
k++;
}
}
@@ -1162,7 +1164,7 @@
frames[frame]->y_stride, mb_uv_width, mb_uv_height,
mbd->mi[0]->mv[0].as_mv.row, mbd->mi[0]->mv[0].as_mv.col,
predictor, ref_scale_factors, mb_col * BW, mb_row * BH,
- cm->allow_warped_motion, num_planes, blk_mvs, use_32x32);
+ num_planes, blk_mvs, use_32x32);
// Apply the filter (YUV)
if (frame == alt_ref_index) {
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 025a215..6f342c7 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -240,14 +240,15 @@
motion_estimation(cpi, x, src_mb_buffer, ref_mb, src_stride, ref_stride,
bsize, mi_row, mi_col);
- ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
- WarpTypesAllowed warp_types;
- memset(&warp_types, 0, sizeof(WarpTypesAllowed));
+ InterPredParams inter_pred_params;
+ av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
+ sf, kernel);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
- av1_build_inter_predictor(
- ref_mb, ref_stride, predictor, bw, &x->best_mv.as_mv, sf, bw, bh,
- &conv_params, kernel, &warp_types, mi_col * MI_SIZE, mi_row * MI_SIZE,
- 0, 0, MV_PRECISION_Q3, mi_col * MI_SIZE, mi_row * MI_SIZE, xd, 0);
+ av1_build_inter_predictor(ref_mb, ref_stride, predictor, bw,
+ &x->best_mv.as_mv, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, &inter_pred_params);
#if CONFIG_AV1_HIGHBITDEPTH
if (is_cur_buf_hbd(xd)) {
@@ -290,9 +291,11 @@
// Final encode
if (is_inter_mode(best_mode)) {
- ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
- WarpTypesAllowed warp_types;
- memset(&warp_types, 0, sizeof(WarpTypesAllowed));
+ InterPredParams inter_pred_params;
+ av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
+ sf, kernel);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
const YV12_BUFFER_CONFIG *ref_frame_ptr = ref_frame[best_rf_idx];
const int ref_mb_offset =
@@ -301,10 +304,8 @@
int ref_stride = ref_frame_ptr->y_stride;
av1_build_inter_predictor(ref_mb, ref_stride, dst_buffer, dst_buffer_stride,
- &best_mv.as_mv, sf, bw, bh, &conv_params, kernel,
- &warp_types, mi_col * MI_SIZE, mi_row * MI_SIZE,
- 0, 0, MV_PRECISION_Q3, mi_col * MI_SIZE,
- mi_row * MI_SIZE, xd, 0);
+ &best_mv.as_mv, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, &inter_pred_params);
} else {
av1_predict_intra_block(cm, xd, block_size_wide[bsize],
block_size_high[bsize], tx_size, best_mode, 0, 0,
@@ -966,9 +967,6 @@
struct scale_factors sf;
av1_setup_scale_factors_for_frame(&sf, ref->y_crop_width, ref->y_crop_height,
src->y_crop_width, src->y_crop_height);
- ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
- WarpTypesAllowed warp_types;
- memset(&warp_types, 0, sizeof(WarpTypesAllowed));
const int_interpfilters kernel =
av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
xd->above_mbmi = NULL;
@@ -1055,11 +1053,16 @@
ref->y_buffer + mb_y_offset_ref, src->y_stride,
ref->y_stride, bsize, mi_row, mi_col);
- av1_build_inter_predictor(
- ref->y_buffer + mb_y_offset_ref, ref->y_stride, predictor, bw,
- &x->best_mv.as_mv, &sf, bw, bh, &conv_params, kernel, &warp_types,
- mi_col * MI_SIZE, mi_row * MI_SIZE, 0, 0, MV_PRECISION_Q3,
- mi_col * MI_SIZE, mi_row * MI_SIZE, xd, 0);
+ InterPredParams inter_pred_params;
+ av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
+ mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd),
+ 0, &sf, kernel);
+ inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
+
+ av1_build_inter_predictor(ref->y_buffer + mb_y_offset_ref, ref->y_stride,
+ predictor, bw, &x->best_mv.as_mv,
+ mi_col * MI_SIZE, mi_row * MI_SIZE,
+ &inter_pred_params);
if (use_satd) {
#if CONFIG_AV1_HIGHBITDEPTH
if (is_cur_buf_hbd(xd)) {