Group compound type elements in AV1EncoderConfig

This CL groups together compound type related elements from
AV1EncoderConfig into a new structure CompoundTypeCfg, changes
datatypes of flags to bool, and adds relevant documentation.

BUG=aomedia:2701

Change-Id: If00dc76a3a1c785d53906364f56b96efc173bef2
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index f0f18e4..c9addb8 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -712,6 +712,8 @@
 
   TxfmSizeTypeCfg *const txfm_cfg = &oxcf->txfm_cfg;
 
+  CompoundTypeCfg *const comp_type_cfg = &oxcf->comp_type_cfg;
+
   const int is_vbr = cfg->rc_end_usage == AOM_VBR;
   oxcf->profile = cfg->g_profile;
   oxcf->fwd_kf_enabled = cfg->fwd_kf_enabled;
@@ -929,21 +931,10 @@
   oxcf->min_partition_size = extra_cfg->min_partition_size;
   oxcf->max_partition_size = extra_cfg->max_partition_size;
   oxcf->enable_order_hint = extra_cfg->enable_order_hint;
-  oxcf->enable_dist_wtd_comp =
-      extra_cfg->enable_dist_wtd_comp & extra_cfg->enable_order_hint;
   oxcf->max_reference_frames = extra_cfg->max_reference_frames;
   oxcf->enable_reduced_reference_set = extra_cfg->enable_reduced_reference_set;
-  oxcf->enable_masked_comp = extra_cfg->enable_masked_comp;
   oxcf->enable_onesided_comp = extra_cfg->enable_onesided_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_smooth_interintra =
-      extra_cfg->enable_interintra_comp && extra_cfg->enable_smooth_interintra;
-  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;
 
@@ -971,6 +962,19 @@
   txfm_cfg->use_inter_dct_only = extra_cfg->use_inter_dct_only;
   txfm_cfg->use_intra_default_tx_only = extra_cfg->use_intra_default_tx_only;
 
+  // Set compound type configuration.
+  comp_type_cfg->enable_dist_wtd_comp =
+      extra_cfg->enable_dist_wtd_comp & extra_cfg->enable_order_hint;
+  comp_type_cfg->enable_masked_comp = extra_cfg->enable_masked_comp;
+  comp_type_cfg->enable_diff_wtd_comp =
+      extra_cfg->enable_masked_comp & extra_cfg->enable_diff_wtd_comp;
+  comp_type_cfg->enable_interinter_wedge =
+      extra_cfg->enable_masked_comp & extra_cfg->enable_interinter_wedge;
+  comp_type_cfg->enable_smooth_interintra =
+      extra_cfg->enable_interintra_comp && extra_cfg->enable_smooth_interintra;
+  comp_type_cfg->enable_interintra_wedge =
+      extra_cfg->enable_interintra_comp & extra_cfg->enable_interintra_wedge;
+
   oxcf->enable_superres =
       (oxcf->superres_mode != AOM_SUPERRES_NONE) && extra_cfg->enable_superres;
   if (!oxcf->enable_superres) {
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index 6025797..6deb4aa 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -107,13 +107,15 @@
 
 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 &&
+  return enable_wedge_search(x, cpi) &&
+         cpi->oxcf.comp_type_cfg.enable_interinter_wedge &&
          !cpi->sf.inter_sf.disable_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 &&
+  return enable_wedge_search(x, cpi) &&
+         cpi->oxcf.comp_type_cfg.enable_interintra_wedge &&
          !cpi->sf.inter_sf.disable_wedge_interintra_search;
 }
 
@@ -548,8 +550,9 @@
                                 HandleInterModeArgs *args, int64_t ref_best_rd,
                                 int *rate_mv, int *tmp_rate2,
                                 const BUFFER_SET *orig_dst) {
-  const int try_smooth_interintra = cpi->oxcf.enable_smooth_interintra &&
-                                    !cpi->sf.inter_sf.disable_smooth_interintra;
+  const int try_smooth_interintra =
+      cpi->oxcf.comp_type_cfg.enable_smooth_interintra &&
+      !cpi->sf.inter_sf.disable_smooth_interintra;
   const int is_wedge_used = av1_is_wedge_used(bsize);
   const int try_wedge_interintra =
       is_wedge_used && enable_wedge_interintra_search(x, cpi);
@@ -606,7 +609,7 @@
       }
       args->inter_intra_mode[mbmi->ref_frame[0]] = best_interintra_mode;
     }
