Fix tpl with non-subgop stackless reference mapping
Fixes remaining issues with reference frame mapping.
Neutral coding results on subgop enh and def,
and neutral coding results on default strategy without
subgop cfg.
BUGS=aomedia:2819
STATS_CHANGED
Change-Id: Id06194fd6428ae60e5af3ffd78abfb69e1317227
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index bae475f..4e0eaca 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -1273,13 +1273,14 @@
// Find which reference buffer should be left out of the named mapping.
// This is because there are 8 reference buffers and only 7 named slots.
static void set_unmapped_ref(RefBufMapData *buffer_map, int n_bufs,
- int min_level, int cur_frame_disp) {
+ int n_min_level_refs, int min_level,
+ int cur_frame_disp) {
int max_dist = 0;
int unmapped_idx = -1;
if (n_bufs <= ALTREF_FRAME) return;
for (int i = 0; i < n_bufs; i++) {
if (buffer_map[i].used) continue;
- if (buffer_map[i].pyr_level != min_level) {
+ if (buffer_map[i].pyr_level != min_level || n_bufs == n_min_level_refs) {
int dist = abs(cur_frame_disp - buffer_map[i].disp_order);
if (dist > max_dist) {
max_dist = dist;
@@ -1292,16 +1293,11 @@
}
static void get_ref_frames_subgop(
- AV1_COMP *const cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
+ AV1_COMP *const cpi, int cur_frame_disp,
+ RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
AV1_COMMON *cm = &cpi->common;
- GF_GROUP gf_group = cpi->gf_group;
int *const remapped_ref_idx = cm->remapped_ref_idx;
- // The current display index stored has not yet been updated. We must add
- // The order offset to get the correct value here.
- const int order_offset = gf_group.arf_src_offset[gf_group.index];
- const int cur_frame_disp =
- cpi->common.current_frame.frame_number + order_offset;
int buf_map_idx = 0;
// Initialize reference frame mappings
@@ -1371,7 +1367,8 @@
}
// Find the buffer to be excluded from the mapping
- set_unmapped_ref(buffer_map, n_bufs, min_level, cur_frame_disp);
+ set_unmapped_ref(buffer_map, n_bufs, n_min_level_refs, min_level,
+ cur_frame_disp);
// Map LAST3_FRAME
if (n_bufs >= ALTREF_FRAME) {
@@ -1436,12 +1433,12 @@
}
void av1_get_ref_frames(AV1_COMP *const cpi, RefBufferStack *ref_buffer_stack,
+ int cur_frame_disp,
RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
- if (use_subgop_cfg(&cpi->gf_group, cpi->gf_group.index)) {
- get_ref_frames_subgop(cpi, ref_frame_map_pairs);
- return;
- }
+ get_ref_frames_subgop(cpi, cur_frame_disp, ref_frame_map_pairs);
+ return;
+ // TODO(sarahparker) Delete this all with stack deletion
AV1_COMMON *cm = &cpi->common;
int *const remapped_ref_idx = cm->remapped_ref_idx;
int *const arf_stack = ref_buffer_stack->arf_stack;
@@ -1703,7 +1700,11 @@
const YV12_BUFFER_CONFIG *ref_frame_buf[INTER_REFS_PER_FRAME];
if (!ext_flags->refresh_frame.update_pending) {
- av1_get_ref_frames(cpi, &cpi->ref_buffer_stack, ref_frame_map_pairs);
+ const int order_offset = gf_group->arf_src_offset[gf_group->index];
+ const int cur_frame_disp =
+ cpi->common.current_frame.frame_number + order_offset;
+ av1_get_ref_frames(cpi, &cpi->ref_buffer_stack, cur_frame_disp,
+ ref_frame_map_pairs);
} else if (cpi->svc.external_ref_frame_config) {
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++)
cm->remapped_ref_idx[i] = cpi->svc.ref_idx[i];
diff --git a/av1/encoder/encode_strategy.h b/av1/encoder/encode_strategy.h
index e236fc5..0b6cb86 100644
--- a/av1/encoder/encode_strategy.h
+++ b/av1/encoder/encode_strategy.h
@@ -82,6 +82,7 @@
RefBufferStack *ref_buffer_stack);
void av1_get_ref_frames(AV1_COMP *const cpi, RefBufferStack *ref_buffer_stack,
+ int cur_frame_disp,
RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]);
int is_forced_keyframe_pending(struct lookahead_ctx *lookahead,
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 1bbe124..eaedcb3 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1028,9 +1028,10 @@
++process_frame_count;
}
- av1_get_ref_frames(cpi, &ref_buffer_stack, ref_frame_map_pairs);
const int true_disp =
- (int)(tpl_frame->frame_display_index) - frame_params.show_frame;
+ (int)(tpl_frame->frame_display_index) -
+ (gf_group->subgop_cfg != NULL && frame_params.show_frame);
+ av1_get_ref_frames(cpi, &ref_buffer_stack, true_disp, ref_frame_map_pairs);
int refresh_mask = av1_get_refresh_frame_flags(
cpi, &frame_params, frame_update_type, gf_index, true_disp,
ref_frame_map_pairs, &ref_buffer_stack);
@@ -1044,7 +1045,8 @@
ref_frame_map_pairs[refresh_frame_map_index].disp_order =
AOMMAX(0, true_disp);
ref_frame_map_pairs[refresh_frame_map_index].pyr_level =
- gf_group->layer_depth[gf_index];
+ get_true_pyr_level(gf_group->layer_depth[gf_index], true_disp,
+ cpi->gf_group.max_layer_depth);
}
for (int i = LAST_FRAME; i <= ALTREF_FRAME; ++i)
@@ -1100,13 +1102,14 @@
gf_group->update_type[gf_index] = LF_UPDATE;
gf_group->q_val[gf_index] = *pframe_qindex;
- av1_get_ref_frames(cpi, &ref_buffer_stack, ref_frame_map_pairs);
+ const int true_disp =
+ (int)(tpl_frame->frame_display_index) -
+ (gf_group->subgop_cfg != NULL && frame_params.show_frame);
+ av1_get_ref_frames(cpi, &ref_buffer_stack, true_disp, ref_frame_map_pairs);
// TODO(sarahparker) av1_get_refresh_frame_flags() and
// av1_update_ref_frame_map() will execute default behavior even when
// subgop cfg is enabled. This should be addressed if we ever remove the
// frame_update_type.
- const int true_disp =
- (int)(tpl_frame->frame_display_index) - frame_params.show_frame;
int refresh_mask = av1_get_refresh_frame_flags(
cpi, &frame_params, frame_update_type, -1, true_disp,
ref_frame_map_pairs, &ref_buffer_stack);
@@ -1118,7 +1121,8 @@
ref_frame_map_pairs[refresh_frame_map_index].disp_order =
AOMMAX(0, true_disp);
ref_frame_map_pairs[refresh_frame_map_index].pyr_level =
- gf_group->layer_depth[gf_index];
+ get_true_pyr_level(gf_group->layer_depth[gf_index], true_disp,
+ cpi->gf_group.max_layer_depth);
}
for (int i = LAST_FRAME; i <= ALTREF_FRAME; ++i)
@@ -1137,7 +1141,13 @@
++frame_display_index;
}
- av1_get_ref_frames(cpi, &cpi->ref_buffer_stack, ref_frame_map_pairs);
+ TplDepFrame *tpl_frame = &tpl_data->tpl_frame[cur_frame_idx];
+ const int true_disp =
+ (int)(tpl_frame->frame_display_index) -
+ (gf_group->subgop_cfg != NULL && init_frame_params->show_frame);
+ init_ref_map_pair(cpi, ref_frame_map_pairs);
+ av1_get_ref_frames(cpi, &cpi->ref_buffer_stack, true_disp,
+ ref_frame_map_pairs);
}
static AOM_INLINE void init_tpl_stats(TplParams *const tpl_data) {