Commit f678accce1 for aom
commit f678accce1e499f39de1ead3ea8f7575462ba76c
Author: Bohan Li <bohanli@google.com>
Date: Tue May 26 11:47:19 2026 -0700
Fix external RC
- Use base qp for tpl collecting
- Save the correct MVs
- Calculate per-block rd mult correctly
Should not change libaom encoding stats
Change-Id: I5ddb3dd58b989d8a7343df6635b79cc8ba7d2b48
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index b4bc0148f2..8170c1d857 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -321,6 +321,10 @@ static inline void setup_delta_q(AV1_COMP *const cpi, ThreadData *td,
cpi->ext_ratectrl.funcs.get_encodeframe_decision != NULL &&
cpi->ext_ratectrl.sb_params_list != NULL) {
if (cpi->ext_ratectrl.use_delta_q) {
+ // Only used for per-coding-block RD mult calculation later.
+ current_qindex = av1_get_q_for_deltaq_objective(cpi, td, NULL, sb_size,
+ mi_row, mi_col);
+
const int q_index = cpi->ext_ratectrl.sb_params_list[sb_index].q_index;
if (q_index != AOM_DEFAULT_Q) {
current_qindex = q_index;
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 11f84ae91a..7f3bc97d7b 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1412,20 +1412,6 @@ static inline void init_mc_flow_dispenser(AV1_COMP *cpi, int frame_idx,
int base_qindex =
cpi->use_ducky_encode ? gf_group->q_val[frame_idx] : pframe_qindex;
- // Override QP decision with RC
- if (av1_use_tpl_for_extrc(&cpi->ext_ratectrl) &&
- cpi->ext_ratectrl.funcs.get_encodeframe_decision != NULL) {
- aom_rc_encodeframe_decision_t encode_frame_decision;
- encode_frame_decision.sb_params_list = NULL;
- // Even though delta Q is not used for TPL, this pointer still needs to be
- // set to avoid segfault.
- encode_frame_decision.use_delta_q = &cpi->ext_ratectrl.use_delta_q;
- if (av1_extrc_get_encodeframe_decision(&cpi->ext_ratectrl, frame_idx,
- &encode_frame_decision) ==
- AOM_CODEC_OK) {
- base_qindex = encode_frame_decision.q_index;
- }
- }
// Get rd multiplier set up.
rdmult = av1_compute_rd_mult(
base_qindex, cm->seq_params->bit_depth,
@@ -1504,19 +1490,23 @@ static void tpl_store_before_propagation(AV1_COMP *cpi,
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] =
- 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;
- tpl_block_stats->mv[ref].as_fullmv.col = src_stats->mv[ref].as_fullmv.col;
- tpl_block_stats->mv[ref].as_fullmv.row = src_stats->mv[ref].as_fullmv.row;
- tpl_block_stats->mv[ref].as_int = src_stats->mv[ref].as_int;
- tpl_block_stats->pred_error[ref] = src_stats->pred_error[ref];
+
+ for (int ref = 0; ref < 2; ++ref) {
+ const int ref_frame_index = src_stats->ref_frame_index[ref];
+ if (ref_frame_index < 0) {
+ tpl_block_stats->ref_frame_index[ref] = -1;
+ continue;
+ }
+ tpl_block_stats->ref_frame_index[ref] =
+ gf_group
+ ->ref_frame_list[tpl_data->frame_idx][LAST_FRAME + ref_frame_index];
+
+ const FULLPEL_MV full_mv =
+ get_fullmv_from_mv(&src_stats->mv[ref_frame_index].as_mv);
+
+ tpl_block_stats->mv[ref].as_mv.row = full_mv.row;
+ tpl_block_stats->mv[ref].as_mv.col = full_mv.col;
+ tpl_block_stats->pred_error[ref] = src_stats->pred_error[ref_frame_index];
}
}