xref: /aosp_15_r20/external/libaom/test/datarate_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2016, 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 "config/aom_config.h"
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*77c1e3ccSAndroid Build Coastguard Worker #include "test/acm_random.h"
16*77c1e3ccSAndroid Build Coastguard Worker #include "test/codec_factory.h"
17*77c1e3ccSAndroid Build Coastguard Worker #include "test/datarate_test.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 #include "test/y4m_video_source.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_codec.h"
23*77c1e3ccSAndroid Build Coastguard Worker 
24*77c1e3ccSAndroid Build Coastguard Worker namespace datarate_test {
25*77c1e3ccSAndroid Build Coastguard Worker namespace {
26*77c1e3ccSAndroid Build Coastguard Worker 
27*77c1e3ccSAndroid Build Coastguard Worker // Params: test mode, speed, aq mode and index for bitrate array.
28*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestLarge
29*77c1e3ccSAndroid Build Coastguard Worker     : public ::libaom_test::CodecTestWith4Params<libaom_test::TestMode, int,
30*77c1e3ccSAndroid Build Coastguard Worker                                                  unsigned int, int>,
31*77c1e3ccSAndroid Build Coastguard Worker       public DatarateTest {
32*77c1e3ccSAndroid Build Coastguard Worker  public:
DatarateTestLarge()33*77c1e3ccSAndroid Build Coastguard Worker   DatarateTestLarge() : DatarateTest(GET_PARAM(0)) {
34*77c1e3ccSAndroid Build Coastguard Worker     set_cpu_used_ = GET_PARAM(2);
35*77c1e3ccSAndroid Build Coastguard Worker     aq_mode_ = GET_PARAM(3);
36*77c1e3ccSAndroid Build Coastguard Worker   }
37*77c1e3ccSAndroid Build Coastguard Worker 
38*77c1e3ccSAndroid Build Coastguard Worker  protected:
39*77c1e3ccSAndroid Build Coastguard Worker   ~DatarateTestLarge() override = default;
40*77c1e3ccSAndroid Build Coastguard Worker 
SetUp()41*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override {
42*77c1e3ccSAndroid Build Coastguard Worker     InitializeConfig(GET_PARAM(1));
43*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
44*77c1e3ccSAndroid Build Coastguard Worker   }
45*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingVBRTest()46*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingVBRTest() {
47*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
48*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
49*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 0;
50*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_VBR;
51*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
52*77c1e3ccSAndroid Build Coastguard Worker 
53*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
54*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
55*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 400, 800 };
56*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
57*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
58*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
59*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.7)
60*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
61*77c1e3ccSAndroid Build Coastguard Worker     // FIXME(jingning): Lower this test threshold after vbr mode can render
62*77c1e3ccSAndroid Build Coastguard Worker     // sufficiently accurate bit rate.
63*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.45)
64*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
65*77c1e3ccSAndroid Build Coastguard Worker   }
66*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingCBRTest()67*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingCBRTest() {
68*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
69*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
70*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
71*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
72*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
73*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
74*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
75*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
76*77c1e3ccSAndroid Build Coastguard Worker 
77*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
78*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
79*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 150, 550 };
80*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
81*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
82*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
83*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
84*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
85*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.19)
86*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
87*77c1e3ccSAndroid Build Coastguard Worker   }
88*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingCBRSpikeTest()89*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingCBRSpikeTest() {
90*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
91*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
92*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
93*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
94*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
95*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
96*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
97*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
98*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 3000;
99*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_min_dist = 3000;
100*77c1e3ccSAndroid Build Coastguard Worker 
101*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("desktopqvga2.320_240.yuv", 320, 240,
102*77c1e3ccSAndroid Build Coastguard Worker                                          30, 1, 0, 800);
103*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 100, 200 };
104*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
105*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
106*77c1e3ccSAndroid Build Coastguard Worker     max_perc_spike_ = 3.0;
107*77c1e3ccSAndroid Build Coastguard Worker     max_perc_spike_high_ = 8.0;
108*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
109*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
110*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
111*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.19)
112*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
113*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(num_spikes_, 10);
114*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LT(num_spikes_high_, 1);
115*77c1e3ccSAndroid Build Coastguard Worker   }
116*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingCBRDynamicBitrateTest()117*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingCBRDynamicBitrateTest() {
118*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
119*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
120*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
121*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
122*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
123*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
124*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
125*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
126*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 3000;
127*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_min_dist = 3000;
128*77c1e3ccSAndroid Build Coastguard Worker 
129*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("desktop1.320_180.yuv", 320, 180, 30,
130*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, 800);
131*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 100, 200 };
132*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
133*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
134*77c1e3ccSAndroid Build Coastguard Worker     target_bitrate_update_[0] = cfg_.rc_target_bitrate;
135*77c1e3ccSAndroid Build Coastguard Worker     target_bitrate_update_[1] = static_cast<int>(1.3 * cfg_.rc_target_bitrate);
136*77c1e3ccSAndroid Build Coastguard Worker     target_bitrate_update_[2] = static_cast<int>(0.7 * cfg_.rc_target_bitrate);
137*77c1e3ccSAndroid Build Coastguard Worker     frame_update_bitrate_ = 250;
138*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
139*77c1e3ccSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
140*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_GE(effective_datarate_dynamic_[i],
141*77c1e3ccSAndroid Build Coastguard Worker                 target_bitrate_update_[i] * 0.85)
142*77c1e3ccSAndroid Build Coastguard Worker           << " The datarate for the file is lower than target by too much!";
143*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_LE(effective_datarate_dynamic_[i],
144*77c1e3ccSAndroid Build Coastguard Worker                 target_bitrate_update_[i] * 1.20)
145*77c1e3ccSAndroid Build Coastguard Worker           << " The datarate for the file is greater than target by too much!";
146*77c1e3ccSAndroid Build Coastguard Worker     }
147*77c1e3ccSAndroid Build Coastguard Worker   }
148*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingMultiThreadCBRTest()149*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingMultiThreadCBRTest() {
150*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
151*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, 400);
152*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
153*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
154*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
155*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
156*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
157*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
158*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
159*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
160*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_threads = 4;
161*77c1e3ccSAndroid Build Coastguard Worker 
162*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 250, 650 };
163*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
164*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
165*77c1e3ccSAndroid Build Coastguard Worker     tile_columns_ = 2;
166*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
167*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate),
168*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 0.85)
169*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target by too much!";
170*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate),
171*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 1.15)
172*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!"
173*77c1e3ccSAndroid Build Coastguard Worker         << cfg_.rc_target_bitrate << " " << effective_datarate_;
174*77c1e3ccSAndroid Build Coastguard Worker   }
175*77c1e3ccSAndroid Build Coastguard Worker 
ErrorResilienceOnSceneCuts()176*77c1e3ccSAndroid Build Coastguard Worker   virtual void ErrorResilienceOnSceneCuts() {
177*77c1e3ccSAndroid Build Coastguard Worker     if (GET_PARAM(4) > 0) return;
178*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
179*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
180*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
181*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
182*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 1;
183*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
184*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
185*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
186*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
187*77c1e3ccSAndroid Build Coastguard Worker 
188*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
189*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 300);
190*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 500;
191*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
192*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
193*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
194*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
195*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.15)
196*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
197*77c1e3ccSAndroid Build Coastguard Worker   }
198*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingCBRPeriodicKeyFrameTest()199*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingCBRPeriodicKeyFrameTest() {
200*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
201*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
202*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
203*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
204*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
205*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
206*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
207*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
208*77c1e3ccSAndroid Build Coastguard Worker     // Periodic keyframe
209*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 50;
210*77c1e3ccSAndroid Build Coastguard Worker 
211*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("pixel_capture_w320h240.yuv", 320, 240,
212*77c1e3ccSAndroid Build Coastguard Worker                                          30, 1, 0, 310);
213*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 150, 550 };
214*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
215*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
216*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
217*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
218*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
219*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.15)
220*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
221*77c1e3ccSAndroid Build Coastguard Worker   }
222*77c1e3ccSAndroid Build Coastguard Worker 
CBRPeriodicKeyFrameOnSceneCuts()223*77c1e3ccSAndroid Build Coastguard Worker   virtual void CBRPeriodicKeyFrameOnSceneCuts() {
224*77c1e3ccSAndroid Build Coastguard Worker     if (GET_PARAM(4) > 0) return;
225*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
226*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
227*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
228*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
229*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
230*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
231*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
232*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
233*77c1e3ccSAndroid Build Coastguard Worker     // Periodic keyframe
234*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 30;
235*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_min_dist = 30;
236*77c1e3ccSAndroid Build Coastguard Worker 
237*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
238*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 300);
239*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 500;
240*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
241*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
242*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
243*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
244*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.3)
245*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
246*77c1e3ccSAndroid Build Coastguard Worker   }
247*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingAQModeOnOffCBRTest()248*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingAQModeOnOffCBRTest() {
249*77c1e3ccSAndroid Build Coastguard Worker     if (GET_PARAM(4) > 0) return;
250*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
251*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
252*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
253*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
254*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
255*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
256*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
257*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
258*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 0;
259*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_pass = AOM_RC_ONE_PASS;
260*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_usage = AOM_USAGE_REALTIME;
261*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_mode = AOM_KF_DISABLED;
262*77c1e3ccSAndroid Build Coastguard Worker 
263*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("pixel_capture_w320h240.yuv", 320, 240,
264*77c1e3ccSAndroid Build Coastguard Worker                                          30, 1, 0, 310);
265*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 60;
266*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
267*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
268*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
269*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
270*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.15)
271*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
272*77c1e3ccSAndroid Build Coastguard Worker   }
273*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargeting444CBRScreenTest()274*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargeting444CBRScreenTest() {
275*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 140);
276*77c1e3ccSAndroid Build Coastguard Worker 
277*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_profile = 1;
278*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_timebase = video.timebase();
279*77c1e3ccSAndroid Build Coastguard Worker 
280*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
281*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
282*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
283*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
284*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
285*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
286*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
287*77c1e3ccSAndroid Build Coastguard Worker 
288*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 250, 650 };
289*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
290*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
291*77c1e3ccSAndroid Build Coastguard Worker     screen_mode_ = true;
292*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
293*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate),
294*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 0.85)
295*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target by too much!";
296*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate),
297*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 1.15)
298*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!"
299*77c1e3ccSAndroid Build Coastguard Worker         << cfg_.rc_target_bitrate << " " << effective_datarate_;
300*77c1e3ccSAndroid Build Coastguard Worker   }
301*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingSuperresCBR()302*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingSuperresCBR() {
303*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("desktopqvga2.320_240.yuv", 320, 240,
304*77c1e3ccSAndroid Build Coastguard Worker                                          30, 1, 0, 800);
305*77c1e3ccSAndroid Build Coastguard Worker 
306*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_profile = 0;
307*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_timebase = video.timebase();
308*77c1e3ccSAndroid Build Coastguard Worker 
309*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
310*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
311*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
312*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
313*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
314*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
315*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
316*77c1e3ccSAndroid Build Coastguard Worker 
317*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_mode = AOM_SUPERRES_FIXED;
318*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_denominator = 16;
319*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_kf_denominator = 16;
320*77c1e3ccSAndroid Build Coastguard Worker 
321*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 250, 650 };
322*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
323*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
324*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
325*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate),
326*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 0.85)
327*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target by too much!";
328*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate),
329*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 1.15)
330*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!"
331*77c1e3ccSAndroid Build Coastguard Worker         << cfg_.rc_target_bitrate << " " << effective_datarate_;
332*77c1e3ccSAndroid Build Coastguard Worker   }
333*77c1e3ccSAndroid Build Coastguard Worker 
BasicRateTargetingSuperresCBRMultiThreads()334*77c1e3ccSAndroid Build Coastguard Worker   virtual void BasicRateTargetingSuperresCBRMultiThreads() {
335*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30,
336*77c1e3ccSAndroid Build Coastguard Worker                                          1, 0, 400);
337*77c1e3ccSAndroid Build Coastguard Worker 
338*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_profile = 0;
339*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_timebase = video.timebase();
340*77c1e3ccSAndroid Build Coastguard Worker 
341*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
342*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
343*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
344*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
345*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
346*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 63;
347*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
348*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_threads = 2;
349*77c1e3ccSAndroid Build Coastguard Worker 
350*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_mode = AOM_SUPERRES_FIXED;
351*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_denominator = 16;
352*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_superres_kf_denominator = 16;
353*77c1e3ccSAndroid Build Coastguard Worker 
354*77c1e3ccSAndroid Build Coastguard Worker     const int bitrate_array[2] = { 250, 650 };
355*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = bitrate_array[GET_PARAM(4)];
356*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
357*77c1e3ccSAndroid Build Coastguard Worker     tile_columns_ = 1;
358*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
359*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate),
360*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 0.85)
361*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target by too much!";
362*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate),
363*77c1e3ccSAndroid Build Coastguard Worker               effective_datarate_ * 1.15)
364*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!"
365*77c1e3ccSAndroid Build Coastguard Worker         << cfg_.rc_target_bitrate << " " << effective_datarate_;
366*77c1e3ccSAndroid Build Coastguard Worker   }
367*77c1e3ccSAndroid Build Coastguard Worker };
368*77c1e3ccSAndroid Build Coastguard Worker 
369*77c1e3ccSAndroid Build Coastguard Worker // Params: test mode, speed, aq mode.
370*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestFrameDropLarge
371*77c1e3ccSAndroid Build Coastguard Worker     : public ::libaom_test::CodecTestWith3Params<libaom_test::TestMode, int,
372*77c1e3ccSAndroid Build Coastguard Worker                                                  unsigned int>,
373*77c1e3ccSAndroid Build Coastguard Worker       public DatarateTest {
374*77c1e3ccSAndroid Build Coastguard Worker  public:
DatarateTestFrameDropLarge()375*77c1e3ccSAndroid Build Coastguard Worker   DatarateTestFrameDropLarge() : DatarateTest(GET_PARAM(0)) {
376*77c1e3ccSAndroid Build Coastguard Worker     set_cpu_used_ = GET_PARAM(2);
377*77c1e3ccSAndroid Build Coastguard Worker     aq_mode_ = GET_PARAM(3);
378*77c1e3ccSAndroid Build Coastguard Worker   }
379*77c1e3ccSAndroid Build Coastguard Worker 
380*77c1e3ccSAndroid Build Coastguard Worker  protected:
381*77c1e3ccSAndroid Build Coastguard Worker   ~DatarateTestFrameDropLarge() override = default;
382*77c1e3ccSAndroid Build Coastguard Worker 
SetUp()383*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override {
384*77c1e3ccSAndroid Build Coastguard Worker     InitializeConfig(GET_PARAM(1));
385*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
386*77c1e3ccSAndroid Build Coastguard Worker   }
387*77c1e3ccSAndroid Build Coastguard Worker 
ChangingDropFrameThreshTest()388*77c1e3ccSAndroid Build Coastguard Worker   virtual void ChangingDropFrameThreshTest() {
389*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
390*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
391*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
392*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 20;
393*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 20;
394*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 10;
395*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
396*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 50;
397*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
398*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 200;
399*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
400*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 1;
401*77c1e3ccSAndroid Build Coastguard Worker     // TODO(marpan): Investigate datarate target failures with a smaller
402*77c1e3ccSAndroid Build Coastguard Worker     // keyframe interval (128).
403*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 9999;
404*77c1e3ccSAndroid Build Coastguard Worker 
405*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
406*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 100);
407*77c1e3ccSAndroid Build Coastguard Worker 
408*77c1e3ccSAndroid Build Coastguard Worker     const int kDropFrameThreshTestStep = 30;
409*77c1e3ccSAndroid Build Coastguard Worker     aom_codec_pts_t last_drop = 140;
410*77c1e3ccSAndroid Build Coastguard Worker     int last_num_drops = 0;
411*77c1e3ccSAndroid Build Coastguard Worker     for (int i = 40; i < 100; i += kDropFrameThreshTestStep) {
412*77c1e3ccSAndroid Build Coastguard Worker       cfg_.rc_dropframe_thresh = i;
413*77c1e3ccSAndroid Build Coastguard Worker       ResetModel();
414*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
415*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
416*77c1e3ccSAndroid Build Coastguard Worker           << " The datarate for the file is lower than target by too much!";
417*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.40)
418*77c1e3ccSAndroid Build Coastguard Worker           << " The datarate for the file is greater than target by too much!";
419*77c1e3ccSAndroid Build Coastguard Worker       if (last_drop > 0) {
420*77c1e3ccSAndroid Build Coastguard Worker         ASSERT_LE(first_drop_, last_drop)
421*77c1e3ccSAndroid Build Coastguard Worker             << " The first dropped frame for drop_thresh " << i
422*77c1e3ccSAndroid Build Coastguard Worker             << " > first dropped frame for drop_thresh "
423*77c1e3ccSAndroid Build Coastguard Worker             << i - kDropFrameThreshTestStep;
424*77c1e3ccSAndroid Build Coastguard Worker       }
425*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_GE(num_drops_, last_num_drops * 0.7)
426*77c1e3ccSAndroid Build Coastguard Worker           << " The number of dropped frames for drop_thresh " << i
427*77c1e3ccSAndroid Build Coastguard Worker           << " < number of dropped frames for drop_thresh "
428*77c1e3ccSAndroid Build Coastguard Worker           << i - kDropFrameThreshTestStep;
429*77c1e3ccSAndroid Build Coastguard Worker       last_drop = first_drop_;
430*77c1e3ccSAndroid Build Coastguard Worker       last_num_drops = num_drops_;
431*77c1e3ccSAndroid Build Coastguard Worker     }
432*77c1e3ccSAndroid Build Coastguard Worker   }
433*77c1e3ccSAndroid Build Coastguard Worker };
434*77c1e3ccSAndroid Build Coastguard Worker 
435*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for VBR mode.
TEST_P(DatarateTestLarge,BasicRateTargetingVBR)436*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingVBR) {
437*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingVBRTest();
438*77c1e3ccSAndroid Build Coastguard Worker }
439*77c1e3ccSAndroid Build Coastguard Worker 
440*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR.
TEST_P(DatarateTestLarge,BasicRateTargetingCBR)441*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingCBR) {
442*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRTest();
443*77c1e3ccSAndroid Build Coastguard Worker }
444*77c1e3ccSAndroid Build Coastguard Worker 
445*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR, with 4 threads
TEST_P(DatarateTestLarge,BasicRateTargetingMultiThreadCBR)446*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingMultiThreadCBR) {
447*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingMultiThreadCBRTest();
448*77c1e3ccSAndroid Build Coastguard Worker }
449*77c1e3ccSAndroid Build Coastguard Worker 
450*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for periodic key frame.
TEST_P(DatarateTestLarge,PeriodicKeyFrameCBR)451*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, PeriodicKeyFrameCBR) {
452*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRPeriodicKeyFrameTest();
453*77c1e3ccSAndroid Build Coastguard Worker }
454*77c1e3ccSAndroid Build Coastguard Worker 
455*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for periodic key frame, aligned with scene change.
TEST_P(DatarateTestLarge,PeriodicKeyFrameCBROnSceneCuts)456*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, PeriodicKeyFrameCBROnSceneCuts) {
457*77c1e3ccSAndroid Build Coastguard Worker   CBRPeriodicKeyFrameOnSceneCuts();
458*77c1e3ccSAndroid Build Coastguard Worker }
459*77c1e3ccSAndroid Build Coastguard Worker 
460*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting with error resilience on for scene cuts.
TEST_P(DatarateTestLarge,ErrorResilienceOnSceneCuts)461*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, ErrorResilienceOnSceneCuts) {
462*77c1e3ccSAndroid Build Coastguard Worker   ErrorResilienceOnSceneCuts();
463*77c1e3ccSAndroid Build Coastguard Worker }
464*77c1e3ccSAndroid Build Coastguard Worker 
465*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR, for 444 input screen mode.
466*77c1e3ccSAndroid Build Coastguard Worker #if defined(CONFIG_MAX_DECODE_PROFILE) && CONFIG_MAX_DECODE_PROFILE < 1
TEST_P(DatarateTestLarge,DISABLED_BasicRateTargeting444CBRScreen)467*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, DISABLED_BasicRateTargeting444CBRScreen) {
468*77c1e3ccSAndroid Build Coastguard Worker #else
469*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargeting444CBRScreen) {
470*77c1e3ccSAndroid Build Coastguard Worker #endif
471*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargeting444CBRScreenTest();
472*77c1e3ccSAndroid Build Coastguard Worker }
473*77c1e3ccSAndroid Build Coastguard Worker 
474*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for Superres mode with CBR.
475*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingSuperresCBR) {
476*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingSuperresCBR();
477*77c1e3ccSAndroid Build Coastguard Worker }
478*77c1e3ccSAndroid Build Coastguard Worker 
479*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for Superres mode with CBR and multi-threads.
480*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingSuperresCBRMultiThreads) {
481*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingSuperresCBRMultiThreads();
482*77c1e3ccSAndroid Build Coastguard Worker }
483*77c1e3ccSAndroid Build Coastguard Worker 
484*77c1e3ccSAndroid Build Coastguard Worker // Check that (1) the first dropped frame gets earlier and earlier
485*77c1e3ccSAndroid Build Coastguard Worker // as the drop frame threshold is increased, and (2) that the total number of
486*77c1e3ccSAndroid Build Coastguard Worker // frame drops does not decrease as we increase frame drop threshold.
487*77c1e3ccSAndroid Build Coastguard Worker // Use a lower qp-max to force some frame drops.
488*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestFrameDropLarge, ChangingDropFrameThresh) {
489*77c1e3ccSAndroid Build Coastguard Worker   ChangingDropFrameThreshTest();
490*77c1e3ccSAndroid Build Coastguard Worker }
491*77c1e3ccSAndroid Build Coastguard Worker 
492*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicRateTargetingAQModeOnOffCBR) {
493*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingAQModeOnOffCBRTest();
494*77c1e3ccSAndroid Build Coastguard Worker }
495*77c1e3ccSAndroid Build Coastguard Worker 
496*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestRealtime : public DatarateTestLarge {};
497*77c1e3ccSAndroid Build Coastguard Worker 
498*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestFrameDropRealtime : public DatarateTestFrameDropLarge {};
499*77c1e3ccSAndroid Build Coastguard Worker 
500*77c1e3ccSAndroid Build Coastguard Worker // Params: aq mode.
501*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestSpeedChangeRealtime
502*77c1e3ccSAndroid Build Coastguard Worker     : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode,
503*77c1e3ccSAndroid Build Coastguard Worker                                                  unsigned int>,
504*77c1e3ccSAndroid Build Coastguard Worker       public DatarateTest {
505*77c1e3ccSAndroid Build Coastguard Worker  public:
506*77c1e3ccSAndroid Build Coastguard Worker   DatarateTestSpeedChangeRealtime() : DatarateTest(GET_PARAM(0)) {
507*77c1e3ccSAndroid Build Coastguard Worker     aq_mode_ = GET_PARAM(1);
508*77c1e3ccSAndroid Build Coastguard Worker     speed_change_test_ = true;
509*77c1e3ccSAndroid Build Coastguard Worker   }
510*77c1e3ccSAndroid Build Coastguard Worker 
511*77c1e3ccSAndroid Build Coastguard Worker  protected:
512*77c1e3ccSAndroid Build Coastguard Worker   ~DatarateTestSpeedChangeRealtime() override = default;
513*77c1e3ccSAndroid Build Coastguard Worker 
514*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override {
515*77c1e3ccSAndroid Build Coastguard Worker     InitializeConfig(GET_PARAM(1));
516*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
517*77c1e3ccSAndroid Build Coastguard Worker   }
518*77c1e3ccSAndroid Build Coastguard Worker 
519*77c1e3ccSAndroid Build Coastguard Worker   virtual void ChangingSpeedTest() {
520*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
521*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 500;
522*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
523*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 20;
524*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 20;
525*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 10;
526*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 0;
527*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 50;
528*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_end_usage = AOM_CBR;
529*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 200;
530*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
531*77c1e3ccSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 1;
532*77c1e3ccSAndroid Build Coastguard Worker     // TODO(marpan): Investigate datarate target failures with a smaller
533*77c1e3ccSAndroid Build Coastguard Worker     // keyframe interval (128).
534*77c1e3ccSAndroid Build Coastguard Worker     cfg_.kf_max_dist = 9999;
535*77c1e3ccSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
536*77c1e3ccSAndroid Build Coastguard Worker     ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
537*77c1e3ccSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 100);
538*77c1e3ccSAndroid Build Coastguard Worker 
539*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
540*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
541*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.83)
542*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is lower than target by too much!";
543*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.35)
544*77c1e3ccSAndroid Build Coastguard Worker         << " The datarate for the file is greater than target by too much!";
545*77c1e3ccSAndroid Build Coastguard Worker   }
546*77c1e3ccSAndroid Build Coastguard Worker };
547*77c1e3ccSAndroid Build Coastguard Worker 
548*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for VBR mode.
549*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingVBR) {
550*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingVBRTest();
551*77c1e3ccSAndroid Build Coastguard Worker }
552*77c1e3ccSAndroid Build Coastguard Worker 
553*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR.
554*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingCBR) {
555*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRTest();
556*77c1e3ccSAndroid Build Coastguard Worker }
557*77c1e3ccSAndroid Build Coastguard Worker 
558*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR. Use a longer clip,
559*77c1e3ccSAndroid Build Coastguard Worker // and verify #encode size spikes above threshold.
560*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingCBRSpike) {
561*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRSpikeTest();
562*77c1e3ccSAndroid Build Coastguard Worker }
563*77c1e3ccSAndroid Build Coastguard Worker 
564*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR. Use a longer clip,
565*77c1e3ccSAndroid Build Coastguard Worker // and verify encoder can respnd and hit new bitrates updated
566*77c1e3ccSAndroid Build Coastguard Worker // within the stream.
567*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingCBRDynamicBitrate) {
568*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRDynamicBitrateTest();
569*77c1e3ccSAndroid Build Coastguard Worker }
570*77c1e3ccSAndroid Build Coastguard Worker 
571*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR, with 4 threads
572*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingMultiThreadCBR) {
573*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingMultiThreadCBRTest();
574*77c1e3ccSAndroid Build Coastguard Worker }
575*77c1e3ccSAndroid Build Coastguard Worker 
576*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for periodic key frame.
577*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, PeriodicKeyFrameCBR) {
578*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingCBRPeriodicKeyFrameTest();
579*77c1e3ccSAndroid Build Coastguard Worker }
580*77c1e3ccSAndroid Build Coastguard Worker 
581*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for periodic key frame, aligned with scene change.
582*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, PeriodicKeyFrameCBROnSceneCuts) {
583*77c1e3ccSAndroid Build Coastguard Worker   CBRPeriodicKeyFrameOnSceneCuts();
584*77c1e3ccSAndroid Build Coastguard Worker }
585*77c1e3ccSAndroid Build Coastguard Worker 
586*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting with error resilience on for scene cuts.
587*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, ErrorResilienceOnSceneCuts) {
588*77c1e3ccSAndroid Build Coastguard Worker   ErrorResilienceOnSceneCuts();
589*77c1e3ccSAndroid Build Coastguard Worker }
590*77c1e3ccSAndroid Build Coastguard Worker 
591*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for CBR for 444 screen mode.
592*77c1e3ccSAndroid Build Coastguard Worker #if defined(CONFIG_MAX_DECODE_PROFILE) && CONFIG_MAX_DECODE_PROFILE < 1
593*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, DISABLED_BasicRateTargeting444CBRScreen) {
594*77c1e3ccSAndroid Build Coastguard Worker #else
595*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargeting444CBRScreen) {
596*77c1e3ccSAndroid Build Coastguard Worker #endif
597*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargeting444CBRScreenTest();
598*77c1e3ccSAndroid Build Coastguard Worker }
599*77c1e3ccSAndroid Build Coastguard Worker 
600*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for Superres mode with CBR.
601*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingSuperresCBR) {
602*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingSuperresCBR();
603*77c1e3ccSAndroid Build Coastguard Worker }
604*77c1e3ccSAndroid Build Coastguard Worker 
605*77c1e3ccSAndroid Build Coastguard Worker // Check basic rate targeting for Superres mode with CBR and multi-threads.
606*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestRealtime, BasicRateTargetingSuperresCBRMultiThreads) {
607*77c1e3ccSAndroid Build Coastguard Worker   BasicRateTargetingSuperresCBRMultiThreads();
608*77c1e3ccSAndroid Build Coastguard Worker }
609*77c1e3ccSAndroid Build Coastguard Worker 
610*77c1e3ccSAndroid Build Coastguard Worker // Check that (1) the first dropped frame gets earlier and earlier
611*77c1e3ccSAndroid Build Coastguard Worker // as the drop frame threshold is increased, and (2) that the total number of
612*77c1e3ccSAndroid Build Coastguard Worker // frame drops does not decrease as we increase frame drop threshold.
613*77c1e3ccSAndroid Build Coastguard Worker // Use a lower qp-max to force some frame drops.
614*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestFrameDropRealtime, ChangingDropFrameThresh) {
615*77c1e3ccSAndroid Build Coastguard Worker   ChangingDropFrameThreshTest();
616*77c1e3ccSAndroid Build Coastguard Worker }
617*77c1e3ccSAndroid Build Coastguard Worker 
618*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestSpeedChangeRealtime, ChangingSpeedTest) {
619*77c1e3ccSAndroid Build Coastguard Worker   ChangingSpeedTest();
620*77c1e3ccSAndroid Build Coastguard Worker }
621*77c1e3ccSAndroid Build Coastguard Worker 
622*77c1e3ccSAndroid Build Coastguard Worker class DatarateTestSetFrameQpRealtime
623*77c1e3ccSAndroid Build Coastguard Worker     : public DatarateTest,
624*77c1e3ccSAndroid Build Coastguard Worker       public ::testing::TestWithParam<const libaom_test::AV1CodecFactory *> {
625*77c1e3ccSAndroid Build Coastguard Worker  public:
626*77c1e3ccSAndroid Build Coastguard Worker   DatarateTestSetFrameQpRealtime() : DatarateTest(GetParam()), frame_(0) {}
627*77c1e3ccSAndroid Build Coastguard Worker 
628*77c1e3ccSAndroid Build Coastguard Worker  protected:
629*77c1e3ccSAndroid Build Coastguard Worker   ~DatarateTestSetFrameQpRealtime() override = default;
630*77c1e3ccSAndroid Build Coastguard Worker 
631*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override {
632*77c1e3ccSAndroid Build Coastguard Worker     InitializeConfig(libaom_test::kRealTime);
633*77c1e3ccSAndroid Build Coastguard Worker     ResetModel();
634*77c1e3ccSAndroid Build Coastguard Worker   }
635*77c1e3ccSAndroid Build Coastguard Worker 
636*77c1e3ccSAndroid Build Coastguard Worker   void PreEncodeFrameHook(::libaom_test::VideoSource *video,
637*77c1e3ccSAndroid Build Coastguard Worker                           ::libaom_test::Encoder *encoder) override {
638*77c1e3ccSAndroid Build Coastguard Worker     set_cpu_used_ = 7;
639*77c1e3ccSAndroid Build Coastguard Worker     DatarateTest::PreEncodeFrameHook(video, encoder);
640*77c1e3ccSAndroid Build Coastguard Worker     frame_qp_ = rnd_.PseudoUniform(63);
641*77c1e3ccSAndroid Build Coastguard Worker     encoder->Control(AV1E_SET_QUANTIZER_ONE_PASS, frame_qp_);
642*77c1e3ccSAndroid Build Coastguard Worker     frame_++;
643*77c1e3ccSAndroid Build Coastguard Worker   }
644*77c1e3ccSAndroid Build Coastguard Worker 
645*77c1e3ccSAndroid Build Coastguard Worker   void PostEncodeFrameHook(::libaom_test::Encoder *encoder) override {
646*77c1e3ccSAndroid Build Coastguard Worker     if (frame_ >= total_frames_) return;
647*77c1e3ccSAndroid Build Coastguard Worker     int qp = 0;
648*77c1e3ccSAndroid Build Coastguard Worker     encoder->Control(AOME_GET_LAST_QUANTIZER_64, &qp);
649*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_EQ(qp, frame_qp_);
650*77c1e3ccSAndroid Build Coastguard Worker   }
651*77c1e3ccSAndroid Build Coastguard Worker 
652*77c1e3ccSAndroid Build Coastguard Worker  protected:
653*77c1e3ccSAndroid Build Coastguard Worker   int total_frames_;
654*77c1e3ccSAndroid Build Coastguard Worker 
655*77c1e3ccSAndroid Build Coastguard Worker  private:
656*77c1e3ccSAndroid Build Coastguard Worker   int frame_qp_;
657*77c1e3ccSAndroid Build Coastguard Worker   int frame_;
658*77c1e3ccSAndroid Build Coastguard Worker   libaom_test::ACMRandom rnd_;
659*77c1e3ccSAndroid Build Coastguard Worker };
660*77c1e3ccSAndroid Build Coastguard Worker 
661*77c1e3ccSAndroid Build Coastguard Worker TEST_P(DatarateTestSetFrameQpRealtime, SetFrameQpOnePass) {
662*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
663*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
664*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
665*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_undershoot_pct = 20;
666*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_undershoot_pct = 20;
667*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
668*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 50;
669*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_end_usage = AOM_CBR;
670*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 200;
671*77c1e3ccSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
672*77c1e3ccSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 1;
673*77c1e3ccSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
674*77c1e3ccSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
675*77c1e3ccSAndroid Build Coastguard Worker 
676*77c1e3ccSAndroid Build Coastguard Worker   total_frames_ = 100;
677*77c1e3ccSAndroid Build Coastguard Worker   ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
678*77c1e3ccSAndroid Build Coastguard Worker                                        30, 1, 0, 100);
679*77c1e3ccSAndroid Build Coastguard Worker 
680*77c1e3ccSAndroid Build Coastguard Worker   ResetModel();
681*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
682*77c1e3ccSAndroid Build Coastguard Worker }
683*77c1e3ccSAndroid Build Coastguard Worker 
684*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(DatarateTestLarge,
685*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(::libaom_test::kRealTime),
686*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Range(5, 7), ::testing::Values(0, 3),
687*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(0, 1));
688*77c1e3ccSAndroid Build Coastguard Worker 
689*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(DatarateTestFrameDropLarge,
690*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(::libaom_test::kRealTime),
691*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Range(5, 7), ::testing::Values(0, 3));
692*77c1e3ccSAndroid Build Coastguard Worker 
693*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(DatarateTestRealtime,
694*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(::libaom_test::kRealTime),
695*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Range(7, 12), ::testing::Values(0, 3),
696*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(0, 1));
697*77c1e3ccSAndroid Build Coastguard Worker 
698*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(DatarateTestFrameDropRealtime,
699*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(::libaom_test::kRealTime),
700*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Range(7, 12), ::testing::Values(0, 3));
701*77c1e3ccSAndroid Build Coastguard Worker 
702*77c1e3ccSAndroid Build Coastguard Worker AV1_INSTANTIATE_TEST_SUITE(DatarateTestSpeedChangeRealtime,
703*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(::libaom_test::kRealTime),
704*77c1e3ccSAndroid Build Coastguard Worker                            ::testing::Values(0, 3));
705*77c1e3ccSAndroid Build Coastguard Worker 
706*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
707*77c1e3ccSAndroid Build Coastguard Worker     AV1, DatarateTestSetFrameQpRealtime,
708*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Values(
709*77c1e3ccSAndroid Build Coastguard Worker         static_cast<const libaom_test::CodecFactory *>(&libaom_test::kAV1)));
710*77c1e3ccSAndroid Build Coastguard Worker 
711*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
712*77c1e3ccSAndroid Build Coastguard Worker }  // namespace datarate_test
713