1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
11*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/y4m_video_source.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/bitops.h"
20*fb1b10abSAndroid Build Coastguard Worker
21*fb1b10abSAndroid Build Coastguard Worker namespace {
22*fb1b10abSAndroid Build Coastguard Worker
23*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9 : public ::libvpx_test::EncoderTest {
24*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9(const::libvpx_test::CodecFactory * codec)25*fb1b10abSAndroid Build Coastguard Worker explicit DatarateTestVP9(const ::libvpx_test::CodecFactory *codec)
26*fb1b10abSAndroid Build Coastguard Worker : EncoderTest(codec) {
27*fb1b10abSAndroid Build Coastguard Worker tune_content_ = 0;
28*fb1b10abSAndroid Build Coastguard Worker }
29*fb1b10abSAndroid Build Coastguard Worker
30*fb1b10abSAndroid Build Coastguard Worker protected:
31*fb1b10abSAndroid Build Coastguard Worker ~DatarateTestVP9() override = default;
32*fb1b10abSAndroid Build Coastguard Worker
ResetModel()33*fb1b10abSAndroid Build Coastguard Worker virtual void ResetModel() {
34*fb1b10abSAndroid Build Coastguard Worker last_pts_ = 0;
35*fb1b10abSAndroid Build Coastguard Worker bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz;
36*fb1b10abSAndroid Build Coastguard Worker frame_number_ = 0;
37*fb1b10abSAndroid Build Coastguard Worker tot_frame_number_ = 0;
38*fb1b10abSAndroid Build Coastguard Worker first_drop_ = 0;
39*fb1b10abSAndroid Build Coastguard Worker num_drops_ = 0;
40*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 3;
41*fb1b10abSAndroid Build Coastguard Worker // Denoiser is off by default.
42*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ = 0;
43*fb1b10abSAndroid Build Coastguard Worker // For testing up to 3 layers.
44*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 3; ++i) {
45*fb1b10abSAndroid Build Coastguard Worker bits_total_[i] = 0;
46*fb1b10abSAndroid Build Coastguard Worker }
47*fb1b10abSAndroid Build Coastguard Worker denoiser_offon_test_ = 0;
48*fb1b10abSAndroid Build Coastguard Worker denoiser_offon_period_ = -1;
49*fb1b10abSAndroid Build Coastguard Worker frame_parallel_decoding_mode_ = 1;
50*fb1b10abSAndroid Build Coastguard Worker delta_q_uv_ = 0;
51*fb1b10abSAndroid Build Coastguard Worker use_roi_ = false;
52*fb1b10abSAndroid Build Coastguard Worker }
53*fb1b10abSAndroid Build Coastguard Worker
54*fb1b10abSAndroid Build Coastguard Worker //
55*fb1b10abSAndroid Build Coastguard Worker // Frame flags and layer id for temporal layers.
56*fb1b10abSAndroid Build Coastguard Worker //
57*fb1b10abSAndroid Build Coastguard Worker
58*fb1b10abSAndroid Build Coastguard Worker // For two layers, test pattern is:
59*fb1b10abSAndroid Build Coastguard Worker // 1 3
60*fb1b10abSAndroid Build Coastguard Worker // 0 2 .....
61*fb1b10abSAndroid Build Coastguard Worker // For three layers, test pattern is:
62*fb1b10abSAndroid Build Coastguard Worker // 1 3 5 7
63*fb1b10abSAndroid Build Coastguard Worker // 2 6
64*fb1b10abSAndroid Build Coastguard Worker // 0 4 ....
65*fb1b10abSAndroid Build Coastguard Worker // LAST is always update on base/layer 0, GOLDEN is updated on layer 1.
66*fb1b10abSAndroid Build Coastguard Worker // For this 3 layer example, the 2nd enhancement layer (layer 2) updates
67*fb1b10abSAndroid Build Coastguard Worker // the altref frame.
GetFrameFlags(int frame_num,int num_temp_layers)68*fb1b10abSAndroid Build Coastguard Worker static int GetFrameFlags(int frame_num, int num_temp_layers) {
69*fb1b10abSAndroid Build Coastguard Worker int frame_flags = 0;
70*fb1b10abSAndroid Build Coastguard Worker if (num_temp_layers == 2) {
71*fb1b10abSAndroid Build Coastguard Worker if (frame_num % 2 == 0) {
72*fb1b10abSAndroid Build Coastguard Worker // Layer 0: predict from L and ARF, update L.
73*fb1b10abSAndroid Build Coastguard Worker frame_flags =
74*fb1b10abSAndroid Build Coastguard Worker VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
75*fb1b10abSAndroid Build Coastguard Worker } else {
76*fb1b10abSAndroid Build Coastguard Worker // Layer 1: predict from L, G and ARF, and update G.
77*fb1b10abSAndroid Build Coastguard Worker frame_flags = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST |
78*fb1b10abSAndroid Build Coastguard Worker VP8_EFLAG_NO_UPD_ENTROPY;
79*fb1b10abSAndroid Build Coastguard Worker }
80*fb1b10abSAndroid Build Coastguard Worker } else if (num_temp_layers == 3) {
81*fb1b10abSAndroid Build Coastguard Worker if (frame_num % 4 == 0) {
82*fb1b10abSAndroid Build Coastguard Worker // Layer 0: predict from L and ARF; update L.
83*fb1b10abSAndroid Build Coastguard Worker frame_flags =
84*fb1b10abSAndroid Build Coastguard Worker VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF;
85*fb1b10abSAndroid Build Coastguard Worker } else if ((frame_num - 2) % 4 == 0) {
86*fb1b10abSAndroid Build Coastguard Worker // Layer 1: predict from L, G, ARF; update G.
87*fb1b10abSAndroid Build Coastguard Worker frame_flags = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
88*fb1b10abSAndroid Build Coastguard Worker } else if ((frame_num - 1) % 2 == 0) {
89*fb1b10abSAndroid Build Coastguard Worker // Layer 2: predict from L, G, ARF; update ARF.
90*fb1b10abSAndroid Build Coastguard Worker frame_flags = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_LAST;
91*fb1b10abSAndroid Build Coastguard Worker }
92*fb1b10abSAndroid Build Coastguard Worker }
93*fb1b10abSAndroid Build Coastguard Worker return frame_flags;
94*fb1b10abSAndroid Build Coastguard Worker }
95*fb1b10abSAndroid Build Coastguard Worker
SetLayerId(int frame_num,int num_temp_layers)96*fb1b10abSAndroid Build Coastguard Worker static int SetLayerId(int frame_num, int num_temp_layers) {
97*fb1b10abSAndroid Build Coastguard Worker int layer_id = 0;
98*fb1b10abSAndroid Build Coastguard Worker if (num_temp_layers == 2) {
99*fb1b10abSAndroid Build Coastguard Worker if (frame_num % 2 == 0) {
100*fb1b10abSAndroid Build Coastguard Worker layer_id = 0;
101*fb1b10abSAndroid Build Coastguard Worker } else {
102*fb1b10abSAndroid Build Coastguard Worker layer_id = 1;
103*fb1b10abSAndroid Build Coastguard Worker }
104*fb1b10abSAndroid Build Coastguard Worker } else if (num_temp_layers == 3) {
105*fb1b10abSAndroid Build Coastguard Worker if (frame_num % 4 == 0) {
106*fb1b10abSAndroid Build Coastguard Worker layer_id = 0;
107*fb1b10abSAndroid Build Coastguard Worker } else if ((frame_num - 2) % 4 == 0) {
108*fb1b10abSAndroid Build Coastguard Worker layer_id = 1;
109*fb1b10abSAndroid Build Coastguard Worker } else if ((frame_num - 1) % 2 == 0) {
110*fb1b10abSAndroid Build Coastguard Worker layer_id = 2;
111*fb1b10abSAndroid Build Coastguard Worker }
112*fb1b10abSAndroid Build Coastguard Worker }
113*fb1b10abSAndroid Build Coastguard Worker return layer_id;
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)116*fb1b10abSAndroid Build Coastguard Worker void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
117*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Encoder *encoder) override {
118*fb1b10abSAndroid Build Coastguard Worker if (video->frame() == 0) {
119*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
120*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_AQ_MODE, aq_mode_);
121*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_TUNE_CONTENT, tune_content_);
122*fb1b10abSAndroid Build Coastguard Worker }
123*fb1b10abSAndroid Build Coastguard Worker
124*fb1b10abSAndroid Build Coastguard Worker if (denoiser_offon_test_) {
125*fb1b10abSAndroid Build Coastguard Worker ASSERT_GT(denoiser_offon_period_, 0)
126*fb1b10abSAndroid Build Coastguard Worker << "denoiser_offon_period_ is not positive.";
127*fb1b10abSAndroid Build Coastguard Worker if ((video->frame() + 1) % denoiser_offon_period_ == 0) {
128*fb1b10abSAndroid Build Coastguard Worker // Flip denoiser_on_ periodically
129*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ ^= 1;
130*fb1b10abSAndroid Build Coastguard Worker }
131*fb1b10abSAndroid Build Coastguard Worker }
132*fb1b10abSAndroid Build Coastguard Worker
133*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_NOISE_SENSITIVITY, denoiser_on_);
134*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_TILE_COLUMNS, get_msb(cfg_.g_threads));
135*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_FRAME_PARALLEL_DECODING,
136*fb1b10abSAndroid Build Coastguard Worker frame_parallel_decoding_mode_);
137*fb1b10abSAndroid Build Coastguard Worker
138*fb1b10abSAndroid Build Coastguard Worker if (use_roi_) {
139*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_ROI_MAP, &roi_);
140*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_AQ_MODE, 0);
141*fb1b10abSAndroid Build Coastguard Worker }
142*fb1b10abSAndroid Build Coastguard Worker
143*fb1b10abSAndroid Build Coastguard Worker if (delta_q_uv_ != 0) {
144*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_DELTA_Q_UV, delta_q_uv_);
145*fb1b10abSAndroid Build Coastguard Worker }
146*fb1b10abSAndroid Build Coastguard Worker
147*fb1b10abSAndroid Build Coastguard Worker if (cfg_.ts_number_layers > 1) {
148*fb1b10abSAndroid Build Coastguard Worker if (video->frame() == 0) {
149*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_SVC, 1);
150*fb1b10abSAndroid Build Coastguard Worker }
151*fb1b10abSAndroid Build Coastguard Worker if (cfg_.temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
152*fb1b10abSAndroid Build Coastguard Worker vpx_svc_layer_id_t layer_id;
153*fb1b10abSAndroid Build Coastguard Worker frame_flags_ = GetFrameFlags(video->frame(), cfg_.ts_number_layers);
154*fb1b10abSAndroid Build Coastguard Worker layer_id.spatial_layer_id = 0;
155*fb1b10abSAndroid Build Coastguard Worker layer_id.temporal_layer_id =
156*fb1b10abSAndroid Build Coastguard Worker SetLayerId(video->frame(), cfg_.ts_number_layers);
157*fb1b10abSAndroid Build Coastguard Worker layer_id.temporal_layer_id_per_spatial[0] =
158*fb1b10abSAndroid Build Coastguard Worker SetLayerId(video->frame(), cfg_.ts_number_layers);
159*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_SVC_LAYER_ID, &layer_id);
160*fb1b10abSAndroid Build Coastguard Worker }
161*fb1b10abSAndroid Build Coastguard Worker }
162*fb1b10abSAndroid Build Coastguard Worker const vpx_rational_t tb = video->timebase();
163*fb1b10abSAndroid Build Coastguard Worker timebase_ = static_cast<double>(tb.num) / tb.den;
164*fb1b10abSAndroid Build Coastguard Worker duration_ = 0;
165*fb1b10abSAndroid Build Coastguard Worker }
166*fb1b10abSAndroid Build Coastguard Worker
FramePktHook(const vpx_codec_cx_pkt_t * pkt)167*fb1b10abSAndroid Build Coastguard Worker void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
168*fb1b10abSAndroid Build Coastguard Worker // Time since last timestamp = duration.
169*fb1b10abSAndroid Build Coastguard Worker vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_;
170*fb1b10abSAndroid Build Coastguard Worker
171*fb1b10abSAndroid Build Coastguard Worker if (duration > 1) {
172*fb1b10abSAndroid Build Coastguard Worker // If first drop not set and we have a drop set it to this time.
173*fb1b10abSAndroid Build Coastguard Worker if (!first_drop_) first_drop_ = last_pts_ + 1;
174*fb1b10abSAndroid Build Coastguard Worker // Update the number of frame drops.
175*fb1b10abSAndroid Build Coastguard Worker num_drops_ += static_cast<int>(duration - 1);
176*fb1b10abSAndroid Build Coastguard Worker // Update counter for total number of frames (#frames input to encoder).
177*fb1b10abSAndroid Build Coastguard Worker // Needed for setting the proper layer_id below.
178*fb1b10abSAndroid Build Coastguard Worker tot_frame_number_ += static_cast<int>(duration - 1);
179*fb1b10abSAndroid Build Coastguard Worker }
180*fb1b10abSAndroid Build Coastguard Worker
181*fb1b10abSAndroid Build Coastguard Worker int layer = SetLayerId(tot_frame_number_, cfg_.ts_number_layers);
182*fb1b10abSAndroid Build Coastguard Worker
183*fb1b10abSAndroid Build Coastguard Worker // Add to the buffer the bits we'd expect from a constant bitrate server.
184*fb1b10abSAndroid Build Coastguard Worker bits_in_buffer_model_ += static_cast<int64_t>(
185*fb1b10abSAndroid Build Coastguard Worker duration * timebase_ * cfg_.rc_target_bitrate * 1000);
186*fb1b10abSAndroid Build Coastguard Worker
187*fb1b10abSAndroid Build Coastguard Worker // Buffer should not go negative.
188*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(bits_in_buffer_model_, 0)
189*fb1b10abSAndroid Build Coastguard Worker << "Buffer Underrun at frame " << pkt->data.frame.pts;
190*fb1b10abSAndroid Build Coastguard Worker
191*fb1b10abSAndroid Build Coastguard Worker const size_t frame_size_in_bits = pkt->data.frame.sz * 8;
192*fb1b10abSAndroid Build Coastguard Worker
193*fb1b10abSAndroid Build Coastguard Worker // Update the total encoded bits. For temporal layers, update the cumulative
194*fb1b10abSAndroid Build Coastguard Worker // encoded bits per layer.
195*fb1b10abSAndroid Build Coastguard Worker for (int i = layer; i < static_cast<int>(cfg_.ts_number_layers); ++i) {
196*fb1b10abSAndroid Build Coastguard Worker bits_total_[i] += frame_size_in_bits;
197*fb1b10abSAndroid Build Coastguard Worker }
198*fb1b10abSAndroid Build Coastguard Worker
199*fb1b10abSAndroid Build Coastguard Worker // Update the most recent pts.
200*fb1b10abSAndroid Build Coastguard Worker last_pts_ = pkt->data.frame.pts;
201*fb1b10abSAndroid Build Coastguard Worker ++frame_number_;
202*fb1b10abSAndroid Build Coastguard Worker ++tot_frame_number_;
203*fb1b10abSAndroid Build Coastguard Worker }
204*fb1b10abSAndroid Build Coastguard Worker
EndPassHook()205*fb1b10abSAndroid Build Coastguard Worker void EndPassHook() override {
206*fb1b10abSAndroid Build Coastguard Worker for (int layer = 0; layer < static_cast<int>(cfg_.ts_number_layers);
207*fb1b10abSAndroid Build Coastguard Worker ++layer) {
208*fb1b10abSAndroid Build Coastguard Worker duration_ = (last_pts_ + 1) * timebase_;
209*fb1b10abSAndroid Build Coastguard Worker if (bits_total_[layer]) {
210*fb1b10abSAndroid Build Coastguard Worker // Effective file datarate:
211*fb1b10abSAndroid Build Coastguard Worker effective_datarate_[layer] = (bits_total_[layer] / 1000.0) / duration_;
212*fb1b10abSAndroid Build Coastguard Worker }
213*fb1b10abSAndroid Build Coastguard Worker }
214*fb1b10abSAndroid Build Coastguard Worker }
215*fb1b10abSAndroid Build Coastguard Worker
216*fb1b10abSAndroid Build Coastguard Worker vpx_codec_pts_t last_pts_;
217*fb1b10abSAndroid Build Coastguard Worker double timebase_;
218*fb1b10abSAndroid Build Coastguard Worker int tune_content_;
219*fb1b10abSAndroid Build Coastguard Worker int frame_number_; // Counter for number of non-dropped/encoded frames.
220*fb1b10abSAndroid Build Coastguard Worker int tot_frame_number_; // Counter for total number of input frames.
221*fb1b10abSAndroid Build Coastguard Worker int64_t bits_total_[3];
222*fb1b10abSAndroid Build Coastguard Worker double duration_;
223*fb1b10abSAndroid Build Coastguard Worker double effective_datarate_[3];
224*fb1b10abSAndroid Build Coastguard Worker int set_cpu_used_;
225*fb1b10abSAndroid Build Coastguard Worker int64_t bits_in_buffer_model_;
226*fb1b10abSAndroid Build Coastguard Worker vpx_codec_pts_t first_drop_;
227*fb1b10abSAndroid Build Coastguard Worker int num_drops_;
228*fb1b10abSAndroid Build Coastguard Worker int aq_mode_;
229*fb1b10abSAndroid Build Coastguard Worker int denoiser_on_;
230*fb1b10abSAndroid Build Coastguard Worker int denoiser_offon_test_;
231*fb1b10abSAndroid Build Coastguard Worker int denoiser_offon_period_;
232*fb1b10abSAndroid Build Coastguard Worker int frame_parallel_decoding_mode_;
233*fb1b10abSAndroid Build Coastguard Worker int delta_q_uv_;
234*fb1b10abSAndroid Build Coastguard Worker bool use_roi_;
235*fb1b10abSAndroid Build Coastguard Worker vpx_roi_map_t roi_;
236*fb1b10abSAndroid Build Coastguard Worker };
237*fb1b10abSAndroid Build Coastguard Worker
238*fb1b10abSAndroid Build Coastguard Worker // Params: test mode, speed setting and index for bitrate array.
239*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9RealTimeMultiBR
240*fb1b10abSAndroid Build Coastguard Worker : public DatarateTestVP9,
241*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWith2Params<int, int> {
242*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9RealTimeMultiBR()243*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9RealTimeMultiBR() : DatarateTestVP9(GET_PARAM(0)) {}
244*fb1b10abSAndroid Build Coastguard Worker
245*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()246*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
247*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
248*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
249*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = GET_PARAM(1);
250*fb1b10abSAndroid Build Coastguard Worker ResetModel();
251*fb1b10abSAndroid Build Coastguard Worker }
252*fb1b10abSAndroid Build Coastguard Worker };
253*fb1b10abSAndroid Build Coastguard Worker
254*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting and index for bitrate array.
255*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9LargeVBR
256*fb1b10abSAndroid Build Coastguard Worker : public DatarateTestVP9,
257*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWith2Params<int, int> {
258*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9LargeVBR()259*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9LargeVBR() : DatarateTestVP9(GET_PARAM(0)) {}
260*fb1b10abSAndroid Build Coastguard Worker
261*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()262*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
263*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
264*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
265*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = GET_PARAM(1);
266*fb1b10abSAndroid Build Coastguard Worker ResetModel();
267*fb1b10abSAndroid Build Coastguard Worker }
268*fb1b10abSAndroid Build Coastguard Worker };
269*fb1b10abSAndroid Build Coastguard Worker
270*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for VBR mode with 0 lag.
TEST_P(DatarateTestVP9LargeVBR,BasicRateTargetingVBRLagZero)271*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9LargeVBR, BasicRateTargetingVBRLagZero) {
272*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
273*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
274*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 0;
275*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_VBR;
276*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
277*fb1b10abSAndroid Build Coastguard Worker
278*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
279*fb1b10abSAndroid Build Coastguard Worker 30, 1, 0, 300);
280*fb1b10abSAndroid Build Coastguard Worker
281*fb1b10abSAndroid Build Coastguard Worker const int bitrates[2] = { 400, 800 };
282*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
283*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
284*fb1b10abSAndroid Build Coastguard Worker ResetModel();
285*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
286*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.75)
287*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
288*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.36)
289*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
290*fb1b10abSAndroid Build Coastguard Worker }
291*fb1b10abSAndroid Build Coastguard Worker
292*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for VBR mode with non-zero lag.
TEST_P(DatarateTestVP9LargeVBR,BasicRateTargetingVBRLagNonZero)293*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9LargeVBR, BasicRateTargetingVBRLagNonZero) {
294*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
295*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
296*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 0;
297*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_VBR;
298*fb1b10abSAndroid Build Coastguard Worker // For non-zero lag, rate control will work (be within bounds) for
299*fb1b10abSAndroid Build Coastguard Worker // real-time mode.
300*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) {
301*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 15;
302*fb1b10abSAndroid Build Coastguard Worker } else {
303*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
304*fb1b10abSAndroid Build Coastguard Worker }
305*fb1b10abSAndroid Build Coastguard Worker
306*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
307*fb1b10abSAndroid Build Coastguard Worker 30, 1, 0, 300);
308*fb1b10abSAndroid Build Coastguard Worker const int bitrates[2] = { 400, 800 };
309*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
310*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
311*fb1b10abSAndroid Build Coastguard Worker ResetModel();
312*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
313*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.75)
314*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
315*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.35)
316*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
317*fb1b10abSAndroid Build Coastguard Worker }
318*fb1b10abSAndroid Build Coastguard Worker
319*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for VBR mode with non-zero lag, with
320*fb1b10abSAndroid Build Coastguard Worker // frame_parallel_decoding_mode off. This enables the adapt_coeff/mode/mv probs
321*fb1b10abSAndroid Build Coastguard Worker // since error_resilience is off.
TEST_P(DatarateTestVP9LargeVBR,BasicRateTargetingVBRLagNonZeroFrameParDecOff)322*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9LargeVBR, BasicRateTargetingVBRLagNonZeroFrameParDecOff) {
323*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
324*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
325*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 0;
326*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_VBR;
327*fb1b10abSAndroid Build Coastguard Worker // For non-zero lag, rate control will work (be within bounds) for
328*fb1b10abSAndroid Build Coastguard Worker // real-time mode.
329*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) {
330*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 15;
331*fb1b10abSAndroid Build Coastguard Worker } else {
332*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
333*fb1b10abSAndroid Build Coastguard Worker }
334*fb1b10abSAndroid Build Coastguard Worker
335*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
336*fb1b10abSAndroid Build Coastguard Worker 30, 1, 0, 300);
337*fb1b10abSAndroid Build Coastguard Worker const int bitrates[2] = { 400, 800 };
338*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
339*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
340*fb1b10abSAndroid Build Coastguard Worker ResetModel();
341*fb1b10abSAndroid Build Coastguard Worker frame_parallel_decoding_mode_ = 0;
342*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
343*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.75)
344*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
345*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.35)
346*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
347*fb1b10abSAndroid Build Coastguard Worker }
348*fb1b10abSAndroid Build Coastguard Worker
349*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for CBR mode.
TEST_P(DatarateTestVP9RealTimeMultiBR,BasicRateTargeting)350*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, BasicRateTargeting) {
351*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
352*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
353*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
354*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
355*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
356*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
357*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
358*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
359*fb1b10abSAndroid Build Coastguard Worker
360*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
361*fb1b10abSAndroid Build Coastguard Worker 0, 400);
362*fb1b10abSAndroid Build Coastguard Worker const int bitrates[4] = { 150, 350, 550, 750 };
363*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
364*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
365*fb1b10abSAndroid Build Coastguard Worker ResetModel();
366*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
367*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
368*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
369*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
370*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
371*fb1b10abSAndroid Build Coastguard Worker }
372*fb1b10abSAndroid Build Coastguard Worker
373*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for CBR mode, with frame_parallel_decoding_mode
374*fb1b10abSAndroid Build Coastguard Worker // off( and error_resilience off).
TEST_P(DatarateTestVP9RealTimeMultiBR,BasicRateTargetingFrameParDecOff)375*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, BasicRateTargetingFrameParDecOff) {
376*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
377*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
378*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
379*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
380*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
381*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
382*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
383*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
384*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 0;
385*fb1b10abSAndroid Build Coastguard Worker
386*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
387*fb1b10abSAndroid Build Coastguard Worker 0, 400);
388*fb1b10abSAndroid Build Coastguard Worker const int bitrates[4] = { 150, 350, 550, 750 };
389*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
390*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
391*fb1b10abSAndroid Build Coastguard Worker ResetModel();
392*fb1b10abSAndroid Build Coastguard Worker frame_parallel_decoding_mode_ = 0;
393*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
394*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
395*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
396*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
397*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
398*fb1b10abSAndroid Build Coastguard Worker }
399*fb1b10abSAndroid Build Coastguard Worker
400*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for CBR.
TEST_P(DatarateTestVP9RealTimeMultiBR,BasicRateTargeting444)401*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, BasicRateTargeting444) {
402*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 140);
403*fb1b10abSAndroid Build Coastguard Worker
404*fb1b10abSAndroid Build Coastguard Worker cfg_.g_profile = 1;
405*fb1b10abSAndroid Build Coastguard Worker cfg_.g_timebase = video.timebase();
406*fb1b10abSAndroid Build Coastguard Worker
407*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
408*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
409*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
410*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
411*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
412*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
413*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
414*fb1b10abSAndroid Build Coastguard Worker const int bitrates[4] = { 250, 450, 650, 850 };
415*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
416*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
417*fb1b10abSAndroid Build Coastguard Worker ResetModel();
418*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
419*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate),
420*fb1b10abSAndroid Build Coastguard Worker effective_datarate_[0] * 0.80)
421*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file exceeds the target by too much!";
422*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate),
423*fb1b10abSAndroid Build Coastguard Worker effective_datarate_[0] * 1.15)
424*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file missed the target!"
425*fb1b10abSAndroid Build Coastguard Worker << cfg_.rc_target_bitrate << " " << effective_datarate_;
426*fb1b10abSAndroid Build Coastguard Worker }
427*fb1b10abSAndroid Build Coastguard Worker
428*fb1b10abSAndroid Build Coastguard Worker // Check that (1) the first dropped frame gets earlier and earlier
429*fb1b10abSAndroid Build Coastguard Worker // as the drop frame threshold is increased, and (2) that the total number of
430*fb1b10abSAndroid Build Coastguard Worker // frame drops does not decrease as we increase frame drop threshold.
431*fb1b10abSAndroid Build Coastguard Worker // Use a lower qp-max to force some frame drops.
TEST_P(DatarateTestVP9RealTimeMultiBR,ChangingDropFrameThresh)432*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, ChangingDropFrameThresh) {
433*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
434*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
435*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
436*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_undershoot_pct = 20;
437*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_undershoot_pct = 20;
438*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 10;
439*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
440*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 50;
441*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
442*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
443*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
444*fb1b10abSAndroid Build Coastguard Worker // TODO(marpan): Investigate datarate target failures with a smaller keyframe
445*fb1b10abSAndroid Build Coastguard Worker // interval (128).
446*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_max_dist = 9999;
447*fb1b10abSAndroid Build Coastguard Worker
448*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
449*fb1b10abSAndroid Build Coastguard Worker 0, 400);
450*fb1b10abSAndroid Build Coastguard Worker
451*fb1b10abSAndroid Build Coastguard Worker const int kDropFrameThreshTestStep = 30;
452*fb1b10abSAndroid Build Coastguard Worker const int bitrates[2] = { 50, 150 };
453*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
454*fb1b10abSAndroid Build Coastguard Worker if (bitrate_index > 1) return;
455*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
456*fb1b10abSAndroid Build Coastguard Worker vpx_codec_pts_t last_drop = 140;
457*fb1b10abSAndroid Build Coastguard Worker int last_num_drops = 0;
458*fb1b10abSAndroid Build Coastguard Worker for (int i = 10; i < 100; i += kDropFrameThreshTestStep) {
459*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = i;
460*fb1b10abSAndroid Build Coastguard Worker ResetModel();
461*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
462*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
463*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
464*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.25)
465*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
466*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(first_drop_, last_drop)
467*fb1b10abSAndroid Build Coastguard Worker << " The first dropped frame for drop_thresh " << i
468*fb1b10abSAndroid Build Coastguard Worker << " > first dropped frame for drop_thresh "
469*fb1b10abSAndroid Build Coastguard Worker << i - kDropFrameThreshTestStep;
470*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(num_drops_, last_num_drops * 0.85)
471*fb1b10abSAndroid Build Coastguard Worker << " The number of dropped frames for drop_thresh " << i
472*fb1b10abSAndroid Build Coastguard Worker << " < number of dropped frames for drop_thresh "
473*fb1b10abSAndroid Build Coastguard Worker << i - kDropFrameThreshTestStep;
474*fb1b10abSAndroid Build Coastguard Worker last_drop = first_drop_;
475*fb1b10abSAndroid Build Coastguard Worker last_num_drops = num_drops_;
476*fb1b10abSAndroid Build Coastguard Worker }
477*fb1b10abSAndroid Build Coastguard Worker } // namespace
478*fb1b10abSAndroid Build Coastguard Worker
479*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 2 temporal layers.
TEST_P(DatarateTestVP9RealTimeMultiBR,BasicRateTargeting2TemporalLayers)480*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, BasicRateTargeting2TemporalLayers) {
481*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
482*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
483*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
484*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
485*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
486*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
487*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
488*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
489*fb1b10abSAndroid Build Coastguard Worker
490*fb1b10abSAndroid Build Coastguard Worker // 2 Temporal layers, no spatial layers: Framerate decimation (2, 1).
491*fb1b10abSAndroid Build Coastguard Worker cfg_.ss_number_layers = 1;
492*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_number_layers = 2;
493*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[0] = 2;
494*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[1] = 1;
495*fb1b10abSAndroid Build Coastguard Worker
496*fb1b10abSAndroid Build Coastguard Worker cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
497*fb1b10abSAndroid Build Coastguard Worker
498*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
499*fb1b10abSAndroid Build Coastguard Worker 0, 400);
500*fb1b10abSAndroid Build Coastguard Worker const int bitrates[4] = { 200, 400, 600, 800 };
501*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
502*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
503*fb1b10abSAndroid Build Coastguard Worker ResetModel();
504*fb1b10abSAndroid Build Coastguard Worker // 60-40 bitrate allocation for 2 temporal layers.
505*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[0] = 60 * cfg_.rc_target_bitrate / 100;
506*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[1] = cfg_.rc_target_bitrate;
507*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 0;
508*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) {
509*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 3;
510*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 1;
511*fb1b10abSAndroid Build Coastguard Worker }
512*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
513*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < static_cast<int>(cfg_.ts_number_layers); ++j) {
514*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 0.85)
515*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much, "
516*fb1b10abSAndroid Build Coastguard Worker "for layer: "
517*fb1b10abSAndroid Build Coastguard Worker << j;
518*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 1.15)
519*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much, "
520*fb1b10abSAndroid Build Coastguard Worker "for layer: "
521*fb1b10abSAndroid Build Coastguard Worker << j;
522*fb1b10abSAndroid Build Coastguard Worker }
523*fb1b10abSAndroid Build Coastguard Worker }
524*fb1b10abSAndroid Build Coastguard Worker
525*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 3 temporal layers.
TEST_P(DatarateTestVP9RealTimeMultiBR,BasicRateTargeting3TemporalLayers)526*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeMultiBR, BasicRateTargeting3TemporalLayers) {
527*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
528*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
529*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
530*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
531*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
532*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
533*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
534*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
535*fb1b10abSAndroid Build Coastguard Worker
536*fb1b10abSAndroid Build Coastguard Worker // 3 Temporal layers, no spatial layers: Framerate decimation (4, 2, 1).
537*fb1b10abSAndroid Build Coastguard Worker cfg_.ss_number_layers = 1;
538*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_number_layers = 3;
539*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[0] = 4;
540*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[1] = 2;
541*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[2] = 1;
542*fb1b10abSAndroid Build Coastguard Worker
543*fb1b10abSAndroid Build Coastguard Worker cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
544*fb1b10abSAndroid Build Coastguard Worker
545*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
546*fb1b10abSAndroid Build Coastguard Worker 0, 400);
547*fb1b10abSAndroid Build Coastguard Worker const int bitrates[4] = { 200, 400, 600, 800 };
548*fb1b10abSAndroid Build Coastguard Worker const int bitrate_index = GET_PARAM(2);
549*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = bitrates[bitrate_index];
550*fb1b10abSAndroid Build Coastguard Worker ResetModel();
551*fb1b10abSAndroid Build Coastguard Worker // 40-20-40 bitrate allocation for 3 temporal layers.
552*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[0] = 40 * cfg_.rc_target_bitrate / 100;
553*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[1] = 60 * cfg_.rc_target_bitrate / 100;
554*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[2] = cfg_.rc_target_bitrate;
555*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 0;
556*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) {
557*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 3;
558*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 1;
559*fb1b10abSAndroid Build Coastguard Worker }
560*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
561*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < static_cast<int>(cfg_.ts_number_layers); ++j) {
562*fb1b10abSAndroid Build Coastguard Worker // TODO(yaowu): Work out more stable rc control strategy and
563*fb1b10abSAndroid Build Coastguard Worker // Adjust the thresholds to be tighter than .75.
564*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 0.75)
565*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much, "
566*fb1b10abSAndroid Build Coastguard Worker "for layer: "
567*fb1b10abSAndroid Build Coastguard Worker << j;
568*fb1b10abSAndroid Build Coastguard Worker // TODO(yaowu): Work out more stable rc control strategy and
569*fb1b10abSAndroid Build Coastguard Worker // Adjust the thresholds to be tighter than 1.25.
570*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 1.25)
571*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much, "
572*fb1b10abSAndroid Build Coastguard Worker "for layer: "
573*fb1b10abSAndroid Build Coastguard Worker << j;
574*fb1b10abSAndroid Build Coastguard Worker }
575*fb1b10abSAndroid Build Coastguard Worker }
576*fb1b10abSAndroid Build Coastguard Worker
577*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting.
578*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9RealTime : public DatarateTestVP9,
579*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWithParam<int> {
580*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9RealTime()581*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9RealTime() : DatarateTestVP9(GET_PARAM(0)) {}
582*fb1b10abSAndroid Build Coastguard Worker ~DatarateTestVP9RealTime() override = default;
583*fb1b10abSAndroid Build Coastguard Worker
584*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()585*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
586*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
587*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
588*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = GET_PARAM(1);
589*fb1b10abSAndroid Build Coastguard Worker ResetModel();
590*fb1b10abSAndroid Build Coastguard Worker }
591*fb1b10abSAndroid Build Coastguard Worker };
592*fb1b10abSAndroid Build Coastguard Worker
593*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for CBR mode, with 2 threads and dropped frames.
TEST_P(DatarateTestVP9RealTime,BasicRateTargetingDropFramesMultiThreads)594*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTime, BasicRateTargetingDropFramesMultiThreads) {
595*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
596*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
597*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
598*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 30;
599*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
600*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
601*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
602*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
603*fb1b10abSAndroid Build Coastguard Worker // Encode using multiple threads.
604*fb1b10abSAndroid Build Coastguard Worker cfg_.g_threads = 2;
605*fb1b10abSAndroid Build Coastguard Worker
606*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
607*fb1b10abSAndroid Build Coastguard Worker 0, 400);
608*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
609*fb1b10abSAndroid Build Coastguard Worker ResetModel();
610*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
611*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
612*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
613*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
614*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
615*fb1b10abSAndroid Build Coastguard Worker }
616*fb1b10abSAndroid Build Coastguard Worker
617*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 3 temporal layers, with frame dropping.
618*fb1b10abSAndroid Build Coastguard Worker // Only for one (low) bitrate with lower max_quantizer, and somewhat higher
619*fb1b10abSAndroid Build Coastguard Worker // frame drop threshold, to force frame dropping.
TEST_P(DatarateTestVP9RealTime,BasicRateTargeting3TemporalLayersFrameDropping)620*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTime,
621*fb1b10abSAndroid Build Coastguard Worker BasicRateTargeting3TemporalLayersFrameDropping) {
622*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
623*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
624*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
625*fb1b10abSAndroid Build Coastguard Worker // Set frame drop threshold and rc_max_quantizer to force some frame drops.
626*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 20;
627*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 45;
628*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
629*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
630*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
631*fb1b10abSAndroid Build Coastguard Worker
632*fb1b10abSAndroid Build Coastguard Worker // 3 Temporal layers, no spatial layers: Framerate decimation (4, 2, 1).
633*fb1b10abSAndroid Build Coastguard Worker cfg_.ss_number_layers = 1;
634*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_number_layers = 3;
635*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[0] = 4;
636*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[1] = 2;
637*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[2] = 1;
638*fb1b10abSAndroid Build Coastguard Worker
639*fb1b10abSAndroid Build Coastguard Worker cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
640*fb1b10abSAndroid Build Coastguard Worker
641*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
642*fb1b10abSAndroid Build Coastguard Worker 0, 400);
643*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
644*fb1b10abSAndroid Build Coastguard Worker ResetModel();
645*fb1b10abSAndroid Build Coastguard Worker // 40-20-40 bitrate allocation for 3 temporal layers.
646*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[0] = 40 * cfg_.rc_target_bitrate / 100;
647*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[1] = 60 * cfg_.rc_target_bitrate / 100;
648*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[2] = cfg_.rc_target_bitrate;
649*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 0;
650*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) {
651*fb1b10abSAndroid Build Coastguard Worker aq_mode_ = 3;
652*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 1;
653*fb1b10abSAndroid Build Coastguard Worker }
654*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
655*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < static_cast<int>(cfg_.ts_number_layers); ++j) {
656*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 0.85)
657*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much, "
658*fb1b10abSAndroid Build Coastguard Worker "for layer: "
659*fb1b10abSAndroid Build Coastguard Worker << j;
660*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[j], cfg_.layer_target_bitrate[j] * 1.20)
661*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much, "
662*fb1b10abSAndroid Build Coastguard Worker "for layer: "
663*fb1b10abSAndroid Build Coastguard Worker << j;
664*fb1b10abSAndroid Build Coastguard Worker // Expect some frame drops in this test: for this 200 frames test,
665*fb1b10abSAndroid Build Coastguard Worker // expect at least 10% and not more than 60% drops.
666*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(num_drops_, 20);
667*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(num_drops_, 280);
668*fb1b10abSAndroid Build Coastguard Worker }
669*fb1b10abSAndroid Build Coastguard Worker }
670*fb1b10abSAndroid Build Coastguard Worker
671*fb1b10abSAndroid Build Coastguard Worker // Check VP9 region of interest feature.
TEST_P(DatarateTestVP9RealTime,RegionOfInterest)672*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTime, RegionOfInterest) {
673*fb1b10abSAndroid Build Coastguard Worker if (deadline_ != VPX_DL_REALTIME || set_cpu_used_ < 5) return;
674*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
675*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
676*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
677*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 0;
678*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
679*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
680*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
681*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
682*fb1b10abSAndroid Build Coastguard Worker
683*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
684*fb1b10abSAndroid Build Coastguard Worker 0, 400);
685*fb1b10abSAndroid Build Coastguard Worker
686*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 450;
687*fb1b10abSAndroid Build Coastguard Worker cfg_.g_w = 640;
688*fb1b10abSAndroid Build Coastguard Worker cfg_.g_h = 480;
689*fb1b10abSAndroid Build Coastguard Worker
690*fb1b10abSAndroid Build Coastguard Worker ResetModel();
691*fb1b10abSAndroid Build Coastguard Worker
692*fb1b10abSAndroid Build Coastguard Worker // Set ROI parameters
693*fb1b10abSAndroid Build Coastguard Worker use_roi_ = true;
694*fb1b10abSAndroid Build Coastguard Worker memset(&roi_, 0, sizeof(roi_));
695*fb1b10abSAndroid Build Coastguard Worker
696*fb1b10abSAndroid Build Coastguard Worker roi_.rows = (cfg_.g_h + 7) / 8;
697*fb1b10abSAndroid Build Coastguard Worker roi_.cols = (cfg_.g_w + 7) / 8;
698*fb1b10abSAndroid Build Coastguard Worker
699*fb1b10abSAndroid Build Coastguard Worker roi_.delta_q[1] = -20;
700*fb1b10abSAndroid Build Coastguard Worker roi_.delta_lf[1] = -20;
701*fb1b10abSAndroid Build Coastguard Worker memset(roi_.ref_frame, -1, sizeof(roi_.ref_frame));
702*fb1b10abSAndroid Build Coastguard Worker roi_.ref_frame[1] = 1;
703*fb1b10abSAndroid Build Coastguard Worker
704*fb1b10abSAndroid Build Coastguard Worker // Use 2 states: 1 is center square, 0 is the rest.
705*fb1b10abSAndroid Build Coastguard Worker roi_.roi_map = reinterpret_cast<uint8_t *>(
706*fb1b10abSAndroid Build Coastguard Worker calloc(roi_.rows * roi_.cols, sizeof(*roi_.roi_map)));
707*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(roi_.roi_map, nullptr);
708*fb1b10abSAndroid Build Coastguard Worker
709*fb1b10abSAndroid Build Coastguard Worker for (unsigned int i = 0; i < roi_.rows; ++i) {
710*fb1b10abSAndroid Build Coastguard Worker for (unsigned int j = 0; j < roi_.cols; ++j) {
711*fb1b10abSAndroid Build Coastguard Worker if (i > (roi_.rows >> 2) && i < ((roi_.rows * 3) >> 2) &&
712*fb1b10abSAndroid Build Coastguard Worker j > (roi_.cols >> 2) && j < ((roi_.cols * 3) >> 2)) {
713*fb1b10abSAndroid Build Coastguard Worker roi_.roi_map[i * roi_.cols + j] = 1;
714*fb1b10abSAndroid Build Coastguard Worker }
715*fb1b10abSAndroid Build Coastguard Worker }
716*fb1b10abSAndroid Build Coastguard Worker }
717*fb1b10abSAndroid Build Coastguard Worker
718*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
719*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_[0] * 0.90)
720*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file exceeds the target!";
721*fb1b10abSAndroid Build Coastguard Worker
722*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(cfg_.rc_target_bitrate, effective_datarate_[0] * 1.4)
723*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file missed the target!";
724*fb1b10abSAndroid Build Coastguard Worker
725*fb1b10abSAndroid Build Coastguard Worker free(roi_.roi_map);
726*fb1b10abSAndroid Build Coastguard Worker }
727*fb1b10abSAndroid Build Coastguard Worker
728*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting, delta q UV.
729*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9RealTimeDeltaQUV
730*fb1b10abSAndroid Build Coastguard Worker : public DatarateTestVP9,
731*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWith2Params<int, int> {
732*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9RealTimeDeltaQUV()733*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9RealTimeDeltaQUV() : DatarateTestVP9(GET_PARAM(0)) {}
734*fb1b10abSAndroid Build Coastguard Worker ~DatarateTestVP9RealTimeDeltaQUV() override = default;
735*fb1b10abSAndroid Build Coastguard Worker
736*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()737*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
738*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
739*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
740*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = GET_PARAM(1);
741*fb1b10abSAndroid Build Coastguard Worker ResetModel();
742*fb1b10abSAndroid Build Coastguard Worker }
743*fb1b10abSAndroid Build Coastguard Worker };
744*fb1b10abSAndroid Build Coastguard Worker
TEST_P(DatarateTestVP9RealTimeDeltaQUV,DeltaQUV)745*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeDeltaQUV, DeltaQUV) {
746*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
747*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
748*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
749*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 0;
750*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
751*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
752*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
753*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
754*fb1b10abSAndroid Build Coastguard Worker
755*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
756*fb1b10abSAndroid Build Coastguard Worker 0, 400);
757*fb1b10abSAndroid Build Coastguard Worker
758*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 450;
759*fb1b10abSAndroid Build Coastguard Worker cfg_.g_w = 640;
760*fb1b10abSAndroid Build Coastguard Worker cfg_.g_h = 480;
761*fb1b10abSAndroid Build Coastguard Worker
762*fb1b10abSAndroid Build Coastguard Worker ResetModel();
763*fb1b10abSAndroid Build Coastguard Worker
764*fb1b10abSAndroid Build Coastguard Worker delta_q_uv_ = GET_PARAM(2);
765*fb1b10abSAndroid Build Coastguard Worker
766*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
767*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_[0] * 0.90)
768*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file exceeds the target!";
769*fb1b10abSAndroid Build Coastguard Worker
770*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(cfg_.rc_target_bitrate, effective_datarate_[0] * 1.4)
771*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file missed the target!";
772*fb1b10abSAndroid Build Coastguard Worker }
773*fb1b10abSAndroid Build Coastguard Worker
774*fb1b10abSAndroid Build Coastguard Worker // Params: test mode, speed setting and index for bitrate array.
775*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9PostEncodeDrop
776*fb1b10abSAndroid Build Coastguard Worker : public DatarateTestVP9,
777*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWithParam<int> {
778*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9PostEncodeDrop()779*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9PostEncodeDrop() : DatarateTestVP9(GET_PARAM(0)) {}
780*fb1b10abSAndroid Build Coastguard Worker
781*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()782*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
783*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
784*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
785*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = GET_PARAM(1);
786*fb1b10abSAndroid Build Coastguard Worker ResetModel();
787*fb1b10abSAndroid Build Coastguard Worker }
788*fb1b10abSAndroid Build Coastguard Worker };
789*fb1b10abSAndroid Build Coastguard Worker
790*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for CBR mode, with 2 threads and dropped frames.
TEST_P(DatarateTestVP9PostEncodeDrop,PostEncodeDropScreenContent)791*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9PostEncodeDrop, PostEncodeDropScreenContent) {
792*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
793*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
794*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
795*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 30;
796*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
797*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 56;
798*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
799*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
800*fb1b10abSAndroid Build Coastguard Worker // Encode using multiple threads.
801*fb1b10abSAndroid Build Coastguard Worker cfg_.g_threads = 2;
802*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 0;
803*fb1b10abSAndroid Build Coastguard Worker tune_content_ = 1;
804*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
805*fb1b10abSAndroid Build Coastguard Worker 30, 1, 0, 300);
806*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 300;
807*fb1b10abSAndroid Build Coastguard Worker ResetModel();
808*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
809*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
810*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
811*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
812*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
813*fb1b10abSAndroid Build Coastguard Worker }
814*fb1b10abSAndroid Build Coastguard Worker
815*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
816*fb1b10abSAndroid Build Coastguard Worker
817*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9FrameQp
818*fb1b10abSAndroid Build Coastguard Worker : public DatarateTestVP9,
819*fb1b10abSAndroid Build Coastguard Worker public ::testing::TestWithParam<const libvpx_test::CodecFactory *> {
820*fb1b10abSAndroid Build Coastguard Worker public:
DatarateTestVP9FrameQp()821*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9FrameQp() : DatarateTestVP9(GetParam()), frame_(0) {}
822*fb1b10abSAndroid Build Coastguard Worker ~DatarateTestVP9FrameQp() override = default;
823*fb1b10abSAndroid Build Coastguard Worker
824*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()825*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
826*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
827*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
828*fb1b10abSAndroid Build Coastguard Worker ResetModel();
829*fb1b10abSAndroid Build Coastguard Worker }
830*fb1b10abSAndroid Build Coastguard Worker
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)831*fb1b10abSAndroid Build Coastguard Worker void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
832*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Encoder *encoder) override {
833*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = 7;
834*fb1b10abSAndroid Build Coastguard Worker DatarateTestVP9::PreEncodeFrameHook(video, encoder);
835*fb1b10abSAndroid Build Coastguard Worker frame_qp_ = static_cast<int>(rnd_.RandRange(64));
836*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_SET_QUANTIZER_ONE_PASS, frame_qp_);
837*fb1b10abSAndroid Build Coastguard Worker frame_++;
838*fb1b10abSAndroid Build Coastguard Worker }
839*fb1b10abSAndroid Build Coastguard Worker
PostEncodeFrameHook(::libvpx_test::Encoder * encoder)840*fb1b10abSAndroid Build Coastguard Worker void PostEncodeFrameHook(::libvpx_test::Encoder *encoder) override {
841*fb1b10abSAndroid Build Coastguard Worker int qp = 0;
842*fb1b10abSAndroid Build Coastguard Worker vpx_svc_layer_id_t layer_id;
843*fb1b10abSAndroid Build Coastguard Worker if (frame_ >= total_frame_) return;
844*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP8E_GET_LAST_QUANTIZER_64, &qp);
845*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(frame_qp_, qp);
846*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP9E_GET_SVC_LAYER_ID, &layer_id);
847*fb1b10abSAndroid Build Coastguard Worker temporal_layer_id_ = layer_id.temporal_layer_id;
848*fb1b10abSAndroid Build Coastguard Worker }
849*fb1b10abSAndroid Build Coastguard Worker
MismatchHook(const vpx_image_t *,const vpx_image_t *)850*fb1b10abSAndroid Build Coastguard Worker void MismatchHook(const vpx_image_t * /*img1*/,
851*fb1b10abSAndroid Build Coastguard Worker const vpx_image_t * /*img2*/) override {
852*fb1b10abSAndroid Build Coastguard Worker if (frame_ >= total_frame_) return;
853*fb1b10abSAndroid Build Coastguard Worker ASSERT_TRUE(cfg_.temporal_layering_mode ==
854*fb1b10abSAndroid Build Coastguard Worker VP9E_TEMPORAL_LAYERING_MODE_0212 &&
855*fb1b10abSAndroid Build Coastguard Worker temporal_layer_id_ == 2);
856*fb1b10abSAndroid Build Coastguard Worker }
857*fb1b10abSAndroid Build Coastguard Worker
858*fb1b10abSAndroid Build Coastguard Worker protected:
859*fb1b10abSAndroid Build Coastguard Worker int total_frame_;
860*fb1b10abSAndroid Build Coastguard Worker
861*fb1b10abSAndroid Build Coastguard Worker private:
862*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd_;
863*fb1b10abSAndroid Build Coastguard Worker int frame_qp_;
864*fb1b10abSAndroid Build Coastguard Worker int frame_;
865*fb1b10abSAndroid Build Coastguard Worker int temporal_layer_id_;
866*fb1b10abSAndroid Build Coastguard Worker };
867*fb1b10abSAndroid Build Coastguard Worker
TEST_P(DatarateTestVP9FrameQp,VP9SetFrameQp)868*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9FrameQp, VP9SetFrameQp) {
869*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
870*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
871*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
872*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 0;
873*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
874*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
875*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
876*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
877*fb1b10abSAndroid Build Coastguard Worker
878*fb1b10abSAndroid Build Coastguard Worker total_frame_ = 400;
879*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
880*fb1b10abSAndroid Build Coastguard Worker 0, total_frame_);
881*fb1b10abSAndroid Build Coastguard Worker ResetModel();
882*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
883*fb1b10abSAndroid Build Coastguard Worker }
884*fb1b10abSAndroid Build Coastguard Worker
TEST_P(DatarateTestVP9FrameQp,VP9SetFrameQp3TemporalLayersBypass)885*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9FrameQp, VP9SetFrameQp3TemporalLayersBypass) {
886*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
887*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
888*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
889*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 0;
890*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
891*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
892*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
893*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
894*fb1b10abSAndroid Build Coastguard Worker
895*fb1b10abSAndroid Build Coastguard Worker // 3 Temporal layers, no spatial layers: Framerate decimation (4, 2, 1).
896*fb1b10abSAndroid Build Coastguard Worker cfg_.ss_number_layers = 1;
897*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_number_layers = 3;
898*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[0] = 4;
899*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[1] = 2;
900*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[2] = 1;
901*fb1b10abSAndroid Build Coastguard Worker
902*fb1b10abSAndroid Build Coastguard Worker cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
903*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
904*fb1b10abSAndroid Build Coastguard Worker total_frame_ = 400;
905*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
906*fb1b10abSAndroid Build Coastguard Worker 0, total_frame_);
907*fb1b10abSAndroid Build Coastguard Worker ResetModel();
908*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[0] = 40 * cfg_.rc_target_bitrate / 100;
909*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[1] = 60 * cfg_.rc_target_bitrate / 100;
910*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[2] = cfg_.rc_target_bitrate;
911*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
912*fb1b10abSAndroid Build Coastguard Worker }
913*fb1b10abSAndroid Build Coastguard Worker
TEST_P(DatarateTestVP9FrameQp,VP9SetFrameQp3TemporalLayersFixedMode)914*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9FrameQp, VP9SetFrameQp3TemporalLayersFixedMode) {
915*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
916*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
917*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
918*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 0;
919*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 63;
920*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 0;
921*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
922*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
923*fb1b10abSAndroid Build Coastguard Worker
924*fb1b10abSAndroid Build Coastguard Worker // 3 Temporal layers, no spatial layers: Framerate decimation (4, 2, 1).
925*fb1b10abSAndroid Build Coastguard Worker cfg_.ss_number_layers = 1;
926*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_number_layers = 3;
927*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[0] = 4;
928*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[1] = 2;
929*fb1b10abSAndroid Build Coastguard Worker cfg_.ts_rate_decimator[2] = 1;
930*fb1b10abSAndroid Build Coastguard Worker
931*fb1b10abSAndroid Build Coastguard Worker cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_0212;
932*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 200;
933*fb1b10abSAndroid Build Coastguard Worker cfg_.g_error_resilient = 1;
934*fb1b10abSAndroid Build Coastguard Worker total_frame_ = 400;
935*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
936*fb1b10abSAndroid Build Coastguard Worker 0, total_frame_);
937*fb1b10abSAndroid Build Coastguard Worker ResetModel();
938*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[0] = 40 * cfg_.rc_target_bitrate / 100;
939*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[1] = 60 * cfg_.rc_target_bitrate / 100;
940*fb1b10abSAndroid Build Coastguard Worker cfg_.layer_target_bitrate[2] = cfg_.rc_target_bitrate;
941*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
942*fb1b10abSAndroid Build Coastguard Worker }
943*fb1b10abSAndroid Build Coastguard Worker
944*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
945*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting.
946*fb1b10abSAndroid Build Coastguard Worker class DatarateTestVP9RealTimeDenoiser : public DatarateTestVP9RealTime {
947*fb1b10abSAndroid Build Coastguard Worker public:
948*fb1b10abSAndroid Build Coastguard Worker ~DatarateTestVP9RealTimeDenoiser() override = default;
949*fb1b10abSAndroid Build Coastguard Worker };
950*fb1b10abSAndroid Build Coastguard Worker
951*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is on.
TEST_P(DatarateTestVP9RealTimeDenoiser,LowNoise)952*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeDenoiser, LowNoise) {
953*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
954*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
955*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
956*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
957*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 2;
958*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 56;
959*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
960*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
961*fb1b10abSAndroid Build Coastguard Worker
962*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
963*fb1b10abSAndroid Build Coastguard Worker 0, 400);
964*fb1b10abSAndroid Build Coastguard Worker
965*fb1b10abSAndroid Build Coastguard Worker // For the temporal denoiser (#if CONFIG_VP9_TEMPORAL_DENOISING),
966*fb1b10abSAndroid Build Coastguard Worker // there is only one denoiser mode: denoiserYonly(which is 1),
967*fb1b10abSAndroid Build Coastguard Worker // but may add more modes in the future.
968*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 400;
969*fb1b10abSAndroid Build Coastguard Worker ResetModel();
970*fb1b10abSAndroid Build Coastguard Worker // Turn on the denoiser.
971*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ = 1;
972*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
973*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
974*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
975*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
976*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
977*fb1b10abSAndroid Build Coastguard Worker }
978*fb1b10abSAndroid Build Coastguard Worker
979*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is on,
980*fb1b10abSAndroid Build Coastguard Worker // for clip with high noise level. Use 2 threads.
TEST_P(DatarateTestVP9RealTimeDenoiser,HighNoise)981*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeDenoiser, HighNoise) {
982*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
983*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
984*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
985*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
986*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 2;
987*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 56;
988*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
989*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
990*fb1b10abSAndroid Build Coastguard Worker cfg_.g_threads = 2;
991*fb1b10abSAndroid Build Coastguard Worker
992*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Y4mVideoSource video("noisy_clip_640_360.y4m", 0, 200);
993*fb1b10abSAndroid Build Coastguard Worker
994*fb1b10abSAndroid Build Coastguard Worker // For the temporal denoiser (#if CONFIG_VP9_TEMPORAL_DENOISING),
995*fb1b10abSAndroid Build Coastguard Worker // there is only one denoiser mode: kDenoiserOnYOnly(which is 1),
996*fb1b10abSAndroid Build Coastguard Worker // but may add more modes in the future.
997*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 1000;
998*fb1b10abSAndroid Build Coastguard Worker ResetModel();
999*fb1b10abSAndroid Build Coastguard Worker // Turn on the denoiser.
1000*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ = 1;
1001*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1002*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
1003*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
1004*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
1005*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
1006*fb1b10abSAndroid Build Coastguard Worker }
1007*fb1b10abSAndroid Build Coastguard Worker
1008*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is on,
1009*fb1b10abSAndroid Build Coastguard Worker // for 1280x720 clip with 4 threads.
1010*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeDenoiser, 4threads) {
1011*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
1012*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
1013*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
1014*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
1015*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 2;
1016*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 56;
1017*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
1018*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
1019*fb1b10abSAndroid Build Coastguard Worker cfg_.g_threads = 4;
1020*fb1b10abSAndroid Build Coastguard Worker
1021*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 300);
1022*fb1b10abSAndroid Build Coastguard Worker
1023*fb1b10abSAndroid Build Coastguard Worker // For the temporal denoiser (#if CONFIG_VP9_TEMPORAL_DENOISING),
1024*fb1b10abSAndroid Build Coastguard Worker // there is only one denoiser mode: denoiserYonly(which is 1),
1025*fb1b10abSAndroid Build Coastguard Worker // but may add more modes in the future.
1026*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 1000;
1027*fb1b10abSAndroid Build Coastguard Worker ResetModel();
1028*fb1b10abSAndroid Build Coastguard Worker // Turn on the denoiser.
1029*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ = 1;
1030*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1031*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
1032*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
1033*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.29)
1034*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
1035*fb1b10abSAndroid Build Coastguard Worker }
1036*fb1b10abSAndroid Build Coastguard Worker
1037*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is off
1038*fb1b10abSAndroid Build Coastguard Worker // and on.
TEST_P(DatarateTestVP9RealTimeDenoiser,DenoiserOffOn)1039*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestVP9RealTimeDenoiser, DenoiserOffOn) {
1040*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_initial_sz = 500;
1041*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_optimal_sz = 500;
1042*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_buf_sz = 1000;
1043*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_dropframe_thresh = 1;
1044*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_min_quantizer = 2;
1045*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_max_quantizer = 56;
1046*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_end_usage = VPX_CBR;
1047*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
1048*fb1b10abSAndroid Build Coastguard Worker
1049*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1050*fb1b10abSAndroid Build Coastguard Worker 0, 400);
1051*fb1b10abSAndroid Build Coastguard Worker
1052*fb1b10abSAndroid Build Coastguard Worker // For the temporal denoiser (#if CONFIG_VP9_TEMPORAL_DENOISING),
1053*fb1b10abSAndroid Build Coastguard Worker // there is only one denoiser mode: denoiserYonly(which is 1),
1054*fb1b10abSAndroid Build Coastguard Worker // but may add more modes in the future.
1055*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = 400;
1056*fb1b10abSAndroid Build Coastguard Worker ResetModel();
1057*fb1b10abSAndroid Build Coastguard Worker // The denoiser is off by default.
1058*fb1b10abSAndroid Build Coastguard Worker denoiser_on_ = 0;
1059*fb1b10abSAndroid Build Coastguard Worker // Set the offon test flag.
1060*fb1b10abSAndroid Build Coastguard Worker denoiser_offon_test_ = 1;
1061*fb1b10abSAndroid Build Coastguard Worker denoiser_offon_period_ = 100;
1062*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1063*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.85)
1064*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is lower than target by too much!";
1065*fb1b10abSAndroid Build Coastguard Worker ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.15)
1066*fb1b10abSAndroid Build Coastguard Worker << " The datarate for the file is greater than target by too much!";
1067*fb1b10abSAndroid Build Coastguard Worker }
1068*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_TEMPORAL_DENOISING
1069*fb1b10abSAndroid Build Coastguard Worker
1070*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9RealTimeMultiBR,
1071*fb1b10abSAndroid Build Coastguard Worker ::testing::Range(5, 10), ::testing::Range(0, 4));
1072*fb1b10abSAndroid Build Coastguard Worker
1073*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9LargeVBR, ::testing::Range(5, 9),
1074*fb1b10abSAndroid Build Coastguard Worker ::testing::Range(0, 2));
1075*fb1b10abSAndroid Build Coastguard Worker
1076*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9RealTime, ::testing::Range(5, 10));
1077*fb1b10abSAndroid Build Coastguard Worker
1078*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9
1079*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
1080*fb1b10abSAndroid Build Coastguard Worker VP9, DatarateTestVP9FrameQp,
1081*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
1082*fb1b10abSAndroid Build Coastguard Worker static_cast<const libvpx_test::CodecFactory *>(&libvpx_test::kVP9)));
1083*fb1b10abSAndroid Build Coastguard Worker #endif
1084*fb1b10abSAndroid Build Coastguard Worker
1085*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9RealTimeDeltaQUV,
1086*fb1b10abSAndroid Build Coastguard Worker ::testing::Range(5, 10),
1087*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(-5, -10, -15));
1088*fb1b10abSAndroid Build Coastguard Worker
1089*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9PostEncodeDrop,
1090*fb1b10abSAndroid Build Coastguard Worker ::testing::Range(5, 6));
1091*fb1b10abSAndroid Build Coastguard Worker
1092*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
1093*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateTestVP9RealTimeDenoiser,
1094*fb1b10abSAndroid Build Coastguard Worker ::testing::Range(5, 10));
1095*fb1b10abSAndroid Build Coastguard Worker #endif
1096*fb1b10abSAndroid Build Coastguard Worker } // namespace
1097