summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorCheng Chen <chengchen@google.com>2022-06-06 16:46:55 -0700
committerCheng Chen <chengchen@google.com>2022-06-07 11:42:25 -0700
commit7b1b9f7cd23e085d97c26ed026d2c817d78a14d6 (patch)
tree05799aadc817f4244af4530fa0d064d8f7807b46 /test
parent7bb4bd36122e55236148190625507efc90ec5b75 (diff)
downloadlibvpx-7b1b9f7cd23e085d97c26ed026d2c817d78a14d6.tar
libvpx-7b1b9f7cd23e085d97c26ed026d2c817d78a14d6.tar.gz
libvpx-7b1b9f7cd23e085d97c26ed026d2c817d78a14d6.tar.bz2
libvpx-7b1b9f7cd23e085d97c26ed026d2c817d78a14d6.zip
L2E: Use libvpx's default q in case of invalid external value
If the external model recommends an invalid q value, we use the default q selected by libvpx's rate control strategy. We update the test so that when the external model wants to control GOP decision, it could get per frame information and just recommend an invalid q. Change-Id: I69be4b0ee0800e7ab0706d305242bb87f001b1f7
Diffstat (limited to 'test')
-rw-r--r--test/vp9_ext_ratectrl_test.cc79
1 files changed, 77 insertions, 2 deletions
diff --git a/test/vp9_ext_ratectrl_test.cc b/test/vp9_ext_ratectrl_test.cc
index a3af4e98f..66d423376 100644
--- a/test/vp9_ext_ratectrl_test.cc
+++ b/test/vp9_ext_ratectrl_test.cc
@@ -186,6 +186,81 @@ vpx_rc_status_t rc_get_encodeframe_decision(
return VPX_RC_OK;
}
+vpx_rc_status_t rc_get_encodeframe_decision_gop(
+ vpx_rc_model_t rate_ctrl_model,
+ const vpx_rc_encodeframe_info_t *encode_frame_info,
+ vpx_rc_encodeframe_decision_t *frame_decision) {
+ ToyRateCtrl *toy_rate_ctrl = static_cast<ToyRateCtrl *>(rate_ctrl_model);
+ EXPECT_EQ(toy_rate_ctrl->magic_number, kModelMagicNumber);
+ EXPECT_LT(encode_frame_info->show_index, kFrameNumGOP);
+ EXPECT_EQ(encode_frame_info->coding_index, toy_rate_ctrl->coding_index);
+
+ if (encode_frame_info->coding_index == 0) {
+ EXPECT_EQ(encode_frame_info->show_index, 0);
+ EXPECT_EQ(encode_frame_info->gop_index, 0);
+ EXPECT_EQ(encode_frame_info->frame_type, 0 /*kFrameTypeKey*/);
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
+ 0); // kRefFrameTypeLast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
+ 0); // kRefFrameTypePast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
+ 0); // kRefFrameTypeFuture
+ }
+
+ if (encode_frame_info->coding_index == 1) {
+ EXPECT_EQ(encode_frame_info->show_index, 1);
+ EXPECT_EQ(encode_frame_info->gop_index, 1);
+ EXPECT_EQ(encode_frame_info->frame_type, 1 /*kFrameTypeInter*/);
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
+ 1); // kRefFrameTypeLast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
+ 0); // kRefFrameTypePast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
+ 0); // kRefFrameTypeFuture
+ EXPECT_EQ(encode_frame_info->ref_frame_coding_indexes[0],
+ 0); // kRefFrameTypeLast
+ }
+
+ if (encode_frame_info->coding_index == 2) {
+ EXPECT_EQ(encode_frame_info->show_index, 2);
+ EXPECT_EQ(encode_frame_info->gop_index, 0);
+ EXPECT_EQ(encode_frame_info->frame_type, 0 /*kFrameTypeKey*/);
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
+ 0); // kRefFrameTypeLast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
+ 0); // kRefFrameTypePast
+ EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
+ 0); // kRefFrameTypeFuture
+ }
+
+ if (encode_frame_info->coding_index == 3 ||
+ encode_frame_info->coding_index == 12 ||
+ encode_frame_info->coding_index == 21) {
+ EXPECT_EQ(encode_frame_info->frame_type, 2 /*kFrameTypeAltRef*/);
+ EXPECT_EQ(encode_frame_info->gop_index, 1);
+ }
+
+ if (encode_frame_info->coding_index == 11 ||
+ encode_frame_info->coding_index == 20 ||
+ encode_frame_info->coding_index == 29) {
+ EXPECT_EQ(encode_frame_info->frame_type, 3 /*kFrameTypeOverlay*/);
+ EXPECT_EQ(encode_frame_info->gop_index, 0);
+ }
+
+ if (encode_frame_info->coding_index >= 30) {
+ EXPECT_EQ(encode_frame_info->frame_type, 1 /*kFrameTypeInter*/);
+ }
+
+ // When the model recommends an invalid q, valid range [0, 255],
+ // the encoder will ignore it and use the default q selected
+ // by libvpx rate control strategy.
+ frame_decision->q_index = VPX_DEFAULT_Q;
+ frame_decision->max_frame_size = 0;
+
+ toy_rate_ctrl->coding_index += 1;
+ return VPX_RC_OK;
+}
+
vpx_rc_status_t rc_get_gop_decision(vpx_rc_model_t rate_ctrl_model,
const vpx_rc_gop_info_t *gop_info,
vpx_rc_gop_decision_t *gop_decision) {
@@ -216,7 +291,6 @@ vpx_rc_status_t rc_get_gop_decision(vpx_rc_model_t rate_ctrl_model,
gop_decision->gop_coding_frames - gop_decision->use_alt_ref;
toy_rate_ctrl->show_index +=
gop_decision->gop_coding_frames - gop_decision->use_alt_ref;
- toy_rate_ctrl->coding_index += gop_decision->gop_coding_frames;
++toy_rate_ctrl->gop_global_index;
return VPX_RC_OK;
}
@@ -319,9 +393,10 @@ class ExtRateCtrlTestGOP : public ::libvpx_test::EncoderTest,
encoder->Control(VP9E_SET_MAX_GF_INTERVAL, kDefaultMaxGfInterval);
vpx_rc_funcs_t rc_funcs;
- rc_funcs.rc_type = VPX_RC_GOP;
+ rc_funcs.rc_type = VPX_RC_GOP_QP;
rc_funcs.create_model = rc_create_model_gop;
rc_funcs.send_firstpass_stats = rc_send_firstpass_stats_gop;
+ rc_funcs.get_encodeframe_decision = rc_get_encodeframe_decision_gop;
rc_funcs.get_gop_decision = rc_get_gop_decision;
rc_funcs.update_encodeframe_result = rc_update_encodeframe_result_gop;
rc_funcs.delete_model = rc_delete_model;