Consolidate inter prediction functions for encoder
Change-Id: I56d99c4c9a94b16264a006185ef2b16f63830644
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index cc41902..16f341d 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -2179,7 +2179,8 @@
// Get a copy of the prediction output
set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]);
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
aom_clear_system_state();
@@ -6827,7 +6828,8 @@
xd->block_ref_scale_factors[ref], num_planes);
}
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0,
+ av1_num_planes(cm) - 1);
if (mbmi->motion_mode == OBMC_CAUSAL) {
assert(cpi->oxcf.enable_obmc == 1);
av1_build_obmc_inter_predictors_sb(cm, xd, mi_row, mi_col);
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index 0279a78..c5dd78a 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -855,8 +855,9 @@
xd->mi[0]->tx_size = TX_4X4;
xd->mi[0]->ref_frame[0] = LAST_FRAME;
xd->mi[0]->ref_frame[1] = NONE_FRAME;
- av1_build_inter_predictors_sby(cm, xd, mb_row * mb_scale,
- mb_col * mb_scale, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mb_row * mb_scale,
+ mb_col * mb_scale, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
av1_encode_sby_pass1(cm, x, bsize);
sum_mvr += mv.row;
sum_mvr_abs += abs(mv.row);
diff --git a/av1/encoder/mbgraph.c b/av1/encoder/mbgraph.c
index 4e37d32..0cb6286 100644
--- a/av1/encoder/mbgraph.c
+++ b/av1/encoder/mbgraph.c
@@ -71,8 +71,8 @@
xd->mi[0]->mv[0] = x->best_mv;
xd->mi[0]->ref_frame[1] = NONE_FRAME;
- av1_build_inter_predictors_sby(&cpi->common, xd, mb_row, mb_col, NULL,
- BLOCK_16X16);
+ av1_enc_build_inter_predictor(&cpi->common, xd, mb_row, mb_col, NULL,
+ BLOCK_16X16, AOM_PLANE_Y, AOM_PLANE_Y);
/* restore UMV window */
x->mv_limits = tmp_mv_limits;
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c
index d5eb871..1bab45c 100644
--- a/av1/encoder/mcomp.c
+++ b/av1/encoder/mcomp.c
@@ -899,7 +899,8 @@
unsigned int mse;
unsigned int sse;
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
mse = vfp->vf(dst, dst_stride, src, src_stride, &sse);
mse += mv_err_cost(this_mv, &ref_mv.as_mv, x->nmv_vec_cost, x->mv_cost_stack,
x->errorperbit);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index e53bd01..f87a99b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -7861,7 +7861,8 @@
!cpi->sf.disable_interinter_wedge_newmv_search) {
*out_rate_mv = interinter_compound_motion_search(
cpi, x, cur_mv, bsize, this_mode, mi_row, mi_col);
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, ctx, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, ctx, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
int rate_sum, tmp_skip_txfm_sb;
int64_t dist_sum, tmp_skip_sse_sb;
model_rd_sb_fn[MODELRD_TYPE_MASKED_COMPOUND](
@@ -8136,7 +8137,8 @@
if (skip_pred != cpi->default_interp_skip_flags) {
if (skip_pred != DEFAULT_LUMA_INTERP_SKIP_FLAG) {
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
#if CONFIG_COLLECT_RD_STATS == 3
RD_STATS rd_stats_y;
select_tx_type_yrd(cpi, x, &rd_stats_y, bsize, mi_row, mi_col, INT64_MAX);
@@ -8161,8 +8163,8 @@
mbmi->interp_filters = last_best;
return 0;
}
- av1_build_inter_predictors_sbp(cm, xd, mi_row, mi_col, orig_dst, bsize,
- plane);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ plane, plane);
model_rd_sb_fn[MODELRD_TYPE_INTERP_FILTER](
cpi, bsize, x, xd, plane, plane, mi_row, mi_col, &tmp_rate_uv,
&tmp_dist_uv, &tmp_skip_sb_uv, &tmp_skip_sse_uv, NULL, NULL, NULL);
@@ -8491,8 +8493,10 @@
switchable_ctx[1] = av1_get_pred_context_switchable_interp(xd, 1);
*switchable_rate =
get_switchable_rate(x, mbmi->interp_filters, switchable_ctx);
- if (!skip_build_pred)
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ if (!skip_build_pred) {
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize, 0,
+ av1_num_planes(cm) - 1);
+ }
#if CONFIG_COLLECT_RD_STATS == 3
RD_STATS rd_stats_y;
@@ -8679,7 +8683,8 @@
// in either of the directions Condition below is necessary, but not
// sufficient
assert((skip_hor == 1) || (skip_ver == 1));
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
}
*skip_txfm_sb = best_skip_txfm_sb[1];
*skip_sse_sb = best_skip_sse_sb[1];
@@ -8877,7 +8882,8 @@
mbmi->ref_frame[1] = NONE_FRAME;
xd->plane[0].dst.buf = tmp_buf;
xd->plane[0].dst.stride = bw;
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
restore_dst_buf(xd, *orig_dst, num_planes);
mbmi->ref_frame[1] = INTRA_FRAME;
@@ -8999,8 +9005,8 @@
0);
if (mbmi->mv[0].as_int != tmp_mv.as_int) {
mbmi->mv[0].as_int = tmp_mv.as_int;
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, orig_dst,
- bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
model_rd_sb_fn[MODELRD_TYPE_MASKED_COMPOUND](
cpi, bsize, x, xd, 0, 0, mi_row, mi_col, &rate_sum, &dist_sum,
&tmp_skip_txfm_sb, &tmp_skip_sse_sb, NULL, NULL, NULL);
@@ -9032,7 +9038,8 @@
} else {
mbmi->use_wedge_interintra = 0;
mbmi->mv[0].as_int = mv0.as_int;
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
}
} else {
if (!cpi->oxcf.enable_smooth_interintra) return -1;
@@ -9040,7 +9047,8 @@
}
} // if (is_wedge_used)
if (num_planes > 1) {
- av1_build_inter_predictors_sbuv(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_U, num_planes - 1);
}
return 0;
}
@@ -9197,7 +9205,8 @@
tmp_rate2 = rate2_nocoeff - rate_mv0 + tmp_rate_mv;
}
if (mbmi->mv[0].as_int != cur_mv) {
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ 0, av1_num_planes(cm) - 1);
}
av1_build_obmc_inter_prediction(
cm, xd, mi_row, mi_col, args->above_pred_buf, args->above_pred_stride,
@@ -9264,7 +9273,8 @@
continue;
}
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0,
+ av1_num_planes(cm) - 1);
} else {
continue;
}
@@ -9446,7 +9456,8 @@
const AV1_COMMON *cm = &cpi->common;
const int num_planes = av1_num_planes(cm);
MACROBLOCKD *const xd = &x->e_mbd;
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, orig_dst, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize, 0,
+ av1_num_planes(cm) - 1);
int64_t total_sse = 0;
for (int plane = 0; plane < num_planes; ++plane) {
@@ -9670,8 +9681,8 @@
if (mode_rd < ref_best_rd) {
// Reuse data if matching record is found
if (comp_rate[0] == INT_MAX) {
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, orig_dst,
- bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
*is_luma_interp_done = 1;
RD_STATS est_rd_stats;
const int64_t est_rd =
@@ -10082,15 +10093,16 @@
restore_dst_buf(xd, orig_dst, num_planes);
continue;
}
- // No need to call av1_build_inter_predictors_sby if
+ // No need to call av1_enc_build_inter_predictor for luma if
// COMPOUND_AVERAGE is selected because it is the first
// candidate in compound_type_rd, and the following
// compound types searching uses tmp_dst buffer
if (mbmi->interinter_comp.type == COMPOUND_AVERAGE &&
is_luma_interp_done) {
- if (num_planes > 1)
- av1_build_inter_predictors_sbuv(cm, xd, mi_row, mi_col, &orig_dst,
- bsize);
+ if (num_planes > 1) {
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, &orig_dst,
+ bsize, AOM_PLANE_U, num_planes - 1);
+ }
skip_build_pred = 1;
}
}
@@ -10338,7 +10350,8 @@
mbmi->interp_filters = av1_broadcast_interp_filter(BILINEAR);
mbmi->skip = 0;
x->skip = 0;
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0,
+ av1_num_planes(cm) - 1);
int *dvcost[2] = { (int *)&cpi->dv_cost[0][MV_MAX],
(int *)&cpi->dv_cost[1][MV_MAX] };
@@ -10695,7 +10708,8 @@
}
if (is_inter_mode(mbmi->mode)) {
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0,
+ av1_num_planes(cm) - 1);
if (mbmi->motion_mode == OBMC_CAUSAL)
av1_build_obmc_inter_predictors_sb(cm, xd, mi_row, mi_col);
@@ -12402,7 +12416,8 @@
RD_STATS rd_stats_y;
RD_STATS rd_stats_uv;
- av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0,
+ av1_num_planes(cm) - 1);
if (mbmi->motion_mode == OBMC_CAUSAL)
av1_build_obmc_inter_predictors_sb(cm, xd, mi_row, mi_col);
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index c1d6c74..4b477ce 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -237,47 +237,19 @@
}
}
-static void build_inter_predictors_for_planes(const AV1_COMMON *cm,
- MACROBLOCKD *xd, BLOCK_SIZE bsize,
- int mi_row, int mi_col,
- int plane_from, int plane_to) {
- int plane;
+static void build_inter_predictors_for_plane(const AV1_COMMON *cm,
+ MACROBLOCKD *xd, int mi_row,
+ int mi_col, const BUFFER_SET *ctx,
+ BLOCK_SIZE bsize, int plane_idx) {
+ const struct macroblockd_plane *pd = &xd->plane[plane_idx];
+ if (!is_chroma_reference(mi_row, mi_col, bsize, pd->subsampling_x,
+ pd->subsampling_y))
+ return;
+
const int mi_x = mi_col * MI_SIZE;
const int mi_y = mi_row * MI_SIZE;
- for (plane = plane_from; plane <= plane_to; ++plane) {
- const struct macroblockd_plane *pd = &xd->plane[plane];
- const int bw = pd->width;
- const int bh = pd->height;
-
- if (!is_chroma_reference(mi_row, mi_col, bsize, pd->subsampling_x,
- pd->subsampling_y))
- continue;
-
- build_inter_predictors(cm, xd, plane, xd->mi[0], 0, bw, bh, mi_x, mi_y);
- }
-}
-
-void av1_build_inter_predictors_sby(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize) {
- av1_build_inter_predictors_sbp(cm, xd, mi_row, mi_col, ctx, bsize, 0);
-}
-
-void av1_build_inter_predictors_sbuv(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize) {
- for (int plane_idx = 1; plane_idx < MAX_MB_PLANE; plane_idx++) {
- av1_build_inter_predictors_sbp(cm, xd, mi_row, mi_col, ctx, bsize,
- plane_idx);
- }
-}
-
-void av1_build_inter_predictors_sbp(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize,
- int plane_idx) {
- build_inter_predictors_for_planes(cm, xd, bsize, mi_row, mi_col, plane_idx,
- plane_idx);
+ build_inter_predictors(cm, xd, plane_idx, xd->mi[0], 0, pd->width, pd->height,
+ mi_x, mi_y);
if (is_interintra_pred(xd->mi[0])) {
BUFFER_SET default_ctx = { { NULL, NULL, NULL }, { 0, 0, 0 } };
@@ -292,13 +264,14 @@
}
}
-void av1_build_inter_predictors_sb(const AV1_COMMON *cm, MACROBLOCKD *xd,
+void av1_enc_build_inter_predictor(const AV1_COMMON *cm, MACROBLOCKD *xd,
int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize) {
- const int num_planes = av1_num_planes(cm);
- av1_build_inter_predictors_sby(cm, xd, mi_row, mi_col, ctx, bsize);
- if (num_planes > 1)
- av1_build_inter_predictors_sbuv(cm, xd, mi_row, mi_col, ctx, bsize);
+ const BUFFER_SET *ctx, BLOCK_SIZE bsize,
+ int plane_from, int plane_to) {
+ for (int plane_idx = plane_from; plane_idx <= plane_to; ++plane_idx) {
+ build_inter_predictors_for_plane(cm, xd, mi_row, mi_col, ctx, bsize,
+ plane_idx);
+ }
}
// TODO(sarahparker):
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h
index fd2760e..5687168 100644
--- a/av1/encoder/reconinter_enc.h
+++ b/av1/encoder/reconinter_enc.h
@@ -23,22 +23,10 @@
extern "C" {
#endif
-void av1_build_inter_predictors_sby(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize);
-
-void av1_build_inter_predictors_sbuv(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize);
-
-void av1_build_inter_predictors_sbp(const AV1_COMMON *cm, MACROBLOCKD *xd,
- int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize,
- int plane_idx);
-
-void av1_build_inter_predictors_sb(const AV1_COMMON *cm, MACROBLOCKD *xd,
+void av1_enc_build_inter_predictor(const AV1_COMMON *cm, MACROBLOCKD *xd,
int mi_row, int mi_col,
- const BUFFER_SET *ctx, BLOCK_SIZE bsize);
+ const BUFFER_SET *ctx, BLOCK_SIZE bsize,
+ 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,