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.
#