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,