Adjust init_ref_map_pair to help find free index
This moves the functionality previously in
get_free_ref_map_index to init_ref_map_pair in order to
build a correct reference map for the TPL model.
BUG=aomedia:2864
Change-Id: I5ff45dc480a8d94b7e92a2f2a9da2646695c5624
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 40573f6..5d08d3d 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -853,23 +853,9 @@
return;
}
-static int get_free_ref_map_index(const AV1_COMMON *const cm) {
- for (int idx = 0; idx < REF_FRAMES - 1; ++idx) {
- // Get reference frame buffer
- const RefCntBuffer *const buf = cm->ref_frame_map[idx];
- if (buf == NULL) return idx;
- // Once the keyframe is coded, the slots in ref_frame_map will all
- // point to the same frame. In that case, all subsequent pointers
- // matching the current are considered "free" slots. This will find
- // the next occurance of the current pointer if ref_count indicates
- // there are multiple instances of it.
- if (buf->ref_count > 1) {
- for (int idx2 = idx + 1; idx2 < REF_FRAMES; ++idx2) {
- const RefCntBuffer *const buf2 = cm->ref_frame_map[idx2];
- if (buf2 == buf) return idx2;
- }
- }
- }
+static int get_free_ref_map_index(RefFrameMapPair ref_map_pairs[REF_FRAMES]) {
+ for (int idx = 0; idx < REF_FRAMES; ++idx)
+ if (ref_map_pairs[idx].disp_order == -1) return idx;
return INVALID_IDX;
}
@@ -1032,7 +1018,7 @@
}
// Search for the open slot to store the current frame.
- int free_fb_index = get_free_ref_map_index(cm);
+ int free_fb_index = get_free_ref_map_index(ref_frame_map_pairs);
if (use_subgop_cfg(&cpi->gf_group, gf_index)) {
return get_refresh_frame_flags_subgop_cfg(cpi, gf_index, cur_disp_order,
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index c37a8a4..4cdeb91 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -2839,14 +2839,31 @@
static INLINE void init_ref_map_pair(
AV1_COMP *cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
- memset(ref_frame_map_pairs, -1, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
+ memset(ref_frame_map_pairs, 0, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
for (int map_idx = 0; map_idx < REF_FRAMES; map_idx++) {
// Get reference frame buffer
const RefCntBuffer *const buf = cpi->common.ref_frame_map[map_idx];
- if (buf == NULL) continue;
+ if (ref_frame_map_pairs[map_idx].disp_order == -1) continue;
+ if (buf == NULL) {
+ ref_frame_map_pairs[map_idx].disp_order = -1;
+ ref_frame_map_pairs[map_idx].pyr_level = -1;
+ continue;
+ } else if (buf->ref_count > 1) {
+ // Once the keyframe is coded, the slots in ref_frame_map will all
+ // point to the same frame. In that case, all subsequent pointers
+ // matching the current are considered "free" slots. This will find
+ // the next occurance of the current pointer if ref_count indicates
+ // there are multiple instances of it and mark it as free.
+ for (int idx2 = map_idx + 1; idx2 < REF_FRAMES; ++idx2) {
+ const RefCntBuffer *const buf2 = cpi->common.ref_frame_map[idx2];
+ if (buf2 == buf) {
+ ref_frame_map_pairs[idx2].disp_order = -1;
+ ref_frame_map_pairs[idx2].pyr_level = -1;
+ }
+ }
+ }
ref_frame_map_pairs[map_idx].disp_order = (int)buf->display_order_hint;
- const int reference_frame_level = buf->pyramid_level;
- ref_frame_map_pairs[map_idx].pyr_level = reference_frame_level;
+ ref_frame_map_pairs[map_idx].pyr_level = buf->pyramid_level;
}
}