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 {