xref: /aosp_15_r20/external/libaom/test/ratectrl_rtc_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2021, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker 
12*77c1e3ccSAndroid Build Coastguard Worker #include "av1/ratectrl_rtc.h"
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker #include <memory>
15*77c1e3ccSAndroid Build Coastguard Worker 
16*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*77c1e3ccSAndroid Build Coastguard Worker #include "test/codec_factory.h"
18*77c1e3ccSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
19*77c1e3ccSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
20*77c1e3ccSAndroid Build Coastguard Worker #include "test/util.h"
21*77c1e3ccSAndroid Build Coastguard Worker 
22*77c1e3ccSAndroid Build Coastguard Worker namespace {
23*77c1e3ccSAndroid Build Coastguard Worker 
24*77c1e3ccSAndroid Build Coastguard Worker constexpr size_t kNumFrames = 450;
25*77c1e3ccSAndroid Build Coastguard Worker 
26*77c1e3ccSAndroid Build Coastguard Worker const int kTemporalId3Layer[4] = { 0, 2, 1, 2 };
27*77c1e3ccSAndroid Build Coastguard Worker const int kTemporalId2Layer[2] = { 0, 1 };
28*77c1e3ccSAndroid Build Coastguard Worker const int kTemporalRateAllocation3Layer[3] = { 50, 70, 100 };
29*77c1e3ccSAndroid Build Coastguard Worker const int kTemporalRateAllocation2Layer[2] = { 60, 100 };
30*77c1e3ccSAndroid Build Coastguard Worker const int kSpatialLayerBitrate[3] = { 200, 500, 900 };
31*77c1e3ccSAndroid Build Coastguard Worker 
32*77c1e3ccSAndroid Build Coastguard Worker // Parameter: aq mode: 0 and 3
33*77c1e3ccSAndroid Build Coastguard Worker class RcInterfaceTest : public ::libaom_test::EncoderTest,
34*77c1e3ccSAndroid Build Coastguard Worker                         public ::libaom_test::CodecTestWithParam<int> {
35*77c1e3ccSAndroid Build Coastguard Worker  public:
RcInterfaceTest()36*77c1e3ccSAndroid Build Coastguard Worker   RcInterfaceTest()
37*77c1e3ccSAndroid Build Coastguard Worker       : EncoderTest(GET_PARAM(0)), aq_mode_(GET_PARAM(1)), key_interval_(3000),
38*77c1e3ccSAndroid Build Coastguard Worker         encoder_exit_(false), layer_frame_cnt_(0), superframe_cnt_(0),
39*77c1e3ccSAndroid Build Coastguard Worker         frame_cnt_(0), dynamic_temporal_layers_(false),
40*77c1e3ccSAndroid Build Coastguard Worker         dynamic_spatial_layers_(false), num_drops_(0), max_consec_drop_ms_(0),
41*77c1e3ccSAndroid Build Coastguard Worker         frame_drop_thresh_(0) {
42*77c1e3ccSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
43*77c1e3ccSAndroid Build Coastguard Worker     memset(&layer_id_, 0, sizeof(layer_id_));
44*77c1e3ccSAndroid Build Coastguard Worker   }
45*77c1e3ccSAndroid Build Coastguard Worker 
46*77c1e3ccSAndroid Build Coastguard Worker   ~RcInterfaceTest() override = default;
47*77c1e3ccSAndroid Build Coastguard Worker 
48*77c1e3ccSAndroid Build Coastguard Worker  protected:
SetUp()49*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override { InitializeConfig(::libaom_test::kRealTime); }
50*77c1e3ccSAndroid Build Coastguard Worker 
GetNumSpatialLayers()51*77c1e3ccSAndroid Build Coastguard Worker   int GetNumSpatialLayers() override { return rc_cfg_.ss_number_layers; }
52*77c1e3ccSAndroid Build Coastguard Worker 
PreEncodeFrameHook(libaom_test::VideoSource * video,libaom_test::Encoder * encoder)53*77c1e3ccSAndroid Build Coastguard Worker   void PreEncodeFrameHook(libaom_test::VideoSource *video,
54*77c1e3ccSAndroid Build Coastguard Worker                           libaom_test::Encoder *encoder) override {
55*77c1e3ccSAndroid Build Coastguard Worker     int key_int = key_interval_;
56*77c1e3ccSAndroid Build Coastguard Worker     const int use_svc =
57*77c1e3ccSAndroid Build Coastguard Worker         rc_cfg_.ss_number_layers > 1 || rc_cfg_.ts_number_layers > 1;
58*77c1e3ccSAndroid Build Coastguard Worker     encoder->Control(AV1E_SET_RTC_EXTERNAL_RC, 1);
59*77c1e3ccSAndroid Build Coastguard Worker     if (video->frame() == 0 && layer_frame_cnt_ == 0) {
60*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AOME_SET_CPUUSED, 7);
61*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AV1E_SET_AQ_MODE, aq_mode_);
62*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AV1E_SET_ENABLE_ORDER_HINT, 0);
63*77c1e3ccSAndroid Build Coastguard Worker       if (rc_cfg_.is_screen) {
64*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN);
65*77c1e3ccSAndroid Build Coastguard Worker       } else {
66*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_DEFAULT);
67*77c1e3ccSAndroid Build Coastguard Worker       }
68*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AOME_SET_MAX_INTRA_BITRATE_PCT,
69*77c1e3ccSAndroid Build Coastguard Worker                        rc_cfg_.max_intra_bitrate_pct);
70*77c1e3ccSAndroid Build Coastguard Worker       if (use_svc) encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
71*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR,
72*77c1e3ccSAndroid Build Coastguard Worker                        max_consec_drop_ms_);
73*77c1e3ccSAndroid Build Coastguard Worker     }
74*77c1e3ccSAndroid Build Coastguard Worker     // SVC specific settings
75*77c1e3ccSAndroid Build Coastguard Worker     if (use_svc) {
76*77c1e3ccSAndroid Build Coastguard Worker       frame_params_.spatial_layer_id =
77*77c1e3ccSAndroid Build Coastguard Worker           layer_frame_cnt_ % rc_cfg_.ss_number_layers;
78*77c1e3ccSAndroid Build Coastguard Worker       if (rc_cfg_.ts_number_layers == 3)
79*77c1e3ccSAndroid Build Coastguard Worker         frame_params_.temporal_layer_id =
80*77c1e3ccSAndroid Build Coastguard Worker             kTemporalId3Layer[superframe_cnt_ % 4];
81*77c1e3ccSAndroid Build Coastguard Worker       else if (rc_cfg_.ts_number_layers == 2)
82*77c1e3ccSAndroid Build Coastguard Worker         frame_params_.temporal_layer_id =
83*77c1e3ccSAndroid Build Coastguard Worker             kTemporalId2Layer[superframe_cnt_ % 2];
84*77c1e3ccSAndroid Build Coastguard Worker       else
85*77c1e3ccSAndroid Build Coastguard Worker         frame_params_.temporal_layer_id = 0;
86*77c1e3ccSAndroid Build Coastguard Worker       layer_id_.spatial_layer_id = frame_params_.spatial_layer_id;
87*77c1e3ccSAndroid Build Coastguard Worker       layer_id_.temporal_layer_id = frame_params_.temporal_layer_id;
88*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AV1E_SET_SVC_LAYER_ID, &layer_id_);
89*77c1e3ccSAndroid Build Coastguard Worker       key_int = key_interval_ * rc_cfg_.ss_number_layers;
90*77c1e3ccSAndroid Build Coastguard Worker     }
91*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.frame_type =
92*77c1e3ccSAndroid Build Coastguard Worker         layer_frame_cnt_ % key_int == 0 ? aom::kKeyFrame : aom::kInterFrame;
93*77c1e3ccSAndroid Build Coastguard Worker     encoder_exit_ = video->frame() == kNumFrames;
94*77c1e3ccSAndroid Build Coastguard Worker     frame_flags_ = 0;
95*77c1e3ccSAndroid Build Coastguard Worker 
96*77c1e3ccSAndroid Build Coastguard Worker     if (dynamic_temporal_layers_) {
97*77c1e3ccSAndroid Build Coastguard Worker       if (superframe_cnt_ == 100 && layer_id_.spatial_layer_id == 0) {
98*77c1e3ccSAndroid Build Coastguard Worker         // Go down to 2 temporal layers.
99*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(3, 2);
100*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
101*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
102*77c1e3ccSAndroid Build Coastguard Worker       } else if (superframe_cnt_ == 200 && layer_id_.spatial_layer_id == 0) {
103*77c1e3ccSAndroid Build Coastguard Worker         // Go down to 1 temporal layer.
104*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(3, 1);
105*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
106*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
107*77c1e3ccSAndroid Build Coastguard Worker       } else if (superframe_cnt_ == 300 && layer_id_.spatial_layer_id == 0) {
108*77c1e3ccSAndroid Build Coastguard Worker         // Go back up to 3 temporal layers.
109*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(3, 3);
110*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
111*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
112*77c1e3ccSAndroid Build Coastguard Worker       }
113*77c1e3ccSAndroid Build Coastguard Worker     } else if (dynamic_spatial_layers_) {
114*77c1e3ccSAndroid Build Coastguard Worker       // In this example the #spatial layers is modified on the fly,
115*77c1e3ccSAndroid Build Coastguard Worker       // so we go from (120p,240p,480p) to (240p,480p), etc.
116*77c1e3ccSAndroid Build Coastguard Worker       if (superframe_cnt_ == 100 && layer_id_.spatial_layer_id == 0) {
117*77c1e3ccSAndroid Build Coastguard Worker         // Change to 2 spatial layers (240p, 480p).
118*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(2, 3);
119*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
120*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
121*77c1e3ccSAndroid Build Coastguard Worker       } else if (superframe_cnt_ == 200 && layer_id_.spatial_layer_id == 0) {
122*77c1e3ccSAndroid Build Coastguard Worker         // Change to 1 spatial layer (480p).
123*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(1, 3);
124*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
125*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
126*77c1e3ccSAndroid Build Coastguard Worker       } else if (superframe_cnt_ == 300 && layer_id_.spatial_layer_id == 0) {
127*77c1e3ccSAndroid Build Coastguard Worker         // Go back to 3 spatial layers (120p, 240p, 480p).
128*77c1e3ccSAndroid Build Coastguard Worker         SetConfigSvc(3, 3);
129*77c1e3ccSAndroid Build Coastguard Worker         encoder->Control(AV1E_SET_SVC_PARAMS, &svc_params_);
130*77c1e3ccSAndroid Build Coastguard Worker         // In the fixed SVC mode (which is what is used in this test):
131*77c1e3ccSAndroid Build Coastguard Worker         // Key frame is required here on SL0 since 120p will try to predict
132*77c1e3ccSAndroid Build Coastguard Worker         // from LAST which was the 480p, so decoder will throw an error
133*77c1e3ccSAndroid Build Coastguard Worker         // (reference must be smaller than 4x4). In the flexible mode
134*77c1e3ccSAndroid Build Coastguard Worker         // (not used here) we can set the frame flags to predict off the 2x2
135*77c1e3ccSAndroid Build Coastguard Worker         // reference instead,
136*77c1e3ccSAndroid Build Coastguard Worker         frame_flags_ = AOM_EFLAG_FORCE_KF;
137*77c1e3ccSAndroid Build Coastguard Worker         frame_params_.frame_type = aom::kKeyFrame;
138*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_TRUE(rc_api_->UpdateRateControl(rc_cfg_));
139*77c1e3ccSAndroid Build Coastguard Worker       }
140*77c1e3ccSAndroid Build Coastguard Worker     }
141*77c1e3ccSAndroid Build Coastguard Worker     // TODO(marpan): Add dynamic spatial layers based on 0 layer bitrate.
142*77c1e3ccSAndroid Build Coastguard Worker     // That is actual usage in SW where configuration (#spatial, #temporal)
143*77c1e3ccSAndroid Build Coastguard Worker     // layers is fixed, but top layer is dropped or re-enabled based on
144*77c1e3ccSAndroid Build Coastguard Worker     // bitrate. This requires external RC to handle dropped (zero-size) frames.
145*77c1e3ccSAndroid Build Coastguard Worker   }
146*77c1e3ccSAndroid Build Coastguard Worker 
PostEncodeFrameHook(::libaom_test::Encoder * encoder)147*77c1e3ccSAndroid Build Coastguard Worker   void PostEncodeFrameHook(::libaom_test::Encoder *encoder) override {
148*77c1e3ccSAndroid Build Coastguard Worker     if (encoder_exit_) {
149*77c1e3ccSAndroid Build Coastguard Worker       return;
150*77c1e3ccSAndroid Build Coastguard Worker     }
151*77c1e3ccSAndroid Build Coastguard Worker     layer_frame_cnt_++;
152*77c1e3ccSAndroid Build Coastguard Worker     frame_cnt_++;
153*77c1e3ccSAndroid Build Coastguard Worker     if (layer_id_.spatial_layer_id == rc_cfg_.ss_number_layers - 1)
154*77c1e3ccSAndroid Build Coastguard Worker       superframe_cnt_++;
155*77c1e3ccSAndroid Build Coastguard Worker     int qp;
156*77c1e3ccSAndroid Build Coastguard Worker     encoder->Control(AOME_GET_LAST_QUANTIZER, &qp);
157*77c1e3ccSAndroid Build Coastguard Worker     if (rc_api_->ComputeQP(frame_params_) == aom::FrameDropDecision::kOk) {
158*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_EQ(rc_api_->GetQP(), qp) << "at frame " << frame_cnt_ - 1;
159*77c1e3ccSAndroid Build Coastguard Worker       int encoder_lpf_level;
160*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AOME_GET_LOOPFILTER_LEVEL, &encoder_lpf_level);
161*77c1e3ccSAndroid Build Coastguard Worker       aom::AV1LoopfilterLevel loopfilter_level = rc_api_->GetLoopfilterLevel();
162*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_EQ(loopfilter_level.filter_level[0], encoder_lpf_level);
163*77c1e3ccSAndroid Build Coastguard Worker       aom::AV1CdefInfo cdef_level = rc_api_->GetCdefInfo();
164*77c1e3ccSAndroid Build Coastguard Worker       int cdef_y_strengths[16];
165*77c1e3ccSAndroid Build Coastguard Worker       encoder->Control(AV1E_GET_LUMA_CDEF_STRENGTH, cdef_y_strengths);
166*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_EQ(cdef_level.cdef_strength_y, cdef_y_strengths[0]);
167*77c1e3ccSAndroid Build Coastguard Worker     } else {
168*77c1e3ccSAndroid Build Coastguard Worker       num_drops_++;
169*77c1e3ccSAndroid Build Coastguard Worker     }
170*77c1e3ccSAndroid Build Coastguard Worker   }
171*77c1e3ccSAndroid Build Coastguard Worker 
FramePktHook(const aom_codec_cx_pkt_t * pkt)172*77c1e3ccSAndroid Build Coastguard Worker   void FramePktHook(const aom_codec_cx_pkt_t *pkt) override {
173*77c1e3ccSAndroid Build Coastguard Worker     if (layer_id_.spatial_layer_id == 0)
174*77c1e3ccSAndroid Build Coastguard Worker       rc_api_->PostEncodeUpdate(pkt->data.frame.sz - 2);
175*77c1e3ccSAndroid Build Coastguard Worker     else
176*77c1e3ccSAndroid Build Coastguard Worker       rc_api_->PostEncodeUpdate(pkt->data.frame.sz);
177*77c1e3ccSAndroid Build Coastguard Worker   }
178*77c1e3ccSAndroid Build Coastguard Worker 
MismatchHook(const aom_image_t * img1,const aom_image_t * img2)179*77c1e3ccSAndroid Build Coastguard Worker   void MismatchHook(const aom_image_t *img1, const aom_image_t *img2) override {
180*77c1e3ccSAndroid Build Coastguard Worker     (void)img1;
181*77c1e3ccSAndroid Build Coastguard Worker     (void)img2;
182*77c1e3ccSAndroid Build Coastguard Worker   }
183*77c1e3ccSAndroid Build Coastguard Worker 
RunOneLayer()184*77c1e3ccSAndroid Build Coastguard Worker   void RunOneLayer() {
185*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
186*77c1e3ccSAndroid Build Coastguard Worker     SetConfig();
187*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
188*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
189*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
190*77c1e3ccSAndroid Build Coastguard Worker 
191*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
192*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
193*77c1e3ccSAndroid Build Coastguard Worker 
194*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
195*77c1e3ccSAndroid Build Coastguard Worker   }
196*77c1e3ccSAndroid Build Coastguard Worker 
RunOneLayerScreen()197*77c1e3ccSAndroid Build Coastguard Worker   void RunOneLayerScreen() {
198*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
199*77c1e3ccSAndroid Build Coastguard Worker     SetConfig();
200*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.is_screen = true;
201*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.width = 352;
202*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.height = 288;
203*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
204*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
205*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
206*77c1e3ccSAndroid Build Coastguard Worker 
207*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
208*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
209*77c1e3ccSAndroid Build Coastguard Worker 
210*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
211*77c1e3ccSAndroid Build Coastguard Worker   }
212*77c1e3ccSAndroid Build Coastguard Worker 
RunOneLayerDropFramesCBR()213*77c1e3ccSAndroid Build Coastguard Worker   void RunOneLayerDropFramesCBR() {
214*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
215*77c1e3ccSAndroid Build Coastguard Worker     max_consec_drop_ms_ = 250;
216*77c1e3ccSAndroid Build Coastguard Worker     frame_drop_thresh_ = 30;
217*77c1e3ccSAndroid Build Coastguard Worker     SetConfig();
218*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.target_bandwidth = 100;
219*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 100;
220*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_quantizer = 50;
221*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 50;
222*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
223*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
224*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
225*77c1e3ccSAndroid Build Coastguard Worker 
226*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
227*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
228*77c1e3ccSAndroid Build Coastguard Worker 
229*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
230*77c1e3ccSAndroid Build Coastguard Worker     // Check that some frames were dropped, otherwise test has no value.
231*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(num_drops_, 1);
232*77c1e3ccSAndroid Build Coastguard Worker   }
233*77c1e3ccSAndroid Build Coastguard Worker 
RunOneLayerPeriodicKey()234*77c1e3ccSAndroid Build Coastguard Worker   void RunOneLayerPeriodicKey() {
235*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 100;
236*77c1e3ccSAndroid Build Coastguard Worker     SetConfig();
237*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
238*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
239*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
240*77c1e3ccSAndroid Build Coastguard Worker 
241*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
242*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
243*77c1e3ccSAndroid Build Coastguard Worker 
244*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
245*77c1e3ccSAndroid Build Coastguard Worker   }
246*77c1e3ccSAndroid Build Coastguard Worker 
RunSvc()247*77c1e3ccSAndroid Build Coastguard Worker   void RunSvc() {
248*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
249*77c1e3ccSAndroid Build Coastguard Worker     SetConfigSvc(3, 3);
250*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
251*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
252*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
253*77c1e3ccSAndroid Build Coastguard Worker 
254*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
255*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
256*77c1e3ccSAndroid Build Coastguard Worker 
257*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
258*77c1e3ccSAndroid Build Coastguard Worker   }
259*77c1e3ccSAndroid Build Coastguard Worker 
RunSvcPeriodicKey()260*77c1e3ccSAndroid Build Coastguard Worker   void RunSvcPeriodicKey() {
261*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 100;
262*77c1e3ccSAndroid Build Coastguard Worker     SetConfigSvc(3, 3);
263*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
264*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
265*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
266*77c1e3ccSAndroid Build Coastguard Worker 
267*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
268*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
269*77c1e3ccSAndroid Build Coastguard Worker 
270*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
271*77c1e3ccSAndroid Build Coastguard Worker   }
272*77c1e3ccSAndroid Build Coastguard Worker 
RunSvcDynamicTemporal()273*77c1e3ccSAndroid Build Coastguard Worker   void RunSvcDynamicTemporal() {
274*77c1e3ccSAndroid Build Coastguard Worker     dynamic_temporal_layers_ = true;
275*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
276*77c1e3ccSAndroid Build Coastguard Worker     SetConfigSvc(3, 3);
277*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
278*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
279*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
280*77c1e3ccSAndroid Build Coastguard Worker 
281*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
282*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
283*77c1e3ccSAndroid Build Coastguard Worker 
284*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
285*77c1e3ccSAndroid Build Coastguard Worker   }
286*77c1e3ccSAndroid Build Coastguard Worker 
RunSvcDynamicSpatial()287*77c1e3ccSAndroid Build Coastguard Worker   void RunSvcDynamicSpatial() {
288*77c1e3ccSAndroid Build Coastguard Worker     dynamic_spatial_layers_ = true;
289*77c1e3ccSAndroid Build Coastguard Worker     key_interval_ = 10000;
290*77c1e3ccSAndroid Build Coastguard Worker     SetConfigSvc(3, 3);
291*77c1e3ccSAndroid Build Coastguard Worker     rc_api_ = aom::AV1RateControlRTC::Create(rc_cfg_);
292*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.spatial_layer_id = 0;
293*77c1e3ccSAndroid Build Coastguard Worker     frame_params_.temporal_layer_id = 0;
294*77c1e3ccSAndroid Build Coastguard Worker 
295*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
296*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, kNumFrames);
297*77c1e3ccSAndroid Build Coastguard Worker 
298*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
299*77c1e3ccSAndroid Build Coastguard Worker   }
300*77c1e3ccSAndroid Build Coastguard Worker 
301*77c1e3ccSAndroid Build Coastguard Worker  private:
SetConfig()302*77c1e3ccSAndroid Build Coastguard Worker   void SetConfig() {
303*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.width = 640;
304*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.height = 480;
305*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_quantizer = 52;
306*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.min_quantizer = 2;
307*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.target_bandwidth = 1000;
308*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_initial_sz = 600;
309*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_optimal_sz = 600;
310*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_sz = 1000;
311*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.undershoot_pct = 50;
312*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.overshoot_pct = 50;
313*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_intra_bitrate_pct = 1000;
314*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.framerate = 30.0;
315*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.ss_number_layers = 1;
316*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.ts_number_layers = 1;
317*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.scaling_factor_num[0] = 1;
318*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.scaling_factor_den[0] = 1;
319*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.layer_target_bitrate[0] = 1000;
320*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_quantizers[0] = 52;
321*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.min_quantizers[0] = 2;
322*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.aq_mode = aq_mode_;
323*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.frame_drop_thresh = frame_drop_thresh_;
324*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_consec_drop_ms = max_consec_drop_ms_;
325*77c1e3ccSAndroid Build Coastguard Worker 
326*77c1e3ccSAndroid Build Coastguard Worker     // Encoder settings for ground truth.
327*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_w = 640;
328*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_h = 480;
329*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 50;
330*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_overshoot_pct = 50;
331*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 600;
332*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 600;
333*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
334*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
335*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
336*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 52;
337*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
338*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
339*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 0;
340*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 1000;
341*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_min_dist = key_interval_;
342*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = key_interval_;
343*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = frame_drop_thresh_;
344*77c1e3ccSAndroid Build Coastguard Worker   }
345*77c1e3ccSAndroid Build Coastguard Worker 
SetConfigSvc(int number_spatial_layers,int number_temporal_layers)346*77c1e3ccSAndroid Build Coastguard Worker   void SetConfigSvc(int number_spatial_layers, int number_temporal_layers) {
347*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.width = 640;
348*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.height = 480;
349*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_quantizer = 56;
350*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.min_quantizer = 2;
351*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_initial_sz = 600;
352*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_optimal_sz = 600;
353*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.buf_sz = 1000;
354*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.undershoot_pct = 50;
355*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.overshoot_pct = 50;
356*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.max_intra_bitrate_pct = 1000;
357*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.framerate = 30.0;
358*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.aq_mode = aq_mode_;
359*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.ss_number_layers = number_spatial_layers;
360*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.ts_number_layers = number_temporal_layers;
361*77c1e3ccSAndroid Build Coastguard Worker 
362*77c1e3ccSAndroid Build Coastguard Worker     // Encoder settings for ground truth.
363*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_w = 640;
364*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_h = 480;
365*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
366*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
367*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 600;
368*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 600;
369*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
370*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_overshoot_pct = 50;
371*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 50;
372*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_threads = 1;
373*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_min_dist = key_interval_;
374*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = key_interval_;
375*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_timebase.num = 1;
376*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_timebase.den = 30;
377*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
378*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
379*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 0;
380*77c1e3ccSAndroid Build Coastguard Worker     svc_params_.number_spatial_layers = number_spatial_layers;
381*77c1e3ccSAndroid Build Coastguard Worker     svc_params_.number_temporal_layers = number_temporal_layers;
382*77c1e3ccSAndroid Build Coastguard Worker 
383*77c1e3ccSAndroid Build Coastguard Worker     // Scale factors.
384*77c1e3ccSAndroid Build Coastguard Worker     if (number_spatial_layers == 3) {
385*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[0] = 1;
386*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[0] = 4;
387*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[1] = 2;
388*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[1] = 4;
389*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[2] = 4;
390*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[2] = 4;
391*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[0] = 1;
392*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[0] = 4;
393*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[1] = 2;
394*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[1] = 4;
395*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[2] = 4;
396*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[2] = 4;
397*77c1e3ccSAndroid Build Coastguard Worker     } else if (number_spatial_layers == 2) {
398*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[0] = 1;
399*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[0] = 2;
400*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[1] = 2;
401*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[1] = 2;
402*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[0] = 1;
403*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[0] = 2;
404*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[1] = 2;
405*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[1] = 2;
406*77c1e3ccSAndroid Build Coastguard Worker     } else if (number_spatial_layers == 1) {
407*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_num[0] = 1;
408*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.scaling_factor_den[0] = 1;
409*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_num[0] = 1;
410*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.scaling_factor_den[0] = 1;
411*77c1e3ccSAndroid Build Coastguard Worker     }
412*77c1e3ccSAndroid Build Coastguard Worker 
413*77c1e3ccSAndroid Build Coastguard Worker     // TS rate decimator.
414*77c1e3ccSAndroid Build Coastguard Worker     if (number_temporal_layers == 3) {
415*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[0] = 4;
416*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[1] = 2;
417*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[2] = 1;
418*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[0] = 4;
419*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[1] = 2;
420*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[2] = 1;
421*77c1e3ccSAndroid Build Coastguard Worker     } else if (number_temporal_layers == 2) {
422*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[0] = 2;
423*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[1] = 1;
424*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[0] = 2;
425*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[1] = 1;
426*77c1e3ccSAndroid Build Coastguard Worker     } else if (number_temporal_layers == 1) {
427*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.ts_rate_decimator[0] = 1;
428*77c1e3ccSAndroid Build Coastguard Worker       svc_params_.framerate_factor[0] = 1;
429*77c1e3ccSAndroid Build Coastguard Worker     }
430*77c1e3ccSAndroid Build Coastguard Worker 
431*77c1e3ccSAndroid Build Coastguard Worker     // Bitate.
432*77c1e3ccSAndroid Build Coastguard Worker     rc_cfg_.target_bandwidth = 0;
433*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 0;
434*77c1e3ccSAndroid Build Coastguard Worker     for (int sl = 0; sl < number_spatial_layers; sl++) {
435*77c1e3ccSAndroid Build Coastguard Worker       int spatial_bitrate = 0;
436*77c1e3ccSAndroid Build Coastguard Worker       if (number_spatial_layers <= 3)
437*77c1e3ccSAndroid Build Coastguard Worker         spatial_bitrate = kSpatialLayerBitrate[sl];
438*77c1e3ccSAndroid Build Coastguard Worker       for (int tl = 0; tl < number_temporal_layers; tl++) {
439*77c1e3ccSAndroid Build Coastguard Worker         int layer = sl * number_temporal_layers + tl;
440*77c1e3ccSAndroid Build Coastguard Worker         if (number_temporal_layers == 3) {
441*77c1e3ccSAndroid Build Coastguard Worker           rc_cfg_.layer_target_bitrate[layer] =
442*77c1e3ccSAndroid Build Coastguard Worker               kTemporalRateAllocation3Layer[tl] * spatial_bitrate / 100;
443*77c1e3ccSAndroid Build Coastguard Worker           svc_params_.layer_target_bitrate[layer] =
444*77c1e3ccSAndroid Build Coastguard Worker               kTemporalRateAllocation3Layer[tl] * spatial_bitrate / 100;
445*77c1e3ccSAndroid Build Coastguard Worker         } else if (number_temporal_layers == 2) {
446*77c1e3ccSAndroid Build Coastguard Worker           rc_cfg_.layer_target_bitrate[layer] =
447*77c1e3ccSAndroid Build Coastguard Worker               kTemporalRateAllocation2Layer[tl] * spatial_bitrate / 100;
448*77c1e3ccSAndroid Build Coastguard Worker           svc_params_.layer_target_bitrate[layer] =
449*77c1e3ccSAndroid Build Coastguard Worker               kTemporalRateAllocation2Layer[tl] * spatial_bitrate / 100;
450*77c1e3ccSAndroid Build Coastguard Worker         } else if (number_temporal_layers == 1) {
451*77c1e3ccSAndroid Build Coastguard Worker           rc_cfg_.layer_target_bitrate[layer] = spatial_bitrate;
452*77c1e3ccSAndroid Build Coastguard Worker           svc_params_.layer_target_bitrate[layer] = spatial_bitrate;
453*77c1e3ccSAndroid Build Coastguard Worker         }
454*77c1e3ccSAndroid Build Coastguard Worker       }
455*77c1e3ccSAndroid Build Coastguard Worker       rc_cfg_.target_bandwidth += spatial_bitrate;
456*77c1e3ccSAndroid Build Coastguard Worker       cfg_.rc_target_bitrate += spatial_bitrate;
457*77c1e3ccSAndroid Build Coastguard Worker     }
458*77c1e3ccSAndroid Build Coastguard Worker 
459*77c1e3ccSAndroid Build Coastguard Worker     // Layer min/max quantizer.
460*77c1e3ccSAndroid Build Coastguard Worker     for (int sl = 0; sl < number_spatial_layers; ++sl) {
461*77c1e3ccSAndroid Build Coastguard Worker       for (int tl = 0; tl < number_temporal_layers; ++tl) {
462*77c1e3ccSAndroid Build Coastguard Worker         const int i = sl * number_temporal_layers + tl;
463*77c1e3ccSAndroid Build Coastguard Worker         rc_cfg_.max_quantizers[i] = rc_cfg_.max_quantizer;
464*77c1e3ccSAndroid Build Coastguard Worker         rc_cfg_.min_quantizers[i] = rc_cfg_.min_quantizer;
465*77c1e3ccSAndroid Build Coastguard Worker         svc_params_.max_quantizers[i] = cfg_.rc_max_quantizer;
466*77c1e3ccSAndroid Build Coastguard Worker         svc_params_.min_quantizers[i] = cfg_.rc_min_quantizer;
467*77c1e3ccSAndroid Build Coastguard Worker       }
468*77c1e3ccSAndroid Build Coastguard Worker     }
469*77c1e3ccSAndroid Build Coastguard Worker   }
470*77c1e3ccSAndroid Build Coastguard Worker 
471*77c1e3ccSAndroid Build Coastguard Worker   std::unique_ptr<aom::AV1RateControlRTC> rc_api_;
472*77c1e3ccSAndroid Build Coastguard Worker   aom::AV1RateControlRtcConfig rc_cfg_;
473*77c1e3ccSAndroid Build Coastguard Worker   int aq_mode_;
474*77c1e3ccSAndroid Build Coastguard Worker   int key_interval_;
475*77c1e3ccSAndroid Build Coastguard Worker   aom::AV1FrameParamsRTC frame_params_;
476*77c1e3ccSAndroid Build Coastguard Worker   bool encoder_exit_;
477*77c1e3ccSAndroid Build Coastguard Worker   aom_svc_params_t svc_params_;
478*77c1e3ccSAndroid Build Coastguard Worker   aom_svc_layer_id_t layer_id_;
479*77c1e3ccSAndroid Build Coastguard Worker   int layer_frame_cnt_;
480*77c1e3ccSAndroid Build Coastguard Worker   int superframe_cnt_;
481*77c1e3ccSAndroid Build Coastguard Worker   int frame_cnt_;
482*77c1e3ccSAndroid Build Coastguard Worker   bool dynamic_temporal_layers_;
483*77c1e3ccSAndroid Build Coastguard Worker   bool dynamic_spatial_layers_;
484*77c1e3ccSAndroid Build Coastguard Worker   int num_drops_;
485*77c1e3ccSAndroid Build Coastguard Worker   int max_consec_drop_ms_;
486*77c1e3ccSAndroid Build Coastguard Worker   int frame_drop_thresh_;
487*77c1e3ccSAndroid Build Coastguard Worker };
488*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,OneLayer)489*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, OneLayer) { RunOneLayer(); }
490*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,OneLayerDropFramesCBR)491*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, OneLayerDropFramesCBR) { RunOneLayerDropFramesCBR(); }
492*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,OneLayerPeriodicKey)493*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, OneLayerPeriodicKey) { RunOneLayerPeriodicKey(); }
494*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,OneLayerScreen)495*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, OneLayerScreen) { RunOneLayerScreen(); }
496*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,Svc)497*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, Svc) { RunSvc(); }
498*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,SvcPeriodicKey)499*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, SvcPeriodicKey) { RunSvcPeriodicKey(); }
500*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,SvcDynamicTemporal)501*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, SvcDynamicTemporal) { RunSvcDynamicTemporal(); }
502*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(RcInterfaceTest,SvcDynamicSpatial)503*77c1e3ccSAndroid Build Coastguard Worker TEST_P(RcInterfaceTest, SvcDynamicSpatial) { RunSvcDynamicSpatial(); }
504*77c1e3ccSAndroid Build Coastguard Worker 
505*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(RcInterfaceTest, ::testing::Values(0, 3));
506*77c1e3ccSAndroid Build Coastguard Worker 
507*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
508