-    assert(IMPLIES(!cpi->oxcf.enable_smooth_interintra ||
+    assert(IMPLIES(!cpi->oxcf.comp_type_cfg.enable_smooth_interintra ||
                        cpi->sf.inter_sf.disable_smooth_interintra,
                    best_interintra_mode != II_SMOOTH_PRED));
     // Recompute prediction if required
@@ -825,7 +828,7 @@
     // enable_masked_type[0] corresponds to COMPOUND_WEDGE
     // enable_masked_type[1] corresponds to COMPOUND_DIFFWTD
     enable_masked_type[0] = enable_wedge_interinter_search(x, cpi);
-    enable_masked_type[1] = cpi->oxcf.enable_diff_wtd_comp;
+    enable_masked_type[1] = cpi->oxcf.comp_type_cfg.enable_diff_wtd_comp;
     for (comp_type = COMPOUND_WEDGE; comp_type <= COMPOUND_DIFFWTD;
          comp_type++) {
       if ((mode_search_mask & (1 << comp_type)) &&
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index cebff7a5..3b2b2a1 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1334,7 +1334,8 @@
   seq->delta_frame_id_length = DELTA_FRAME_ID_LENGTH;
 
   seq->enable_dual_filter = oxcf->enable_dual_filter;
-  seq->order_hint_info.enable_dist_wtd_comp = oxcf->enable_dist_wtd_comp;
+  seq->order_hint_info.enable_dist_wtd_comp =
+      oxcf->comp_type_cfg.enable_dist_wtd_comp;
   seq->order_hint_info.enable_dist_wtd_comp &=
       seq->order_hint_info.enable_order_hint;
   seq->order_hint_info.enable_ref_frame_mvs = oxcf->enable_ref_frame_mvs;
@@ -1345,7 +1346,7 @@
   seq->enable_restoration = oxcf->enable_restoration;
   seq->enable_warped_motion = oxcf->enable_warped_motion;
   seq->enable_interintra_compound = oxcf->enable_interintra_comp;
-  seq->enable_masked_compound = oxcf->enable_masked_comp;
+  seq->enable_masked_compound = oxcf->comp_type_cfg.enable_masked_comp;
   seq->enable_intra_edge_filter = oxcf->intra_mode_cfg.enable_intra_edge_filter;
   seq->enable_filter_intra = oxcf->intra_mode_cfg.enable_filter_intra;
 
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 8a82b73..a6c81af 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -290,6 +290,22 @@
   bool use_intra_default_tx_only;
 } TxfmSizeTypeCfg;
 
+typedef struct {
+  // Flag to indicate if distance-weighted compound type should be enabled.
+  bool enable_dist_wtd_comp;
+  // Flag to indicate if masked (wedge/diff-wtd) compound type should be
+  // enabled.
+  bool enable_masked_comp;
+  // Flag to indicate if smooth interintra mode should be enabled.
+  bool enable_smooth_interintra;
+  // Flag to indicate if difference-weighted compound type should be enabled.
+  bool enable_diff_wtd_comp;
+  // Flag to indicate if inter-inter wedge compound type should be enabled.
+  bool enable_interinter_wedge;
+  // Flag to indicate if inter-intra wedge compound type should be enabled.
+  bool enable_interintra_wedge;
+} CompoundTypeCfg;
+
 typedef struct AV1EncoderConfig {
   BITSTREAM_PROFILE profile;
   aom_bit_depth_t bit_depth;     // Codec bit-depth.
@@ -466,18 +482,12 @@
   int min_partition_size;
   int max_partition_size;
   int enable_order_hint;
-  int enable_dist_wtd_comp;
   int enable_ref_frame_mvs;
   unsigned int max_reference_frames;
   int enable_reduced_reference_set;
   unsigned int allow_ref_frame_mvs;
-  int enable_masked_comp;
   int enable_onesided_comp;
   int enable_interintra_comp;
-  int enable_smooth_interintra;
-  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;
@@ -493,6 +503,9 @@
   // Flags related to transform size/type.
   TxfmSizeTypeCfg txfm_cfg;
 
+  // Flags related to compound type.
+  CompoundTypeCfg comp_type_cfg;
+
 #if CONFIG_DENOISE
   float noise_level;
   int noise_block_size;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index ae97045..7f7ebba 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -478,7 +478,7 @@
     sf->inter_sf.selective_ref_frame = 4;
     sf->inter_sf.skip_repeated_ref_mv = 1;
     sf->inter_sf.skip_repeated_full_newmv = 1;
-    if (cpi->oxcf.enable_smooth_interintra)
+    if (cpi->oxcf.comp_type_cfg.enable_smooth_interintra)
       sf->inter_sf.disable_smooth_interintra = boosted ? 0 : 1;
     sf->inter_sf.reuse_compound_type_decision = 1;
     sf->inter_sf.txfm_rd_gate_level = (boosted || allow_screen_content_tools)