Commit 3a9a298744 for aom
commit 3a9a298744acc08585775c3cb293d4bb5e093102
Author: Jerome Jiang <jianj@google.com>
Date: Tue Apr 7 14:47:41 2026 -0400
RC: Allocate the correct size of TPL blocks for RC
Previously the allocation use mi_rows and mi_cols, assuming width and
height in TPL frame are actual frame sizes. However, width and height in
TPL frame are actually in 16x16 block unit, which is the correct size to
allocate TPL block stats.
Change-Id: I9f0670b2336fd7b7b19fa40350a08665a63fc2ef
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 4266fca24f..d9ec993ed8 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1536,8 +1536,9 @@ void av1_mc_flow_dispenser_row(AV1_COMP *cpi, TplTxfmStats *tpl_txfm_stats,
const int tplb_cols_in_tile =
ROUND_POWER_OF_TWO(mi_params->mi_cols, mi_size_wide_log2[bsize]);
const int tplb_row = ROUND_POWER_OF_TWO(mi_row, mi_size_high_log2[bsize]);
- assert(mi_size_high[bsize] == (1 << tpl_data->tpl_stats_block_mis_log2));
- assert(mi_size_wide[bsize] == (1 << tpl_data->tpl_stats_block_mis_log2));
+ const int block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
+ assert(mi_size_high[bsize] == (1 << block_mis_log2));
+ assert(mi_size_wide[bsize] == (1 << block_mis_log2));
for (int mi_col = 0, tplb_col_in_tile = 0; mi_col < mi_params->mi_cols;
mi_col += mi_width, tplb_col_in_tile++) {
@@ -1567,14 +1568,15 @@ void av1_mc_flow_dispenser_row(AV1_COMP *cpi, TplTxfmStats *tpl_txfm_stats,
// Motion flow dependency dispenser.
tpl_model_store(tpl_frame->tpl_stats_ptr, mi_row, mi_col, tpl_frame->stride,
- &tpl_stats, tpl_data->tpl_stats_block_mis_log2);
+ &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];
+ const int block_index =
+ av1_tpl_ptr_pos(mi_row, mi_col, tpl_frame->width, block_mis_log2);
AomTplBlockStats *block_stats =
- &tpl_frame_stats_before_propagation
- ->block_stats_list[mi_row * tpl_frame->mi_cols + mi_col];
+ &tpl_frame_stats_before_propagation->block_stats_list[block_index];
tpl_store_before_propagation(cpi, block_stats, &tpl_stats, mi_row,
mi_col);
}
@@ -1994,15 +1996,15 @@ 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 mi_rows = tpl_stats->tpl_frame[frame_index].mi_rows;
- const int mi_cols = tpl_stats->tpl_frame[frame_index].mi_cols;
+ const int block_rows = tpl_stats->tpl_frame[frame_index].height;
+ const int block_cols = tpl_stats->tpl_frame[frame_index].width;
AomTplFrameStats *this_frame_stats =
&extrc_tpl_gop_stats->frame_stats_list[frame_index];
AOM_CHECK_MEM_ERROR(
error_info, this_frame_stats->block_stats_list,
- aom_calloc(mi_rows * mi_cols,
+ aom_calloc(block_rows * block_cols,
sizeof(*this_frame_stats->block_stats_list)));
- this_frame_stats->num_blocks = mi_rows * mi_cols;
+ this_frame_stats->num_blocks = block_rows * block_cols;
this_frame_stats->frame_width = frame_width;
this_frame_stats->frame_height = frame_height;
}
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index ba6fd9c3c4..a69bf46271 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -150,6 +150,7 @@ typedef struct TplDepFrame {
YV12_BUFFER_CONFIG *rec_picture;
int ref_map_index[REF_FRAMES];
int stride;
+ // width and height here is in the unit of 16x16 block.
int width;
int height;
int mi_rows;