xref: /aosp_15_r20/external/libvpx/test/vp8_datarate_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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/codec_factory.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/y4m_video_source.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_encoder.h"
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker namespace {
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker class DatarateTestLarge
22*fb1b10abSAndroid Build Coastguard Worker     : public ::libvpx_test::EncoderTest,
23*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
24*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateTestLarge()25*fb1b10abSAndroid Build Coastguard Worker   DatarateTestLarge() : EncoderTest(GET_PARAM(0)) {}
26*fb1b10abSAndroid Build Coastguard Worker 
27*fb1b10abSAndroid Build Coastguard Worker   ~DatarateTestLarge() override = default;
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()30*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
31*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
32*fb1b10abSAndroid Build Coastguard Worker     SetMode(GET_PARAM(1));
33*fb1b10abSAndroid Build Coastguard Worker     set_cpu_used_ = GET_PARAM(2);
34*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
35*fb1b10abSAndroid Build Coastguard Worker   }
36*fb1b10abSAndroid Build Coastguard Worker 
ResetModel()37*fb1b10abSAndroid Build Coastguard Worker   virtual void ResetModel() {
38*fb1b10abSAndroid Build Coastguard Worker     last_pts_ = 0;
39*fb1b10abSAndroid Build Coastguard Worker     bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz;
40*fb1b10abSAndroid Build Coastguard Worker     frame_number_ = 0;
41*fb1b10abSAndroid Build Coastguard Worker     first_drop_ = 0;
42*fb1b10abSAndroid Build Coastguard Worker     bits_total_ = 0;
43*fb1b10abSAndroid Build Coastguard Worker     duration_ = 0.0;
44*fb1b10abSAndroid Build Coastguard Worker     denoiser_offon_test_ = 0;
45*fb1b10abSAndroid Build Coastguard Worker     denoiser_offon_period_ = -1;
46*fb1b10abSAndroid Build Coastguard Worker     gf_boost_ = 0;
47*fb1b10abSAndroid Build Coastguard Worker     use_roi_ = false;
48*fb1b10abSAndroid Build Coastguard Worker   }
49*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)50*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
51*fb1b10abSAndroid Build Coastguard Worker                           ::libvpx_test::Encoder *encoder) override {
52*fb1b10abSAndroid Build Coastguard Worker     if (video->frame() == 0) {
53*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_NOISE_SENSITIVITY, denoiser_on_);
54*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
55*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_GF_CBR_BOOST_PCT, gf_boost_);
56*fb1b10abSAndroid Build Coastguard Worker     }
57*fb1b10abSAndroid Build Coastguard Worker 
58*fb1b10abSAndroid Build Coastguard Worker     if (use_roi_) {
59*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_ROI_MAP, &roi_);
60*fb1b10abSAndroid Build Coastguard Worker     }
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker     if (denoiser_offon_test_) {
63*fb1b10abSAndroid Build Coastguard Worker       ASSERT_GT(denoiser_offon_period_, 0)
64*fb1b10abSAndroid Build Coastguard Worker           << "denoiser_offon_period_ is not positive.";
65*fb1b10abSAndroid Build Coastguard Worker       if ((video->frame() + 1) % denoiser_offon_period_ == 0) {
66*fb1b10abSAndroid Build Coastguard Worker         // Flip denoiser_on_ periodically
67*fb1b10abSAndroid Build Coastguard Worker         denoiser_on_ ^= 1;
68*fb1b10abSAndroid Build Coastguard Worker       }
69*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_NOISE_SENSITIVITY, denoiser_on_);
70*fb1b10abSAndroid Build Coastguard Worker     }
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker     const vpx_rational_t tb = video->timebase();
73*fb1b10abSAndroid Build Coastguard Worker     timebase_ = static_cast<double>(tb.num) / tb.den;
74*fb1b10abSAndroid Build Coastguard Worker     duration_ = 0;
75*fb1b10abSAndroid Build Coastguard Worker   }
76*fb1b10abSAndroid Build Coastguard Worker 
FramePktHook(const vpx_codec_cx_pkt_t * pkt)77*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
78*fb1b10abSAndroid Build Coastguard Worker     // Time since last timestamp = duration.
79*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_;
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker     // TODO(jimbankoski): Remove these lines when the issue:
82*fb1b10abSAndroid Build Coastguard Worker     // http://code.google.com/p/webm/issues/detail?id=496 is fixed.
83*fb1b10abSAndroid Build Coastguard Worker     // For now the codec assumes buffer starts at starting buffer rate
84*fb1b10abSAndroid Build Coastguard Worker     // plus one frame's time.
85*fb1b10abSAndroid Build Coastguard Worker     if (last_pts_ == 0) duration = 1;
86*fb1b10abSAndroid Build Coastguard Worker 
87*fb1b10abSAndroid Build Coastguard Worker     // Add to the buffer the bits we'd expect from a constant bitrate server.
88*fb1b10abSAndroid Build Coastguard Worker     bits_in_buffer_model_ += static_cast<int64_t>(
89*fb1b10abSAndroid Build Coastguard Worker         duration * timebase_ * cfg_.rc_target_bitrate * 1000);
90*fb1b10abSAndroid Build Coastguard Worker 
91*fb1b10abSAndroid Build Coastguard Worker     /* Test the buffer model here before subtracting the frame. Do so because
92*fb1b10abSAndroid Build Coastguard Worker      * the way the leaky bucket model works in libvpx is to allow the buffer to
93*fb1b10abSAndroid Build Coastguard Worker      * empty - and then stop showing frames until we've got enough bits to
94*fb1b10abSAndroid Build Coastguard Worker      * show one. As noted in comment below (issue 495), this does not currently
95*fb1b10abSAndroid Build Coastguard Worker      * apply to key frames. For now exclude key frames in condition below. */
96*fb1b10abSAndroid Build Coastguard Worker     const bool key_frame =
97*fb1b10abSAndroid Build Coastguard Worker         (pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? true : false;
98*fb1b10abSAndroid Build Coastguard Worker     if (!key_frame) {
99*fb1b10abSAndroid Build Coastguard Worker       ASSERT_GE(bits_in_buffer_model_, 0)
100*fb1b10abSAndroid Build Coastguard Worker           << "Buffer Underrun at frame " << pkt->data.frame.pts;
101*fb1b10abSAndroid Build Coastguard Worker     }
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker     const int64_t frame_size_in_bits = pkt->data.frame.sz * 8;
104*fb1b10abSAndroid Build Coastguard Worker 
105*fb1b10abSAndroid Build Coastguard Worker     // Subtract from the buffer the bits associated with a played back frame.
106*fb1b10abSAndroid Build Coastguard Worker     bits_in_buffer_model_ -= frame_size_in_bits;
107*fb1b10abSAndroid Build Coastguard Worker 
108*fb1b10abSAndroid Build Coastguard Worker     // Update the running total of bits for end of test datarate checks.
109*fb1b10abSAndroid Build Coastguard Worker     bits_total_ += frame_size_in_bits;
110*fb1b10abSAndroid Build Coastguard Worker 
111*fb1b10abSAndroid Build Coastguard Worker     // If first drop not set and we have a drop set it to this time.
112*fb1b10abSAndroid Build Coastguard Worker     if (!first_drop_ && duration > 1) first_drop_ = last_pts_ + 1;
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker     // Update the most recent pts.
115*fb1b10abSAndroid Build Coastguard Worker     last_pts_ = pkt->data.frame.pts;
116*fb1b10abSAndroid Build Coastguard Worker 
117*fb1b10abSAndroid Build Coastguard Worker     // We update this so that we can calculate the datarate minus the last
118*fb1b10abSAndroid Build Coastguard Worker     // frame encoded in the file.
119*fb1b10abSAndroid Build Coastguard Worker     bits_in_last_frame_ = frame_size_in_bits;
120*fb1b10abSAndroid Build Coastguard Worker 
121*fb1b10abSAndroid Build Coastguard Worker     ++frame_number_;
122*fb1b10abSAndroid Build Coastguard Worker   }
123*fb1b10abSAndroid Build Coastguard Worker 
EndPassHook()124*fb1b10abSAndroid Build Coastguard Worker   void EndPassHook() override {
125*fb1b10abSAndroid Build Coastguard Worker     if (bits_total_) {
126*fb1b10abSAndroid Build Coastguard Worker       const double file_size_in_kb = bits_total_ / 1000.;  // bits per kilobit
127*fb1b10abSAndroid Build Coastguard Worker 
128*fb1b10abSAndroid Build Coastguard Worker       duration_ = (last_pts_ + 1) * timebase_;
129*fb1b10abSAndroid Build Coastguard Worker 
130*fb1b10abSAndroid Build Coastguard Worker       // Effective file datarate includes the time spent prebuffering.
131*fb1b10abSAndroid Build Coastguard Worker       effective_datarate_ = (bits_total_ - bits_in_last_frame_) / 1000.0 /
132*fb1b10abSAndroid Build Coastguard Worker                             (cfg_.rc_buf_initial_sz / 1000.0 + duration_);
133*fb1b10abSAndroid Build Coastguard Worker 
134*fb1b10abSAndroid Build Coastguard Worker       file_datarate_ = file_size_in_kb / duration_;
135*fb1b10abSAndroid Build Coastguard Worker     }
136*fb1b10abSAndroid Build Coastguard Worker   }
137*fb1b10abSAndroid Build Coastguard Worker 
DenoiserLevelsTest()138*fb1b10abSAndroid Build Coastguard Worker   virtual void DenoiserLevelsTest() {
139*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
140*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
141*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
142*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
143*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
144*fb1b10abSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
145*fb1b10abSAndroid Build Coastguard Worker     for (int j = 1; j < 5; ++j) {
146*fb1b10abSAndroid Build Coastguard Worker       // Run over the denoiser levels.
147*fb1b10abSAndroid Build Coastguard Worker       // For the temporal denoiser (#if CONFIG_TEMPORAL_DENOISING) the level j
148*fb1b10abSAndroid Build Coastguard Worker       // refers to the 4 denoiser modes: denoiserYonly, denoiserOnYUV,
149*fb1b10abSAndroid Build Coastguard Worker       // denoiserOnAggressive, and denoiserOnAdaptive.
150*fb1b10abSAndroid Build Coastguard Worker       denoiser_on_ = j;
151*fb1b10abSAndroid Build Coastguard Worker       cfg_.rc_target_bitrate = 300;
152*fb1b10abSAndroid Build Coastguard Worker       ResetModel();
153*fb1b10abSAndroid Build Coastguard Worker       ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
154*fb1b10abSAndroid Build Coastguard Worker       ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
155*fb1b10abSAndroid Build Coastguard Worker           << " The datarate for the file exceeds the target!";
156*fb1b10abSAndroid Build Coastguard Worker 
157*fb1b10abSAndroid Build Coastguard Worker       ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
158*fb1b10abSAndroid Build Coastguard Worker           << " The datarate for the file missed the target!";
159*fb1b10abSAndroid Build Coastguard Worker     }
160*fb1b10abSAndroid Build Coastguard Worker   }
161*fb1b10abSAndroid Build Coastguard Worker 
DenoiserOffOnTest()162*fb1b10abSAndroid Build Coastguard Worker   virtual void DenoiserOffOnTest() {
163*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
164*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
165*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
166*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
167*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
168*fb1b10abSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 299);
169*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 300;
170*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
171*fb1b10abSAndroid Build Coastguard Worker     // The denoiser is off by default.
172*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
173*fb1b10abSAndroid Build Coastguard Worker     // Set the offon test flag.
174*fb1b10abSAndroid Build Coastguard Worker     denoiser_offon_test_ = 1;
175*fb1b10abSAndroid Build Coastguard Worker     denoiser_offon_period_ = 100;
176*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
177*fb1b10abSAndroid Build Coastguard Worker     ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
178*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target!";
179*fb1b10abSAndroid Build Coastguard Worker     ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
180*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!";
181*fb1b10abSAndroid Build Coastguard Worker   }
182*fb1b10abSAndroid Build Coastguard Worker 
BasicBufferModelTest()183*fb1b10abSAndroid Build Coastguard Worker   virtual void BasicBufferModelTest() {
184*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
185*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
186*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
187*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
188*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
189*fb1b10abSAndroid Build Coastguard Worker     // 2 pass cbr datarate control has a bug hidden by the small # of
190*fb1b10abSAndroid Build Coastguard Worker     // frames selected in this encode. The problem is that even if the buffer is
191*fb1b10abSAndroid Build Coastguard Worker     // negative we produce a keyframe on a cutscene. Ignoring datarate
192*fb1b10abSAndroid Build Coastguard Worker     // constraints
193*fb1b10abSAndroid Build Coastguard Worker     // TODO(jimbankoski): ( Fix when issue
194*fb1b10abSAndroid Build Coastguard Worker     // http://code.google.com/p/webm/issues/detail?id=495 is addressed. )
195*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
196*fb1b10abSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
197*fb1b10abSAndroid Build Coastguard Worker 
198*fb1b10abSAndroid Build Coastguard Worker     // There is an issue for low bitrates in real-time mode, where the
199*fb1b10abSAndroid Build Coastguard Worker     // effective_datarate slightly overshoots the target bitrate.
200*fb1b10abSAndroid Build Coastguard Worker     // This is same the issue as noted about (#495).
201*fb1b10abSAndroid Build Coastguard Worker     // TODO(jimbankoski/marpan): Update test to run for lower bitrates (< 100),
202*fb1b10abSAndroid Build Coastguard Worker     // when the issue is resolved.
203*fb1b10abSAndroid Build Coastguard Worker     for (int i = 100; i < 800; i += 200) {
204*fb1b10abSAndroid Build Coastguard Worker       cfg_.rc_target_bitrate = i;
205*fb1b10abSAndroid Build Coastguard Worker       ResetModel();
206*fb1b10abSAndroid Build Coastguard Worker       ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
207*fb1b10abSAndroid Build Coastguard Worker       ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
208*fb1b10abSAndroid Build Coastguard Worker           << " The datarate for the file exceeds the target!";
209*fb1b10abSAndroid Build Coastguard Worker       ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
210*fb1b10abSAndroid Build Coastguard Worker           << " The datarate for the file missed the target!";
211*fb1b10abSAndroid Build Coastguard Worker     }
212*fb1b10abSAndroid Build Coastguard Worker   }
213*fb1b10abSAndroid Build Coastguard Worker 
ChangingDropFrameThreshTest()214*fb1b10abSAndroid Build Coastguard Worker   virtual void ChangingDropFrameThreshTest() {
215*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
216*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
217*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 36;
218*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
219*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 200;
220*fb1b10abSAndroid Build Coastguard Worker     cfg_.kf_mode = VPX_KF_DISABLED;
221*fb1b10abSAndroid Build Coastguard Worker 
222*fb1b10abSAndroid Build Coastguard Worker     const int frame_count = 40;
223*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
224*fb1b10abSAndroid Build Coastguard Worker                                          288, 30, 1, 0, frame_count);
225*fb1b10abSAndroid Build Coastguard Worker 
226*fb1b10abSAndroid Build Coastguard Worker     // Here we check that the first dropped frame gets earlier and earlier
227*fb1b10abSAndroid Build Coastguard Worker     // as the drop frame threshold is increased.
228*fb1b10abSAndroid Build Coastguard Worker 
229*fb1b10abSAndroid Build Coastguard Worker     const int kDropFrameThreshTestStep = 30;
230*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_pts_t last_drop = frame_count;
231*fb1b10abSAndroid Build Coastguard Worker     for (int i = 1; i < 91; i += kDropFrameThreshTestStep) {
232*fb1b10abSAndroid Build Coastguard Worker       cfg_.rc_dropframe_thresh = i;
233*fb1b10abSAndroid Build Coastguard Worker       ResetModel();
234*fb1b10abSAndroid Build Coastguard Worker       ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
235*fb1b10abSAndroid Build Coastguard Worker       ASSERT_LE(first_drop_, last_drop)
236*fb1b10abSAndroid Build Coastguard Worker           << " The first dropped frame for drop_thresh " << i
237*fb1b10abSAndroid Build Coastguard Worker           << " > first dropped frame for drop_thresh "
238*fb1b10abSAndroid Build Coastguard Worker           << i - kDropFrameThreshTestStep;
239*fb1b10abSAndroid Build Coastguard Worker       last_drop = first_drop_;
240*fb1b10abSAndroid Build Coastguard Worker     }
241*fb1b10abSAndroid Build Coastguard Worker   }
242*fb1b10abSAndroid Build Coastguard Worker 
DropFramesMultiThreadsTest()243*fb1b10abSAndroid Build Coastguard Worker   virtual void DropFramesMultiThreadsTest() {
244*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
245*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
246*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 30;
247*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
248*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
249*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_threads = 2;
250*fb1b10abSAndroid Build Coastguard Worker 
251*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
252*fb1b10abSAndroid Build Coastguard Worker                                          288, 30, 1, 0, 140);
253*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 200;
254*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
255*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
256*fb1b10abSAndroid Build Coastguard Worker     ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
257*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target!";
258*fb1b10abSAndroid Build Coastguard Worker 
259*fb1b10abSAndroid Build Coastguard Worker     ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
260*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!";
261*fb1b10abSAndroid Build Coastguard Worker   }
262*fb1b10abSAndroid Build Coastguard Worker 
MultiThreadsPSNRTest()263*fb1b10abSAndroid Build Coastguard Worker   virtual void MultiThreadsPSNRTest() {
264*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
265*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
266*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 0;
267*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
268*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
269*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_threads = 4;
270*fb1b10abSAndroid Build Coastguard Worker     init_flags_ = VPX_CODEC_USE_PSNR;
271*fb1b10abSAndroid Build Coastguard Worker 
272*fb1b10abSAndroid Build Coastguard Worker     ::libvpx_test::I420VideoSource video("desktop_office1.1280_720-020.yuv",
273*fb1b10abSAndroid Build Coastguard Worker                                          1280, 720, 30, 1, 0, 30);
274*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 1000;
275*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
276*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
277*fb1b10abSAndroid Build Coastguard Worker     ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.5)
278*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file exceeds the target!";
279*fb1b10abSAndroid Build Coastguard Worker 
280*fb1b10abSAndroid Build Coastguard Worker     ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 2.0)
281*fb1b10abSAndroid Build Coastguard Worker         << " The datarate for the file missed the target!";
282*fb1b10abSAndroid Build Coastguard Worker   }
283*fb1b10abSAndroid Build Coastguard Worker 
284*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t last_pts_;
285*fb1b10abSAndroid Build Coastguard Worker   int64_t bits_in_buffer_model_;
286*fb1b10abSAndroid Build Coastguard Worker   double timebase_;
287*fb1b10abSAndroid Build Coastguard Worker   int frame_number_;
288*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t first_drop_;
289*fb1b10abSAndroid Build Coastguard Worker   int64_t bits_total_;
290*fb1b10abSAndroid Build Coastguard Worker   double duration_;
291*fb1b10abSAndroid Build Coastguard Worker   double file_datarate_;
292*fb1b10abSAndroid Build Coastguard Worker   double effective_datarate_;
293*fb1b10abSAndroid Build Coastguard Worker   int64_t bits_in_last_frame_;
294*fb1b10abSAndroid Build Coastguard Worker   int denoiser_on_;
295*fb1b10abSAndroid Build Coastguard Worker   int denoiser_offon_test_;
296*fb1b10abSAndroid Build Coastguard Worker   int denoiser_offon_period_;
297*fb1b10abSAndroid Build Coastguard Worker   int set_cpu_used_;
298*fb1b10abSAndroid Build Coastguard Worker   int gf_boost_;
299*fb1b10abSAndroid Build Coastguard Worker   bool use_roi_;
300*fb1b10abSAndroid Build Coastguard Worker   vpx_roi_map_t roi_;
301*fb1b10abSAndroid Build Coastguard Worker };
302*fb1b10abSAndroid Build Coastguard Worker 
303*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_TEMPORAL_DENOISING
304*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, but loop over the
305*fb1b10abSAndroid Build Coastguard Worker // various denoiser settings.
TEST_P(DatarateTestLarge,DenoiserLevels)306*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, DenoiserLevels) { DenoiserLevelsTest(); }
307*fb1b10abSAndroid Build Coastguard Worker 
308*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is off
309*fb1b10abSAndroid Build Coastguard Worker // and on.
TEST_P(DatarateTestLarge,DenoiserOffOn)310*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, DenoiserOffOn) { DenoiserOffOnTest(); }
311*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_TEMPORAL_DENOISING
312*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestLarge,BasicBufferModel)313*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, BasicBufferModel) { BasicBufferModelTest(); }
314*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestLarge,ChangingDropFrameThresh)315*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, ChangingDropFrameThresh) {
316*fb1b10abSAndroid Build Coastguard Worker   ChangingDropFrameThreshTest();
317*fb1b10abSAndroid Build Coastguard Worker }
318*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestLarge,DropFramesMultiThreads)319*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestLarge, DropFramesMultiThreads) {
320*fb1b10abSAndroid Build Coastguard Worker   DropFramesMultiThreadsTest();
321*fb1b10abSAndroid Build Coastguard Worker }
322*fb1b10abSAndroid Build Coastguard Worker 
323*fb1b10abSAndroid Build Coastguard Worker class DatarateTestRealTime : public DatarateTestLarge {
324*fb1b10abSAndroid Build Coastguard Worker  public:
325*fb1b10abSAndroid Build Coastguard Worker   ~DatarateTestRealTime() override = default;
326*fb1b10abSAndroid Build Coastguard Worker };
327*fb1b10abSAndroid Build Coastguard Worker 
328*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_TEMPORAL_DENOISING
329*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, but loop over the
330*fb1b10abSAndroid Build Coastguard Worker // various denoiser settings.
TEST_P(DatarateTestRealTime,DenoiserLevels)331*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, DenoiserLevels) { DenoiserLevelsTest(); }
332*fb1b10abSAndroid Build Coastguard Worker 
333*fb1b10abSAndroid Build Coastguard Worker // Check basic datarate targeting, for a single bitrate, when denoiser is off
334*fb1b10abSAndroid Build Coastguard Worker // and on.
TEST_P(DatarateTestRealTime,DenoiserOffOn)335*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, DenoiserOffOn) {}
336*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_TEMPORAL_DENOISING
337*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,BasicBufferModel)338*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, BasicBufferModel) { BasicBufferModelTest(); }
339*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,ChangingDropFrameThresh)340*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, ChangingDropFrameThresh) {
341*fb1b10abSAndroid Build Coastguard Worker   ChangingDropFrameThreshTest();
342*fb1b10abSAndroid Build Coastguard Worker }
343*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,DropFramesMultiThreads)344*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, DropFramesMultiThreads) {
345*fb1b10abSAndroid Build Coastguard Worker   DropFramesMultiThreadsTest();
346*fb1b10abSAndroid Build Coastguard Worker }
347*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,MultiThreadsPSNR)348*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, MultiThreadsPSNR) { MultiThreadsPSNRTest(); }
349*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,RegionOfInterest)350*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, RegionOfInterest) {
351*fb1b10abSAndroid Build Coastguard Worker   denoiser_on_ = 0;
352*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
353*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
354*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 56;
355*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
356*fb1b10abSAndroid Build Coastguard Worker   // Encode using multiple threads.
357*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 2;
358*fb1b10abSAndroid Build Coastguard Worker 
359*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
360*fb1b10abSAndroid Build Coastguard Worker                                        30, 1, 0, 300);
361*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 450;
362*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_w = 352;
363*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_h = 288;
364*fb1b10abSAndroid Build Coastguard Worker 
365*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
366*fb1b10abSAndroid Build Coastguard Worker 
367*fb1b10abSAndroid Build Coastguard Worker   // Set ROI parameters
368*fb1b10abSAndroid Build Coastguard Worker   use_roi_ = true;
369*fb1b10abSAndroid Build Coastguard Worker   memset(&roi_, 0, sizeof(roi_));
370*fb1b10abSAndroid Build Coastguard Worker 
371*fb1b10abSAndroid Build Coastguard Worker   roi_.rows = (cfg_.g_h + 15) / 16;
372*fb1b10abSAndroid Build Coastguard Worker   roi_.cols = (cfg_.g_w + 15) / 16;
373*fb1b10abSAndroid Build Coastguard Worker 
374*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_q[0] = 0;
375*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_q[1] = -20;
376*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_q[2] = 0;
377*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_q[3] = 0;
378*fb1b10abSAndroid Build Coastguard Worker 
379*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_lf[0] = 0;
380*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_lf[1] = -20;
381*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_lf[2] = 0;
382*fb1b10abSAndroid Build Coastguard Worker   roi_.delta_lf[3] = 0;
383*fb1b10abSAndroid Build Coastguard Worker 
384*fb1b10abSAndroid Build Coastguard Worker   roi_.static_threshold[0] = 0;
385*fb1b10abSAndroid Build Coastguard Worker   roi_.static_threshold[1] = 1000;
386*fb1b10abSAndroid Build Coastguard Worker   roi_.static_threshold[2] = 0;
387*fb1b10abSAndroid Build Coastguard Worker   roi_.static_threshold[3] = 0;
388*fb1b10abSAndroid Build Coastguard Worker 
389*fb1b10abSAndroid Build Coastguard Worker   // Use 2 states: 1 is center square, 0 is the rest.
390*fb1b10abSAndroid Build Coastguard Worker   roi_.roi_map =
391*fb1b10abSAndroid Build Coastguard Worker       (uint8_t *)calloc(roi_.rows * roi_.cols, sizeof(*roi_.roi_map));
392*fb1b10abSAndroid Build Coastguard Worker   for (unsigned int i = 0; i < roi_.rows; ++i) {
393*fb1b10abSAndroid Build Coastguard Worker     for (unsigned int j = 0; j < roi_.cols; ++j) {
394*fb1b10abSAndroid Build Coastguard Worker       if (i > (roi_.rows >> 2) && i < ((roi_.rows * 3) >> 2) &&
395*fb1b10abSAndroid Build Coastguard Worker           j > (roi_.cols >> 2) && j < ((roi_.cols * 3) >> 2)) {
396*fb1b10abSAndroid Build Coastguard Worker         roi_.roi_map[i * roi_.cols + j] = 1;
397*fb1b10abSAndroid Build Coastguard Worker       }
398*fb1b10abSAndroid Build Coastguard Worker     }
399*fb1b10abSAndroid Build Coastguard Worker   }
400*fb1b10abSAndroid Build Coastguard Worker 
401*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
402*fb1b10abSAndroid Build Coastguard Worker   ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
403*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file exceeds the target!";
404*fb1b10abSAndroid Build Coastguard Worker 
405*fb1b10abSAndroid Build Coastguard Worker   ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
406*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file missed the target!";
407*fb1b10abSAndroid Build Coastguard Worker 
408*fb1b10abSAndroid Build Coastguard Worker   free(roi_.roi_map);
409*fb1b10abSAndroid Build Coastguard Worker }
410*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,GFBoost)411*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, GFBoost) {
412*fb1b10abSAndroid Build Coastguard Worker   denoiser_on_ = 0;
413*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
414*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
415*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 56;
416*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
417*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 0;
418*fb1b10abSAndroid Build Coastguard Worker 
419*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
420*fb1b10abSAndroid Build Coastguard Worker                                        30, 1, 0, 300);
421*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 300;
422*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
423*fb1b10abSAndroid Build Coastguard Worker   // Apply a gf boost.
424*fb1b10abSAndroid Build Coastguard Worker   gf_boost_ = 50;
425*fb1b10abSAndroid Build Coastguard Worker 
426*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
427*fb1b10abSAndroid Build Coastguard Worker   ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
428*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file exceeds the target!";
429*fb1b10abSAndroid Build Coastguard Worker 
430*fb1b10abSAndroid Build Coastguard Worker   ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
431*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file missed the target!";
432*fb1b10abSAndroid Build Coastguard Worker }
433*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(DatarateTestRealTime,NV12)434*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateTestRealTime, NV12) {
435*fb1b10abSAndroid Build Coastguard Worker   denoiser_on_ = 0;
436*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
437*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
438*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 56;
439*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
440*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 0;
441*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::YUVVideoSource video("hantro_collage_w352h288_nv12.yuv",
442*fb1b10abSAndroid Build Coastguard Worker                                       VPX_IMG_FMT_NV12, 352, 288, 30, 1, 0,
443*fb1b10abSAndroid Build Coastguard Worker                                       100);
444*fb1b10abSAndroid Build Coastguard Worker 
445*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 200;
446*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
447*fb1b10abSAndroid Build Coastguard Worker 
448*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
449*fb1b10abSAndroid Build Coastguard Worker   ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.95)
450*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file exceeds the target!";
451*fb1b10abSAndroid Build Coastguard Worker 
452*fb1b10abSAndroid Build Coastguard Worker   ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.4)
453*fb1b10abSAndroid Build Coastguard Worker       << " The datarate for the file missed the target!";
454*fb1b10abSAndroid Build Coastguard Worker }
455*fb1b10abSAndroid Build Coastguard Worker 
456*fb1b10abSAndroid Build Coastguard Worker VP8_INSTANTIATE_TEST_SUITE(DatarateTestLarge, ALL_TEST_MODES,
457*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(0));
458*fb1b10abSAndroid Build Coastguard Worker VP8_INSTANTIATE_TEST_SUITE(DatarateTestRealTime,
459*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kRealTime),
460*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(-6, -12));
461*fb1b10abSAndroid Build Coastguard Worker }  // namespace
462