Add encoder options for wedge and diff-wtd comp

Allows these tools to be turned off or on with finer
granularity than the enable_masked_comp flag.

STATS_CHANGED due to a bug fix.

Change-Id: I77cafd0a5052a1d81efcf70c6efedf0b74fb4308
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 896945a..8475e48 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -784,6 +784,33 @@
    */
   AV1E_SET_ENABLE_INTERINTRA_COMP,
 
+  /*!\brief Codec control function to turn on / off difference weighted
+   * compound.
+   *
+   * This will enable or disable usage of difference weighted compound.
+   * The default value is 1.
+   *
+   */
+  AV1E_SET_ENABLE_DIFF_WTD_COMP,
+
+  /*!\brief Codec control function to turn on / off interinter wedge
+   * compound.
+   *
+   * This will enable or disable usage of interinter wedge compound.
+   * The default value is 1.
+   *
+   */
+  AV1E_SET_ENABLE_INTERINTER_WEDGE,
+
+  /*!\brief Codec control function to turn on / off interintra wedge
+   * compound.
+   *
+   * This will enable or disable usage of interintra wedge compound.
+   * The default value is 1.
+   *
+   */
+  AV1E_SET_ENABLE_INTERINTRA_WEDGE,
+
   /*!\brief Codec control function to turn on / off global motion usage
    * for a sequence.
    *
@@ -1104,6 +1131,15 @@
 AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTRA_COMP, unsigned int)
 #define AOM_CTRL_AV1E_SET_ENABLE_INTERINTRA_COMP
 
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_DIFF_WTD_COMP, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_DIFF_WTD_COMP
+
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTER_WEDGE, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_INTERINTER_WEDGE
+
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTRA_WEDGE, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_INTERINTRA_WEDGE
+
 AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_GLOBAL_MOTION, unsigned int)
 #define AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
 
diff --git a/apps/aomenc.c b/apps/aomenc.c
index dda82f6..6cff587 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -457,6 +457,18 @@
     ARG_DEF(NULL, "enable-interintra-comp", 1,
             "Enable interintra compound "
             "(0: false, 1: true (default))");
+static const arg_def_t enable_diff_wtd_comp =
+    ARG_DEF(NULL, "enable-diff-wtd-comp", 1,
+            "Enable difference-weighted compound "
+            "(0: false, 1: true (default))");
+static const arg_def_t enable_interinter_wedge =
+    ARG_DEF(NULL, "enable-interinter-wedge", 1,
+            "Enable interinter wedge compound "
+            "(0: false, 1: true (default))");
+static const arg_def_t enable_interintra_wedge =
+    ARG_DEF(NULL, "enable-interintra-wedge", 1,
+            "Enable interintra wedge compound "
+            "(0: false, 1: true (default))");
 static const arg_def_t enable_global_motion =
     ARG_DEF(NULL, "enable-global-motion", 1,
             "Enable global motion "
@@ -675,6 +687,9 @@
                                        &enable_jnt_comp,
                                        &enable_masked_comp,
                                        &enable_interintra_comp,
+                                       &enable_diff_wtd_comp,
+                                       &enable_interinter_wedge,
+                                       &enable_interintra_wedge,
                                        &enable_global_motion,
                                        &enable_warped_motion,
                                        &enable_obmc,
@@ -742,6 +757,9 @@
                                         AV1E_SET_ENABLE_JNT_COMP,
                                         AV1E_SET_ENABLE_MASKED_COMP,
                                         AV1E_SET_ENABLE_INTERINTRA_COMP,
+                                        AV1E_SET_ENABLE_DIFF_WTD_COMP,
+                                        AV1E_SET_ENABLE_INTERINTER_WEDGE,
+                                        AV1E_SET_ENABLE_INTERINTRA_WEDGE,
                                         AV1E_SET_ENABLE_GLOBAL_MOTION,
                                         AV1E_SET_ENABLE_WARPED_MOTION,
                                         AV1E_SET_ENABLE_OBMC,
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 13d46f4..ffe3b4a 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -96,13 +96,16 @@
   unsigned int cdf_update_mode;
   int enable_order_hint;
   int enable_jnt_comp;
-  int enable_ref_frame_mvs;    // sequence level
-  int allow_ref_frame_mvs;     // frame level
-  int enable_masked_comp;      // enable masked compound for sequence
-  int enable_interintra_comp;  // enable interintra compound for sequence
-  int enable_global_motion;    // enable global motion usage for sequence
-  int enable_warped_motion;    // sequence level
-  int allow_warped_motion;     // frame level
+  int enable_ref_frame_mvs;     // sequence level
+  int allow_ref_frame_mvs;      // frame level
+  int enable_masked_comp;       // enable masked compound for sequence
+  int enable_interintra_comp;   // enable interintra compound for sequence
+  int enable_diff_wtd_comp;     // enable diff-wtd compound usage
+  int enable_interinter_wedge;  // enable interinter-wedge compound usage
+  int enable_interintra_wedge;  // enable interintra-wedge compound usage
+  int enable_global_motion;     // enable global motion usage for sequence
+  int enable_warped_motion;     // sequence level
+  int allow_warped_motion;      // frame level
   int enable_superres;
 #if CONFIG_DENOISE
   float noise_level;
@@ -179,6 +182,9 @@
   1,                            // allow ref_frame_mvs frame level
   1,                            // enable masked compound at sequence level
   1,                            // enable interintra compound at sequence level
+  1,                            // enable difference-weighted compound
+  1,                            // enable interinter wedge compound
+  1,                            // enable interintra wedge compound
   1,                            // enable_global_motion usage
   1,                            // enable_warped_motion at sequence level
   1,                            // allow_warped_motion at frame level
@@ -676,7 +682,13 @@
   oxcf->enable_jnt_comp =
       extra_cfg->enable_jnt_comp & extra_cfg->enable_order_hint;
   oxcf->enable_masked_comp = extra_cfg->enable_masked_comp;
+  oxcf->enable_diff_wtd_comp =
+      extra_cfg->enable_masked_comp & extra_cfg->enable_diff_wtd_comp;
+  oxcf->enable_interinter_wedge =
+      extra_cfg->enable_masked_comp & extra_cfg->enable_interinter_wedge;
   oxcf->enable_interintra_comp = extra_cfg->enable_interintra_comp;
+  oxcf->enable_interintra_wedge =
+      extra_cfg->enable_interintra_comp & extra_cfg->enable_interintra_wedge;
   oxcf->enable_ref_frame_mvs =
       extra_cfg->enable_ref_frame_mvs & extra_cfg->enable_order_hint;
 
@@ -1079,6 +1091,29 @@
   return update_extra_cfg(ctx, &extra_cfg);
 }
 
+static aom_codec_err_t ctrl_set_enable_diff_wtd_comp(aom_codec_alg_priv_t *ctx,
+                                                     va_list args) {
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  extra_cfg.enable_diff_wtd_comp = CAST(AV1E_SET_ENABLE_DIFF_WTD_COMP, args);
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
+static aom_codec_err_t ctrl_set_enable_interinter_wedge(
+    aom_codec_alg_priv_t *ctx, va_list args) {
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  extra_cfg.enable_interinter_wedge =
+      CAST(AV1E_SET_ENABLE_INTERINTER_WEDGE, args);
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
+static aom_codec_err_t ctrl_set_enable_interintra_wedge(
+    aom_codec_alg_priv_t *ctx, va_list args) {
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  extra_cfg.enable_interintra_wedge =
+      CAST(AV1E_SET_ENABLE_INTERINTRA_WEDGE, args);
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
 static aom_codec_err_t ctrl_set_enable_global_motion(aom_codec_alg_priv_t *ctx,
                                                      va_list args) {
   struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -1842,6 +1877,9 @@
   { AV1E_SET_ALLOW_REF_FRAME_MVS, ctrl_set_allow_ref_frame_mvs },
   { AV1E_SET_ENABLE_MASKED_COMP, ctrl_set_enable_masked_comp },
   { AV1E_SET_ENABLE_INTERINTRA_COMP, ctrl_set_enable_interintra_comp },
+  { AV1E_SET_ENABLE_DIFF_WTD_COMP, ctrl_set_enable_diff_wtd_comp },
+  { AV1E_SET_ENABLE_INTERINTER_WEDGE, ctrl_set_enable_interinter_wedge },
+  { AV1E_SET_ENABLE_INTERINTRA_WEDGE, ctrl_set_enable_interintra_wedge },
   { AV1E_SET_ENABLE_GLOBAL_MOTION, ctrl_set_enable_global_motion },
   { AV1E_SET_ENABLE_WARPED_MOTION, ctrl_set_enable_warped_motion },
   { AV1E_SET_ALLOW_WARPED_MOTION, ctrl_set_allow_warped_motion },
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 385eea0..fd9f7bb 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -328,6 +328,9 @@
   unsigned int allow_ref_frame_mvs;
   int enable_masked_comp;
   int enable_interintra_comp;
+  int enable_diff_wtd_comp;
+  int enable_interinter_wedge;
+  int enable_interintra_wedge;
   int enable_global_motion;
   int enable_warped_motion;
   int allow_warped_motion;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 4863c7b..9ee24db 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8784,6 +8784,16 @@
          x->edge_strength > cpi->sf.disable_wedge_search_edge_thresh;
 }
 
+static INLINE bool enable_wedge_interinter_search(MACROBLOCK *const x,
+                                                  const AV1_COMP *const cpi) {
+  return enable_wedge_search(x, cpi) && cpi->oxcf.enable_interinter_wedge;
+}
+
+static INLINE bool enable_wedge_interintra_search(MACROBLOCK *const x,
+                                                  const AV1_COMP *const cpi) {
+  return enable_wedge_search(x, cpi) && cpi->oxcf.enable_interintra_wedge;
+}
+
 static int handle_inter_intra_mode(const AV1_COMP *const cpi,
                                    MACROBLOCK *const x, BLOCK_SIZE bsize,
                                    int mi_row, int mi_col, MB_MODE_INFO *mbmi,
@@ -8859,7 +8869,7 @@
     int64_t best_interintra_rd_nowedge = rd;
     int64_t best_interintra_rd_wedge = INT64_MAX;
     int_mv tmp_mv;
-    if (enable_wedge_search(x, cpi)) {
+    if (enable_wedge_interintra_search(x, cpi)) {
       mbmi->use_wedge_interintra = 1;
 
       rwedge = av1_cost_literal(get_interintra_wedge_bits(bsize)) +
@@ -9539,14 +9549,19 @@
       masked_type_cost += x->compound_type_cost[bsize][cur_type - 1];
       rs2 = masked_type_cost;
 
-      if (enable_wedge_search(x, cpi) &&
-          ((*rd / cpi->max_comp_type_rd_threshold_div) *
+      if (((*rd / cpi->max_comp_type_rd_threshold_div) *
            cpi->max_comp_type_rd_threshold_mul) < ref_best_rd) {
-        best_rd_cur = build_and_cost_compound_type(
-            cpi, x, cur_mv, bsize, this_mode, &rs2, *rate_mv, orig_dst,
-            &tmp_rate_mv, preds0, preds1, buffers->residual1, buffers->diff10,
-            strides, mi_row, mi_col, rd_stats->rate, ref_best_rd,
-            &calc_pred_masked_compound);
+        const COMPOUND_TYPE compound_type = mbmi->interinter_comp.type;
+
+        if (!((compound_type == COMPOUND_WEDGE &&
+               !enable_wedge_interinter_search(x, cpi)) ||
+              (compound_type == COMPOUND_DIFFWTD &&
+               !cpi->oxcf.enable_diff_wtd_comp)))
+          best_rd_cur = build_and_cost_compound_type(
+              cpi, x, cur_mv, bsize, this_mode, &rs2, *rate_mv, orig_dst,
+              &tmp_rate_mv, preds0, preds1, buffers->residual1, buffers->diff10,
+              strides, mi_row, mi_col, rd_stats->rate, ref_best_rd,
+              &calc_pred_masked_compound);
       }
     }
     if (best_rd_cur < *rd) {