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 8164752..1de901a 100644 --- a/av1/encoder/gop_structure.c +++ b/av1/encoder/gop_structure.c
@@ -849,9 +849,13 @@ &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 @@ 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 be22b63..0dec565 100644 --- a/av1/encoder/pass2_strategy.c +++ b/av1/encoder/pass2_strategy.c
@@ -3857,6 +3857,14 @@ 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 c7a413e..57944d9 100644 --- a/test/ext_ratectrl_test.cc +++ b/test/ext_ratectrl_test.cc
@@ -92,26 +92,30 @@ 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.