Commit 9acf475fe0 for aom

commit 9acf475fe072c3a3a19c283713d3f9b66aedfff1
Author: Jerome Jiang <jianj@google.com>
Date:   Tue May 26 13:24:30 2026 -0400

    RC: Use MI grid dimensions for TPL block stats.

    The TPL block stats array indexing and initialization now use
    dimensions from CommonModeInfoParams (mi_rows/mi_cols) instead of
    tpl_frame dimensions or a custom helper function, ensuring
    consistency with the MI grid.

    Change-Id: Ie33ad0fb3202c0f00a78ce9411e4d56187d70d87

diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index d9ec993ed8..11f84ae91a 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1540,6 +1540,16 @@ void av1_mc_flow_dispenser_row(AV1_COMP *cpi, TplTxfmStats *tpl_txfm_stats,
   assert(mi_size_high[bsize] == (1 << block_mis_log2));
   assert(mi_size_wide[bsize] == (1 << block_mis_log2));

+  const int use_extrc = av1_use_tpl_for_extrc(&cpi->ext_ratectrl);
+  AomTplFrameStats *tpl_frame_stats_before_propagation = NULL;
+  int cols = 0;
+  if (use_extrc) {
+    tpl_frame_stats_before_propagation =
+        &cpi->extrc_tpl_gop_stats.frame_stats_list[tpl_data->frame_idx];
+    const int mi_to_blocks = 1 << block_mis_log2;
+    cols = (mi_params->mi_cols + mi_to_blocks - 1) / mi_to_blocks;
+  }
+
   for (int mi_col = 0, tplb_col_in_tile = 0; mi_col < mi_params->mi_cols;
        mi_col += mi_width, tplb_col_in_tile++) {
     (*tpl_row_mt->sync_read_ptr)(&tpl_data->tpl_mt_sync, tplb_row,
@@ -1570,11 +1580,10 @@ void av1_mc_flow_dispenser_row(AV1_COMP *cpi, TplTxfmStats *tpl_txfm_stats,
     tpl_model_store(tpl_frame->tpl_stats_ptr, mi_row, mi_col, tpl_frame->stride,
                     &tpl_stats, block_mis_log2);

-    if (av1_use_tpl_for_extrc(&cpi->ext_ratectrl)) {
-      AomTplFrameStats *tpl_frame_stats_before_propagation =
-          &cpi->extrc_tpl_gop_stats.frame_stats_list[tpl_data->frame_idx];
+    if (use_extrc) {
       const int block_index =
-          av1_tpl_ptr_pos(mi_row, mi_col, tpl_frame->width, block_mis_log2);
+          av1_tpl_ptr_pos(mi_row, mi_col, cols, block_mis_log2);
+      assert(block_index < tpl_frame_stats_before_propagation->num_blocks);
       AomTplBlockStats *block_stats =
           &tpl_frame_stats_before_propagation->block_stats_list[block_index];
       tpl_store_before_propagation(cpi, block_stats, &tpl_stats, mi_row,
@@ -1986,6 +1995,7 @@ void av1_free_tpl_gop_stats(AomTplGopStats *extrc_tpl_gop_stats) {
 }

 static void init_tpl_stats_before_propagation(
+    CommonModeInfoParams *const mi_params,
     struct aom_internal_error_info *error_info,
     AomTplGopStats *extrc_tpl_gop_stats, TplParams *tpl_stats,
     int tpl_gop_frames, int frame_width, int frame_height) {
@@ -1996,8 +2006,12 @@ static void init_tpl_stats_before_propagation(
                  sizeof(*extrc_tpl_gop_stats->frame_stats_list)));
   extrc_tpl_gop_stats->size = tpl_gop_frames;
   for (int frame_index = 0; frame_index < tpl_gop_frames; ++frame_index) {
-    const int block_rows = tpl_stats->tpl_frame[frame_index].height;
-    const int block_cols = tpl_stats->tpl_frame[frame_index].width;
+    const int block_mis_log2 = tpl_stats->tpl_stats_block_mis_log2;
+    const int mi_to_blocks = 1 << block_mis_log2;
+    const int block_rows =
+        (mi_params->mi_rows + mi_to_blocks - 1) / mi_to_blocks;
+    const int block_cols =
+        (mi_params->mi_cols + mi_to_blocks - 1) / mi_to_blocks;
     AomTplFrameStats *this_frame_stats =
         &extrc_tpl_gop_stats->frame_stats_list[frame_index];
     AOM_CHECK_MEM_ERROR(
@@ -2083,7 +2097,7 @@ int av1_tpl_setup_stats(AV1_COMP *cpi, int gop_eval,

   if (av1_use_tpl_for_extrc(&cpi->ext_ratectrl)) {
     init_tpl_stats_before_propagation(
-        cpi->common.error, &cpi->extrc_tpl_gop_stats, tpl_data,
+        &cm->mi_params, cpi->common.error, &cpi->extrc_tpl_gop_stats, tpl_data,
         tpl_gf_group_frames, cpi->common.width, cpi->common.height);
   }