Remove LAST_REF_FRAMES enum value.
It's clearer to use LAST3_FRAME directly instead.
Also, some related cleanup / comments.
BUG=aomedia:2230
Change-Id: I11a0520fdea31f88b756e44d4a873885a6a0e370
diff --git a/av1/common/enums.h b/av1/common/enums.h
index 298ba88..be6d7a6 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -557,9 +557,6 @@
// - updated from ALTREF2_FRAME ref (see rshift_bwd_ref_frames()).
EXTREF_FRAME = REF_FRAMES,
- // Number of LAST* reference types.
- LAST_REF_FRAMES = LAST3_FRAME - LAST_FRAME + 1,
-
// Number of inter (non-intra) reference types.
INTER_REFS_PER_FRAME = ALTREF_FRAME - LAST_FRAME + 1,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 626b5b7..ab41354 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2222,7 +2222,7 @@
// shifted and become the new virtual indexes for LAST2_FRAME and
// LAST3_FRAME.
refresh_mask |=
- (cpi->refresh_last_frame << cpi->remapped_ref_idx[LAST_REF_FRAMES - 1]);
+ (cpi->refresh_last_frame << cpi->remapped_ref_idx[LAST3_FRAME - 1]);
#if USE_SYMM_MULTI_LAYER
refresh_mask |= (cpi->new_bwdref_update_rule == 1)
? (cpi->refresh_bwd_ref_frame
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 7b91720..43218b4 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3425,16 +3425,14 @@
// when the LAST_FRAME is updated.
static INLINE void shift_last_ref_frames(AV1_COMP *cpi) {
// TODO(isbs): shift the scaled indices as well
- int ref_frame;
- for (ref_frame = LAST_REF_FRAMES - 1; ref_frame > 0; --ref_frame) {
- cpi->remapped_ref_idx[ref_frame] = cpi->remapped_ref_idx[ref_frame - 1];
+ for (int ref_frame = LAST3_FRAME; ref_frame > LAST_FRAME; --ref_frame) {
+ const int ref_idx = ref_frame - LAST_FRAME;
+ cpi->remapped_ref_idx[ref_idx] = cpi->remapped_ref_idx[ref_idx - 1];
- // [0] is allocated to the current coded frame. The statistics for the
- // reference frames start at [LAST_FRAME], i.e. [1].
if (!cpi->rc.is_src_frame_alt_ref) {
- memcpy(cpi->interp_filter_selected[ref_frame + LAST_FRAME],
- cpi->interp_filter_selected[ref_frame - 1 + LAST_FRAME],
- sizeof(cpi->interp_filter_selected[ref_frame - 1 + LAST_FRAME]));
+ memcpy(cpi->interp_filter_selected[ref_frame],
+ cpi->interp_filter_selected[ref_frame - 1],
+ sizeof(cpi->interp_filter_selected[ref_frame - 1]));
}
}
}
@@ -3568,7 +3566,7 @@
// Deal with the special case for showing existing internal ALTREF_FRAME
// Refresh the LAST_FRAME with the ALTREF_FRAME and retire the LAST3_FRAME
// by updating the virtual indices.
- const int tmp = cpi->remapped_ref_idx[LAST_REF_FRAMES - 1];
+ const int last3_remapped_idx = cpi->remapped_ref_idx[LAST3_FRAME - 1];
shift_last_ref_frames(cpi);
cpi->remapped_ref_idx[LAST_FRAME - 1] =
@@ -3582,10 +3580,10 @@
lshift_bwd_ref_frames(cpi);
// pass outdated forward reference frame (previous LAST3) to the
// spared space
- cpi->remapped_ref_idx[EXTREF_FRAME - 1] = tmp;
+ cpi->remapped_ref_idx[EXTREF_FRAME - 1] = last3_remapped_idx;
} else {
#endif
- cpi->remapped_ref_idx[bwdref_to_show - 1] = tmp;
+ cpi->remapped_ref_idx[bwdref_to_show - 1] = last3_remapped_idx;
#if USE_SYMM_MULTI_LAYER
}
#endif
@@ -3685,17 +3683,15 @@
// | | |
// v v v
// remapped_ref_idx[2], remapped_ref_idx[0], remapped_ref_idx[1]
- int tmp;
-
assign_frame_buffer(
pool->frame_bufs,
- &cm->ref_frame_map[cpi->remapped_ref_idx[LAST_REF_FRAMES - 1]],
+ &cm->ref_frame_map[cpi->remapped_ref_idx[LAST3_FRAME - 1]],
cm->new_fb_idx);
- tmp = cpi->remapped_ref_idx[LAST_REF_FRAMES - 1];
+ int last3_remapped_idx = cpi->remapped_ref_idx[LAST3_FRAME - 1];
shift_last_ref_frames(cpi);
- cpi->remapped_ref_idx[0] = tmp;
+ cpi->remapped_ref_idx[LAST_FRAME - 1] = last3_remapped_idx;
assert(!encode_show_existing_frame(cm));
memcpy(cpi->interp_filter_selected[LAST_FRAME],
@@ -3718,11 +3714,12 @@
// virtual index reshuffling for BWDREF, the encoder always
// specifies a LAST_BIPRED right before BWDREF and completes the
// reshuffling job accordingly.
- tmp = cpi->remapped_ref_idx[LAST_REF_FRAMES - 1];
+ last3_remapped_idx = cpi->remapped_ref_idx[LAST3_FRAME - 1];
shift_last_ref_frames(cpi);
- cpi->remapped_ref_idx[0] = cpi->remapped_ref_idx[BWDREF_FRAME - 1];
- cpi->remapped_ref_idx[BWDREF_FRAME - 1] = tmp;
+ cpi->remapped_ref_idx[LAST_FRAME - 1] =
+ cpi->remapped_ref_idx[BWDREF_FRAME - 1];
+ cpi->remapped_ref_idx[BWDREF_FRAME - 1] = last3_remapped_idx;
memcpy(cpi->interp_filter_selected[LAST_FRAME],
cpi->interp_filter_selected[BWDREF_FRAME],
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f7747e0..ea7d03a 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -707,9 +707,10 @@
RATE_CONTROL rc;
double framerate;
- // NOTE(zoeliu): Any inter frame allows maximum of REF_FRAMES inter
- // references; Plus the currently coded frame itself, it is needed to allocate
- // sufficient space to the size of the maximum possible number of frames.
+ // Relevant for an inter frame.
+ // - Index '0' corresponds to the values for the currently coded frame.
+ // - Indices 1 ... REF_FRAMES are used to store values for all the possible
+ // reference frames.
int interp_filter_selected[REF_FRAMES + 1][SWITCHABLE];
struct aom_codec_pkt_list *output_pkt_list;