Refactor get_ref_frame_flags()
Change-Id: Idfefd64c7d9adfe28293bb392e702d4378ba132d
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 6a05fd7..39bf26b 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -211,80 +211,41 @@
}
static int get_ref_frame_flags(const AV1_COMP *const cpi) {
+ static const MV_REFERENCE_FRAME
+ ref_frame_priority_order[INTER_REFS_PER_FRAME] = {
+ LAST_FRAME, ALTREF_FRAME, LAST2_FRAME, LAST3_FRAME,
+ GOLDEN_FRAME, BWDREF_FRAME, ALTREF2_FRAME,
+ };
const AV1_COMMON *const cm = &cpi->common;
-
- const RefCntBuffer *last_buf = get_ref_frame_buf(cm, LAST_FRAME);
- const RefCntBuffer *last2_buf = get_ref_frame_buf(cm, LAST2_FRAME);
- const RefCntBuffer *last3_buf = get_ref_frame_buf(cm, LAST3_FRAME);
- const RefCntBuffer *golden_buf = get_ref_frame_buf(cm, GOLDEN_FRAME);
- const RefCntBuffer *bwd_buf = get_ref_frame_buf(cm, BWDREF_FRAME);
- const RefCntBuffer *alt2_buf = get_ref_frame_buf(cm, ALTREF2_FRAME);
- const RefCntBuffer *alt_buf = get_ref_frame_buf(cm, ALTREF_FRAME);
-
- // No.1 Priority: LAST_FRAME
- const int last2_is_last = (last2_buf == last_buf);
- const int last3_is_last = (last3_buf == last_buf);
- const int gld_is_last = (golden_buf == last_buf);
- const int bwd_is_last = (bwd_buf == last_buf);
- const int alt2_is_last = (alt2_buf == last_buf);
- const int alt_is_last = (alt_buf == last_buf);
-
- // No.2 Priority: ALTREF_FRAME
- const int last2_is_alt = (last2_buf == alt_buf);
- const int last3_is_alt = (last3_buf == alt_buf);
- const int gld_is_alt = (golden_buf == alt_buf);
- const int bwd_is_alt = (bwd_buf == alt_buf);
- const int alt2_is_alt = (alt2_buf == alt_buf);
-
- // No.3 Priority: LAST2_FRAME
- const int last3_is_last2 = (last3_buf == last2_buf);
- const int gld_is_last2 = (golden_buf == last2_buf);
- const int bwd_is_last2 = (bwd_buf == last2_buf);
- const int alt2_is_last2 = (alt2_buf == last2_buf);
-
- // No.4 Priority: LAST3_FRAME
- const int gld_is_last3 = (golden_buf == last3_buf);
- const int bwd_is_last3 = (bwd_buf == last3_buf);
- const int alt2_is_last3 = (alt2_buf == last3_buf);
-
- // No.5 Priority: GOLDEN_FRAME
- const int bwd_is_gld = (bwd_buf == golden_buf);
- const int alt2_is_gld = (alt2_buf == golden_buf);
-
- // No.6 Priority: BWDREF_FRAME
- const int alt2_is_bwd = (alt2_buf == bwd_buf);
-
- // No.7 Priority: ALTREF2_FRAME
+ const RefCntBuffer *ref_frames[INTER_REFS_PER_FRAME];
+ for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
+ ref_frames[i] = get_ref_frame_buf(cm, ref_frame_priority_order[i]);
+ }
// cpi->ext_ref_frame_flags allows certain reference types to be disabled
// by the external interface. These are set by av1_apply_encoding_flags().
// Start with what the external interface allows, then suppress any reference
// types which we have found to be duplicates.
-
int flags = cpi->ext_ref_frame_flags;
- if (cpi->rc.frames_till_gf_update_due == INT_MAX) flags &= ~AOM_GOLD_FLAG;
-
- if (alt_is_last) flags &= ~AOM_ALT_FLAG;
-
- if (last2_is_last || last2_is_alt) flags &= ~AOM_LAST2_FLAG;
-
- if (last3_is_last || last3_is_alt || last3_is_last2) flags &= ~AOM_LAST3_FLAG;
-
- if (gld_is_last ||
- (!cpi->sf.use_fast_nonrd_pick_mode && (gld_is_last2 || gld_is_last3)))
- flags &= ~AOM_GOLD_FLAG;
-
- if (!cpi->sf.use_fast_nonrd_pick_mode && gld_is_alt) {
- flags &= ~AOM_GOLD_FLAG;
+ for (int i = 1; i < INTER_REFS_PER_FRAME; ++i) {
+ const RefCntBuffer *const this_ref = ref_frames[i];
+ // If this_ref has appeared before, mark the corresponding ref frame as
+ // invalid.
+ for (int j = 0; j < i; ++j) {
+ if (this_ref == ref_frames[j]) {
+ flags &= ~(1 << (ref_frame_priority_order[i] - 1));
+ break;
+ }
+ }
}
- if ((bwd_is_last || bwd_is_alt || bwd_is_last2 || bwd_is_last3 || bwd_is_gld))
- flags &= ~AOM_BWD_FLAG;
-
- if ((alt2_is_last || alt2_is_alt || alt2_is_last2 || alt2_is_last3 ||
- alt2_is_gld || alt2_is_bwd))
- flags &= ~AOM_ALT2_FLAG;
+ // For non-RD mode, only disable GOLDEN_FRAME if it's the same as LAST_FRAME.
+ if (cpi->sf.use_fast_nonrd_pick_mode) {
+ const RefCntBuffer *last_buf = get_ref_frame_buf(cm, LAST_FRAME);
+ const RefCntBuffer *golden_buf = get_ref_frame_buf(cm, GOLDEN_FRAME);
+ if (golden_buf != last_buf) flags |= (1 << GOLDEN_FRAME);
+ }
return flags;
}