Remove old GOP structure.

BUG=aomedia:2346

Change-Id: I915d9581667d6935a0ce467fd31dd63136f3d7cf
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c
index cd6c382..f8d61ff 100644
--- a/av1/encoder/gop_structure.c
+++ b/av1/encoder/gop_structure.c
@@ -144,10 +144,6 @@
 #endif  // CHECK_GF_PARAMETER
 
 static INLINE int max_pyramid_height_from_width(int pyramid_width) {
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-  assert(pyramid_width <= MAX_GF_INTERVAL && pyramid_width >= MIN_GF_INTERVAL &&
-         "invalid gf interval for pyramid structure");
-#endif  // CONFIG_FLAT_GF_STRUCTURE_ALLOWED
   if (pyramid_width > 12) return 4;
   if (pyramid_width > 6) return 3;
   if (pyramid_width > 3) return 2;
@@ -186,8 +182,8 @@
   }
 }
 
-static void define_pyramid_gf_group_structure(
-    AV1_COMP *cpi, const EncodeFrameParams *const frame_params) {
+void av1_gop_setup_structure(AV1_COMP *cpi,
+                             const EncodeFrameParams *const frame_params) {
   RATE_CONTROL *const rc = &cpi->rc;
   TWO_PASS *const twopass = &cpi->twopass;
   GF_GROUP *const gf_group = &twopass->gf_group;
@@ -236,238 +232,7 @@
 #if CHECK_GF_PARAMETER
   check_frame_params(gf_group, rc->baseline_gf_interval, gf_update_frames);
 #endif
-}
-
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-
-static void define_flat_gf_group_structure(
-    AV1_COMP *cpi, const EncodeFrameParams *const frame_params) {
-  RATE_CONTROL *const rc = &cpi->rc;
-  TWO_PASS *const twopass = &cpi->twopass;
-  GF_GROUP *const gf_group = &twopass->gf_group;
-  int i;
-  int frame_index = 0;
-  const int key_frame = frame_params->frame_type == KEY_FRAME;
-
-  // The use of bi-predictive frames are only enabled when following 3
-  // conditions are met:
-  // (1) ALTREF is enabled;
-  // (2) The bi-predictive group interval is at least 2; and
-  // (3) The bi-predictive group interval is strictly smaller than the
-  //     golden group interval.
-  const int is_bipred_enabled =
-      cpi->extra_arf_allowed && rc->source_alt_ref_pending &&
-      rc->bipred_group_interval &&
-      rc->bipred_group_interval <=
-          (rc->baseline_gf_interval - rc->source_alt_ref_pending);
-  int bipred_group_end = 0;
-  int bipred_frame_index = 0;
-
-  const unsigned char ext_arf_interval =
-      (unsigned char)(rc->baseline_gf_interval / (cpi->num_extra_arfs + 1) - 1);
-  int which_arf = cpi->num_extra_arfs;
-  int subgroup_interval[MAX_EXT_ARFS + 1];
-  int is_sg_bipred_enabled = is_bipred_enabled;
-  int accumulative_subgroup_interval = 0;
-
-  // For key frames the frame target rate is already set and it
-  // is also the golden frame.
-  // === [frame_index == 0] ===
-  if (!key_frame) {
-    if (rc->source_alt_ref_active) {
-      gf_group->update_type[frame_index] = OVERLAY_UPDATE;
-      gf_group->rf_level[frame_index] = INTER_NORMAL;
-    } else {
-      gf_group->update_type[frame_index] = GF_UPDATE;
-      gf_group->rf_level[frame_index] = GF_ARF_STD;
-    }
-    gf_group->arf_update_idx[frame_index] = 0;
-  }
-
-  gf_group->brf_src_offset[frame_index] = 0;
-
-  frame_index++;
-
-  bipred_frame_index++;
-
-  // === [frame_index == 1] ===
-  if (rc->source_alt_ref_pending) {
-    gf_group->update_type[frame_index] = ARF_UPDATE;
-    gf_group->rf_level[frame_index] = GF_ARF_STD;
-    gf_group->arf_src_offset[frame_index] =
-        (unsigned char)(rc->baseline_gf_interval - 1);
-
-    gf_group->arf_update_idx[frame_index] = 0;
-
-    gf_group->brf_src_offset[frame_index] = 0;
-    // NOTE: "bidir_pred_frame_index" stays unchanged for ARF_UPDATE frames.
-
-    // Work out the ARFs' positions in this gf group
-    // NOTE(weitinglin): ALT_REFs' are indexed inversely, but coded in display
-    // order (except for the original ARF). In the example of three ALT_REF's,
-    // We index ALTREF's as: KEY ----- ALT2 ----- ALT1 ----- ALT0
-    // but code them in the following order:
-    // KEY-ALT0-ALT2 ----- OVERLAY2-ALT1 ----- OVERLAY1 ----- OVERLAY0
-    //
-    // arf_pos_for_ovrly[]: Position for OVERLAY
-    // arf_pos_in_gf[]:     Position for ALTREF
-    cpi->arf_pos_for_ovrly[0] = frame_index + cpi->num_extra_arfs +
-                                gf_group->arf_src_offset[frame_index] + 1;
-    for (i = 0; i < cpi->num_extra_arfs; ++i) {
-      cpi->arf_pos_for_ovrly[i + 1] =
-          frame_index + (cpi->num_extra_arfs - i) * (ext_arf_interval + 2);
-      subgroup_interval[i] = cpi->arf_pos_for_ovrly[i] -
-                             cpi->arf_pos_for_ovrly[i + 1] - (i == 0 ? 1 : 2);
-    }
-    subgroup_interval[cpi->num_extra_arfs] =
-        cpi->arf_pos_for_ovrly[cpi->num_extra_arfs] - frame_index -
-        (cpi->num_extra_arfs == 0 ? 1 : 2);
-
-    ++frame_index;
-
-    // Insert an extra ARF
-    // === [frame_index == 2] ===
-    if (cpi->num_extra_arfs) {
-      gf_group->update_type[frame_index] = INTNL_ARF_UPDATE;
-      gf_group->rf_level[frame_index] = GF_ARF_LOW;
-      gf_group->arf_src_offset[frame_index] = ext_arf_interval;
-
-      gf_group->arf_update_idx[frame_index] = which_arf;
-      ++frame_index;
-    }
-    accumulative_subgroup_interval += subgroup_interval[cpi->num_extra_arfs];
-  }
-
-  const int normal_frames =
-      rc->baseline_gf_interval - (key_frame || rc->source_alt_ref_pending);
-
-  for (i = 0; i < normal_frames; ++i) {
-    gf_group->arf_update_idx[frame_index] = which_arf;
-
-    // If we are going to have ARFs, check whether we can have BWDREF in this
-    // subgroup, and further, whether we can have ARF subgroup which contains
-    // the BWDREF subgroup but contained within the GF group:
-    //
-    // GF group --> ARF subgroup --> BWDREF subgroup
-    if (rc->source_alt_ref_pending) {
-      is_sg_bipred_enabled =
-          is_bipred_enabled &&
-          (subgroup_interval[which_arf] > rc->bipred_group_interval);
-    }
-
-    // NOTE: BIDIR_PRED is only enabled when the length of the bi-predictive
-    //       frame group interval is strictly smaller than that of the GOLDEN
-    //       FRAME group interval.
-    // TODO(zoeliu): Currently BIDIR_PRED is only enabled when alt-ref is on.
-    if (is_sg_bipred_enabled && !bipred_group_end) {
-      const int cur_brf_src_offset = rc->bipred_group_interval - 1;
-
-      if (bipred_frame_index == 1) {
-        // --- BRF_UPDATE ---
-        gf_group->update_type[frame_index] = BRF_UPDATE;
-        gf_group->rf_level[frame_index] = GF_ARF_LOW;
-        gf_group->brf_src_offset[frame_index] = cur_brf_src_offset;
-      } else if (bipred_frame_index == rc->bipred_group_interval) {
-        // --- LAST_BIPRED_UPDATE ---
-        gf_group->update_type[frame_index] = LAST_BIPRED_UPDATE;
-        gf_group->rf_level[frame_index] = INTER_NORMAL;
-        gf_group->brf_src_offset[frame_index] = 0;
-
-        // Reset the bi-predictive frame index.
-        bipred_frame_index = 0;
-      } else {
-        // --- BIPRED_UPDATE ---
-        gf_group->update_type[frame_index] = BIPRED_UPDATE;
-        gf_group->rf_level[frame_index] = INTER_NORMAL;
-        gf_group->brf_src_offset[frame_index] = 0;
-      }
-
-      bipred_frame_index++;
-      // Check whether the next bi-predictive frame group would entirely be
-      // included within the current golden frame group.
-      // In addition, we need to avoid coding a BRF right before an ARF.
-      if (bipred_frame_index == 1 &&
-          (i + 2 + cur_brf_src_offset) >= accumulative_subgroup_interval) {
-        bipred_group_end = 1;
-      }
-    } else {
-      gf_group->update_type[frame_index] = LF_UPDATE;
-      gf_group->rf_level[frame_index] = INTER_NORMAL;
-      gf_group->brf_src_offset[frame_index] = 0;
-    }
-
-    ++frame_index;
-
-    // Check if we need to update the ARF.
-    if (is_sg_bipred_enabled && cpi->num_extra_arfs && which_arf > 0 &&
-        frame_index > cpi->arf_pos_for_ovrly[which_arf]) {
-      --which_arf;
-      accumulative_subgroup_interval += subgroup_interval[which_arf] + 1;
-
-      // Meet the new subgroup; Reset the bipred_group_end flag.
-      bipred_group_end = 0;
-      // Insert another extra ARF after the overlay frame
-      if (which_arf) {
-        gf_group->update_type[frame_index] = INTNL_ARF_UPDATE;
-        gf_group->rf_level[frame_index] = GF_ARF_LOW;
-        gf_group->arf_src_offset[frame_index] = ext_arf_interval;
-
-        gf_group->arf_update_idx[frame_index] = which_arf;
-        ++frame_index;
-      }
-    }
-  }
-
-  // NOTE: We need to configure the frame at the end of the sequence + 1 that
-  //       will be the start frame for the next group. Otherwise prior to the
-  //       call to av1_get_second_pass_params() the data will be undefined.
-  gf_group->arf_update_idx[frame_index] = 0;
-
-  if (rc->source_alt_ref_pending) {
-    gf_group->update_type[frame_index] = OVERLAY_UPDATE;
-    gf_group->rf_level[frame_index] = INTER_NORMAL;
-
-    cpi->arf_pos_in_gf[0] = 1;
-    if (cpi->num_extra_arfs) {
-      // Overwrite the update_type for extra-ARF's corresponding internal
-      // OVERLAY's: Change from LF_UPDATE to INTNL_OVERLAY_UPDATE.
-      for (i = cpi->num_extra_arfs; i > 0; --i) {
-        cpi->arf_pos_in_gf[i] =
-            (i == cpi->num_extra_arfs ? 2 : cpi->arf_pos_for_ovrly[i + 1] + 1);
-
-        gf_group->update_type[cpi->arf_pos_for_ovrly[i]] = INTNL_OVERLAY_UPDATE;
-        gf_group->rf_level[cpi->arf_pos_for_ovrly[i]] = INTER_NORMAL;
-      }
-    }
-  } else {
-    gf_group->update_type[frame_index] = GF_UPDATE;
-    gf_group->rf_level[frame_index] = GF_ARF_STD;
-  }
-
-  gf_group->brf_src_offset[frame_index] = 0;
-}
-
-#endif  // CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-
-void av1_gop_setup_structure(AV1_COMP *cpi,
-                             const EncodeFrameParams *const frame_params) {
-  // Decide whether to use a flat or pyramid structure for this GF
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-  const RATE_CONTROL *const rc = &cpi->rc;
-  const int max_pyr_height = cpi->oxcf.gf_max_pyr_height;
-  const int valid_pyramid_gf_length =
-      max_pyr_height >= MIN_PYRAMID_LVL && max_pyr_height <= MAX_PYRAMID_LVL &&
-      rc->baseline_gf_interval >= MIN_GF_INTERVAL &&
-      rc->baseline_gf_interval <= get_max_gf_length(max_pyr_height) &&
-      rc->source_alt_ref_pending && cpi->extra_arf_allowed > 0;
-  if (valid_pyramid_gf_length) {
-#endif  // ALWAYS_USE_PYRAMID_STRUCTURE
-    define_pyramid_gf_group_structure(cpi, frame_params);
-    cpi->new_bwdref_update_rule = 1;
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-  } else {
-    define_flat_gf_group_structure(cpi, frame_params);
-    cpi->new_bwdref_update_rule = 0;
-  }
-#endif  // CONFIG_FLAT_GF_STRUCTURE_ALLOWED
+  // TODO(urvang): Remove 'new_bwdref_update_rule' and other code related to
+  // the old GOP structure.
+  cpi->new_bwdref_update_rule = 1;
 }
diff --git a/av1/encoder/gop_structure.h b/av1/encoder/gop_structure.h
index 63db06f..79be636 100644
--- a/av1/encoder/gop_structure.h
+++ b/av1/encoder/gop_structure.h
@@ -19,29 +19,6 @@
 extern "C" {
 #endif
 
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-// Given the maximum allowed height of the pyramid structure, return the maximum
-// GF length supported by the same.
-static INLINE int get_max_gf_length(int max_pyr_height) {
-  // We allow a frame to have at most two left/right descendants before changing
-  // them into to a subtree, i.e., we allow the following structure:
-  /*                    OUT_OF_ORDER_FRAME
-                       / /              \ \
-  (two left children) F F                F F (two right children) */
-  // For example, the max gf size supported by 4 layer structure is:
-  // 1 (KEY/OVERLAY) + 1 + 2 + 4 + 16 (two children on both side of their
-  // parent)
-  switch (max_pyr_height) {
-    case 2: return 6;   // = 1 (KEY/OVERLAY) + 1 + 4
-    case 3: return 12;  // = 1 (KEY/OVERLAY) + 1 + 2 + 8
-    case 4: return 24;  // = 1 (KEY/OVERLAY) + 1 + 2 + 4 + 16
-    case 1:
-      return MAX_GF_INTERVAL;  // Special case: uses the old pyramid structure.
-    default: assert(0 && "Invalid max_pyr_height"); return -1;
-  }
-}
-#endif  // CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-
 struct AV1_COMP;
 struct EncodeFrameParams;
 
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 82b7dca..a40b5b2 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -741,13 +741,8 @@
 // Given the maximum allowed height of the pyramid structure, return the fixed
 // GF length to be used.
 static INLINE int get_fixed_gf_length(int max_pyr_height) {
-#if CONFIG_FLAT_GF_STRUCTURE_ALLOWED
-  const int max_gf_length_allowed = get_max_gf_length(max_pyr_height);
-  return AOMMIN(max_gf_length_allowed, MAX_GF_INTERVAL);
-#else
   (void)max_pyr_height;
   return MAX_GF_INTERVAL;
-#endif  // CONFIG_FLAT_GF_STRUCTURE_ALLOWED
 }
 
 // Returns true if KF group and GF group both are almost completely static.
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index 94e342b..f498acd 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -133,12 +133,6 @@
                    "Collect stats on partition decisions.")
 set_aom_config_var(CONFIG_COLLECT_COMPONENT_TIMING 0 NUMBER
                    "Collect encoding component timing information.")
-
-# TODO(urvang): Consider removing flat GF structure if and when pyramid
-# structure is generic enough to handle all cases, and performs equally well /
-# better.
-set_aom_config_var(CONFIG_FLAT_GF_STRUCTURE_ALLOWED 0 NUMBER
-                   "AV1 experiment flag.")
 #
 # Variables in this section control optional features of the build system.
 #