xref: /aosp_15_r20/external/libvpx/test/resize_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 <climits>
11*fb1b10abSAndroid Build Coastguard Worker #include <vector>
12*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.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/video_source.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker // Enable(1) or Disable(0) writing of the compressed bitstream.
21*fb1b10abSAndroid Build Coastguard Worker #define WRITE_COMPRESSED_STREAM 0
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker namespace {
24*fb1b10abSAndroid Build Coastguard Worker 
25*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
mem_put_le16(char * const mem,const unsigned int val)26*fb1b10abSAndroid Build Coastguard Worker static void mem_put_le16(char *const mem, const unsigned int val) {
27*fb1b10abSAndroid Build Coastguard Worker   mem[0] = val;
28*fb1b10abSAndroid Build Coastguard Worker   mem[1] = val >> 8;
29*fb1b10abSAndroid Build Coastguard Worker }
30*fb1b10abSAndroid Build Coastguard Worker 
mem_put_le32(char * const mem,const unsigned int val)31*fb1b10abSAndroid Build Coastguard Worker static void mem_put_le32(char *const mem, const unsigned int val) {
32*fb1b10abSAndroid Build Coastguard Worker   mem[0] = val;
33*fb1b10abSAndroid Build Coastguard Worker   mem[1] = val >> 8;
34*fb1b10abSAndroid Build Coastguard Worker   mem[2] = val >> 16;
35*fb1b10abSAndroid Build Coastguard Worker   mem[3] = val >> 24;
36*fb1b10abSAndroid Build Coastguard Worker }
37*fb1b10abSAndroid Build Coastguard Worker 
write_ivf_file_header(const vpx_codec_enc_cfg_t * const cfg,int frame_cnt,FILE * const outfile)38*fb1b10abSAndroid Build Coastguard Worker static void write_ivf_file_header(const vpx_codec_enc_cfg_t *const cfg,
39*fb1b10abSAndroid Build Coastguard Worker                                   int frame_cnt, FILE *const outfile) {
40*fb1b10abSAndroid Build Coastguard Worker   char header[32];
41*fb1b10abSAndroid Build Coastguard Worker 
42*fb1b10abSAndroid Build Coastguard Worker   header[0] = 'D';
43*fb1b10abSAndroid Build Coastguard Worker   header[1] = 'K';
44*fb1b10abSAndroid Build Coastguard Worker   header[2] = 'I';
45*fb1b10abSAndroid Build Coastguard Worker   header[3] = 'F';
46*fb1b10abSAndroid Build Coastguard Worker   mem_put_le16(header + 4, 0);                    /* version */
47*fb1b10abSAndroid Build Coastguard Worker   mem_put_le16(header + 6, 32);                   /* headersize */
48*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 8, 0x30395056);           /* fourcc (vp9) */
49*fb1b10abSAndroid Build Coastguard Worker   mem_put_le16(header + 12, cfg->g_w);            /* width */
50*fb1b10abSAndroid Build Coastguard Worker   mem_put_le16(header + 14, cfg->g_h);            /* height */
51*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 16, cfg->g_timebase.den); /* rate */
52*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 20, cfg->g_timebase.num); /* scale */
53*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 24, frame_cnt);           /* length */
54*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 28, 0);                   /* unused */
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker   (void)fwrite(header, 1, 32, outfile);
57*fb1b10abSAndroid Build Coastguard Worker }
58*fb1b10abSAndroid Build Coastguard Worker 
write_ivf_frame_size(FILE * const outfile,const size_t size)59*fb1b10abSAndroid Build Coastguard Worker static void write_ivf_frame_size(FILE *const outfile, const size_t size) {
60*fb1b10abSAndroid Build Coastguard Worker   char header[4];
61*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header, static_cast<unsigned int>(size));
62*fb1b10abSAndroid Build Coastguard Worker   (void)fwrite(header, 1, 4, outfile);
63*fb1b10abSAndroid Build Coastguard Worker }
64*fb1b10abSAndroid Build Coastguard Worker 
write_ivf_frame_header(const vpx_codec_cx_pkt_t * const pkt,FILE * const outfile)65*fb1b10abSAndroid Build Coastguard Worker static void write_ivf_frame_header(const vpx_codec_cx_pkt_t *const pkt,
66*fb1b10abSAndroid Build Coastguard Worker                                    FILE *const outfile) {
67*fb1b10abSAndroid Build Coastguard Worker   char header[12];
68*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t pts;
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker   if (pkt->kind != VPX_CODEC_CX_FRAME_PKT) return;
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker   pts = pkt->data.frame.pts;
73*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header, static_cast<unsigned int>(pkt->data.frame.sz));
74*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 4, pts & 0xFFFFFFFF);
75*fb1b10abSAndroid Build Coastguard Worker   mem_put_le32(header + 8, pts >> 32);
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker   (void)fwrite(header, 1, 12, outfile);
78*fb1b10abSAndroid Build Coastguard Worker }
79*fb1b10abSAndroid Build Coastguard Worker #endif  // WRITE_COMPRESSED_STREAM
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker const unsigned int kInitialWidth = 320;
82*fb1b10abSAndroid Build Coastguard Worker const unsigned int kInitialHeight = 240;
83*fb1b10abSAndroid Build Coastguard Worker 
84*fb1b10abSAndroid Build Coastguard Worker struct FrameInfo {
FrameInfo__anon40eeaa1f0111::FrameInfo85*fb1b10abSAndroid Build Coastguard Worker   FrameInfo(vpx_codec_pts_t _pts, unsigned int _w, unsigned int _h)
86*fb1b10abSAndroid Build Coastguard Worker       : pts(_pts), w(_w), h(_h) {}
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t pts;
89*fb1b10abSAndroid Build Coastguard Worker   unsigned int w;
90*fb1b10abSAndroid Build Coastguard Worker   unsigned int h;
91*fb1b10abSAndroid Build Coastguard Worker };
92*fb1b10abSAndroid Build Coastguard Worker 
ScaleForFrameNumber(unsigned int frame,unsigned int initial_w,unsigned int initial_h,unsigned int * w,unsigned int * h,bool flag_codec,bool smaller_width_larger_size_)93*fb1b10abSAndroid Build Coastguard Worker void ScaleForFrameNumber(unsigned int frame, unsigned int initial_w,
94*fb1b10abSAndroid Build Coastguard Worker                          unsigned int initial_h, unsigned int *w,
95*fb1b10abSAndroid Build Coastguard Worker                          unsigned int *h, bool flag_codec,
96*fb1b10abSAndroid Build Coastguard Worker                          bool smaller_width_larger_size_) {
97*fb1b10abSAndroid Build Coastguard Worker   *w = initial_w;
98*fb1b10abSAndroid Build Coastguard Worker   *h = initial_h;
99*fb1b10abSAndroid Build Coastguard Worker 
100*fb1b10abSAndroid Build Coastguard Worker   if (smaller_width_larger_size_) {
101*fb1b10abSAndroid Build Coastguard Worker     if (frame < 30) {
102*fb1b10abSAndroid Build Coastguard Worker       return;
103*fb1b10abSAndroid Build Coastguard Worker     }
104*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 7 / 10;
105*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 16 / 10;
106*fb1b10abSAndroid Build Coastguard Worker     return;
107*fb1b10abSAndroid Build Coastguard Worker   }
108*fb1b10abSAndroid Build Coastguard Worker   if (frame < 10) {
109*fb1b10abSAndroid Build Coastguard Worker     return;
110*fb1b10abSAndroid Build Coastguard Worker   }
111*fb1b10abSAndroid Build Coastguard Worker   if (frame < 20) {
112*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
113*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
114*fb1b10abSAndroid Build Coastguard Worker     return;
115*fb1b10abSAndroid Build Coastguard Worker   }
116*fb1b10abSAndroid Build Coastguard Worker   if (frame < 30) {
117*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
118*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
119*fb1b10abSAndroid Build Coastguard Worker     return;
120*fb1b10abSAndroid Build Coastguard Worker   }
121*fb1b10abSAndroid Build Coastguard Worker   if (frame < 40) {
122*fb1b10abSAndroid Build Coastguard Worker     return;
123*fb1b10abSAndroid Build Coastguard Worker   }
124*fb1b10abSAndroid Build Coastguard Worker   if (frame < 50) {
125*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
126*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
127*fb1b10abSAndroid Build Coastguard Worker     return;
128*fb1b10abSAndroid Build Coastguard Worker   }
129*fb1b10abSAndroid Build Coastguard Worker   if (frame < 60) {
130*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
131*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
132*fb1b10abSAndroid Build Coastguard Worker     return;
133*fb1b10abSAndroid Build Coastguard Worker   }
134*fb1b10abSAndroid Build Coastguard Worker   if (frame < 70) {
135*fb1b10abSAndroid Build Coastguard Worker     return;
136*fb1b10abSAndroid Build Coastguard Worker   }
137*fb1b10abSAndroid Build Coastguard Worker   if (frame < 80) {
138*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
139*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
140*fb1b10abSAndroid Build Coastguard Worker     return;
141*fb1b10abSAndroid Build Coastguard Worker   }
142*fb1b10abSAndroid Build Coastguard Worker   if (frame < 90) {
143*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
144*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
145*fb1b10abSAndroid Build Coastguard Worker     return;
146*fb1b10abSAndroid Build Coastguard Worker   }
147*fb1b10abSAndroid Build Coastguard Worker   if (frame < 100) {
148*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
149*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
150*fb1b10abSAndroid Build Coastguard Worker     return;
151*fb1b10abSAndroid Build Coastguard Worker   }
152*fb1b10abSAndroid Build Coastguard Worker   if (frame < 110) {
153*fb1b10abSAndroid Build Coastguard Worker     return;
154*fb1b10abSAndroid Build Coastguard Worker   }
155*fb1b10abSAndroid Build Coastguard Worker   if (frame < 120) {
156*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
157*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
158*fb1b10abSAndroid Build Coastguard Worker     return;
159*fb1b10abSAndroid Build Coastguard Worker   }
160*fb1b10abSAndroid Build Coastguard Worker   if (frame < 130) {
161*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
162*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
163*fb1b10abSAndroid Build Coastguard Worker     return;
164*fb1b10abSAndroid Build Coastguard Worker   }
165*fb1b10abSAndroid Build Coastguard Worker   if (frame < 140) {
166*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
167*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
168*fb1b10abSAndroid Build Coastguard Worker     return;
169*fb1b10abSAndroid Build Coastguard Worker   }
170*fb1b10abSAndroid Build Coastguard Worker   if (frame < 150) {
171*fb1b10abSAndroid Build Coastguard Worker     return;
172*fb1b10abSAndroid Build Coastguard Worker   }
173*fb1b10abSAndroid Build Coastguard Worker   if (frame < 160) {
174*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
175*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
176*fb1b10abSAndroid Build Coastguard Worker     return;
177*fb1b10abSAndroid Build Coastguard Worker   }
178*fb1b10abSAndroid Build Coastguard Worker   if (frame < 170) {
179*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
180*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
181*fb1b10abSAndroid Build Coastguard Worker     return;
182*fb1b10abSAndroid Build Coastguard Worker   }
183*fb1b10abSAndroid Build Coastguard Worker   if (frame < 180) {
184*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
185*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
186*fb1b10abSAndroid Build Coastguard Worker     return;
187*fb1b10abSAndroid Build Coastguard Worker   }
188*fb1b10abSAndroid Build Coastguard Worker   if (frame < 190) {
189*fb1b10abSAndroid Build Coastguard Worker     return;
190*fb1b10abSAndroid Build Coastguard Worker   }
191*fb1b10abSAndroid Build Coastguard Worker   if (frame < 200) {
192*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
193*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
194*fb1b10abSAndroid Build Coastguard Worker     return;
195*fb1b10abSAndroid Build Coastguard Worker   }
196*fb1b10abSAndroid Build Coastguard Worker   if (frame < 210) {
197*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
198*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
199*fb1b10abSAndroid Build Coastguard Worker     return;
200*fb1b10abSAndroid Build Coastguard Worker   }
201*fb1b10abSAndroid Build Coastguard Worker   if (frame < 220) {
202*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
203*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
204*fb1b10abSAndroid Build Coastguard Worker     return;
205*fb1b10abSAndroid Build Coastguard Worker   }
206*fb1b10abSAndroid Build Coastguard Worker   if (frame < 230) {
207*fb1b10abSAndroid Build Coastguard Worker     return;
208*fb1b10abSAndroid Build Coastguard Worker   }
209*fb1b10abSAndroid Build Coastguard Worker   if (frame < 240) {
210*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w * 3 / 4;
211*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h * 3 / 4;
212*fb1b10abSAndroid Build Coastguard Worker     return;
213*fb1b10abSAndroid Build Coastguard Worker   }
214*fb1b10abSAndroid Build Coastguard Worker   if (frame < 250) {
215*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 2;
216*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 2;
217*fb1b10abSAndroid Build Coastguard Worker     return;
218*fb1b10abSAndroid Build Coastguard Worker   }
219*fb1b10abSAndroid Build Coastguard Worker   if (frame < 260) {
220*fb1b10abSAndroid Build Coastguard Worker     return;
221*fb1b10abSAndroid Build Coastguard Worker   }
222*fb1b10abSAndroid Build Coastguard Worker   // Go down very low.
223*fb1b10abSAndroid Build Coastguard Worker   if (frame < 270) {
224*fb1b10abSAndroid Build Coastguard Worker     *w = initial_w / 4;
225*fb1b10abSAndroid Build Coastguard Worker     *h = initial_h / 4;
226*fb1b10abSAndroid Build Coastguard Worker     return;
227*fb1b10abSAndroid Build Coastguard Worker   }
228*fb1b10abSAndroid Build Coastguard Worker   if (flag_codec == 1) {
229*fb1b10abSAndroid Build Coastguard Worker     // Cases that only works for VP9.
230*fb1b10abSAndroid Build Coastguard Worker     // For VP9: Swap width and height of original.
231*fb1b10abSAndroid Build Coastguard Worker     if (frame < 320) {
232*fb1b10abSAndroid Build Coastguard Worker       return;
233*fb1b10abSAndroid Build Coastguard Worker     }
234*fb1b10abSAndroid Build Coastguard Worker   }
235*fb1b10abSAndroid Build Coastguard Worker }
236*fb1b10abSAndroid Build Coastguard Worker 
237*fb1b10abSAndroid Build Coastguard Worker class ResizingVideoSource : public ::libvpx_test::DummyVideoSource {
238*fb1b10abSAndroid Build Coastguard Worker  public:
ResizingVideoSource()239*fb1b10abSAndroid Build Coastguard Worker   ResizingVideoSource() {
240*fb1b10abSAndroid Build Coastguard Worker     SetSize(kInitialWidth, kInitialHeight);
241*fb1b10abSAndroid Build Coastguard Worker     limit_ = 350;
242*fb1b10abSAndroid Build Coastguard Worker     smaller_width_larger_size_ = false;
243*fb1b10abSAndroid Build Coastguard Worker   }
244*fb1b10abSAndroid Build Coastguard Worker   bool flag_codec_;
245*fb1b10abSAndroid Build Coastguard Worker   bool smaller_width_larger_size_;
246*fb1b10abSAndroid Build Coastguard Worker   ~ResizingVideoSource() override = default;
247*fb1b10abSAndroid Build Coastguard Worker 
248*fb1b10abSAndroid Build Coastguard Worker  protected:
Next()249*fb1b10abSAndroid Build Coastguard Worker   void Next() override {
250*fb1b10abSAndroid Build Coastguard Worker     ++frame_;
251*fb1b10abSAndroid Build Coastguard Worker     unsigned int width = 0;
252*fb1b10abSAndroid Build Coastguard Worker     unsigned int height = 0;
253*fb1b10abSAndroid Build Coastguard Worker     ScaleForFrameNumber(frame_, kInitialWidth, kInitialHeight, &width, &height,
254*fb1b10abSAndroid Build Coastguard Worker                         flag_codec_, smaller_width_larger_size_);
255*fb1b10abSAndroid Build Coastguard Worker     SetSize(width, height);
256*fb1b10abSAndroid Build Coastguard Worker     FillFrame();
257*fb1b10abSAndroid Build Coastguard Worker   }
258*fb1b10abSAndroid Build Coastguard Worker };
259*fb1b10abSAndroid Build Coastguard Worker 
260*fb1b10abSAndroid Build Coastguard Worker class ResizeTest
261*fb1b10abSAndroid Build Coastguard Worker     : public ::libvpx_test::EncoderTest,
262*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
263*fb1b10abSAndroid Build Coastguard Worker  protected:
ResizeTest()264*fb1b10abSAndroid Build Coastguard Worker   ResizeTest() : EncoderTest(GET_PARAM(0)) {}
265*fb1b10abSAndroid Build Coastguard Worker 
266*fb1b10abSAndroid Build Coastguard Worker   ~ResizeTest() override = default;
267*fb1b10abSAndroid Build Coastguard Worker 
SetUp()268*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
269*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
270*fb1b10abSAndroid Build Coastguard Worker     SetMode(GET_PARAM(1));
271*fb1b10abSAndroid Build Coastguard Worker   }
272*fb1b10abSAndroid Build Coastguard Worker 
FramePktHook(const vpx_codec_cx_pkt_t * pkt)273*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
274*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(static_cast<int>(pkt->data.frame.width[0]), 0);
275*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(static_cast<int>(pkt->data.frame.height[0]), 0);
276*fb1b10abSAndroid Build Coastguard Worker     encode_frame_width_.push_back(pkt->data.frame.width[0]);
277*fb1b10abSAndroid Build Coastguard Worker     encode_frame_height_.push_back(pkt->data.frame.height[0]);
278*fb1b10abSAndroid Build Coastguard Worker   }
279*fb1b10abSAndroid Build Coastguard Worker 
GetFrameWidth(size_t idx) const280*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetFrameWidth(size_t idx) const {
281*fb1b10abSAndroid Build Coastguard Worker     return encode_frame_width_[idx];
282*fb1b10abSAndroid Build Coastguard Worker   }
283*fb1b10abSAndroid Build Coastguard Worker 
GetFrameHeight(size_t idx) const284*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetFrameHeight(size_t idx) const {
285*fb1b10abSAndroid Build Coastguard Worker     return encode_frame_height_[idx];
286*fb1b10abSAndroid Build Coastguard Worker   }
287*fb1b10abSAndroid Build Coastguard Worker 
DecompressedFrameHook(const vpx_image_t & img,vpx_codec_pts_t pts)288*fb1b10abSAndroid Build Coastguard Worker   void DecompressedFrameHook(const vpx_image_t &img,
289*fb1b10abSAndroid Build Coastguard Worker                              vpx_codec_pts_t pts) override {
290*fb1b10abSAndroid Build Coastguard Worker     frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h));
291*fb1b10abSAndroid Build Coastguard Worker   }
292*fb1b10abSAndroid Build Coastguard Worker 
293*fb1b10abSAndroid Build Coastguard Worker   std::vector<FrameInfo> frame_info_list_;
294*fb1b10abSAndroid Build Coastguard Worker   std::vector<unsigned int> encode_frame_width_;
295*fb1b10abSAndroid Build Coastguard Worker   std::vector<unsigned int> encode_frame_height_;
296*fb1b10abSAndroid Build Coastguard Worker };
297*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeTest,TestExternalResizeWorks)298*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeTest, TestExternalResizeWorks) {
299*fb1b10abSAndroid Build Coastguard Worker   ResizingVideoSource video;
300*fb1b10abSAndroid Build Coastguard Worker   video.flag_codec_ = false;
301*fb1b10abSAndroid Build Coastguard Worker   video.smaller_width_larger_size_ = false;
302*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
303*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
304*fb1b10abSAndroid Build Coastguard Worker 
305*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
306*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
307*fb1b10abSAndroid Build Coastguard Worker     const unsigned int frame = static_cast<unsigned>(info->pts);
308*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_w;
309*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_h;
310*fb1b10abSAndroid Build Coastguard Worker     const size_t idx = info - frame_info_list_.begin();
311*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(info->w, GetFrameWidth(idx));
312*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(info->h, GetFrameHeight(idx));
313*fb1b10abSAndroid Build Coastguard Worker     ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w,
314*fb1b10abSAndroid Build Coastguard Worker                         &expected_h, video.flag_codec_,
315*fb1b10abSAndroid Build Coastguard Worker                         video.smaller_width_larger_size_);
316*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_w, info->w)
317*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected width";
318*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_h, info->h)
319*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected height";
320*fb1b10abSAndroid Build Coastguard Worker   }
321*fb1b10abSAndroid Build Coastguard Worker }
322*fb1b10abSAndroid Build Coastguard Worker 
323*fb1b10abSAndroid Build Coastguard Worker const unsigned int kStepDownFrame = 3;
324*fb1b10abSAndroid Build Coastguard Worker const unsigned int kStepUpFrame = 6;
325*fb1b10abSAndroid Build Coastguard Worker 
326*fb1b10abSAndroid Build Coastguard Worker class ResizeInternalTest : public ResizeTest {
327*fb1b10abSAndroid Build Coastguard Worker  protected:
328*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
ResizeInternalTest()329*fb1b10abSAndroid Build Coastguard Worker   ResizeInternalTest()
330*fb1b10abSAndroid Build Coastguard Worker       : ResizeTest(), frame0_psnr_(0.0), outfile_(nullptr), out_frames_(0) {}
331*fb1b10abSAndroid Build Coastguard Worker #else
332*fb1b10abSAndroid Build Coastguard Worker   ResizeInternalTest() : ResizeTest(), frame0_psnr_(0.0) {}
333*fb1b10abSAndroid Build Coastguard Worker #endif
334*fb1b10abSAndroid Build Coastguard Worker 
335*fb1b10abSAndroid Build Coastguard Worker   ~ResizeInternalTest() override = default;
336*fb1b10abSAndroid Build Coastguard Worker 
BeginPassHook(unsigned int)337*fb1b10abSAndroid Build Coastguard Worker   void BeginPassHook(unsigned int /*pass*/) override {
338*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
339*fb1b10abSAndroid Build Coastguard Worker     outfile_ = fopen("vp90-2-05-resize.ivf", "wb");
340*fb1b10abSAndroid Build Coastguard Worker #endif
341*fb1b10abSAndroid Build Coastguard Worker   }
342*fb1b10abSAndroid Build Coastguard Worker 
EndPassHook()343*fb1b10abSAndroid Build Coastguard Worker   void EndPassHook() override {
344*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
345*fb1b10abSAndroid Build Coastguard Worker     if (outfile_) {
346*fb1b10abSAndroid Build Coastguard Worker       if (!fseek(outfile_, 0, SEEK_SET))
347*fb1b10abSAndroid Build Coastguard Worker         write_ivf_file_header(&cfg_, out_frames_, outfile_);
348*fb1b10abSAndroid Build Coastguard Worker       fclose(outfile_);
349*fb1b10abSAndroid Build Coastguard Worker       outfile_ = nullptr;
350*fb1b10abSAndroid Build Coastguard Worker     }
351*fb1b10abSAndroid Build Coastguard Worker #endif
352*fb1b10abSAndroid Build Coastguard Worker   }
353*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(libvpx_test::VideoSource * video,libvpx_test::Encoder * encoder)354*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(libvpx_test::VideoSource *video,
355*fb1b10abSAndroid Build Coastguard Worker                           libvpx_test::Encoder *encoder) override {
356*fb1b10abSAndroid Build Coastguard Worker     if (change_config_) {
357*fb1b10abSAndroid Build Coastguard Worker       int new_q = 60;
358*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 0) {
359*fb1b10abSAndroid Build Coastguard Worker         struct vpx_scaling_mode mode = { VP8E_ONETWO, VP8E_ONETWO };
360*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP8E_SET_SCALEMODE, &mode);
361*fb1b10abSAndroid Build Coastguard Worker       }
362*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 1) {
363*fb1b10abSAndroid Build Coastguard Worker         struct vpx_scaling_mode mode = { VP8E_NORMAL, VP8E_NORMAL };
364*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP8E_SET_SCALEMODE, &mode);
365*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = new_q;
366*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
367*fb1b10abSAndroid Build Coastguard Worker       }
368*fb1b10abSAndroid Build Coastguard Worker     } else {
369*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == kStepDownFrame) {
370*fb1b10abSAndroid Build Coastguard Worker         struct vpx_scaling_mode mode = { VP8E_FOURFIVE, VP8E_THREEFIVE };
371*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP8E_SET_SCALEMODE, &mode);
372*fb1b10abSAndroid Build Coastguard Worker       }
373*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == kStepUpFrame) {
374*fb1b10abSAndroid Build Coastguard Worker         struct vpx_scaling_mode mode = { VP8E_NORMAL, VP8E_NORMAL };
375*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP8E_SET_SCALEMODE, &mode);
376*fb1b10abSAndroid Build Coastguard Worker       }
377*fb1b10abSAndroid Build Coastguard Worker     }
378*fb1b10abSAndroid Build Coastguard Worker   }
379*fb1b10abSAndroid Build Coastguard Worker 
PSNRPktHook(const vpx_codec_cx_pkt_t * pkt)380*fb1b10abSAndroid Build Coastguard Worker   void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) override {
381*fb1b10abSAndroid Build Coastguard Worker     if (frame0_psnr_ == 0.) frame0_psnr_ = pkt->data.psnr.psnr[0];
382*fb1b10abSAndroid Build Coastguard Worker     EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 2.0);
383*fb1b10abSAndroid Build Coastguard Worker   }
384*fb1b10abSAndroid Build Coastguard Worker 
385*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
FramePktHook(const vpx_codec_cx_pkt_t * pkt)386*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
387*fb1b10abSAndroid Build Coastguard Worker     ++out_frames_;
388*fb1b10abSAndroid Build Coastguard Worker 
389*fb1b10abSAndroid Build Coastguard Worker     // Write initial file header if first frame.
390*fb1b10abSAndroid Build Coastguard Worker     if (pkt->data.frame.pts == 0) write_ivf_file_header(&cfg_, 0, outfile_);
391*fb1b10abSAndroid Build Coastguard Worker 
392*fb1b10abSAndroid Build Coastguard Worker     // Write frame header and data.
393*fb1b10abSAndroid Build Coastguard Worker     write_ivf_frame_header(pkt, outfile_);
394*fb1b10abSAndroid Build Coastguard Worker     (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
395*fb1b10abSAndroid Build Coastguard Worker   }
396*fb1b10abSAndroid Build Coastguard Worker #endif
397*fb1b10abSAndroid Build Coastguard Worker 
398*fb1b10abSAndroid Build Coastguard Worker   double frame0_psnr_;
399*fb1b10abSAndroid Build Coastguard Worker   bool change_config_;
400*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
401*fb1b10abSAndroid Build Coastguard Worker   FILE *outfile_;
402*fb1b10abSAndroid Build Coastguard Worker   unsigned int out_frames_;
403*fb1b10abSAndroid Build Coastguard Worker #endif
404*fb1b10abSAndroid Build Coastguard Worker };
405*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeInternalTest,TestInternalResizeWorks)406*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeInternalTest, TestInternalResizeWorks) {
407*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
408*fb1b10abSAndroid Build Coastguard Worker                                        30, 1, 0, 10);
409*fb1b10abSAndroid Build Coastguard Worker   init_flags_ = VPX_CODEC_USE_PSNR;
410*fb1b10abSAndroid Build Coastguard Worker   change_config_ = false;
411*fb1b10abSAndroid Build Coastguard Worker 
412*fb1b10abSAndroid Build Coastguard Worker   // q picked such that initial keyframe on this clip is ~30dB PSNR
413*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48;
414*fb1b10abSAndroid Build Coastguard Worker 
415*fb1b10abSAndroid Build Coastguard Worker   // If the number of frames being encoded is smaller than g_lag_in_frames
416*fb1b10abSAndroid Build Coastguard Worker   // the encoded frame is unavailable using the current API. Comparing
417*fb1b10abSAndroid Build Coastguard Worker   // frames to detect mismatch would then not be possible. Set
418*fb1b10abSAndroid Build Coastguard Worker   // g_lag_in_frames = 0 to get around this.
419*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
420*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
421*fb1b10abSAndroid Build Coastguard Worker 
422*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
423*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
424*fb1b10abSAndroid Build Coastguard Worker     const vpx_codec_pts_t pts = info->pts;
425*fb1b10abSAndroid Build Coastguard Worker     if (pts >= kStepDownFrame && pts < kStepUpFrame) {
426*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(282U, info->w) << "Frame " << pts << " had unexpected width";
427*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(173U, info->h) << "Frame " << pts << " had unexpected height";
428*fb1b10abSAndroid Build Coastguard Worker     } else {
429*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(352U, info->w) << "Frame " << pts << " had unexpected width";
430*fb1b10abSAndroid Build Coastguard Worker       EXPECT_EQ(288U, info->h) << "Frame " << pts << " had unexpected height";
431*fb1b10abSAndroid Build Coastguard Worker     }
432*fb1b10abSAndroid Build Coastguard Worker   }
433*fb1b10abSAndroid Build Coastguard Worker }
434*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeInternalTest,TestInternalResizeChangeConfig)435*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeInternalTest, TestInternalResizeChangeConfig) {
436*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
437*fb1b10abSAndroid Build Coastguard Worker                                        30, 1, 0, 10);
438*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_w = 352;
439*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_h = 288;
440*fb1b10abSAndroid Build Coastguard Worker   change_config_ = true;
441*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
442*fb1b10abSAndroid Build Coastguard Worker }
443*fb1b10abSAndroid Build Coastguard Worker 
444*fb1b10abSAndroid Build Coastguard Worker class ResizeRealtimeTest
445*fb1b10abSAndroid Build Coastguard Worker     : public ::libvpx_test::EncoderTest,
446*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
447*fb1b10abSAndroid Build Coastguard Worker  protected:
ResizeRealtimeTest()448*fb1b10abSAndroid Build Coastguard Worker   ResizeRealtimeTest() : EncoderTest(GET_PARAM(0)) {}
449*fb1b10abSAndroid Build Coastguard Worker   ~ResizeRealtimeTest() override = default;
450*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(libvpx_test::VideoSource * video,libvpx_test::Encoder * encoder)451*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(libvpx_test::VideoSource *video,
452*fb1b10abSAndroid Build Coastguard Worker                           libvpx_test::Encoder *encoder) override {
453*fb1b10abSAndroid Build Coastguard Worker     if (video->frame() == 0) {
454*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_AQ_MODE, 3);
455*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
456*fb1b10abSAndroid Build Coastguard Worker     }
457*fb1b10abSAndroid Build Coastguard Worker 
458*fb1b10abSAndroid Build Coastguard Worker     if (change_bitrate_ && video->frame() == 120) {
459*fb1b10abSAndroid Build Coastguard Worker       change_bitrate_ = false;
460*fb1b10abSAndroid Build Coastguard Worker       cfg_.rc_target_bitrate = 500;
461*fb1b10abSAndroid Build Coastguard Worker       encoder->Config(&cfg_);
462*fb1b10abSAndroid Build Coastguard Worker     }
463*fb1b10abSAndroid Build Coastguard Worker   }
464*fb1b10abSAndroid Build Coastguard Worker 
SetUp()465*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
466*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
467*fb1b10abSAndroid Build Coastguard Worker     SetMode(GET_PARAM(1));
468*fb1b10abSAndroid Build Coastguard Worker     set_cpu_used_ = GET_PARAM(2);
469*fb1b10abSAndroid Build Coastguard Worker   }
470*fb1b10abSAndroid Build Coastguard Worker 
DecompressedFrameHook(const vpx_image_t & img,vpx_codec_pts_t pts)471*fb1b10abSAndroid Build Coastguard Worker   void DecompressedFrameHook(const vpx_image_t &img,
472*fb1b10abSAndroid Build Coastguard Worker                              vpx_codec_pts_t pts) override {
473*fb1b10abSAndroid Build Coastguard Worker     frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h));
474*fb1b10abSAndroid Build Coastguard Worker   }
475*fb1b10abSAndroid Build Coastguard Worker 
MismatchHook(const vpx_image_t * img1,const vpx_image_t * img2)476*fb1b10abSAndroid Build Coastguard Worker   void MismatchHook(const vpx_image_t *img1, const vpx_image_t *img2) override {
477*fb1b10abSAndroid Build Coastguard Worker     double mismatch_psnr = compute_psnr(img1, img2);
478*fb1b10abSAndroid Build Coastguard Worker     mismatch_psnr_ += mismatch_psnr;
479*fb1b10abSAndroid Build Coastguard Worker     ++mismatch_nframes_;
480*fb1b10abSAndroid Build Coastguard Worker   }
481*fb1b10abSAndroid Build Coastguard Worker 
FramePktHook(const vpx_codec_cx_pkt_t * pkt)482*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
483*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(static_cast<int>(pkt->data.frame.width[0]), 0);
484*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(static_cast<int>(pkt->data.frame.height[0]), 0);
485*fb1b10abSAndroid Build Coastguard Worker     encode_frame_width_.push_back(pkt->data.frame.width[0]);
486*fb1b10abSAndroid Build Coastguard Worker     encode_frame_height_.push_back(pkt->data.frame.height[0]);
487*fb1b10abSAndroid Build Coastguard Worker   }
488*fb1b10abSAndroid Build Coastguard Worker 
GetMismatchFrames()489*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetMismatchFrames() { return mismatch_nframes_; }
490*fb1b10abSAndroid Build Coastguard Worker 
GetFrameWidth(size_t idx) const491*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetFrameWidth(size_t idx) const {
492*fb1b10abSAndroid Build Coastguard Worker     return encode_frame_width_[idx];
493*fb1b10abSAndroid Build Coastguard Worker   }
494*fb1b10abSAndroid Build Coastguard Worker 
GetFrameHeight(size_t idx) const495*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetFrameHeight(size_t idx) const {
496*fb1b10abSAndroid Build Coastguard Worker     return encode_frame_height_[idx];
497*fb1b10abSAndroid Build Coastguard Worker   }
498*fb1b10abSAndroid Build Coastguard Worker 
DefaultConfig()499*fb1b10abSAndroid Build Coastguard Worker   void DefaultConfig() {
500*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_initial_sz = 500;
501*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_optimal_sz = 600;
502*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_buf_sz = 1000;
503*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_min_quantizer = 2;
504*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_max_quantizer = 56;
505*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_undershoot_pct = 50;
506*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_overshoot_pct = 50;
507*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
508*fb1b10abSAndroid Build Coastguard Worker     cfg_.kf_mode = VPX_KF_AUTO;
509*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
510*fb1b10abSAndroid Build Coastguard Worker     cfg_.kf_min_dist = cfg_.kf_max_dist = 3000;
511*fb1b10abSAndroid Build Coastguard Worker     // Enable dropped frames.
512*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_dropframe_thresh = 1;
513*fb1b10abSAndroid Build Coastguard Worker     // Enable error_resilience mode.
514*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 1;
515*fb1b10abSAndroid Build Coastguard Worker     // Enable dynamic resizing.
516*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_resize_allowed = 1;
517*fb1b10abSAndroid Build Coastguard Worker     // Run at low bitrate.
518*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_target_bitrate = 200;
519*fb1b10abSAndroid Build Coastguard Worker   }
520*fb1b10abSAndroid Build Coastguard Worker 
521*fb1b10abSAndroid Build Coastguard Worker   std::vector<FrameInfo> frame_info_list_;
522*fb1b10abSAndroid Build Coastguard Worker   int set_cpu_used_;
523*fb1b10abSAndroid Build Coastguard Worker   bool change_bitrate_;
524*fb1b10abSAndroid Build Coastguard Worker   double mismatch_psnr_;
525*fb1b10abSAndroid Build Coastguard Worker   int mismatch_nframes_;
526*fb1b10abSAndroid Build Coastguard Worker   std::vector<unsigned int> encode_frame_width_;
527*fb1b10abSAndroid Build Coastguard Worker   std::vector<unsigned int> encode_frame_height_;
528*fb1b10abSAndroid Build Coastguard Worker };
529*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeRealtimeTest,TestExternalResizeWorks)530*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) {
531*fb1b10abSAndroid Build Coastguard Worker   ResizingVideoSource video;
532*fb1b10abSAndroid Build Coastguard Worker   video.flag_codec_ = true;
533*fb1b10abSAndroid Build Coastguard Worker   video.smaller_width_larger_size_ = false;
534*fb1b10abSAndroid Build Coastguard Worker   DefaultConfig();
535*fb1b10abSAndroid Build Coastguard Worker   // Disable internal resize for this test.
536*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_resize_allowed = 0;
537*fb1b10abSAndroid Build Coastguard Worker   change_bitrate_ = false;
538*fb1b10abSAndroid Build Coastguard Worker   mismatch_psnr_ = 0.0;
539*fb1b10abSAndroid Build Coastguard Worker   mismatch_nframes_ = 0;
540*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
541*fb1b10abSAndroid Build Coastguard Worker 
542*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
543*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
544*fb1b10abSAndroid Build Coastguard Worker     const unsigned int frame = static_cast<unsigned>(info->pts);
545*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_w;
546*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_h;
547*fb1b10abSAndroid Build Coastguard Worker     ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w,
548*fb1b10abSAndroid Build Coastguard Worker                         &expected_h, video.flag_codec_,
549*fb1b10abSAndroid Build Coastguard Worker                         video.smaller_width_larger_size_);
550*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_w, info->w)
551*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected width";
552*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_h, info->h)
553*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected height";
554*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
555*fb1b10abSAndroid Build Coastguard Worker   }
556*fb1b10abSAndroid Build Coastguard Worker }
557*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeRealtimeTest,TestExternalResizeSmallerWidthBiggerSize)558*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeRealtimeTest, TestExternalResizeSmallerWidthBiggerSize) {
559*fb1b10abSAndroid Build Coastguard Worker   ResizingVideoSource video;
560*fb1b10abSAndroid Build Coastguard Worker   video.flag_codec_ = true;
561*fb1b10abSAndroid Build Coastguard Worker   video.smaller_width_larger_size_ = true;
562*fb1b10abSAndroid Build Coastguard Worker   DefaultConfig();
563*fb1b10abSAndroid Build Coastguard Worker   // Disable internal resize for this test.
564*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_resize_allowed = 0;
565*fb1b10abSAndroid Build Coastguard Worker   change_bitrate_ = false;
566*fb1b10abSAndroid Build Coastguard Worker   mismatch_psnr_ = 0.0;
567*fb1b10abSAndroid Build Coastguard Worker   mismatch_nframes_ = 0;
568*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
569*fb1b10abSAndroid Build Coastguard Worker 
570*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
571*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
572*fb1b10abSAndroid Build Coastguard Worker     const unsigned int frame = static_cast<unsigned>(info->pts);
573*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_w;
574*fb1b10abSAndroid Build Coastguard Worker     unsigned int expected_h;
575*fb1b10abSAndroid Build Coastguard Worker     ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w,
576*fb1b10abSAndroid Build Coastguard Worker                         &expected_h, video.flag_codec_,
577*fb1b10abSAndroid Build Coastguard Worker                         video.smaller_width_larger_size_);
578*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_w, info->w)
579*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected width";
580*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(expected_h, info->h)
581*fb1b10abSAndroid Build Coastguard Worker         << "Frame " << frame << " had unexpected height";
582*fb1b10abSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
583*fb1b10abSAndroid Build Coastguard Worker   }
584*fb1b10abSAndroid Build Coastguard Worker }
585*fb1b10abSAndroid Build Coastguard Worker 
586*fb1b10abSAndroid Build Coastguard Worker // Verify the dynamic resizer behavior for real time, 1 pass CBR mode.
587*fb1b10abSAndroid Build Coastguard Worker // Run at low bitrate, with resize_allowed = 1, and verify that we get
588*fb1b10abSAndroid Build Coastguard Worker // one resize down event.
TEST_P(ResizeRealtimeTest,TestInternalResizeDown)589*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeRealtimeTest, TestInternalResizeDown) {
590*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
591*fb1b10abSAndroid Build Coastguard Worker                                        0, 299);
592*fb1b10abSAndroid Build Coastguard Worker   DefaultConfig();
593*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_w = 640;
594*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_h = 480;
595*fb1b10abSAndroid Build Coastguard Worker   change_bitrate_ = false;
596*fb1b10abSAndroid Build Coastguard Worker   mismatch_psnr_ = 0.0;
597*fb1b10abSAndroid Build Coastguard Worker   mismatch_nframes_ = 0;
598*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
599*fb1b10abSAndroid Build Coastguard Worker 
600*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
601*fb1b10abSAndroid Build Coastguard Worker   unsigned int last_w = cfg_.g_w;
602*fb1b10abSAndroid Build Coastguard Worker   unsigned int last_h = cfg_.g_h;
603*fb1b10abSAndroid Build Coastguard Worker   int resize_count = 0;
604*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
605*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
606*fb1b10abSAndroid Build Coastguard Worker     if (info->w != last_w || info->h != last_h) {
607*fb1b10abSAndroid Build Coastguard Worker       // Verify that resize down occurs.
608*fb1b10abSAndroid Build Coastguard Worker       ASSERT_LT(info->w, last_w);
609*fb1b10abSAndroid Build Coastguard Worker       ASSERT_LT(info->h, last_h);
610*fb1b10abSAndroid Build Coastguard Worker       last_w = info->w;
611*fb1b10abSAndroid Build Coastguard Worker       last_h = info->h;
612*fb1b10abSAndroid Build Coastguard Worker       resize_count++;
613*fb1b10abSAndroid Build Coastguard Worker     }
614*fb1b10abSAndroid Build Coastguard Worker   }
615*fb1b10abSAndroid Build Coastguard Worker 
616*fb1b10abSAndroid Build Coastguard Worker   // Verify that we get 1 resize down event in this test.
617*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(1, resize_count) << "Resizing should occur.";
618*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
619*fb1b10abSAndroid Build Coastguard Worker #else
620*fb1b10abSAndroid Build Coastguard Worker   GTEST_SKIP()
621*fb1b10abSAndroid Build Coastguard Worker       << "Warning: VP9 decoder unavailable, unable to check resize count!\n";
622*fb1b10abSAndroid Build Coastguard Worker #endif
623*fb1b10abSAndroid Build Coastguard Worker }
624*fb1b10abSAndroid Build Coastguard Worker 
625*fb1b10abSAndroid Build Coastguard Worker // Verify the dynamic resizer behavior for real time, 1 pass CBR mode.
626*fb1b10abSAndroid Build Coastguard Worker // Start at low target bitrate, raise the bitrate in the middle of the clip,
627*fb1b10abSAndroid Build Coastguard Worker // scaling-up should occur after bitrate changed.
TEST_P(ResizeRealtimeTest,TestInternalResizeDownUpChangeBitRate)628*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeRealtimeTest, TestInternalResizeDownUpChangeBitRate) {
629*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
630*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
631*fb1b10abSAndroid Build Coastguard Worker   DefaultConfig();
632*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_w = 640;
633*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_h = 480;
634*fb1b10abSAndroid Build Coastguard Worker   change_bitrate_ = true;
635*fb1b10abSAndroid Build Coastguard Worker   mismatch_psnr_ = 0.0;
636*fb1b10abSAndroid Build Coastguard Worker   mismatch_nframes_ = 0;
637*fb1b10abSAndroid Build Coastguard Worker   // Disable dropped frames.
638*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
639*fb1b10abSAndroid Build Coastguard Worker   // Starting bitrate low.
640*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 80;
641*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
642*fb1b10abSAndroid Build Coastguard Worker 
643*fb1b10abSAndroid Build Coastguard Worker   unsigned int last_w = cfg_.g_w;
644*fb1b10abSAndroid Build Coastguard Worker   unsigned int last_h = cfg_.g_h;
645*fb1b10abSAndroid Build Coastguard Worker   int resize_count = 0;
646*fb1b10abSAndroid Build Coastguard Worker   for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
647*fb1b10abSAndroid Build Coastguard Worker        info != frame_info_list_.end(); ++info) {
648*fb1b10abSAndroid Build Coastguard Worker     const size_t idx = info - frame_info_list_.begin();
649*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(info->w, GetFrameWidth(idx));
650*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(info->h, GetFrameHeight(idx));
651*fb1b10abSAndroid Build Coastguard Worker     if (info->w != last_w || info->h != last_h) {
652*fb1b10abSAndroid Build Coastguard Worker       resize_count++;
653*fb1b10abSAndroid Build Coastguard Worker       if (resize_count <= 2) {
654*fb1b10abSAndroid Build Coastguard Worker         // Verify that resize down occurs.
655*fb1b10abSAndroid Build Coastguard Worker         ASSERT_LT(info->w, last_w);
656*fb1b10abSAndroid Build Coastguard Worker         ASSERT_LT(info->h, last_h);
657*fb1b10abSAndroid Build Coastguard Worker       } else if (resize_count > 2) {
658*fb1b10abSAndroid Build Coastguard Worker         // Verify that resize up occurs.
659*fb1b10abSAndroid Build Coastguard Worker         ASSERT_GT(info->w, last_w);
660*fb1b10abSAndroid Build Coastguard Worker         ASSERT_GT(info->h, last_h);
661*fb1b10abSAndroid Build Coastguard Worker       }
662*fb1b10abSAndroid Build Coastguard Worker       last_w = info->w;
663*fb1b10abSAndroid Build Coastguard Worker       last_h = info->h;
664*fb1b10abSAndroid Build Coastguard Worker     }
665*fb1b10abSAndroid Build Coastguard Worker   }
666*fb1b10abSAndroid Build Coastguard Worker 
667*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
668*fb1b10abSAndroid Build Coastguard Worker   // Verify that we get 4 resize events in this test.
669*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(resize_count, 4) << "Resizing should occur twice.";
670*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
671*fb1b10abSAndroid Build Coastguard Worker #else
672*fb1b10abSAndroid Build Coastguard Worker   GTEST_SKIP()
673*fb1b10abSAndroid Build Coastguard Worker       << "Warning: VP9 decoder unavailable, unable to check resize count!\n";
674*fb1b10abSAndroid Build Coastguard Worker #endif
675*fb1b10abSAndroid Build Coastguard Worker }
676*fb1b10abSAndroid Build Coastguard Worker 
CspForFrameNumber(int frame)677*fb1b10abSAndroid Build Coastguard Worker vpx_img_fmt_t CspForFrameNumber(int frame) {
678*fb1b10abSAndroid Build Coastguard Worker   if (frame < 10) return VPX_IMG_FMT_I420;
679*fb1b10abSAndroid Build Coastguard Worker   if (frame < 20) return VPX_IMG_FMT_I444;
680*fb1b10abSAndroid Build Coastguard Worker   return VPX_IMG_FMT_I420;
681*fb1b10abSAndroid Build Coastguard Worker }
682*fb1b10abSAndroid Build Coastguard Worker 
683*fb1b10abSAndroid Build Coastguard Worker class ResizeCspTest : public ResizeTest {
684*fb1b10abSAndroid Build Coastguard Worker  protected:
685*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
ResizeCspTest()686*fb1b10abSAndroid Build Coastguard Worker   ResizeCspTest()
687*fb1b10abSAndroid Build Coastguard Worker       : ResizeTest(), frame0_psnr_(0.0), outfile_(nullptr), out_frames_(0) {}
688*fb1b10abSAndroid Build Coastguard Worker #else
689*fb1b10abSAndroid Build Coastguard Worker   ResizeCspTest() : ResizeTest(), frame0_psnr_(0.0) {}
690*fb1b10abSAndroid Build Coastguard Worker #endif
691*fb1b10abSAndroid Build Coastguard Worker 
692*fb1b10abSAndroid Build Coastguard Worker   ~ResizeCspTest() override = default;
693*fb1b10abSAndroid Build Coastguard Worker 
BeginPassHook(unsigned int)694*fb1b10abSAndroid Build Coastguard Worker   void BeginPassHook(unsigned int /*pass*/) override {
695*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
696*fb1b10abSAndroid Build Coastguard Worker     outfile_ = fopen("vp91-2-05-cspchape.ivf", "wb");
697*fb1b10abSAndroid Build Coastguard Worker #endif
698*fb1b10abSAndroid Build Coastguard Worker   }
699*fb1b10abSAndroid Build Coastguard Worker 
EndPassHook()700*fb1b10abSAndroid Build Coastguard Worker   void EndPassHook() override {
701*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
702*fb1b10abSAndroid Build Coastguard Worker     if (outfile_) {
703*fb1b10abSAndroid Build Coastguard Worker       if (!fseek(outfile_, 0, SEEK_SET))
704*fb1b10abSAndroid Build Coastguard Worker         write_ivf_file_header(&cfg_, out_frames_, outfile_);
705*fb1b10abSAndroid Build Coastguard Worker       fclose(outfile_);
706*fb1b10abSAndroid Build Coastguard Worker       outfile_ = nullptr;
707*fb1b10abSAndroid Build Coastguard Worker     }
708*fb1b10abSAndroid Build Coastguard Worker #endif
709*fb1b10abSAndroid Build Coastguard Worker   }
710*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(libvpx_test::VideoSource * video,libvpx_test::Encoder * encoder)711*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(libvpx_test::VideoSource *video,
712*fb1b10abSAndroid Build Coastguard Worker                           libvpx_test::Encoder *encoder) override {
713*fb1b10abSAndroid Build Coastguard Worker     if (CspForFrameNumber(video->frame()) != VPX_IMG_FMT_I420 &&
714*fb1b10abSAndroid Build Coastguard Worker         cfg_.g_profile != 1) {
715*fb1b10abSAndroid Build Coastguard Worker       cfg_.g_profile = 1;
716*fb1b10abSAndroid Build Coastguard Worker       encoder->Config(&cfg_);
717*fb1b10abSAndroid Build Coastguard Worker     }
718*fb1b10abSAndroid Build Coastguard Worker     if (CspForFrameNumber(video->frame()) == VPX_IMG_FMT_I420 &&
719*fb1b10abSAndroid Build Coastguard Worker         cfg_.g_profile != 0) {
720*fb1b10abSAndroid Build Coastguard Worker       cfg_.g_profile = 0;
721*fb1b10abSAndroid Build Coastguard Worker       encoder->Config(&cfg_);
722*fb1b10abSAndroid Build Coastguard Worker     }
723*fb1b10abSAndroid Build Coastguard Worker   }
724*fb1b10abSAndroid Build Coastguard Worker 
PSNRPktHook(const vpx_codec_cx_pkt_t * pkt)725*fb1b10abSAndroid Build Coastguard Worker   void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) override {
726*fb1b10abSAndroid Build Coastguard Worker     if (frame0_psnr_ == 0.) frame0_psnr_ = pkt->data.psnr.psnr[0];
727*fb1b10abSAndroid Build Coastguard Worker     EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 2.0);
728*fb1b10abSAndroid Build Coastguard Worker   }
729*fb1b10abSAndroid Build Coastguard Worker 
730*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
FramePktHook(const vpx_codec_cx_pkt_t * pkt)731*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
732*fb1b10abSAndroid Build Coastguard Worker     ++out_frames_;
733*fb1b10abSAndroid Build Coastguard Worker 
734*fb1b10abSAndroid Build Coastguard Worker     // Write initial file header if first frame.
735*fb1b10abSAndroid Build Coastguard Worker     if (pkt->data.frame.pts == 0) write_ivf_file_header(&cfg_, 0, outfile_);
736*fb1b10abSAndroid Build Coastguard Worker 
737*fb1b10abSAndroid Build Coastguard Worker     // Write frame header and data.
738*fb1b10abSAndroid Build Coastguard Worker     write_ivf_frame_header(pkt, outfile_);
739*fb1b10abSAndroid Build Coastguard Worker     (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
740*fb1b10abSAndroid Build Coastguard Worker   }
741*fb1b10abSAndroid Build Coastguard Worker #endif
742*fb1b10abSAndroid Build Coastguard Worker 
743*fb1b10abSAndroid Build Coastguard Worker   double frame0_psnr_;
744*fb1b10abSAndroid Build Coastguard Worker #if WRITE_COMPRESSED_STREAM
745*fb1b10abSAndroid Build Coastguard Worker   FILE *outfile_;
746*fb1b10abSAndroid Build Coastguard Worker   unsigned int out_frames_;
747*fb1b10abSAndroid Build Coastguard Worker #endif
748*fb1b10abSAndroid Build Coastguard Worker };
749*fb1b10abSAndroid Build Coastguard Worker 
750*fb1b10abSAndroid Build Coastguard Worker class ResizingCspVideoSource : public ::libvpx_test::DummyVideoSource {
751*fb1b10abSAndroid Build Coastguard Worker  public:
ResizingCspVideoSource()752*fb1b10abSAndroid Build Coastguard Worker   ResizingCspVideoSource() {
753*fb1b10abSAndroid Build Coastguard Worker     SetSize(kInitialWidth, kInitialHeight);
754*fb1b10abSAndroid Build Coastguard Worker     limit_ = 30;
755*fb1b10abSAndroid Build Coastguard Worker   }
756*fb1b10abSAndroid Build Coastguard Worker 
757*fb1b10abSAndroid Build Coastguard Worker   ~ResizingCspVideoSource() override = default;
758*fb1b10abSAndroid Build Coastguard Worker 
759*fb1b10abSAndroid Build Coastguard Worker  protected:
Next()760*fb1b10abSAndroid Build Coastguard Worker   void Next() override {
761*fb1b10abSAndroid Build Coastguard Worker     ++frame_;
762*fb1b10abSAndroid Build Coastguard Worker     SetImageFormat(CspForFrameNumber(frame_));
763*fb1b10abSAndroid Build Coastguard Worker     FillFrame();
764*fb1b10abSAndroid Build Coastguard Worker   }
765*fb1b10abSAndroid Build Coastguard Worker };
766*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(ResizeCspTest,TestResizeCspWorks)767*fb1b10abSAndroid Build Coastguard Worker TEST_P(ResizeCspTest, TestResizeCspWorks) {
768*fb1b10abSAndroid Build Coastguard Worker   ResizingCspVideoSource video;
769*fb1b10abSAndroid Build Coastguard Worker   init_flags_ = VPX_CODEC_USE_PSNR;
770*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48;
771*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
772*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
773*fb1b10abSAndroid Build Coastguard Worker }
774*fb1b10abSAndroid Build Coastguard Worker 
775*fb1b10abSAndroid Build Coastguard Worker VP8_INSTANTIATE_TEST_SUITE(ResizeTest, ONE_PASS_TEST_MODES);
776*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(ResizeTest, ONE_PASS_TEST_MODES);
777*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(ResizeInternalTest,
778*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kOnePassBest));
779*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(ResizeRealtimeTest,
780*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kRealTime),
781*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 9));
782*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(ResizeCspTest,
783*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kRealTime));
784*fb1b10abSAndroid Build Coastguard Worker }  // namespace
785