Group ref frame config params in AV1EncoderConfig

This CL groups the configuration params related to reference frames
in AV1EncoderConfig into a new struct RefFrameCfg, adds the relevant
documentation, and cleans up function interfaces.

BUG=aomedia:2701

Change-Id: I17ecb1676039f51958026bfd1f9f9fb0b02bf74b
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index ae9ccfd..3eab5fa 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -932,15 +932,18 @@
       oxcf->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
   }
 
+  // Set reference frame related configuration.
+  oxcf->ref_frm_cfg.max_reference_frames = extra_cfg->max_reference_frames;
+  oxcf->ref_frm_cfg.enable_reduced_reference_set =
+      extra_cfg->enable_reduced_reference_set;
+  oxcf->ref_frm_cfg.enable_onesided_comp = extra_cfg->enable_onesided_comp;
+
   oxcf->row_mt = extra_cfg->row_mt;
 
   oxcf->monochrome = cfg->monochrome;
   oxcf->full_still_picture_hdr = cfg->full_still_picture_hdr;
   oxcf->enable_dual_filter = extra_cfg->enable_dual_filter;
   oxcf->enable_order_hint = 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_onesided_comp = extra_cfg->enable_onesided_comp;
   oxcf->enable_interintra_comp = extra_cfg->enable_interintra_comp;
   oxcf->enable_ref_frame_mvs =
       extra_cfg->enable_ref_frame_mvs & extra_cfg->enable_order_hint;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f01c3bd..e2dd1ba 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -490,6 +490,15 @@
   COST_UPDATE_TYPE mv;
 } CostUpdateFreq;
 
+typedef struct {
+  // Indicates the maximum number of reference frames allowed per frame.
+  unsigned int max_reference_frames;
+  // Indicates if the reduced set of references should be enabled.
+  bool enable_reduced_reference_set;
+  // Indicates if one-sided compound should be enabled.
+  bool enable_onesided_comp;
+} RefFrameCfg;
+
 typedef struct AV1EncoderConfig {
   BITSTREAM_PROFILE profile;
   aom_bit_depth_t bit_depth;     // Codec bit-depth.
@@ -615,6 +624,9 @@
   // Configuration related to decoder model.
   DecoderModelCfg dec_model_cfg;
 
+  // Configuration related to reference frames.
+  RefFrameCfg ref_frm_cfg;
+
   uint8_t cdf_update_mode;
   aom_superblock_size_t superblock_size;
   uint8_t monochrome;
@@ -624,10 +636,7 @@
   unsigned int sb_multipass_unit_test;
   int enable_order_hint;
   int enable_ref_frame_mvs;
-  unsigned int max_reference_frames;
-  int enable_reduced_reference_set;
   unsigned int allow_ref_frame_mvs;
-  int enable_onesided_comp;
   int enable_interintra_comp;
   int enable_global_motion;
   int enable_overlay;
@@ -2682,12 +2691,12 @@
   GOLDEN_FRAME,
 };
 
-static INLINE int get_max_allowed_ref_frames(const AV1_COMP *cpi) {
+static INLINE int get_max_allowed_ref_frames(
+    int selective_ref_frame, unsigned int max_reference_frames) {
   const unsigned int max_allowed_refs_for_given_speed =
-      (cpi->sf.inter_sf.selective_ref_frame >= 3) ? INTER_REFS_PER_FRAME - 1
-                                                  : INTER_REFS_PER_FRAME;
-  return AOMMIN(max_allowed_refs_for_given_speed,
-                cpi->oxcf.max_reference_frames);
+      (selective_ref_frame >= 3) ? INTER_REFS_PER_FRAME - 1
+                                 : INTER_REFS_PER_FRAME;
+  return AOMMIN(max_allowed_refs_for_given_speed, max_reference_frames);
 }
 
 static const MV_REFERENCE_FRAME
@@ -2737,7 +2746,9 @@
     }
   }
 
-  const int max_allowed_refs = get_max_allowed_ref_frames(cpi);
+  const int max_allowed_refs =
+      get_max_allowed_ref_frames(cpi->sf.inter_sf.selective_ref_frame,
+                                 cpi->oxcf.ref_frm_cfg.max_reference_frames);
 
   for (int i = 0; i < 4 && total_valid_refs > max_allowed_refs; ++i) {
     const MV_REFERENCE_FRAME ref_frame_to_disable = disable_order[i];
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index cddd99c..ddb3cf7 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -3270,7 +3270,7 @@
     return;
   }
 
-  if ((!cpi->oxcf.enable_onesided_comp ||
+  if ((!cpi->oxcf.ref_frm_cfg.enable_onesided_comp ||
        cpi->sf.inter_sf.disable_onesided_comp) &&
       cpi->all_one_sided_refs) {
     return;
@@ -3659,7 +3659,7 @@
 
   if (sf->rt_sf.use_real_time_ref_set)
     ref_set = REF_SET_REALTIME;
-  else if (cpi->oxcf.enable_reduced_reference_set)
+  else if (cpi->oxcf.ref_frm_cfg.enable_reduced_reference_set)
     ref_set = REF_SET_REDUCED;
 
   default_skip_mask(mask, ref_set);
@@ -4078,7 +4078,7 @@
   }
 
   const int comp_pred = ref_frame[1] > INTRA_FRAME;
-  if ((!cpi->oxcf.enable_onesided_comp ||
+  if ((!cpi->oxcf.ref_frm_cfg.enable_onesided_comp ||
        cpi->sf.inter_sf.disable_onesided_comp) &&
       comp_pred && cpi->all_one_sided_refs) {
     return 1;