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) {