Reuse single inter predictors in wedge index search
For derived motion vector modes, prepare and reuse the single inter
predictors in the wedge index search. There is a slight stats change
due to the rounding errors in building the compound wedge prediction.
The encoding speed is improved by 2-3% in low bit-rate range.
STATS_CHANGED
Change-Id: Ia14cc3450c503691516c493e708cc648b0312787
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index 4a188ad..5bbe0c4 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -1355,6 +1355,14 @@
const int wedge_mask_size = get_wedge_types_lookup(bsize);
int need_mask_search = args->wedge_index == -1;
+ if (need_mask_search && !have_newmv_in_inter_mode(this_mode)) {
+ // short cut repeated single reference block build
+ av1_build_inter_predictors_for_planes_single_buf(xd, bsize, 0, 0, 0,
+ preds0, strides);
+ av1_build_inter_predictors_for_planes_single_buf(xd, bsize, 0, 0, 1,
+ preds1, strides);
+ }
+
for (int wedge_mask = 0; wedge_mask < wedge_mask_size && need_mask_search;
++wedge_mask) {
for (int wedge_sign = 0; wedge_sign < 2; ++wedge_sign) {
@@ -1370,10 +1378,13 @@
if (have_newmv_in_inter_mode(this_mode)) {
tmp_rate_mv = av1_interinter_compound_motion_search(
cpi, x, cur_mv, bsize, this_mode);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst,
+ bsize, AOM_PLANE_Y, AOM_PLANE_Y);
+ } else {
+ av1_build_wedge_inter_predictor_from_buf(xd, bsize, 0, 0, preds0,
+ strides, preds1, strides);
}
- av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
- AOM_PLANE_Y, AOM_PLANE_Y);
RD_STATS est_rd_stats;
int64_t this_rd_cur =
estimate_yrd_for_sb(cpi, bsize, x, best_rd_cur, &est_rd_stats);