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,