AV1 RT: Simplified Inter Prediction 3-4% speed up on lowres speed 7. No BDRate impact Change-Id: Ifa0bca232bc7073a729ecab6634e6406c65aee28
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c index 3ff3645..11f3132 100644 --- a/av1/encoder/nonrd_pickmode.c +++ b/av1/encoder/nonrd_pickmode.c
@@ -1281,8 +1281,7 @@ int64_t cost; InterpFilter filter = filters[i]; mi->interp_filters = av1_broadcast_interp_filter(filter); - av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, - AOM_PLANE_Y, AOM_PLANE_Y); + av1_enc_build_inter_predictor_y(xd, mi_row, mi_col); if (use_model_yrd_large) model_skip_for_sb_y_large( cpi, bsize, mi_row, mi_col, x, xd, &pf_rate[i], &pf_dist[i], @@ -1338,8 +1337,7 @@ pd->dst.buf = (*this_mode_pred)->data; pd->dst.stride = (*this_mode_pred)->stride; } else if (best_filter_index < filter_search_size - 1) { - av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, - AOM_PLANE_Y, AOM_PLANE_Y); + av1_enc_build_inter_predictor_y(xd, mi_row, mi_col); } } @@ -1841,8 +1839,7 @@ mi->interp_filters = (filter_ref == SWITCHABLE) ? av1_broadcast_interp_filter(EIGHTTAP_REGULAR) : av1_broadcast_interp_filter(filter_ref); - av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, - AOM_PLANE_Y, AOM_PLANE_Y); + av1_enc_build_inter_predictor_y(xd, mi_row, mi_col); if (cpi->sf.rt_sf.use_modeled_non_rd_cost) { model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc.rate, &this_rdc.dist, &this_rdc.skip, NULL, &var_y, &sse_y, 1);
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c index b1e1645..8269d2d 100644 --- a/av1/encoder/reconinter_enc.c +++ b/av1/encoder/reconinter_enc.c
@@ -197,6 +197,29 @@ } } +void av1_enc_build_inter_predictor_y(MACROBLOCKD *xd, int mi_row, int mi_col) { + const int mi_x = mi_col * MI_SIZE; + const int mi_y = mi_row * MI_SIZE; + struct macroblockd_plane *const pd = &xd->plane[AOM_PLANE_Y]; + InterPredParams inter_pred_params; + + struct buf_2d *const dst_buf = &pd->dst; + uint8_t *const dst = dst_buf->buf; + const MV mv = xd->mi[0]->mv[0].as_mv; + const struct scale_factors *const sf = xd->block_ref_scale_factors[0]; + + av1_init_inter_params(&inter_pred_params, pd->width, pd->height, mi_y, mi_x, + pd->subsampling_x, pd->subsampling_y, xd->bd, + is_cur_buf_hbd(xd), false, sf, pd->pre, + xd->mi[0]->interp_filters); + + inter_pred_params.conv_params = get_conv_params_no_round( + 0, AOM_PLANE_Y, xd->tmp_conv_dst, MAX_SB_SIZE, false, xd->bd); + + inter_pred_params.conv_params.use_dist_wtd_comp_avg = 0; + av1_build_inter_predictor(dst, dst_buf->stride, &mv, &inter_pred_params); +} + 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,
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h index 279d2ae..49bb893 100644 --- a/av1/encoder/reconinter_enc.h +++ b/av1/encoder/reconinter_enc.h
@@ -29,6 +29,8 @@ const BUFFER_SET *ctx, BLOCK_SIZE bsize, int plane_from, int plane_to); +void av1_enc_build_inter_predictor_y(MACROBLOCKD *xd, int mi_row, int mi_col); + void av1_build_inter_predictor(uint8_t *dst, int dst_stride, const MV *src_mv, InterPredParams *inter_pred_params);