Commit b784a94d95 for aom
commit b784a94d957844268f810c490db2c92172887cbe
Author: Satheesh Kumar <satheesh.kumar@ittiam.com>
Date: Mon Apr 27 15:42:02 2026 +0530
Skip interinter wedge search for similar predictors
This patch introduces the speed feature
'skip_interinter_wedge_search_based_on_mse' to skip inter-inter
wedge search based on mse between two predictors.
This patch also cleans up redundant code in `masked_compound_type_rd()`
as the function is not called for `COMPOUND_WEDGE` mode.
This speed feature is enabled for 720p or larger resolutions
in speed 3.
Encoder performance results averaged over SHORTS720P, SHORTS1080P and
HDRES2 are as follows:
Instruction Count BD-Rate Loss(%)
cpu Reduction(%) avg.psnr ovr.psnr ssim vmaf vmaf_neg
3 0.993 0.0303 0.0304 0.0265 0.0557 0.0440
Change-Id: Ia6d4ac63734e68399d5b432898ccd2d783fbf3bc
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index 7c462e2a07..be175a9989 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -1111,23 +1111,6 @@ static int64_t masked_compound_type_rd(
diff10, strides);
*calc_pred_masked_compound = 0;
}
- if (compound_type == COMPOUND_WEDGE) {
- unsigned int sse;
- if (is_cur_buf_hbd(xd))
- (void)cpi->ppi->fn_ptr[bsize].vf(CONVERT_TO_BYTEPTR(*preds0), *strides,
- CONVERT_TO_BYTEPTR(*preds1), *strides,
- &sse);
- else
- (void)cpi->ppi->fn_ptr[bsize].vf(*preds0, *strides, *preds1, *strides,
- &sse);
- const unsigned int mse =
- ROUND_POWER_OF_TWO(sse, num_pels_log2_lookup[bsize]);
- // If two predictors are very similar, skip wedge compound mode search
- if (mse < 8 || (!have_newmv_in_inter_mode(this_mode) && mse < 64)) {
- *comp_model_rd_cur = INT64_MAX;
- return INT64_MAX;
- }
- }
// Function pointer to pick the appropriate mask
// compound_type == COMPOUND_WEDGE, calls pick_interinter_wedge()
// compound_type == COMPOUND_DIFFWTD, calls pick_interinter_seg()
@@ -1461,12 +1444,29 @@ int av1_compound_type_rd(const AV1_COMP *const cpi, MACROBLOCK *x,
have_newmv_in_inter_mode(this_mode) &&
!cpi->sf.inter_sf.disable_interinter_wedge_newmv_search;
- if (need_mask_search && !wedge_newmv_search) {
+ if ((need_mask_search && !wedge_newmv_search) ||
+ cpi->sf.inter_sf.skip_interinter_wedge_search_based_on_mse) {
// 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);
+
+ if (cpi->sf.inter_sf.skip_interinter_wedge_search_based_on_mse) {
+ unsigned int sse;
+ if (is_cur_buf_hbd(xd))
+ (void)cpi->ppi->fn_ptr[bsize].vf(
+ CONVERT_TO_BYTEPTR(*preds0), *strides,
+ CONVERT_TO_BYTEPTR(*preds1), *strides, &sse);
+ else
+ (void)cpi->ppi->fn_ptr[bsize].vf(*preds0, *strides, *preds1,
+ *strides, &sse);
+ const unsigned int mse =
+ ROUND_POWER_OF_TWO(sse, num_pels_log2_lookup[bsize]);
+ // If two predictors are very similar, skip wedge compound mode
+ // search.
+ if (mse < 512) continue;
+ }
}
for (int wedge_mask = 0; wedge_mask < wedge_mask_size && need_mask_search;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 1f2d910aac..4bfeb88e3b 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -926,6 +926,7 @@ static void set_good_speed_feature_framesize_dependent(
if (is_720p_or_larger) {
sf->inter_sf.disable_interinter_wedge_var_thresh = 100;
+ sf->inter_sf.skip_interinter_wedge_search_based_on_mse = 1;
sf->inter_sf.limit_txfm_eval_per_mode = boosted ? 0 : 1;
} else {
sf->inter_sf.disable_interinter_wedge_var_thresh = UINT_MAX;
@@ -2406,6 +2407,7 @@ static inline void init_inter_sf(INTER_MODE_SPEED_FEATURES *inter_sf) {
inter_sf->bias_warp_mode_rd_scale_pct = 0;
inter_sf->bias_obmc_mode_rd_scale_pct = 0.0f;
inter_sf->skip_cmp_using_top_cmp_avg_est_rd_lvl = 0;
+ inter_sf->skip_interinter_wedge_search_based_on_mse = 0;
set_txfm_rd_gate_level(inter_sf->txfm_rd_gate_level, 0);
}
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 91b73bb047..ca885c7800 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1252,6 +1252,9 @@ typedef struct INTER_MODE_SPEED_FEATURES {
// Values are 0 (not used),1 - 3 with progressively increasing
// aggressiveness, i.e., decreasing number of top candidates.
int skip_cmp_using_top_cmp_avg_est_rd_lvl;
+
+ // Skip interinter wedge search based on MSE between the two predictors.
+ int skip_interinter_wedge_search_based_on_mse;
} INTER_MODE_SPEED_FEATURES;
typedef struct INTERP_FILTER_SPEED_FEATURES {