Commit 4953015c6d for aom
commit 4953015c6d41f4dc890a8cd21478298b0fe5f4b0
Author: Jerome Jiang <jianj@google.com>
Date: Thu Jan 15 14:05:22 2026 -0500
ext rc: fix gop decision indices & show_frame
same variable means different things between libaom and
the external RC. Differences are explained in the comment.
Also override show_frame assignment.
Bug: 461792087
Change-Id: I1a34980bdf4773ec69b8f60b1a89e06aa6e31e08
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c
index 81647520d8..1de901a51b 100644
--- a/av1/encoder/gop_structure.c
+++ b/av1/encoder/gop_structure.c
@@ -849,9 +849,13 @@ static void construct_gop_structure_from_rc(
&rc_gop_decision->gop_frame_list[frame_index];
gf_group->update_type[frame_index] = gop_frame_rc->update_type;
gf_group->layer_depth[frame_index] = gop_frame_rc->layer_depth;
- gf_group->display_idx[frame_index] =
- gop_frame_rc->display_idx + rc_gop_decision->global_order_idx_offset;
gf_group->update_ref_idx[frame_index] = gop_frame_rc->update_ref_idx;
+ // `display_idx` means differently in libaom and RC.
+ // - in libaom: it is display order index in the GOP, equivalent to
+ // `order_idx` in RC
+ // - in RC: it is the number of display frames precedeing this frame, which
+ // is equivalent to `cur_frame_idx` in libaom.
+ gf_group->display_idx[frame_index] = gop_frame_rc->order_idx;
gf_group->cur_frame_idx[frame_index] = gop_frame_rc->display_idx;
switch (gf_group->update_type[frame_index]) {
case LF_UPDATE:
@@ -861,11 +865,10 @@ static void construct_gop_structure_from_rc(
case ARF_UPDATE:
case INTNL_ARF_UPDATE:
gf_group->arf_src_offset[frame_index] =
- gop_frame_rc->display_idx - frame_index;
+ gop_frame_rc->order_idx - frame_index;
break;
default: gf_group->arf_src_offset[frame_index] = 0;
}
- gf_group->cur_frame_idx[frame_index] = frame_index;
gf_group->frame_type[frame_index] =
gop_frame_rc->is_key_frame ? KEY_FRAME : INTER_FRAME;
gf_group->refbuf_state[frame_index] =
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index be22b63931..0dec565400 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -3857,6 +3857,14 @@ void av1_get_second_pass_params(AV1_COMP *cpi,
return;
}
+ if (cpi->ext_ratectrl.ready &&
+ (cpi->ext_ratectrl.funcs.rc_type & AOM_RC_GOP) != 0 &&
+ cpi->ext_ratectrl.funcs.get_gop_decision != NULL) {
+ frame_params->show_frame =
+ !(gf_group->update_type[cpi->gf_frame_index] == ARF_UPDATE ||
+ gf_group->update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE);
+ }
+
if (cpi->use_ducky_encode &&
cpi->ducky_encode_info.frame_info.gop_mode == DUCKY_ENCODE_GOP_MODE_RCL) {
frame_params->frame_type = gf_group->frame_type[cpi->gf_frame_index];
diff --git a/test/ext_ratectrl_test.cc b/test/ext_ratectrl_test.cc
index c7a413e508..57944d993f 100644
--- a/test/ext_ratectrl_test.cc
+++ b/test/ext_ratectrl_test.cc
@@ -92,26 +92,30 @@ aom_rc_status_t mock_get_gop_decision(aom_rc_model_t /*ratectrl_model*/,
current_gop_frame->layer_depth = 0;
current_gop_frame->display_idx = 0;
current_gop_frame->update_ref_idx = 0;
+ current_gop_frame->order_idx = 0;
} else {
current_gop_frame->is_key_frame = false;
if (i == 1) {
// ALTREF
current_gop_frame->update_type = AOM_RC_ARF_UPDATE;
current_gop_frame->layer_depth = 1;
- current_gop_frame->display_idx = 4;
+ current_gop_frame->display_idx = 1;
current_gop_frame->update_ref_idx = 1;
+ current_gop_frame->order_idx = 4;
} else if (i == 5) {
// Overlay frame
current_gop_frame->is_key_frame = false;
current_gop_frame->update_type = AOM_RC_OVERLAY_UPDATE;
current_gop_frame->layer_depth = AOM_RC_MAX_ARF_LAYERS - 1;
current_gop_frame->display_idx = 4;
+ current_gop_frame->order_idx = 4;
} else {
// Leaf frames
current_gop_frame->is_key_frame = false;
current_gop_frame->update_type = AOM_RC_LF_UPDATE;
current_gop_frame->layer_depth = AOM_RC_MAX_ARF_LAYERS - 1;
- current_gop_frame->display_idx = i - 2; // Key and ARF in the front
+ current_gop_frame->display_idx = i - 1; // Key in the front
+ current_gop_frame->order_idx = i - 1;
current_gop_frame->update_ref_idx = 2;
}
// For leaf and overlay frames, set ALTREF to buffer 1.