Commit 4a29b01938 for aom

commit 4a29b019382bf1ea835637e1b45fda6d5ade80ff
Author: Bohan Li <bohanli@google.com>
Date:   Wed Mar 18 10:28:57 2026 -0700

    Fix tpl stored ref frame indices

    Some details on this:

    - gf_group->ref_frame_list stores the absolute slot idx from ext rc;

    And:

    - src_stats->ref_frame_index comes from best_rf_idx in function mode_estimation;
    - best_rf_idx was used to retrieve the ref like this:
        const YV12_BUFFER_CONFIG *ref_frame_ptr = tpl_data->src_ref_frame[rf_idx];
    - tpl_data->src_ref_frame[rf_idx] comes from tpl_data->tpl_frame[tpl_frame->ref_map_index[rf_idx]];
    - tpl_frame->ref_map_index[i - LAST_FRAME] = ref_picture_map[remapped_ref_idx[i- LAST_FRAME]];
    - ref_picture_map handles the map from ref slot idx to the actual frame idx in tpl
    - remapped_ref_idx[rf - LAST_FRAME] = gf_group.ref_frame_list[gf_index][rf];

    Therefore if a block has src_stats->ref_frame_index[i] == X, then that
    means it uses ref frame stored at
    tpl_data->tpl_frame[tpl_frame->ref_map_index[X]], which is
    tpl_data->tpl_frame[ref_picture_map[remapped_ref_idx[X]]], which is
    tpl_data->tpl_frame[ref_picture_map[gf_group.ref_frame_list[gf_index][X+LAST_FRAME]]],

    So that ultimately means if a block has src_stats->ref_frame_index[i] ==
    X, then it uses ref slot
    gf_group.ref_frame_list[gf_index][X+LAST_FRAME].

    Change-Id: I85f758da85575f2eeb00a75811118d0155462f0e

diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 5dcf47b6f5..0269f4351e 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1463,9 +1463,13 @@ static inline void init_mc_flow_dispenser(AV1_COMP *cpi, int frame_idx,
       gf_group->layer_depth[frame_idx] >= layer_depth_th;
 }

-static void tpl_store_before_propagation(AomTplBlockStats *tpl_block_stats,
+static void tpl_store_before_propagation(AV1_COMP *cpi,
+                                         AomTplBlockStats *tpl_block_stats,
                                          TplDepStats *src_stats, int mi_row,
                                          int mi_col) {
+  TplParams *const tpl_data = &cpi->ppi->tpl_data;
+  GF_GROUP *gf_group = &cpi->ppi->gf_group;
+
   tpl_block_stats->row = mi_row * MI_SIZE;
   tpl_block_stats->col = mi_col * MI_SIZE;
   tpl_block_stats->srcrf_sse = src_stats->srcrf_sse;
@@ -1490,8 +1494,12 @@ static void tpl_store_before_propagation(AomTplBlockStats *tpl_block_stats,
   tpl_block_stats->intra_rate = src_stats->intra_rate;
   tpl_block_stats->cmp_recrf_rate[0] = src_stats->cmp_recrf_rate[0];
   tpl_block_stats->cmp_recrf_rate[1] = src_stats->cmp_recrf_rate[1];
-  tpl_block_stats->ref_frame_index[0] = src_stats->ref_frame_index[0];
-  tpl_block_stats->ref_frame_index[1] = src_stats->ref_frame_index[1];
+  tpl_block_stats->ref_frame_index[0] =
+      gf_group->ref_frame_list[tpl_data->frame_idx]
+                              [LAST_FRAME + src_stats->ref_frame_index[0]];
+  tpl_block_stats->ref_frame_index[1] =
+      gf_group->ref_frame_list[tpl_data->frame_idx]
+                              [LAST_FRAME + src_stats->ref_frame_index[1]];
   for (int ref = 0; ref < AOM_RC_INTER_REFS_PER_FRAME; ++ref) {
     tpl_block_stats->mv[ref].as_mv.col = src_stats->mv[ref].as_mv.col;
     tpl_block_stats->mv[ref].as_mv.row = src_stats->mv[ref].as_mv.row;
@@ -1557,7 +1565,8 @@ void av1_mc_flow_dispenser_row(AV1_COMP *cpi, TplTxfmStats *tpl_txfm_stats,
       AomTplBlockStats *block_stats =
           &tpl_frame_stats_before_propagation
                ->block_stats_list[mi_row * tpl_frame->mi_cols + mi_col];
-      tpl_store_before_propagation(block_stats, &tpl_stats, mi_row, mi_col);
+      tpl_store_before_propagation(cpi, block_stats, &tpl_stats, mi_row,
+                                   mi_col);
     }

     (*tpl_row_mt->sync_write_ptr)(&tpl_data->tpl_mt_sync, tplb_row,