xref: /aosp_15_r20/external/libvpx/test/svc_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/svc_test.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/y4m_video_source.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_onyxc_int.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/bitops.h"
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker namespace svc_test {
23*fb1b10abSAndroid Build Coastguard Worker namespace {
24*fb1b10abSAndroid Build Coastguard Worker 
25*fb1b10abSAndroid Build Coastguard Worker typedef enum {
26*fb1b10abSAndroid Build Coastguard Worker   // Inter-layer prediction is on on all frames.
27*fb1b10abSAndroid Build Coastguard Worker   INTER_LAYER_PRED_ON,
28*fb1b10abSAndroid Build Coastguard Worker   // Inter-layer prediction is off on all frames.
29*fb1b10abSAndroid Build Coastguard Worker   INTER_LAYER_PRED_OFF,
30*fb1b10abSAndroid Build Coastguard Worker   // Inter-layer prediction is off on non-key frames and non-sync frames.
31*fb1b10abSAndroid Build Coastguard Worker   INTER_LAYER_PRED_OFF_NONKEY,
32*fb1b10abSAndroid Build Coastguard Worker   // Inter-layer prediction is on on all frames, but constrained such
33*fb1b10abSAndroid Build Coastguard Worker   // that any layer S (> 0) can only predict from previous spatial
34*fb1b10abSAndroid Build Coastguard Worker   // layer S-1, from the same superframe.
35*fb1b10abSAndroid Build Coastguard Worker   INTER_LAYER_PRED_ON_CONSTRAINED
36*fb1b10abSAndroid Build Coastguard Worker } INTER_LAYER_PRED;
37*fb1b10abSAndroid Build Coastguard Worker 
38*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvc : public OnePassCbrSvc {
39*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvc(const::libvpx_test::CodecFactory * codec)40*fb1b10abSAndroid Build Coastguard Worker   explicit DatarateOnePassCbrSvc(const ::libvpx_test::CodecFactory *codec)
41*fb1b10abSAndroid Build Coastguard Worker       : OnePassCbrSvc(codec) {
42*fb1b10abSAndroid Build Coastguard Worker     inter_layer_pred_mode_ = 0;
43*fb1b10abSAndroid Build Coastguard Worker   }
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker  protected:
46*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvc() override = default;
47*fb1b10abSAndroid Build Coastguard Worker 
ResetModel()48*fb1b10abSAndroid Build Coastguard Worker   virtual void ResetModel() {
49*fb1b10abSAndroid Build Coastguard Worker     last_pts_ = 0;
50*fb1b10abSAndroid Build Coastguard Worker     duration_ = 0.0;
51*fb1b10abSAndroid Build Coastguard Worker     mismatch_psnr_ = 0.0;
52*fb1b10abSAndroid Build Coastguard Worker     mismatch_nframes_ = 0;
53*fb1b10abSAndroid Build Coastguard Worker     denoiser_on_ = 0;
54*fb1b10abSAndroid Build Coastguard Worker     tune_content_ = 0;
55*fb1b10abSAndroid Build Coastguard Worker     base_speed_setting_ = 5;
56*fb1b10abSAndroid Build Coastguard Worker     spatial_layer_id_ = 0;
57*fb1b10abSAndroid Build Coastguard Worker     temporal_layer_id_ = 0;
58*fb1b10abSAndroid Build Coastguard Worker     update_pattern_ = 0;
59*fb1b10abSAndroid Build Coastguard Worker     memset(bits_in_buffer_model_, 0, sizeof(bits_in_buffer_model_));
60*fb1b10abSAndroid Build Coastguard Worker     memset(bits_total_, 0, sizeof(bits_total_));
61*fb1b10abSAndroid Build Coastguard Worker     memset(layer_target_avg_bandwidth_, 0, sizeof(layer_target_avg_bandwidth_));
62*fb1b10abSAndroid Build Coastguard Worker     dynamic_drop_layer_ = false;
63*fb1b10abSAndroid Build Coastguard Worker     single_layer_resize_ = false;
64*fb1b10abSAndroid Build Coastguard Worker     change_bitrate_ = false;
65*fb1b10abSAndroid Build Coastguard Worker     last_pts_ref_ = 0;
66*fb1b10abSAndroid Build Coastguard Worker     middle_bitrate_ = 0;
67*fb1b10abSAndroid Build Coastguard Worker     top_bitrate_ = 0;
68*fb1b10abSAndroid Build Coastguard Worker     superframe_count_ = -1;
69*fb1b10abSAndroid Build Coastguard Worker     key_frame_spacing_ = 9999;
70*fb1b10abSAndroid Build Coastguard Worker     num_nonref_frames_ = 0;
71*fb1b10abSAndroid Build Coastguard Worker     layer_framedrop_ = 0;
72*fb1b10abSAndroid Build Coastguard Worker     force_key_ = 0;
73*fb1b10abSAndroid Build Coastguard Worker     force_key_test_ = 0;
74*fb1b10abSAndroid Build Coastguard Worker     insert_layer_sync_ = 0;
75*fb1b10abSAndroid Build Coastguard Worker     layer_sync_on_base_ = 0;
76*fb1b10abSAndroid Build Coastguard Worker     force_intra_only_frame_ = 0;
77*fb1b10abSAndroid Build Coastguard Worker     superframe_has_intra_only_ = 0;
78*fb1b10abSAndroid Build Coastguard Worker     use_post_encode_drop_ = 0;
79*fb1b10abSAndroid Build Coastguard Worker     denoiser_off_on_ = false;
80*fb1b10abSAndroid Build Coastguard Worker     denoiser_enable_layers_ = false;
81*fb1b10abSAndroid Build Coastguard Worker     num_resize_down_ = 0;
82*fb1b10abSAndroid Build Coastguard Worker     num_resize_up_ = 0;
83*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < VPX_MAX_LAYERS; i++) {
84*fb1b10abSAndroid Build Coastguard Worker       prev_frame_width[i] = 320;
85*fb1b10abSAndroid Build Coastguard Worker       prev_frame_height[i] = 240;
86*fb1b10abSAndroid Build Coastguard Worker     }
87*fb1b10abSAndroid Build Coastguard Worker     ksvc_flex_noupd_tlenh_ = false;
88*fb1b10abSAndroid Build Coastguard Worker   }
BeginPassHook(unsigned int)89*fb1b10abSAndroid Build Coastguard Worker   void BeginPassHook(unsigned int /*pass*/) override {}
90*fb1b10abSAndroid Build Coastguard Worker 
91*fb1b10abSAndroid Build Coastguard Worker   // Example pattern for spatial layers and 2 temporal layers used in the
92*fb1b10abSAndroid Build Coastguard Worker   // bypass/flexible mode. The pattern corresponds to the pattern
93*fb1b10abSAndroid Build Coastguard Worker   // VP9E_TEMPORAL_LAYERING_MODE_0101 (temporal_layering_mode == 2) used in
94*fb1b10abSAndroid Build Coastguard Worker   // non-flexible mode, except that we disable inter-layer prediction.
set_frame_flags_bypass_mode(int tl,int num_spatial_layers,int is_key_frame,vpx_svc_ref_frame_config_t * ref_frame_config,int noupdate_tlenh)95*fb1b10abSAndroid Build Coastguard Worker   void set_frame_flags_bypass_mode(int tl, int num_spatial_layers,
96*fb1b10abSAndroid Build Coastguard Worker                                    int is_key_frame,
97*fb1b10abSAndroid Build Coastguard Worker                                    vpx_svc_ref_frame_config_t *ref_frame_config,
98*fb1b10abSAndroid Build Coastguard Worker                                    int noupdate_tlenh) {
99*fb1b10abSAndroid Build Coastguard Worker     for (int sl = 0; sl < num_spatial_layers; ++sl)
100*fb1b10abSAndroid Build Coastguard Worker       ref_frame_config->update_buffer_slot[sl] = 0;
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker     for (int sl = 0; sl < num_spatial_layers; ++sl) {
103*fb1b10abSAndroid Build Coastguard Worker       if (tl == 0) {
104*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config->lst_fb_idx[sl] = sl;
105*fb1b10abSAndroid Build Coastguard Worker         if (sl) {
106*fb1b10abSAndroid Build Coastguard Worker           if (is_key_frame) {
107*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->lst_fb_idx[sl] = sl - 1;
108*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->gld_fb_idx[sl] = sl;
109*fb1b10abSAndroid Build Coastguard Worker           } else {
110*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->gld_fb_idx[sl] = sl - 1;
111*fb1b10abSAndroid Build Coastguard Worker           }
112*fb1b10abSAndroid Build Coastguard Worker         } else {
113*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->gld_fb_idx[sl] = 0;
114*fb1b10abSAndroid Build Coastguard Worker         }
115*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config->alt_fb_idx[sl] = 0;
116*fb1b10abSAndroid Build Coastguard Worker       } else if (tl == 1) {
117*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config->lst_fb_idx[sl] = sl;
118*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config->gld_fb_idx[sl] =
119*fb1b10abSAndroid Build Coastguard Worker             VPXMIN(REF_FRAMES - 1, num_spatial_layers + sl - 1);
120*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config->alt_fb_idx[sl] =
121*fb1b10abSAndroid Build Coastguard Worker             VPXMIN(REF_FRAMES - 1, num_spatial_layers + sl);
122*fb1b10abSAndroid Build Coastguard Worker       }
123*fb1b10abSAndroid Build Coastguard Worker       if (!tl) {
124*fb1b10abSAndroid Build Coastguard Worker         if (!sl) {
125*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_last[sl] = 1;
126*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_golden[sl] = 0;
127*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_alt_ref[sl] = 0;
128*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->update_buffer_slot[sl] |=
129*fb1b10abSAndroid Build Coastguard Worker               1 << ref_frame_config->lst_fb_idx[sl];
130*fb1b10abSAndroid Build Coastguard Worker         } else {
131*fb1b10abSAndroid Build Coastguard Worker           if (is_key_frame) {
132*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_last[sl] = 1;
133*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_golden[sl] = 0;
134*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_alt_ref[sl] = 0;
135*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->update_buffer_slot[sl] |=
136*fb1b10abSAndroid Build Coastguard Worker                 1 << ref_frame_config->gld_fb_idx[sl];
137*fb1b10abSAndroid Build Coastguard Worker           } else {
138*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_last[sl] = 1;
139*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_golden[sl] = 0;
140*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->reference_alt_ref[sl] = 0;
141*fb1b10abSAndroid Build Coastguard Worker             ref_frame_config->update_buffer_slot[sl] |=
142*fb1b10abSAndroid Build Coastguard Worker                 1 << ref_frame_config->lst_fb_idx[sl];
143*fb1b10abSAndroid Build Coastguard Worker           }
144*fb1b10abSAndroid Build Coastguard Worker         }
145*fb1b10abSAndroid Build Coastguard Worker       } else if (tl == 1) {
146*fb1b10abSAndroid Build Coastguard Worker         if (!sl) {
147*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_last[sl] = 1;
148*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_golden[sl] = 0;
149*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_alt_ref[sl] = 0;
150*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->update_buffer_slot[sl] |=
151*fb1b10abSAndroid Build Coastguard Worker               1 << ref_frame_config->alt_fb_idx[sl];
152*fb1b10abSAndroid Build Coastguard Worker         } else {
153*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_last[sl] = 1;
154*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_golden[sl] = 0;
155*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->reference_alt_ref[sl] = 0;
156*fb1b10abSAndroid Build Coastguard Worker           // Non reference frame on top temporal top spatial.
157*fb1b10abSAndroid Build Coastguard Worker           ref_frame_config->update_buffer_slot[sl] = 0;
158*fb1b10abSAndroid Build Coastguard Worker         }
159*fb1b10abSAndroid Build Coastguard Worker         // Force no update on all spatial layers for temporal enhancement layer
160*fb1b10abSAndroid Build Coastguard Worker         // frames.
161*fb1b10abSAndroid Build Coastguard Worker         if (noupdate_tlenh) ref_frame_config->update_buffer_slot[sl] = 0;
162*fb1b10abSAndroid Build Coastguard Worker       }
163*fb1b10abSAndroid Build Coastguard Worker     }
164*fb1b10abSAndroid Build Coastguard Worker   }
165*fb1b10abSAndroid Build Coastguard Worker 
CheckLayerRateTargeting(int num_spatial_layers,int num_temporal_layers,double thresh_overshoot,double thresh_undershoot) const166*fb1b10abSAndroid Build Coastguard Worker   void CheckLayerRateTargeting(int num_spatial_layers, int num_temporal_layers,
167*fb1b10abSAndroid Build Coastguard Worker                                double thresh_overshoot,
168*fb1b10abSAndroid Build Coastguard Worker                                double thresh_undershoot) const {
169*fb1b10abSAndroid Build Coastguard Worker     for (int sl = 0; sl < num_spatial_layers; ++sl)
170*fb1b10abSAndroid Build Coastguard Worker       for (int tl = 0; tl < num_temporal_layers; ++tl) {
171*fb1b10abSAndroid Build Coastguard Worker         const int layer = sl * num_temporal_layers + tl;
172*fb1b10abSAndroid Build Coastguard Worker         ASSERT_GE(cfg_.layer_target_bitrate[layer],
173*fb1b10abSAndroid Build Coastguard Worker                   file_datarate_[layer] * thresh_overshoot)
174*fb1b10abSAndroid Build Coastguard Worker             << " The datarate for the file exceeds the target by too much!";
175*fb1b10abSAndroid Build Coastguard Worker         ASSERT_LE(cfg_.layer_target_bitrate[layer],
176*fb1b10abSAndroid Build Coastguard Worker                   file_datarate_[layer] * thresh_undershoot)
177*fb1b10abSAndroid Build Coastguard Worker             << " The datarate for the file is lower than the target by too "
178*fb1b10abSAndroid Build Coastguard Worker                "much!";
179*fb1b10abSAndroid Build Coastguard Worker       }
180*fb1b10abSAndroid Build Coastguard Worker   }
181*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)182*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
183*fb1b10abSAndroid Build Coastguard Worker                           ::libvpx_test::Encoder *encoder) override {
184*fb1b10abSAndroid Build Coastguard Worker     PreEncodeFrameHookSetup(video, encoder);
185*fb1b10abSAndroid Build Coastguard Worker 
186*fb1b10abSAndroid Build Coastguard Worker     if (video->frame() == 0) {
187*fb1b10abSAndroid Build Coastguard Worker       if (force_intra_only_frame_) {
188*fb1b10abSAndroid Build Coastguard Worker         // Decoder sets the color_space for Intra-only frames
189*fb1b10abSAndroid Build Coastguard Worker         // to BT_601 (see line 1810 in vp9_decodeframe.c).
190*fb1b10abSAndroid Build Coastguard Worker         // So set it here in these tess to avoid encoder-decoder
191*fb1b10abSAndroid Build Coastguard Worker         // mismatch check on color space setting.
192*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP9E_SET_COLOR_SPACE, VPX_CS_BT_601);
193*fb1b10abSAndroid Build Coastguard Worker       }
194*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_NOISE_SENSITIVITY, denoiser_on_);
195*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_TUNE_CONTENT, tune_content_);
196*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_INTER_LAYER_PRED, inter_layer_pred_mode_);
197*fb1b10abSAndroid Build Coastguard Worker 
198*fb1b10abSAndroid Build Coastguard Worker       if (layer_framedrop_) {
199*fb1b10abSAndroid Build Coastguard Worker         vpx_svc_frame_drop_t svc_drop_frame;
200*fb1b10abSAndroid Build Coastguard Worker         svc_drop_frame.framedrop_mode = LAYER_DROP;
201*fb1b10abSAndroid Build Coastguard Worker         for (int i = 0; i < number_spatial_layers_; i++)
202*fb1b10abSAndroid Build Coastguard Worker           svc_drop_frame.framedrop_thresh[i] = 30;
203*fb1b10abSAndroid Build Coastguard Worker         svc_drop_frame.max_consec_drop = 30;
204*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP9E_SET_SVC_FRAME_DROP_LAYER, &svc_drop_frame);
205*fb1b10abSAndroid Build Coastguard Worker       }
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker       if (use_post_encode_drop_) {
208*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP9E_SET_POSTENCODE_DROP, use_post_encode_drop_);
209*fb1b10abSAndroid Build Coastguard Worker       }
210*fb1b10abSAndroid Build Coastguard Worker     }
211*fb1b10abSAndroid Build Coastguard Worker 
212*fb1b10abSAndroid Build Coastguard Worker     if (denoiser_off_on_) {
213*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_AQ_MODE, 3);
214*fb1b10abSAndroid Build Coastguard Worker       // Set inter_layer_pred to INTER_LAYER_PRED_OFF_NONKEY (K-SVC).
215*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_INTER_LAYER_PRED, 2);
216*fb1b10abSAndroid Build Coastguard Worker       if (!denoiser_enable_layers_) {
217*fb1b10abSAndroid Build Coastguard Worker         if (video->frame() == 0)
218*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_NOISE_SENSITIVITY, 0);
219*fb1b10abSAndroid Build Coastguard Worker         else if (video->frame() == 100)
220*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_NOISE_SENSITIVITY, 1);
221*fb1b10abSAndroid Build Coastguard Worker       } else {
222*fb1b10abSAndroid Build Coastguard Worker         // Cumulative bitrates for top spatial layers, for
223*fb1b10abSAndroid Build Coastguard Worker         // 3 temporal layers.
224*fb1b10abSAndroid Build Coastguard Worker         if (video->frame() == 0) {
225*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_NOISE_SENSITIVITY, 0);
226*fb1b10abSAndroid Build Coastguard Worker           // Change layer bitrates to set top spatial layer to 0.
227*fb1b10abSAndroid Build Coastguard Worker           // This is for 3 spatial 3 temporal layers.
228*fb1b10abSAndroid Build Coastguard Worker           // This will trigger skip encoding/dropping of top spatial layer.
229*fb1b10abSAndroid Build Coastguard Worker           cfg_.rc_target_bitrate -= cfg_.layer_target_bitrate[8];
230*fb1b10abSAndroid Build Coastguard Worker           for (int i = 0; i < 3; i++)
231*fb1b10abSAndroid Build Coastguard Worker             bitrate_sl3_[i] = cfg_.layer_target_bitrate[i + 6];
232*fb1b10abSAndroid Build Coastguard Worker           cfg_.layer_target_bitrate[6] = 0;
233*fb1b10abSAndroid Build Coastguard Worker           cfg_.layer_target_bitrate[7] = 0;
234*fb1b10abSAndroid Build Coastguard Worker           cfg_.layer_target_bitrate[8] = 0;
235*fb1b10abSAndroid Build Coastguard Worker           encoder->Config(&cfg_);
236*fb1b10abSAndroid Build Coastguard Worker         } else if (video->frame() == 100) {
237*fb1b10abSAndroid Build Coastguard Worker           // Change layer bitrates to non-zero on top spatial layer.
238*fb1b10abSAndroid Build Coastguard Worker           // This will trigger skip encoding of top spatial layer
239*fb1b10abSAndroid Build Coastguard Worker           // on key frame (period = 100).
240*fb1b10abSAndroid Build Coastguard Worker           for (int i = 0; i < 3; i++)
241*fb1b10abSAndroid Build Coastguard Worker             cfg_.layer_target_bitrate[i + 6] = bitrate_sl3_[i];
242*fb1b10abSAndroid Build Coastguard Worker           cfg_.rc_target_bitrate += cfg_.layer_target_bitrate[8];
243*fb1b10abSAndroid Build Coastguard Worker           encoder->Config(&cfg_);
244*fb1b10abSAndroid Build Coastguard Worker         } else if (video->frame() == 120) {
245*fb1b10abSAndroid Build Coastguard Worker           // Enable denoiser and top spatial layer after key frame (period is
246*fb1b10abSAndroid Build Coastguard Worker           // 100).
247*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_NOISE_SENSITIVITY, 1);
248*fb1b10abSAndroid Build Coastguard Worker         }
249*fb1b10abSAndroid Build Coastguard Worker       }
250*fb1b10abSAndroid Build Coastguard Worker     }
251*fb1b10abSAndroid Build Coastguard Worker 
252*fb1b10abSAndroid Build Coastguard Worker     if (ksvc_flex_noupd_tlenh_) {
253*fb1b10abSAndroid Build Coastguard Worker       vpx_svc_layer_id_t layer_id;
254*fb1b10abSAndroid Build Coastguard Worker       layer_id.spatial_layer_id = 0;
255*fb1b10abSAndroid Build Coastguard Worker       layer_id.temporal_layer_id = (video->frame() % 2 != 0);
256*fb1b10abSAndroid Build Coastguard Worker       temporal_layer_id_ = layer_id.temporal_layer_id;
257*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < number_spatial_layers_; i++) {
258*fb1b10abSAndroid Build Coastguard Worker         layer_id.temporal_layer_id_per_spatial[i] = temporal_layer_id_;
259*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config_.duration[i] = 1;
260*fb1b10abSAndroid Build Coastguard Worker       }
261*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_LAYER_ID, &layer_id);
262*fb1b10abSAndroid Build Coastguard Worker       set_frame_flags_bypass_mode(layer_id.temporal_layer_id,
263*fb1b10abSAndroid Build Coastguard Worker                                   number_spatial_layers_, 0, &ref_frame_config_,
264*fb1b10abSAndroid Build Coastguard Worker                                   1);
265*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config_);
266*fb1b10abSAndroid Build Coastguard Worker     }
267*fb1b10abSAndroid Build Coastguard Worker 
268*fb1b10abSAndroid Build Coastguard Worker     if (update_pattern_ && video->frame() >= 100) {
269*fb1b10abSAndroid Build Coastguard Worker       vpx_svc_layer_id_t layer_id;
270*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 100) {
271*fb1b10abSAndroid Build Coastguard Worker         cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
272*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
273*fb1b10abSAndroid Build Coastguard Worker       }
274*fb1b10abSAndroid Build Coastguard Worker       // Set layer id since the pattern changed.
275*fb1b10abSAndroid Build Coastguard Worker       layer_id.spatial_layer_id = 0;
276*fb1b10abSAndroid Build Coastguard Worker       layer_id.temporal_layer_id = (video->frame() % 2 != 0);
277*fb1b10abSAndroid Build Coastguard Worker       temporal_layer_id_ = layer_id.temporal_layer_id;
278*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < number_spatial_layers_; i++) {
279*fb1b10abSAndroid Build Coastguard Worker         layer_id.temporal_layer_id_per_spatial[i] = temporal_layer_id_;
280*fb1b10abSAndroid Build Coastguard Worker         ref_frame_config_.duration[i] = 1;
281*fb1b10abSAndroid Build Coastguard Worker       }
282*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_LAYER_ID, &layer_id);
283*fb1b10abSAndroid Build Coastguard Worker       set_frame_flags_bypass_mode(layer_id.temporal_layer_id,
284*fb1b10abSAndroid Build Coastguard Worker                                   number_spatial_layers_, 0, &ref_frame_config_,
285*fb1b10abSAndroid Build Coastguard Worker                                   0);
286*fb1b10abSAndroid Build Coastguard Worker       encoder->Control(VP9E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config_);
287*fb1b10abSAndroid Build Coastguard Worker     }
288*fb1b10abSAndroid Build Coastguard Worker 
289*fb1b10abSAndroid Build Coastguard Worker     if (change_bitrate_ && video->frame() == 200) {
290*fb1b10abSAndroid Build Coastguard Worker       duration_ = (last_pts_ + 1) * timebase_;
291*fb1b10abSAndroid Build Coastguard Worker       for (int sl = 0; sl < number_spatial_layers_; ++sl) {
292*fb1b10abSAndroid Build Coastguard Worker         for (int tl = 0; tl < number_temporal_layers_; ++tl) {
293*fb1b10abSAndroid Build Coastguard Worker           const int layer = sl * number_temporal_layers_ + tl;
294*fb1b10abSAndroid Build Coastguard Worker           const double file_size_in_kb = bits_total_[layer] / 1000.;
295*fb1b10abSAndroid Build Coastguard Worker           file_datarate_[layer] = file_size_in_kb / duration_;
296*fb1b10abSAndroid Build Coastguard Worker         }
297*fb1b10abSAndroid Build Coastguard Worker       }
298*fb1b10abSAndroid Build Coastguard Worker 
299*fb1b10abSAndroid Build Coastguard Worker       CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_,
300*fb1b10abSAndroid Build Coastguard Worker                               0.78, 1.15);
301*fb1b10abSAndroid Build Coastguard Worker 
302*fb1b10abSAndroid Build Coastguard Worker       memset(file_datarate_, 0, sizeof(file_datarate_));
303*fb1b10abSAndroid Build Coastguard Worker       memset(bits_total_, 0, sizeof(bits_total_));
304*fb1b10abSAndroid Build Coastguard Worker       int64_t bits_in_buffer_model_tmp[VPX_MAX_LAYERS];
305*fb1b10abSAndroid Build Coastguard Worker       last_pts_ref_ = last_pts_;
306*fb1b10abSAndroid Build Coastguard Worker       // Set new target bitarate.
307*fb1b10abSAndroid Build Coastguard Worker       cfg_.rc_target_bitrate = cfg_.rc_target_bitrate >> 1;
308*fb1b10abSAndroid Build Coastguard Worker       // Buffer level should not reset on dynamic bitrate change.
309*fb1b10abSAndroid Build Coastguard Worker       memcpy(bits_in_buffer_model_tmp, bits_in_buffer_model_,
310*fb1b10abSAndroid Build Coastguard Worker              sizeof(bits_in_buffer_model_));
311*fb1b10abSAndroid Build Coastguard Worker       AssignLayerBitrates();
312*fb1b10abSAndroid Build Coastguard Worker       memcpy(bits_in_buffer_model_, bits_in_buffer_model_tmp,
313*fb1b10abSAndroid Build Coastguard Worker              sizeof(bits_in_buffer_model_));
314*fb1b10abSAndroid Build Coastguard Worker 
315*fb1b10abSAndroid Build Coastguard Worker       // Change config to update encoder with new bitrate configuration.
316*fb1b10abSAndroid Build Coastguard Worker       encoder->Config(&cfg_);
317*fb1b10abSAndroid Build Coastguard Worker     }
318*fb1b10abSAndroid Build Coastguard Worker 
319*fb1b10abSAndroid Build Coastguard Worker     if (dynamic_drop_layer_ && !single_layer_resize_) {
320*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 0) {
321*fb1b10abSAndroid Build Coastguard Worker         // Change layer bitrates to set top layers to 0. This will trigger skip
322*fb1b10abSAndroid Build Coastguard Worker         // encoding/dropping of top two spatial layers.
323*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate -=
324*fb1b10abSAndroid Build Coastguard Worker             (cfg_.layer_target_bitrate[1] + cfg_.layer_target_bitrate[2]);
325*fb1b10abSAndroid Build Coastguard Worker         middle_bitrate_ = cfg_.layer_target_bitrate[1];
326*fb1b10abSAndroid Build Coastguard Worker         top_bitrate_ = cfg_.layer_target_bitrate[2];
327*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = 0;
328*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[2] = 0;
329*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
330*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 50) {
331*fb1b10abSAndroid Build Coastguard Worker         // Change layer bitrates to non-zero on two top spatial layers.
332*fb1b10abSAndroid Build Coastguard Worker         // This will trigger skip encoding of top two spatial layers.
333*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = middle_bitrate_;
334*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[2] = top_bitrate_;
335*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate +=
336*fb1b10abSAndroid Build Coastguard Worker             cfg_.layer_target_bitrate[2] + cfg_.layer_target_bitrate[1];
337*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
338*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 100) {
339*fb1b10abSAndroid Build Coastguard Worker         // Change layer bitrates to set top layers to 0. This will trigger skip
340*fb1b10abSAndroid Build Coastguard Worker         // encoding/dropping of top two spatial layers.
341*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate -=
342*fb1b10abSAndroid Build Coastguard Worker             (cfg_.layer_target_bitrate[1] + cfg_.layer_target_bitrate[2]);
343*fb1b10abSAndroid Build Coastguard Worker         middle_bitrate_ = cfg_.layer_target_bitrate[1];
344*fb1b10abSAndroid Build Coastguard Worker         top_bitrate_ = cfg_.layer_target_bitrate[2];
345*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = 0;
346*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[2] = 0;
347*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
348*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 150) {
349*fb1b10abSAndroid Build Coastguard Worker         // Change layer bitrate on second layer to non-zero to start
350*fb1b10abSAndroid Build Coastguard Worker         // encoding it again.
351*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = middle_bitrate_;
352*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate += cfg_.layer_target_bitrate[1];
353*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
354*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 200) {
355*fb1b10abSAndroid Build Coastguard Worker         // Change layer bitrate on top layer to non-zero to start
356*fb1b10abSAndroid Build Coastguard Worker         // encoding it again.
357*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[2] = top_bitrate_;
358*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate += cfg_.layer_target_bitrate[2];
359*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
360*fb1b10abSAndroid Build Coastguard Worker       }
361*fb1b10abSAndroid Build Coastguard Worker     } else if (dynamic_drop_layer_ && single_layer_resize_) {
362*fb1b10abSAndroid Build Coastguard Worker       // Change layer bitrates to set top layers to 0. This will trigger skip
363*fb1b10abSAndroid Build Coastguard Worker       // encoding/dropping of top spatial layers.
364*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 2) {
365*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate -=
366*fb1b10abSAndroid Build Coastguard Worker             (cfg_.layer_target_bitrate[1] + cfg_.layer_target_bitrate[2]);
367*fb1b10abSAndroid Build Coastguard Worker         middle_bitrate_ = cfg_.layer_target_bitrate[1];
368*fb1b10abSAndroid Build Coastguard Worker         top_bitrate_ = cfg_.layer_target_bitrate[2];
369*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = 0;
370*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[2] = 0;
371*fb1b10abSAndroid Build Coastguard Worker         // Set spatial layer 0 to a very low bitrate to trigger resize.
372*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[0] = 30;
373*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate = cfg_.layer_target_bitrate[0];
374*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
375*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 100) {
376*fb1b10abSAndroid Build Coastguard Worker         // Set base spatial layer to very high to go back up to original size.
377*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[0] = 400;
378*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate = cfg_.layer_target_bitrate[0];
379*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
380*fb1b10abSAndroid Build Coastguard Worker       }
381*fb1b10abSAndroid Build Coastguard Worker     } else if (!dynamic_drop_layer_ && single_layer_resize_) {
382*fb1b10abSAndroid Build Coastguard Worker       if (video->frame() == 2) {
383*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[0] = 30;
384*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = 50;
385*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate =
386*fb1b10abSAndroid Build Coastguard Worker             (cfg_.layer_target_bitrate[0] + cfg_.layer_target_bitrate[1]);
387*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
388*fb1b10abSAndroid Build Coastguard Worker       } else if (video->frame() == 160) {
389*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[0] = 1500;
390*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[1] = 2000;
391*fb1b10abSAndroid Build Coastguard Worker         cfg_.rc_target_bitrate =
392*fb1b10abSAndroid Build Coastguard Worker             (cfg_.layer_target_bitrate[0] + cfg_.layer_target_bitrate[1]);
393*fb1b10abSAndroid Build Coastguard Worker         encoder->Config(&cfg_);
394*fb1b10abSAndroid Build Coastguard Worker       }
395*fb1b10abSAndroid Build Coastguard Worker     }
396*fb1b10abSAndroid Build Coastguard Worker     if (force_key_test_ && force_key_) frame_flags_ = VPX_EFLAG_FORCE_KF;
397*fb1b10abSAndroid Build Coastguard Worker 
398*fb1b10abSAndroid Build Coastguard Worker     if (insert_layer_sync_) {
399*fb1b10abSAndroid Build Coastguard Worker       vpx_svc_spatial_layer_sync_t svc_layer_sync;
400*fb1b10abSAndroid Build Coastguard Worker       svc_layer_sync.base_layer_intra_only = 0;
401*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < number_spatial_layers_; i++)
402*fb1b10abSAndroid Build Coastguard Worker         svc_layer_sync.spatial_layer_sync[i] = 0;
403*fb1b10abSAndroid Build Coastguard Worker       if (force_intra_only_frame_) {
404*fb1b10abSAndroid Build Coastguard Worker         superframe_has_intra_only_ = 0;
405*fb1b10abSAndroid Build Coastguard Worker         if (video->frame() == 0) {
406*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.base_layer_intra_only = 1;
407*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.spatial_layer_sync[0] = 1;
408*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync);
409*fb1b10abSAndroid Build Coastguard Worker           superframe_has_intra_only_ = 1;
410*fb1b10abSAndroid Build Coastguard Worker         } else if (video->frame() == 100) {
411*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.base_layer_intra_only = 1;
412*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.spatial_layer_sync[0] = 1;
413*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync);
414*fb1b10abSAndroid Build Coastguard Worker           superframe_has_intra_only_ = 1;
415*fb1b10abSAndroid Build Coastguard Worker         }
416*fb1b10abSAndroid Build Coastguard Worker       } else {
417*fb1b10abSAndroid Build Coastguard Worker         layer_sync_on_base_ = 0;
418*fb1b10abSAndroid Build Coastguard Worker         if (video->frame() == 150) {
419*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.spatial_layer_sync[1] = 1;
420*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync);
421*fb1b10abSAndroid Build Coastguard Worker         } else if (video->frame() == 240) {
422*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.spatial_layer_sync[2] = 1;
423*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync);
424*fb1b10abSAndroid Build Coastguard Worker         } else if (video->frame() == 320) {
425*fb1b10abSAndroid Build Coastguard Worker           svc_layer_sync.spatial_layer_sync[0] = 1;
426*fb1b10abSAndroid Build Coastguard Worker           layer_sync_on_base_ = 1;
427*fb1b10abSAndroid Build Coastguard Worker           encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync);
428*fb1b10abSAndroid Build Coastguard Worker         }
429*fb1b10abSAndroid Build Coastguard Worker       }
430*fb1b10abSAndroid Build Coastguard Worker     }
431*fb1b10abSAndroid Build Coastguard Worker 
432*fb1b10abSAndroid Build Coastguard Worker     const vpx_rational_t tb = video->timebase();
433*fb1b10abSAndroid Build Coastguard Worker     timebase_ = static_cast<double>(tb.num) / tb.den;
434*fb1b10abSAndroid Build Coastguard Worker     duration_ = 0;
435*fb1b10abSAndroid Build Coastguard Worker   }
436*fb1b10abSAndroid Build Coastguard Worker 
parse_superframe_index(const uint8_t * data,size_t data_sz,uint32_t sizes[8],int * count)437*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_err_t parse_superframe_index(const uint8_t *data, size_t data_sz,
438*fb1b10abSAndroid Build Coastguard Worker                                          uint32_t sizes[8], int *count) {
439*fb1b10abSAndroid Build Coastguard Worker     uint8_t marker;
440*fb1b10abSAndroid Build Coastguard Worker     marker = *(data + data_sz - 1);
441*fb1b10abSAndroid Build Coastguard Worker     *count = 0;
442*fb1b10abSAndroid Build Coastguard Worker     if ((marker & 0xe0) == 0xc0) {
443*fb1b10abSAndroid Build Coastguard Worker       const uint32_t frames = (marker & 0x7) + 1;
444*fb1b10abSAndroid Build Coastguard Worker       const uint32_t mag = ((marker >> 3) & 0x3) + 1;
445*fb1b10abSAndroid Build Coastguard Worker       const size_t index_sz = 2 + mag * frames;
446*fb1b10abSAndroid Build Coastguard Worker       // This chunk is marked as having a superframe index but doesn't have
447*fb1b10abSAndroid Build Coastguard Worker       // enough data for it, thus it's an invalid superframe index.
448*fb1b10abSAndroid Build Coastguard Worker       if (data_sz < index_sz) return VPX_CODEC_CORRUPT_FRAME;
449*fb1b10abSAndroid Build Coastguard Worker       {
450*fb1b10abSAndroid Build Coastguard Worker         const uint8_t marker2 = *(data + data_sz - index_sz);
451*fb1b10abSAndroid Build Coastguard Worker         // This chunk is marked as having a superframe index but doesn't have
452*fb1b10abSAndroid Build Coastguard Worker         // the matching marker byte at the front of the index therefore it's an
453*fb1b10abSAndroid Build Coastguard Worker         // invalid chunk.
454*fb1b10abSAndroid Build Coastguard Worker         if (marker != marker2) return VPX_CODEC_CORRUPT_FRAME;
455*fb1b10abSAndroid Build Coastguard Worker       }
456*fb1b10abSAndroid Build Coastguard Worker       {
457*fb1b10abSAndroid Build Coastguard Worker         uint32_t i, j;
458*fb1b10abSAndroid Build Coastguard Worker         const uint8_t *x = &data[data_sz - index_sz + 1];
459*fb1b10abSAndroid Build Coastguard Worker         for (i = 0; i < frames; ++i) {
460*fb1b10abSAndroid Build Coastguard Worker           uint32_t this_sz = 0;
461*fb1b10abSAndroid Build Coastguard Worker 
462*fb1b10abSAndroid Build Coastguard Worker           for (j = 0; j < mag; ++j) this_sz |= (*x++) << (j * 8);
463*fb1b10abSAndroid Build Coastguard Worker           sizes[i] = this_sz;
464*fb1b10abSAndroid Build Coastguard Worker         }
465*fb1b10abSAndroid Build Coastguard Worker         *count = frames;
466*fb1b10abSAndroid Build Coastguard Worker       }
467*fb1b10abSAndroid Build Coastguard Worker     }
468*fb1b10abSAndroid Build Coastguard Worker     return VPX_CODEC_OK;
469*fb1b10abSAndroid Build Coastguard Worker   }
470*fb1b10abSAndroid Build Coastguard Worker 
FramePktHook(const vpx_codec_cx_pkt_t * pkt)471*fb1b10abSAndroid Build Coastguard Worker   void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
472*fb1b10abSAndroid Build Coastguard Worker     uint32_t sizes[8] = { 0 };
473*fb1b10abSAndroid Build Coastguard Worker     uint32_t sizes_parsed[8] = { 0 };
474*fb1b10abSAndroid Build Coastguard Worker     int count = 0;
475*fb1b10abSAndroid Build Coastguard Worker     int num_layers_encoded = 0;
476*fb1b10abSAndroid Build Coastguard Worker     last_pts_ = pkt->data.frame.pts;
477*fb1b10abSAndroid Build Coastguard Worker     const bool key_frame =
478*fb1b10abSAndroid Build Coastguard Worker         (pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? true : false;
479*fb1b10abSAndroid Build Coastguard Worker     if (key_frame) {
480*fb1b10abSAndroid Build Coastguard Worker       // For test that inserts layer sync frames: requesting a layer_sync on
481*fb1b10abSAndroid Build Coastguard Worker       // the base layer must force key frame. So if any key frame occurs after
482*fb1b10abSAndroid Build Coastguard Worker       // first superframe it must due to layer sync on base spatial layer.
483*fb1b10abSAndroid Build Coastguard Worker       if (superframe_count_ > 0 && insert_layer_sync_ &&
484*fb1b10abSAndroid Build Coastguard Worker           !force_intra_only_frame_) {
485*fb1b10abSAndroid Build Coastguard Worker         ASSERT_EQ(layer_sync_on_base_, 1);
486*fb1b10abSAndroid Build Coastguard Worker       }
487*fb1b10abSAndroid Build Coastguard Worker       temporal_layer_id_ = 0;
488*fb1b10abSAndroid Build Coastguard Worker       superframe_count_ = 0;
489*fb1b10abSAndroid Build Coastguard Worker     }
490*fb1b10abSAndroid Build Coastguard Worker     parse_superframe_index(static_cast<const uint8_t *>(pkt->data.frame.buf),
491*fb1b10abSAndroid Build Coastguard Worker                            pkt->data.frame.sz, sizes_parsed, &count);
492*fb1b10abSAndroid Build Coastguard Worker     // Count may be less than number of spatial layers because of frame drops.
493*fb1b10abSAndroid Build Coastguard Worker     if (number_spatial_layers_ > 1) {
494*fb1b10abSAndroid Build Coastguard Worker       for (int sl = 0; sl < number_spatial_layers_; ++sl) {
495*fb1b10abSAndroid Build Coastguard Worker         if (pkt->data.frame.spatial_layer_encoded[sl]) {
496*fb1b10abSAndroid Build Coastguard Worker           sizes[sl] = sizes_parsed[num_layers_encoded];
497*fb1b10abSAndroid Build Coastguard Worker           num_layers_encoded++;
498*fb1b10abSAndroid Build Coastguard Worker         }
499*fb1b10abSAndroid Build Coastguard Worker       }
500*fb1b10abSAndroid Build Coastguard Worker     }
501*fb1b10abSAndroid Build Coastguard Worker     // For superframe with Intra-only count will be +1 larger
502*fb1b10abSAndroid Build Coastguard Worker     // because of no-show frame.
503*fb1b10abSAndroid Build Coastguard Worker     if (force_intra_only_frame_ && superframe_has_intra_only_)
504*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(count, num_layers_encoded + 1);
505*fb1b10abSAndroid Build Coastguard Worker     else
506*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(count, num_layers_encoded);
507*fb1b10abSAndroid Build Coastguard Worker 
508*fb1b10abSAndroid Build Coastguard Worker     // In the constrained frame drop mode, if a given spatial is dropped all
509*fb1b10abSAndroid Build Coastguard Worker     // upper layers must be dropped too.
510*fb1b10abSAndroid Build Coastguard Worker     if (!layer_framedrop_) {
511*fb1b10abSAndroid Build Coastguard Worker       int num_layers_dropped = 0;
512*fb1b10abSAndroid Build Coastguard Worker       for (int sl = 0; sl < number_spatial_layers_; ++sl) {
513*fb1b10abSAndroid Build Coastguard Worker         if (!pkt->data.frame.spatial_layer_encoded[sl]) {
514*fb1b10abSAndroid Build Coastguard Worker           // Check that all upper layers are dropped.
515*fb1b10abSAndroid Build Coastguard Worker           num_layers_dropped++;
516*fb1b10abSAndroid Build Coastguard Worker           for (int sl2 = sl + 1; sl2 < number_spatial_layers_; ++sl2)
517*fb1b10abSAndroid Build Coastguard Worker             ASSERT_EQ(pkt->data.frame.spatial_layer_encoded[sl2], 0);
518*fb1b10abSAndroid Build Coastguard Worker         }
519*fb1b10abSAndroid Build Coastguard Worker       }
520*fb1b10abSAndroid Build Coastguard Worker       if (num_layers_dropped == number_spatial_layers_ - 1)
521*fb1b10abSAndroid Build Coastguard Worker         force_key_ = 1;
522*fb1b10abSAndroid Build Coastguard Worker       else
523*fb1b10abSAndroid Build Coastguard Worker         force_key_ = 0;
524*fb1b10abSAndroid Build Coastguard Worker     }
525*fb1b10abSAndroid Build Coastguard Worker     // Keep track of number of non-reference frames, needed for mismatch check.
526*fb1b10abSAndroid Build Coastguard Worker     // Non-reference frames are top spatial and temporal layer frames,
527*fb1b10abSAndroid Build Coastguard Worker     // for TL > 0.
528*fb1b10abSAndroid Build Coastguard Worker     if (temporal_layer_id_ == number_temporal_layers_ - 1 &&
529*fb1b10abSAndroid Build Coastguard Worker         temporal_layer_id_ > 0 &&
530*fb1b10abSAndroid Build Coastguard Worker         pkt->data.frame.spatial_layer_encoded[number_spatial_layers_ - 1])
531*fb1b10abSAndroid Build Coastguard Worker       num_nonref_frames_++;
532*fb1b10abSAndroid Build Coastguard Worker     for (int sl = 0; sl < number_spatial_layers_; ++sl) {
533*fb1b10abSAndroid Build Coastguard Worker       sizes[sl] = sizes[sl] << 3;
534*fb1b10abSAndroid Build Coastguard Worker       // Update the total encoded bits per layer.
535*fb1b10abSAndroid Build Coastguard Worker       // For temporal layers, update the cumulative encoded bits per layer.
536*fb1b10abSAndroid Build Coastguard Worker       for (int tl = temporal_layer_id_; tl < number_temporal_layers_; ++tl) {
537*fb1b10abSAndroid Build Coastguard Worker         const int layer = sl * number_temporal_layers_ + tl;
538*fb1b10abSAndroid Build Coastguard Worker         bits_total_[layer] += static_cast<int64_t>(sizes[sl]);
539*fb1b10abSAndroid Build Coastguard Worker         // Update the per-layer buffer level with the encoded frame size.
540*fb1b10abSAndroid Build Coastguard Worker         bits_in_buffer_model_[layer] -= static_cast<int64_t>(sizes[sl]);
541*fb1b10abSAndroid Build Coastguard Worker         // There should be no buffer underrun, except on the base
542*fb1b10abSAndroid Build Coastguard Worker         // temporal layer, since there may be key frames there.
543*fb1b10abSAndroid Build Coastguard Worker         // Fo short key frame spacing, buffer can underrun on individual frames.
544*fb1b10abSAndroid Build Coastguard Worker         if (!key_frame && tl > 0 && key_frame_spacing_ < 100) {
545*fb1b10abSAndroid Build Coastguard Worker           ASSERT_GE(bits_in_buffer_model_[layer], 0)
546*fb1b10abSAndroid Build Coastguard Worker               << "Buffer Underrun at frame " << pkt->data.frame.pts;
547*fb1b10abSAndroid Build Coastguard Worker         }
548*fb1b10abSAndroid Build Coastguard Worker       }
549*fb1b10abSAndroid Build Coastguard Worker 
550*fb1b10abSAndroid Build Coastguard Worker       if (!single_layer_resize_) {
551*fb1b10abSAndroid Build Coastguard Worker         unsigned int scaled_width = top_sl_width_ *
552*fb1b10abSAndroid Build Coastguard Worker                                     svc_params_.scaling_factor_num[sl] /
553*fb1b10abSAndroid Build Coastguard Worker                                     svc_params_.scaling_factor_den[sl];
554*fb1b10abSAndroid Build Coastguard Worker         if (scaled_width % 2 != 0) scaled_width += 1;
555*fb1b10abSAndroid Build Coastguard Worker         ASSERT_EQ(pkt->data.frame.width[sl], scaled_width);
556*fb1b10abSAndroid Build Coastguard Worker         unsigned int scaled_height = top_sl_height_ *
557*fb1b10abSAndroid Build Coastguard Worker                                      svc_params_.scaling_factor_num[sl] /
558*fb1b10abSAndroid Build Coastguard Worker                                      svc_params_.scaling_factor_den[sl];
559*fb1b10abSAndroid Build Coastguard Worker         if (scaled_height % 2 != 0) scaled_height += 1;
560*fb1b10abSAndroid Build Coastguard Worker         ASSERT_EQ(pkt->data.frame.height[sl], scaled_height);
561*fb1b10abSAndroid Build Coastguard Worker       } else if (superframe_count_ > 0) {
562*fb1b10abSAndroid Build Coastguard Worker         if (pkt->data.frame.width[sl] < prev_frame_width[sl] &&
563*fb1b10abSAndroid Build Coastguard Worker             pkt->data.frame.height[sl] < prev_frame_height[sl])
564*fb1b10abSAndroid Build Coastguard Worker           num_resize_down_ += 1;
565*fb1b10abSAndroid Build Coastguard Worker         if (pkt->data.frame.width[sl] > prev_frame_width[sl] &&
566*fb1b10abSAndroid Build Coastguard Worker             pkt->data.frame.height[sl] > prev_frame_height[sl])
567*fb1b10abSAndroid Build Coastguard Worker           num_resize_up_ += 1;
568*fb1b10abSAndroid Build Coastguard Worker       }
569*fb1b10abSAndroid Build Coastguard Worker       prev_frame_width[sl] = pkt->data.frame.width[sl];
570*fb1b10abSAndroid Build Coastguard Worker       prev_frame_height[sl] = pkt->data.frame.height[sl];
571*fb1b10abSAndroid Build Coastguard Worker     }
572*fb1b10abSAndroid Build Coastguard Worker   }
573*fb1b10abSAndroid Build Coastguard Worker 
EndPassHook()574*fb1b10abSAndroid Build Coastguard Worker   void EndPassHook() override {
575*fb1b10abSAndroid Build Coastguard Worker     if (change_bitrate_) last_pts_ = last_pts_ - last_pts_ref_;
576*fb1b10abSAndroid Build Coastguard Worker     duration_ = (last_pts_ + 1) * timebase_;
577*fb1b10abSAndroid Build Coastguard Worker     for (int sl = 0; sl < number_spatial_layers_; ++sl) {
578*fb1b10abSAndroid Build Coastguard Worker       for (int tl = 0; tl < number_temporal_layers_; ++tl) {
579*fb1b10abSAndroid Build Coastguard Worker         const int layer = sl * number_temporal_layers_ + tl;
580*fb1b10abSAndroid Build Coastguard Worker         const double file_size_in_kb = bits_total_[layer] / 1000.;
581*fb1b10abSAndroid Build Coastguard Worker         file_datarate_[layer] = file_size_in_kb / duration_;
582*fb1b10abSAndroid Build Coastguard Worker       }
583*fb1b10abSAndroid Build Coastguard Worker     }
584*fb1b10abSAndroid Build Coastguard Worker   }
585*fb1b10abSAndroid Build Coastguard Worker 
MismatchHook(const vpx_image_t * img1,const vpx_image_t * img2)586*fb1b10abSAndroid Build Coastguard Worker   void MismatchHook(const vpx_image_t *img1, const vpx_image_t *img2) override {
587*fb1b10abSAndroid Build Coastguard Worker     // TODO(marpan): Look into why an assert is triggered in compute_psnr
588*fb1b10abSAndroid Build Coastguard Worker     // for mismatch frames for the special test case: ksvc_flex_noupd_tlenh.
589*fb1b10abSAndroid Build Coastguard Worker     // Has to do with dropped frames in bypass/flexible svc mode.
590*fb1b10abSAndroid Build Coastguard Worker     if (!ksvc_flex_noupd_tlenh_) {
591*fb1b10abSAndroid Build Coastguard Worker       double mismatch_psnr = compute_psnr(img1, img2);
592*fb1b10abSAndroid Build Coastguard Worker       mismatch_psnr_ += mismatch_psnr;
593*fb1b10abSAndroid Build Coastguard Worker       ++mismatch_nframes_;
594*fb1b10abSAndroid Build Coastguard Worker     }
595*fb1b10abSAndroid Build Coastguard Worker   }
596*fb1b10abSAndroid Build Coastguard Worker 
GetMismatchFrames()597*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetMismatchFrames() { return mismatch_nframes_; }
GetNonRefFrames()598*fb1b10abSAndroid Build Coastguard Worker   unsigned int GetNonRefFrames() { return num_nonref_frames_; }
599*fb1b10abSAndroid Build Coastguard Worker 
600*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t last_pts_;
601*fb1b10abSAndroid Build Coastguard Worker   double timebase_;
602*fb1b10abSAndroid Build Coastguard Worker   int64_t bits_total_[VPX_MAX_LAYERS];
603*fb1b10abSAndroid Build Coastguard Worker   double duration_;
604*fb1b10abSAndroid Build Coastguard Worker   double file_datarate_[VPX_MAX_LAYERS];
605*fb1b10abSAndroid Build Coastguard Worker   size_t bits_in_last_frame_;
606*fb1b10abSAndroid Build Coastguard Worker   double mismatch_psnr_;
607*fb1b10abSAndroid Build Coastguard Worker   int denoiser_on_;
608*fb1b10abSAndroid Build Coastguard Worker   int tune_content_;
609*fb1b10abSAndroid Build Coastguard Worker   int spatial_layer_id_;
610*fb1b10abSAndroid Build Coastguard Worker   bool dynamic_drop_layer_;
611*fb1b10abSAndroid Build Coastguard Worker   bool single_layer_resize_;
612*fb1b10abSAndroid Build Coastguard Worker   unsigned int top_sl_width_;
613*fb1b10abSAndroid Build Coastguard Worker   unsigned int top_sl_height_;
614*fb1b10abSAndroid Build Coastguard Worker   vpx_svc_ref_frame_config_t ref_frame_config_;
615*fb1b10abSAndroid Build Coastguard Worker   int update_pattern_;
616*fb1b10abSAndroid Build Coastguard Worker   bool change_bitrate_;
617*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_pts_t last_pts_ref_;
618*fb1b10abSAndroid Build Coastguard Worker   int middle_bitrate_;
619*fb1b10abSAndroid Build Coastguard Worker   int top_bitrate_;
620*fb1b10abSAndroid Build Coastguard Worker   int key_frame_spacing_;
621*fb1b10abSAndroid Build Coastguard Worker   int layer_framedrop_;
622*fb1b10abSAndroid Build Coastguard Worker   int force_key_;
623*fb1b10abSAndroid Build Coastguard Worker   int force_key_test_;
624*fb1b10abSAndroid Build Coastguard Worker   int inter_layer_pred_mode_;
625*fb1b10abSAndroid Build Coastguard Worker   int insert_layer_sync_;
626*fb1b10abSAndroid Build Coastguard Worker   int layer_sync_on_base_;
627*fb1b10abSAndroid Build Coastguard Worker   int force_intra_only_frame_;
628*fb1b10abSAndroid Build Coastguard Worker   int superframe_has_intra_only_;
629*fb1b10abSAndroid Build Coastguard Worker   int use_post_encode_drop_;
630*fb1b10abSAndroid Build Coastguard Worker   int bitrate_sl3_[3];
631*fb1b10abSAndroid Build Coastguard Worker   // Denoiser switched on the fly.
632*fb1b10abSAndroid Build Coastguard Worker   bool denoiser_off_on_;
633*fb1b10abSAndroid Build Coastguard Worker   // Top layer enabled on the fly.
634*fb1b10abSAndroid Build Coastguard Worker   bool denoiser_enable_layers_;
635*fb1b10abSAndroid Build Coastguard Worker   int num_resize_up_;
636*fb1b10abSAndroid Build Coastguard Worker   int num_resize_down_;
637*fb1b10abSAndroid Build Coastguard Worker   unsigned int prev_frame_width[VPX_MAX_LAYERS];
638*fb1b10abSAndroid Build Coastguard Worker   unsigned int prev_frame_height[VPX_MAX_LAYERS];
639*fb1b10abSAndroid Build Coastguard Worker   bool ksvc_flex_noupd_tlenh_;
640*fb1b10abSAndroid Build Coastguard Worker 
641*fb1b10abSAndroid Build Coastguard Worker  private:
SetConfig(const int num_temporal_layer)642*fb1b10abSAndroid Build Coastguard Worker   void SetConfig(const int num_temporal_layer) override {
643*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_end_usage = VPX_CBR;
644*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_lag_in_frames = 0;
645*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_error_resilient = 1;
646*fb1b10abSAndroid Build Coastguard Worker     if (num_temporal_layer == 3) {
647*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[0] = 4;
648*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[1] = 2;
649*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[2] = 1;
650*fb1b10abSAndroid Build Coastguard Worker       cfg_.temporal_layering_mode = 3;
651*fb1b10abSAndroid Build Coastguard Worker     } else if (num_temporal_layer == 2) {
652*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[0] = 2;
653*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[1] = 1;
654*fb1b10abSAndroid Build Coastguard Worker       cfg_.temporal_layering_mode = 2;
655*fb1b10abSAndroid Build Coastguard Worker     } else if (num_temporal_layer == 1) {
656*fb1b10abSAndroid Build Coastguard Worker       cfg_.ts_rate_decimator[0] = 1;
657*fb1b10abSAndroid Build Coastguard Worker       cfg_.temporal_layering_mode = 0;
658*fb1b10abSAndroid Build Coastguard Worker     }
659*fb1b10abSAndroid Build Coastguard Worker   }
660*fb1b10abSAndroid Build Coastguard Worker 
661*fb1b10abSAndroid Build Coastguard Worker   unsigned int num_nonref_frames_;
662*fb1b10abSAndroid Build Coastguard Worker   unsigned int mismatch_nframes_;
663*fb1b10abSAndroid Build Coastguard Worker };
664*fb1b10abSAndroid Build Coastguard Worker 
665*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting.
666*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcSingleBR
667*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
668*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWithParam<int> {
669*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcSingleBR()670*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcSingleBR() : DatarateOnePassCbrSvc(GET_PARAM(0)) {
671*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
672*fb1b10abSAndroid Build Coastguard Worker   }
673*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcSingleBR() override = default;
674*fb1b10abSAndroid Build Coastguard Worker 
675*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()676*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
677*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
678*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
679*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
680*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
681*fb1b10abSAndroid Build Coastguard Worker   }
682*fb1b10abSAndroid Build Coastguard Worker };
683*fb1b10abSAndroid Build Coastguard Worker 
684*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
685*fb1b10abSAndroid Build Coastguard Worker // temporal layers, for 4:4:4 Profile 1.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TL444Profile1)686*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TL444Profile1) {
687*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
688*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 140);
689*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_profile = 1;
690*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_bit_depth = VPX_BITS_8;
691*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
692*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
693*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
694*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
695*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
696*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
697*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
698*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
699*fb1b10abSAndroid Build Coastguard Worker 
700*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 352;
701*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 288;
702*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 500;
703*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
704*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
705*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
706*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
707*fb1b10abSAndroid Build Coastguard Worker                           1.15);
708*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
709*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
710*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
711*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
712*fb1b10abSAndroid Build Coastguard Worker #endif
713*fb1b10abSAndroid Build Coastguard Worker }
714*fb1b10abSAndroid Build Coastguard Worker 
715*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 3
716*fb1b10abSAndroid Build Coastguard Worker // temporal layers, for 4:2:2 Profile 1.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc2SL3TL422Profile1)717*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc2SL3TL422Profile1) {
718*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
719*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("park_joy_90p_8_422.y4m", 0, 20);
720*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_profile = 1;
721*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_bit_depth = VPX_BITS_8;
722*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
723*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
724*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
725*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
726*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
727*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
728*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
729*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
730*fb1b10abSAndroid Build Coastguard Worker 
731*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 160;
732*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 90;
733*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 500;
734*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
735*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
736*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
737*fb1b10abSAndroid Build Coastguard Worker   // Use large under/over shoot thresholds as this is a very short clip,
738*fb1b10abSAndroid Build Coastguard Worker   // so not good for testing rate-targeting.
739*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.5,
740*fb1b10abSAndroid Build Coastguard Worker                           1.7);
741*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
742*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
743*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
744*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
745*fb1b10abSAndroid Build Coastguard Worker #endif
746*fb1b10abSAndroid Build Coastguard Worker }
747*fb1b10abSAndroid Build Coastguard Worker 
748*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
749*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
750*fb1b10abSAndroid Build Coastguard Worker // temporal layers, for Profle 2 10bit.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TL10bitProfile2)751*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TL10bitProfile2) {
752*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
753*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("park_joy_90p_10_420_20f.y4m", 0, 20);
754*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_profile = 2;
755*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_bit_depth = VPX_BITS_10;
756*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_input_bit_depth = VPX_BITS_10;
757*fb1b10abSAndroid Build Coastguard Worker   if (cfg_.g_bit_depth > 8) init_flags_ |= VPX_CODEC_USE_HIGHBITDEPTH;
758*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
759*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
760*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
761*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
762*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
763*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
764*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
765*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
766*fb1b10abSAndroid Build Coastguard Worker 
767*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 160;
768*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 90;
769*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 500;
770*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
771*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
772*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
773*fb1b10abSAndroid Build Coastguard Worker   // TODO(marpan/jianj): Comment out the rate-target checking for now
774*fb1b10abSAndroid Build Coastguard Worker   // as superframe parsing to get frame size needs to be fixed for
775*fb1b10abSAndroid Build Coastguard Worker   // high bitdepth.
776*fb1b10abSAndroid Build Coastguard Worker   /*
777*fb1b10abSAndroid Build Coastguard Worker   // Use large under/over shoot thresholds as this is a very short clip,
778*fb1b10abSAndroid Build Coastguard Worker   // so not good for testing rate-targeting.
779*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.5,
780*fb1b10abSAndroid Build Coastguard Worker                           1.7);
781*fb1b10abSAndroid Build Coastguard Worker   */
782*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
783*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
784*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
785*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
786*fb1b10abSAndroid Build Coastguard Worker #endif
787*fb1b10abSAndroid Build Coastguard Worker }
788*fb1b10abSAndroid Build Coastguard Worker 
789*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
790*fb1b10abSAndroid Build Coastguard Worker // temporal layers, for Profle 2 12bit.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TL12bitProfile2)791*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TL12bitProfile2) {
792*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
793*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("park_joy_90p_12_420_20f.y4m", 0, 20);
794*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_profile = 2;
795*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_bit_depth = VPX_BITS_12;
796*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_input_bit_depth = VPX_BITS_12;
797*fb1b10abSAndroid Build Coastguard Worker   if (cfg_.g_bit_depth > 8) init_flags_ |= VPX_CODEC_USE_HIGHBITDEPTH;
798*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
799*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
800*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
801*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
802*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
803*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
804*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
805*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
806*fb1b10abSAndroid Build Coastguard Worker 
807*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 160;
808*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 90;
809*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 500;
810*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
811*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
812*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
813*fb1b10abSAndroid Build Coastguard Worker   // TODO(marpan/jianj): Comment out the rate-target checking for now
814*fb1b10abSAndroid Build Coastguard Worker   // as superframe parsing to get frame size needs to be fixed for
815*fb1b10abSAndroid Build Coastguard Worker   // high bitdepth.
816*fb1b10abSAndroid Build Coastguard Worker   /*
817*fb1b10abSAndroid Build Coastguard Worker   // Use large under/over shoot thresholds as this is a very short clip,
818*fb1b10abSAndroid Build Coastguard Worker   // so not good for testing rate-targeting.
819*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.5,
820*fb1b10abSAndroid Build Coastguard Worker                           1.7);
821*fb1b10abSAndroid Build Coastguard Worker   */
822*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
823*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
824*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
825*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
826*fb1b10abSAndroid Build Coastguard Worker #endif
827*fb1b10abSAndroid Build Coastguard Worker }
828*fb1b10abSAndroid Build Coastguard Worker #endif
829*fb1b10abSAndroid Build Coastguard Worker 
830*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 1
831*fb1b10abSAndroid Build Coastguard Worker // temporal layer, with screen content mode on and same speed setting for all
832*fb1b10abSAndroid Build Coastguard Worker // layers.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc2SL1TLScreenContent1)833*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc2SL1TLScreenContent1) {
834*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 1);
835*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
836*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
837*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
838*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
839*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
840*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
841*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 10;
842*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
843*fb1b10abSAndroid Build Coastguard Worker 
844*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
845*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
846*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
847*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 500;
848*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
849*fb1b10abSAndroid Build Coastguard Worker   tune_content_ = 1;
850*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
851*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
852*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
853*fb1b10abSAndroid Build Coastguard Worker                           1.15);
854*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
855*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
856*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
857*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
858*fb1b10abSAndroid Build Coastguard Worker #endif
859*fb1b10abSAndroid Build Coastguard Worker }
860*fb1b10abSAndroid Build Coastguard Worker 
861*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
862*fb1b10abSAndroid Build Coastguard Worker // 3 temporal layers, with force key frame after frame drop
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TLForceKey)863*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TLForceKey) {
864*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
865*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
866*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
867*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
868*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
869*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
870*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
871*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
872*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
873*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
874*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
875*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
876*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
877*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 100;
878*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
879*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
880*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
881*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
882*fb1b10abSAndroid Build Coastguard Worker                           1.25);
883*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
884*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
885*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
886*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
887*fb1b10abSAndroid Build Coastguard Worker #endif
888*fb1b10abSAndroid Build Coastguard Worker }
889*fb1b10abSAndroid Build Coastguard Worker 
890*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
891*fb1b10abSAndroid Build Coastguard Worker // 2 temporal layers, with a change on the fly from the fixed SVC pattern to one
892*fb1b10abSAndroid Build Coastguard Worker // generate via SVC_SET_REF_FRAME_CONFIG. The new pattern also disables
893*fb1b10abSAndroid Build Coastguard Worker // inter-layer prediction.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL2TLDynamicPatternChange)894*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL2TLDynamicPatternChange) {
895*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 2);
896*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
897*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
898*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
899*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
900*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
901*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
902*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
903*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
904*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
905*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
906*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
907*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
908*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
909*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
910*fb1b10abSAndroid Build Coastguard Worker   // Change SVC pattern on the fly.
911*fb1b10abSAndroid Build Coastguard Worker   update_pattern_ = 1;
912*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
913*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
914*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
915*fb1b10abSAndroid Build Coastguard Worker                           1.15);
916*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
917*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
918*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
919*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
920*fb1b10abSAndroid Build Coastguard Worker #endif
921*fb1b10abSAndroid Build Coastguard Worker }
922*fb1b10abSAndroid Build Coastguard Worker 
923*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC with 3 spatial and 3 temporal
924*fb1b10abSAndroid Build Coastguard Worker // layers, for inter_layer_pred=OffKey (K-SVC) and on the fly switching
925*fb1b10abSAndroid Build Coastguard Worker // of denoiser from off to on (on at frame = 100). Key frame period is set to
926*fb1b10abSAndroid Build Coastguard Worker // 1000 so denoise is enabled on non-key.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TL_DenoiserOffOnFixedLayers)927*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR,
928*fb1b10abSAndroid Build Coastguard Worker        OnePassCbrSvc3SL3TL_DenoiserOffOnFixedLayers) {
929*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
930*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
931*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
932*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
933*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
934*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
935*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
936*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
937*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 1000;
938*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("desktop_office1.1280_720-020.yuv", 1280,
939*fb1b10abSAndroid Build Coastguard Worker                                        720, 30, 1, 0, 300);
940*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
941*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
942*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 1000;
943*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
944*fb1b10abSAndroid Build Coastguard Worker   denoiser_off_on_ = true;
945*fb1b10abSAndroid Build Coastguard Worker   denoiser_enable_layers_ = false;
946*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
947*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
948*fb1b10abSAndroid Build Coastguard Worker   // Don't check rate targeting on two top spatial layer since they will be
949*fb1b10abSAndroid Build Coastguard Worker   // skipped for part of the sequence.
950*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_ - 2, number_temporal_layers_,
951*fb1b10abSAndroid Build Coastguard Worker                           0.78, 1.15);
952*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
953*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
954*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
955*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
956*fb1b10abSAndroid Build Coastguard Worker #endif
957*fb1b10abSAndroid Build Coastguard Worker }
958*fb1b10abSAndroid Build Coastguard Worker 
959*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC with 3 spatial and 3 temporal
960*fb1b10abSAndroid Build Coastguard Worker // layers, for inter_layer_pred=OffKey (K-SVC) and on the fly switching
961*fb1b10abSAndroid Build Coastguard Worker // of denoiser from off to on, for dynamic layers. Start at 2 spatial layers
962*fb1b10abSAndroid Build Coastguard Worker // and enable 3rd spatial layer at frame = 100. Use periodic key frame with
963*fb1b10abSAndroid Build Coastguard Worker // period 100 so enabling of spatial layer occurs at key frame. Enable denoiser
964*fb1b10abSAndroid Build Coastguard Worker // at frame > 100, after the key frame sync.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TL_DenoiserOffOnEnableLayers)965*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR,
966*fb1b10abSAndroid Build Coastguard Worker        OnePassCbrSvc3SL3TL_DenoiserOffOnEnableLayers) {
967*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
968*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
969*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
970*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
971*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
972*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
973*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
974*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 0;
975*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 100;
976*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("desktop_office1.1280_720-020.yuv", 1280,
977*fb1b10abSAndroid Build Coastguard Worker                                        720, 30, 1, 0, 300);
978*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
979*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
980*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 1000;
981*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
982*fb1b10abSAndroid Build Coastguard Worker   denoiser_off_on_ = true;
983*fb1b10abSAndroid Build Coastguard Worker   denoiser_enable_layers_ = true;
984*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
985*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
986*fb1b10abSAndroid Build Coastguard Worker   // Don't check rate targeting on two top spatial layer since they will be
987*fb1b10abSAndroid Build Coastguard Worker   // skipped for part of the sequence.
988*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_ - 2, number_temporal_layers_,
989*fb1b10abSAndroid Build Coastguard Worker                           0.78, 1.15);
990*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
991*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
992*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
993*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
994*fb1b10abSAndroid Build Coastguard Worker #endif
995*fb1b10abSAndroid Build Coastguard Worker }
996*fb1b10abSAndroid Build Coastguard Worker 
997*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC with 3 spatial layers and on
998*fb1b10abSAndroid Build Coastguard Worker // the fly switching to 1 and then 2 and back to 3 spatial layers. This switch
999*fb1b10abSAndroid Build Coastguard Worker // is done by setting spatial layer bitrates to 0, and then back to non-zero,
1000*fb1b10abSAndroid Build Coastguard Worker // during the sequence.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL_DisableEnableLayers)1001*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL_DisableEnableLayers) {
1002*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 1);
1003*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1004*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1005*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1006*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1007*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1008*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1009*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 0;
1010*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1011*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1012*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1013*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1014*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1015*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1016*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1017*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1018*fb1b10abSAndroid Build Coastguard Worker   dynamic_drop_layer_ = true;
1019*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1020*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1021*fb1b10abSAndroid Build Coastguard Worker   // Don't check rate targeting on two top spatial layer since they will be
1022*fb1b10abSAndroid Build Coastguard Worker   // skipped for part of the sequence.
1023*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_ - 2, number_temporal_layers_,
1024*fb1b10abSAndroid Build Coastguard Worker                           0.78, 1.15);
1025*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1026*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1027*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1028*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1029*fb1b10abSAndroid Build Coastguard Worker #endif
1030*fb1b10abSAndroid Build Coastguard Worker }
1031*fb1b10abSAndroid Build Coastguard Worker 
1032*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC with 2 spatial layers and on
1033*fb1b10abSAndroid Build Coastguard Worker // the fly switching to 1 spatial layer with dynamic resize enabled.
1034*fb1b10abSAndroid Build Coastguard Worker // The resizer will resize the single layer down and back up again, as the
1035*fb1b10abSAndroid Build Coastguard Worker // bitrate goes back up.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc2SL_SingleLayerResize)1036*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc2SL_SingleLayerResize) {
1037*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 1);
1038*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1039*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1040*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1041*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1042*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1043*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1044*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 0;
1045*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1046*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1047*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_resize_allowed = 1;
1048*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("desktop_office1.1280_720-020.yuv", 1280,
1049*fb1b10abSAndroid Build Coastguard Worker                                        720, 15, 1, 0, 300);
1050*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1051*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1052*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1053*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1054*fb1b10abSAndroid Build Coastguard Worker   dynamic_drop_layer_ = true;
1055*fb1b10abSAndroid Build Coastguard Worker   single_layer_resize_ = true;
1056*fb1b10abSAndroid Build Coastguard Worker   base_speed_setting_ = speed_setting_;
1057*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1058*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1059*fb1b10abSAndroid Build Coastguard Worker   // Expect at least one resize down and at least one resize back up.
1060*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(num_resize_down_, 1);
1061*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(num_resize_up_, 1);
1062*fb1b10abSAndroid Build Coastguard Worker   // Don't check rate targeting on two top spatial layer since they will be
1063*fb1b10abSAndroid Build Coastguard Worker   // skipped for part of the sequence.
1064*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_ - 2, number_temporal_layers_,
1065*fb1b10abSAndroid Build Coastguard Worker                           0.78, 1.15);
1066*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1067*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1068*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1069*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1070*fb1b10abSAndroid Build Coastguard Worker #endif
1071*fb1b10abSAndroid Build Coastguard Worker }
1072*fb1b10abSAndroid Build Coastguard Worker 
1073*fb1b10abSAndroid Build Coastguard Worker // For  pass CBR SVC with 1 spatial and 2 temporal layers with dynamic resize
1074*fb1b10abSAndroid Build Coastguard Worker // and denoiser enabled. The resizer will resize the single layer down and back
1075*fb1b10abSAndroid Build Coastguard Worker // up again, as the bitrate goes back up.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc1SL2TL_DenoiseResize)1076*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc1SL2TL_DenoiseResize) {
1077*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(1, 2);
1078*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1079*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1080*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1081*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1082*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1083*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1084*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 2;
1085*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1086*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1087*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_resize_allowed = 1;
1088*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("desktop_office1.1280_720-020.yuv", 1280,
1089*fb1b10abSAndroid Build Coastguard Worker                                        720, 12, 1, 0, 300);
1090*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1091*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1092*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1093*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1094*fb1b10abSAndroid Build Coastguard Worker   dynamic_drop_layer_ = false;
1095*fb1b10abSAndroid Build Coastguard Worker   single_layer_resize_ = true;
1096*fb1b10abSAndroid Build Coastguard Worker   denoiser_on_ = 1;
1097*fb1b10abSAndroid Build Coastguard Worker   base_speed_setting_ = speed_setting_;
1098*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1099*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1100*fb1b10abSAndroid Build Coastguard Worker   // Expect at least one resize down and at least one resize back up.
1101*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(num_resize_down_, 1);
1102*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(num_resize_up_, 1);
1103*fb1b10abSAndroid Build Coastguard Worker }
1104*fb1b10abSAndroid Build Coastguard Worker 
1105*fb1b10abSAndroid Build Coastguard Worker // Run SVC encoder for 1 temporal layer, 2 spatial layers, with spatial
1106*fb1b10abSAndroid Build Coastguard Worker // downscale 5x5.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc2SL1TL5x5MultipleRuns)1107*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc2SL1TL5x5MultipleRuns) {
1108*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1109*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1110*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1111*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1112*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1113*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
1114*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
1115*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_number_layers = 2;
1116*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_number_layers = 1;
1117*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_rate_decimator[0] = 1;
1118*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 1;
1119*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 3;
1120*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 0;
1121*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[0] = 256;
1122*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[0] = 1280;
1123*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[1] = 1280;
1124*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[1] = 1280;
1125*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 10;
1126*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 999999;
1127*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_min_dist = 0;
1128*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[0] = 300;
1129*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[1] = 1400;
1130*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[0] = 300;
1131*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[1] = 1400;
1132*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 1700;
1133*fb1b10abSAndroid Build Coastguard Worker   number_spatial_layers_ = cfg_.ss_number_layers;
1134*fb1b10abSAndroid Build Coastguard Worker   number_temporal_layers_ = cfg_.ts_number_layers;
1135*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1136*fb1b10abSAndroid Build Coastguard Worker   layer_target_avg_bandwidth_[0] = cfg_.layer_target_bitrate[0] * 1000 / 30;
1137*fb1b10abSAndroid Build Coastguard Worker   bits_in_buffer_model_[0] =
1138*fb1b10abSAndroid Build Coastguard Worker       cfg_.layer_target_bitrate[0] * cfg_.rc_buf_initial_sz;
1139*fb1b10abSAndroid Build Coastguard Worker   layer_target_avg_bandwidth_[1] = cfg_.layer_target_bitrate[1] * 1000 / 30;
1140*fb1b10abSAndroid Build Coastguard Worker   bits_in_buffer_model_[1] =
1141*fb1b10abSAndroid Build Coastguard Worker       cfg_.layer_target_bitrate[1] * cfg_.rc_buf_initial_sz;
1142*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
1143*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1144*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1145*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1146*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1147*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1148*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1149*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1150*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1151*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1152*fb1b10abSAndroid Build Coastguard Worker #endif
1153*fb1b10abSAndroid Build Coastguard Worker }
1154*fb1b10abSAndroid Build Coastguard Worker 
1155*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting and index for bitrate array.
1156*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcMultiBR
1157*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1158*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith2Params<int, int> {
1159*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcMultiBR()1160*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcMultiBR() : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1161*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1162*fb1b10abSAndroid Build Coastguard Worker   }
1163*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcMultiBR() override = default;
1164*fb1b10abSAndroid Build Coastguard Worker 
1165*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1166*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1167*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1168*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1169*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1170*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1171*fb1b10abSAndroid Build Coastguard Worker   }
1172*fb1b10abSAndroid Build Coastguard Worker };
1173*fb1b10abSAndroid Build Coastguard Worker 
1174*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
1175*fb1b10abSAndroid Build Coastguard Worker // 3 temporal layers. Run CIF clip with 1 thread.
TEST_P(DatarateOnePassCbrSvcMultiBR,OnePassCbrSvc2SL3TL)1176*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcMultiBR, OnePassCbrSvc2SL3TL) {
1177*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
1178*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1179*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1180*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1181*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1182*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1183*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1184*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1185*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1186*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1187*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1188*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1189*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1190*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 200, 400, 600 };
1191*fb1b10abSAndroid Build Coastguard Worker   // TODO(marpan): Check that effective_datarate for each layer hits the
1192*fb1b10abSAndroid Build Coastguard Worker   // layer target_bitrate.
1193*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(2)];
1194*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1195*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1196*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1197*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.75,
1198*fb1b10abSAndroid Build Coastguard Worker                           1.2);
1199*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1200*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1201*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1202*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1203*fb1b10abSAndroid Build Coastguard Worker #endif
1204*fb1b10abSAndroid Build Coastguard Worker }
1205*fb1b10abSAndroid Build Coastguard Worker 
1206*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass VBR SVC: 2 spatial layers and
1207*fb1b10abSAndroid Build Coastguard Worker // 3 temporal layers. Run VGA clip with 1 thread.
TEST_P(DatarateOnePassCbrSvcMultiBR,OnePassVbrSvc2SL3TL)1208*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcMultiBR, OnePassVbrSvc2SL3TL) {
1209*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
1210*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1211*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1212*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1213*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 2;
1214*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 56;
1215*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1216*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1217*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1218*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_VBR;
1219*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1220*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1221*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1222*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1223*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 200, 400, 600 };
1224*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(2)];
1225*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1226*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1227*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1228*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.70,
1229*fb1b10abSAndroid Build Coastguard Worker                           1.3);
1230*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1231*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1232*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1233*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1234*fb1b10abSAndroid Build Coastguard Worker #endif
1235*fb1b10abSAndroid Build Coastguard Worker }
1236*fb1b10abSAndroid Build Coastguard Worker 
1237*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting, layer framedrop control and index for bitrate array.
1238*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcFrameDropMultiBR
1239*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1240*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith3Params<int, int, int> {
1241*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcFrameDropMultiBR()1242*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcFrameDropMultiBR()
1243*fb1b10abSAndroid Build Coastguard Worker       : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1244*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1245*fb1b10abSAndroid Build Coastguard Worker   }
1246*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcFrameDropMultiBR() override = default;
1247*fb1b10abSAndroid Build Coastguard Worker 
1248*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1249*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1250*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1251*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1252*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1253*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1254*fb1b10abSAndroid Build Coastguard Worker   }
1255*fb1b10abSAndroid Build Coastguard Worker };
1256*fb1b10abSAndroid Build Coastguard Worker 
1257*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
1258*fb1b10abSAndroid Build Coastguard Worker // 3 temporal layers. Run HD clip with 4 threads.
TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR,OnePassCbrSvc2SL3TL4Threads)1259*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR, OnePassCbrSvc2SL3TL4Threads) {
1260*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
1261*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1262*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1263*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1264*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1265*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1266*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 4;
1267*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1268*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1269*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
1270*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1271*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1272*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = 0;
1273*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 200, 400, 600 };
1274*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(3)];
1275*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1276*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = GET_PARAM(2);
1277*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1278*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1279*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.64,
1280*fb1b10abSAndroid Build Coastguard Worker                           1.45);
1281*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1282*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1283*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1284*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1285*fb1b10abSAndroid Build Coastguard Worker #endif
1286*fb1b10abSAndroid Build Coastguard Worker }
1287*fb1b10abSAndroid Build Coastguard Worker 
1288*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
1289*fb1b10abSAndroid Build Coastguard Worker // 3 temporal layers. Run HD clip with 4 threads.
TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR,OnePassCbrSvc3SL3TL4Threads)1290*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR, OnePassCbrSvc3SL3TL4Threads) {
1291*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
1292*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1293*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1294*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1295*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1296*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1297*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 4;
1298*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1299*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1300*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
1301*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1302*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1303*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = 0;
1304*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 200, 400, 600 };
1305*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(3)];
1306*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1307*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = GET_PARAM(2);
1308*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1309*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1310*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.58,
1311*fb1b10abSAndroid Build Coastguard Worker                           1.2);
1312*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1313*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1314*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1315*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1316*fb1b10abSAndroid Build Coastguard Worker #endif
1317*fb1b10abSAndroid Build Coastguard Worker }
1318*fb1b10abSAndroid Build Coastguard Worker 
1319*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
1320*fb1b10abSAndroid Build Coastguard Worker // 2 temporal layers, for KSVC in flexible mode with no update of reference
1321*fb1b10abSAndroid Build Coastguard Worker // frames for all spatial layers on TL > 0 superframes.
1322*fb1b10abSAndroid Build Coastguard Worker // Run HD clip with 4 threads.
TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR,OnePassCbrSvc3SL2TL4ThKSVCFlex)1323*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR, OnePassCbrSvc3SL2TL4ThKSVCFlex) {
1324*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 2);
1325*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1326*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1327*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1328*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1329*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1330*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 4;
1331*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1332*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1333*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
1334*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 1280;
1335*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 720;
1336*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = 0;
1337*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 200, 400, 600 };
1338*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(3)];
1339*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1340*fb1b10abSAndroid Build Coastguard Worker   layer_framedrop_ = GET_PARAM(2);
1341*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1342*fb1b10abSAndroid Build Coastguard Worker   ksvc_flex_noupd_tlenh_ = true;
1343*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
1344*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1345*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.58,
1346*fb1b10abSAndroid Build Coastguard Worker                           1.2);
1347*fb1b10abSAndroid Build Coastguard Worker }
1348*fb1b10abSAndroid Build Coastguard Worker 
1349*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting, inter-layer prediction mode.
1350*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcInterLayerPredSingleBR
1351*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1352*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith2Params<int, int> {
1353*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcInterLayerPredSingleBR()1354*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcInterLayerPredSingleBR()
1355*fb1b10abSAndroid Build Coastguard Worker       : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1356*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1357*fb1b10abSAndroid Build Coastguard Worker   }
1358*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcInterLayerPredSingleBR() override = default;
1359*fb1b10abSAndroid Build Coastguard Worker 
1360*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1361*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1362*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1363*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1364*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1365*fb1b10abSAndroid Build Coastguard Worker     inter_layer_pred_mode_ = GET_PARAM(2);
1366*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1367*fb1b10abSAndroid Build Coastguard Worker   }
1368*fb1b10abSAndroid Build Coastguard Worker };
1369*fb1b10abSAndroid Build Coastguard Worker 
1370*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting with different inter-layer prediction modes for 1
1371*fb1b10abSAndroid Build Coastguard Worker // pass CBR SVC: 3 spatial layers and 3 temporal layers. Run CIF clip with 1
1372*fb1b10abSAndroid Build Coastguard Worker // thread.
TEST_P(DatarateOnePassCbrSvcInterLayerPredSingleBR,OnePassCbrSvc3SL3TL)1373*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcInterLayerPredSingleBR, OnePassCbrSvc3SL3TL) {
1374*fb1b10abSAndroid Build Coastguard Worker   // Disable test for inter-layer pred off for now since simulcast_mode fails.
1375*fb1b10abSAndroid Build Coastguard Worker   if (inter_layer_pred_mode_ == INTER_LAYER_PRED_OFF) return;
1376*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
1377*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1378*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1379*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1380*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1381*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1382*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1383*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 3;
1384*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1385*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1386*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1387*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1388*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1389*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1390*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1391*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1392*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1393*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1394*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1395*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1396*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1397*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1398*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1399*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1400*fb1b10abSAndroid Build Coastguard Worker #endif
1401*fb1b10abSAndroid Build Coastguard Worker }
1402*fb1b10abSAndroid Build Coastguard Worker 
1403*fb1b10abSAndroid Build Coastguard Worker // Check rate targeting with different inter-layer prediction modes for 1 pass
1404*fb1b10abSAndroid Build Coastguard Worker // CBR SVC: 3 spatial layers and 3 temporal layers, changing the target bitrate
1405*fb1b10abSAndroid Build Coastguard Worker // at the middle of encoding.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TLDynamicBitrateChange)1406*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TLDynamicBitrateChange) {
1407*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
1408*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1409*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1410*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1411*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1412*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1413*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1414*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1415*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1416*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1417*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1418*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1419*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1420*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1421*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1422*fb1b10abSAndroid Build Coastguard Worker   change_bitrate_ = true;
1423*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1424*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1425*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1426*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1427*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1428*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1429*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1430*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1431*fb1b10abSAndroid Build Coastguard Worker #endif
1432*fb1b10abSAndroid Build Coastguard Worker }
1433*fb1b10abSAndroid Build Coastguard Worker 
1434*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
1435*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting, noise sensitivity, index for bitrate array and inter
1436*fb1b10abSAndroid Build Coastguard Worker // layer pred mode.
1437*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcDenoiser
1438*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1439*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith4Params<int, int, int, int> {
1440*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcDenoiser()1441*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcDenoiser() : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1442*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1443*fb1b10abSAndroid Build Coastguard Worker   }
1444*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcDenoiser() override = default;
1445*fb1b10abSAndroid Build Coastguard Worker 
1446*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1447*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1448*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1449*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1450*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1451*fb1b10abSAndroid Build Coastguard Worker     inter_layer_pred_mode_ = GET_PARAM(3);
1452*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1453*fb1b10abSAndroid Build Coastguard Worker   }
1454*fb1b10abSAndroid Build Coastguard Worker };
1455*fb1b10abSAndroid Build Coastguard Worker 
1456*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC with denoising.
1457*fb1b10abSAndroid Build Coastguard Worker // 2 spatial layers and 3 temporal layer. Run HD clip with 2 threads.
TEST_P(DatarateOnePassCbrSvcDenoiser,OnePassCbrSvc2SL3TLDenoiserOn)1458*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcDenoiser, OnePassCbrSvc2SL3TLDenoiserOn) {
1459*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
1460*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1461*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1462*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1463*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1464*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1465*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 2;
1466*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1467*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1468*fb1b10abSAndroid Build Coastguard Worker   number_spatial_layers_ = cfg_.ss_number_layers;
1469*fb1b10abSAndroid Build Coastguard Worker   number_temporal_layers_ = cfg_.ts_number_layers;
1470*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1471*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1472*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1473*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1474*fb1b10abSAndroid Build Coastguard Worker   const int bitrates[3] = { 600, 800, 1000 };
1475*fb1b10abSAndroid Build Coastguard Worker   // TODO(marpan): Check that effective_datarate for each layer hits the
1476*fb1b10abSAndroid Build Coastguard Worker   // layer target_bitrate.
1477*fb1b10abSAndroid Build Coastguard Worker   // For SVC, noise_sen = 1 means denoising only the top spatial layer
1478*fb1b10abSAndroid Build Coastguard Worker   // noise_sen = 2 means denoising the two top spatial layers.
1479*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = bitrates[GET_PARAM(3)];
1480*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1481*fb1b10abSAndroid Build Coastguard Worker   denoiser_on_ = GET_PARAM(2);
1482*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1483*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1484*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1485*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1486*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1487*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1488*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1489*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1490*fb1b10abSAndroid Build Coastguard Worker #endif
1491*fb1b10abSAndroid Build Coastguard Worker }
1492*fb1b10abSAndroid Build Coastguard Worker #endif
1493*fb1b10abSAndroid Build Coastguard Worker 
1494*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting, key frame dist.
1495*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcSmallKF
1496*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1497*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWith2Params<int, int> {
1498*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcSmallKF()1499*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcSmallKF() : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1500*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1501*fb1b10abSAndroid Build Coastguard Worker   }
1502*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcSmallKF() override = default;
1503*fb1b10abSAndroid Build Coastguard Worker 
1504*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1505*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1506*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1507*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1508*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1509*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1510*fb1b10abSAndroid Build Coastguard Worker   }
1511*fb1b10abSAndroid Build Coastguard Worker };
1512*fb1b10abSAndroid Build Coastguard Worker 
1513*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
1514*fb1b10abSAndroid Build Coastguard Worker // temporal layers. Run CIF clip with 1 thread, and few short key frame periods.
TEST_P(DatarateOnePassCbrSvcSmallKF,OnePassCbrSvc3SL3TLSmallKf)1515*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSmallKF, OnePassCbrSvc3SL3TLSmallKf) {
1516*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
1517*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1518*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1519*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1520*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1521*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1522*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1523*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 10;
1524*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 800;
1525*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1526*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1527*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1528*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1529*fb1b10abSAndroid Build Coastguard Worker   // For this 3 temporal layer case, pattern repeats every 4 frames, so choose
1530*fb1b10abSAndroid Build Coastguard Worker   // 4 key neighboring key frame periods (so key frame will land on 0-2-1-2).
1531*fb1b10abSAndroid Build Coastguard Worker   const int kf_dist = GET_PARAM(2);
1532*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = kf_dist;
1533*fb1b10abSAndroid Build Coastguard Worker   key_frame_spacing_ = kf_dist;
1534*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1535*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1536*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1537*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.70,
1538*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1539*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1540*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1541*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1542*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1543*fb1b10abSAndroid Build Coastguard Worker #endif
1544*fb1b10abSAndroid Build Coastguard Worker }
1545*fb1b10abSAndroid Build Coastguard Worker 
1546*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 3
1547*fb1b10abSAndroid Build Coastguard Worker // temporal layers. Run CIF clip with 1 thread, and few short key frame periods.
TEST_P(DatarateOnePassCbrSvcSmallKF,OnePassCbrSvc2SL3TLSmallKf)1548*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSmallKF, OnePassCbrSvc2SL3TLSmallKf) {
1549*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(2, 3);
1550*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1551*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1552*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1553*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1554*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1555*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1556*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 10;
1557*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 400;
1558*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1559*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1560*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1561*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1562*fb1b10abSAndroid Build Coastguard Worker   // For this 3 temporal layer case, pattern repeats every 4 frames, so choose
1563*fb1b10abSAndroid Build Coastguard Worker   // 4 key neighboring key frame periods (so key frame will land on 0-2-1-2).
1564*fb1b10abSAndroid Build Coastguard Worker   const int kf_dist = GET_PARAM(2) + 32;
1565*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = kf_dist;
1566*fb1b10abSAndroid Build Coastguard Worker   key_frame_spacing_ = kf_dist;
1567*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1568*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1569*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1570*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1571*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1572*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1573*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1574*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1575*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1576*fb1b10abSAndroid Build Coastguard Worker #endif
1577*fb1b10abSAndroid Build Coastguard Worker }
1578*fb1b10abSAndroid Build Coastguard Worker 
1579*fb1b10abSAndroid Build Coastguard Worker // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and 3
1580*fb1b10abSAndroid Build Coastguard Worker // temporal layers. Run VGA clip with 1 thread, and place layer sync frames:
1581*fb1b10abSAndroid Build Coastguard Worker // one at middle layer first, then another one for top layer, and another
1582*fb1b10abSAndroid Build Coastguard Worker // insert for base spatial layer (which forces key frame).
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL3TLSyncFrames)1583*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL3TLSyncFrames) {
1584*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 3);
1585*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1586*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1587*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1588*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1589*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1590*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 1;
1591*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1592*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 10;
1593*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 400;
1594*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1595*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1596*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1597*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1598*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1599*fb1b10abSAndroid Build Coastguard Worker   insert_layer_sync_ = 1;
1600*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1601*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1602*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
1603*fb1b10abSAndroid Build Coastguard Worker                           1.15);
1604*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1605*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1606*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1607*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1608*fb1b10abSAndroid Build Coastguard Worker #endif
1609*fb1b10abSAndroid Build Coastguard Worker }
1610*fb1b10abSAndroid Build Coastguard Worker 
1611*fb1b10abSAndroid Build Coastguard Worker // Run SVC encoder for 3 spatial layers, 1 temporal layer, with
1612*fb1b10abSAndroid Build Coastguard Worker // intra-only frame as sync frame on base spatial layer.
1613*fb1b10abSAndroid Build Coastguard Worker // Intra_only is inserted at start and in middle of sequence.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc3SL1TLSyncWithIntraOnly)1614*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc3SL1TLSyncWithIntraOnly) {
1615*fb1b10abSAndroid Build Coastguard Worker   SetSvcConfig(3, 1);
1616*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1617*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1618*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1619*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1620*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 63;
1621*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 4;
1622*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1623*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1624*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 400;
1625*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1626*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1627*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1628*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1629*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1630*fb1b10abSAndroid Build Coastguard Worker   insert_layer_sync_ = 1;
1631*fb1b10abSAndroid Build Coastguard Worker   // Use intra_only frame for sync on base layer.
1632*fb1b10abSAndroid Build Coastguard Worker   force_intra_only_frame_ = 1;
1633*fb1b10abSAndroid Build Coastguard Worker   AssignLayerBitrates();
1634*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1635*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.73,
1636*fb1b10abSAndroid Build Coastguard Worker                           1.2);
1637*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1638*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1639*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1640*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1641*fb1b10abSAndroid Build Coastguard Worker #endif
1642*fb1b10abSAndroid Build Coastguard Worker }
1643*fb1b10abSAndroid Build Coastguard Worker 
1644*fb1b10abSAndroid Build Coastguard Worker // Run SVC encoder for 2 quality layers (same resolution different,
1645*fb1b10abSAndroid Build Coastguard Worker // bitrates), 1 temporal layer, with screen content mode.
TEST_P(DatarateOnePassCbrSvcSingleBR,OnePassCbrSvc2QL1TLScreen)1646*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcSingleBR, OnePassCbrSvc2QL1TLScreen) {
1647*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 500;
1648*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 500;
1649*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 1000;
1650*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1651*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 56;
1652*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
1653*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
1654*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_number_layers = 2;
1655*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_number_layers = 1;
1656*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_rate_decimator[0] = 1;
1657*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 0;
1658*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 1;
1659*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 2;
1660*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[0] = 1;
1661*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[0] = 1;
1662*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[1] = 1;
1663*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[1] = 1;
1664*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1665*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1666*fb1b10abSAndroid Build Coastguard Worker   number_spatial_layers_ = cfg_.ss_number_layers;
1667*fb1b10abSAndroid Build Coastguard Worker   number_temporal_layers_ = cfg_.ts_number_layers;
1668*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
1669*fb1b10abSAndroid Build Coastguard Worker                                        0, 400);
1670*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 640;
1671*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 480;
1672*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1673*fb1b10abSAndroid Build Coastguard Worker   tune_content_ = 1;
1674*fb1b10abSAndroid Build Coastguard Worker   // Set the layer bitrates, for 2 spatial layers, 1 temporal.
1675*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 400;
1676*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[0] = 100;
1677*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[1] = 300;
1678*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[0] = 100;
1679*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[1] = 300;
1680*fb1b10abSAndroid Build Coastguard Worker   for (int sl = 0; sl < 2; ++sl) {
1681*fb1b10abSAndroid Build Coastguard Worker     float layer_framerate = 30.0;
1682*fb1b10abSAndroid Build Coastguard Worker     layer_target_avg_bandwidth_[sl] = static_cast<int>(
1683*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[sl] * 1000.0 / layer_framerate);
1684*fb1b10abSAndroid Build Coastguard Worker     bits_in_buffer_model_[sl] =
1685*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[sl] * cfg_.rc_buf_initial_sz;
1686*fb1b10abSAndroid Build Coastguard Worker   }
1687*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1688*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.73,
1689*fb1b10abSAndroid Build Coastguard Worker                           1.25);
1690*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1691*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1692*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1693*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1694*fb1b10abSAndroid Build Coastguard Worker #endif
1695*fb1b10abSAndroid Build Coastguard Worker }
1696*fb1b10abSAndroid Build Coastguard Worker 
1697*fb1b10abSAndroid Build Coastguard Worker // Params: speed setting.
1698*fb1b10abSAndroid Build Coastguard Worker class DatarateOnePassCbrSvcPostencodeDrop
1699*fb1b10abSAndroid Build Coastguard Worker     : public DatarateOnePassCbrSvc,
1700*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWithParam<int> {
1701*fb1b10abSAndroid Build Coastguard Worker  public:
DatarateOnePassCbrSvcPostencodeDrop()1702*fb1b10abSAndroid Build Coastguard Worker   DatarateOnePassCbrSvcPostencodeDrop() : DatarateOnePassCbrSvc(GET_PARAM(0)) {
1703*fb1b10abSAndroid Build Coastguard Worker     memset(&svc_params_, 0, sizeof(svc_params_));
1704*fb1b10abSAndroid Build Coastguard Worker   }
1705*fb1b10abSAndroid Build Coastguard Worker   ~DatarateOnePassCbrSvcPostencodeDrop() override = default;
1706*fb1b10abSAndroid Build Coastguard Worker 
1707*fb1b10abSAndroid Build Coastguard Worker  protected:
SetUp()1708*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
1709*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
1710*fb1b10abSAndroid Build Coastguard Worker     SetMode(::libvpx_test::kRealTime);
1711*fb1b10abSAndroid Build Coastguard Worker     speed_setting_ = GET_PARAM(1);
1712*fb1b10abSAndroid Build Coastguard Worker     ResetModel();
1713*fb1b10abSAndroid Build Coastguard Worker   }
1714*fb1b10abSAndroid Build Coastguard Worker };
1715*fb1b10abSAndroid Build Coastguard Worker 
1716*fb1b10abSAndroid Build Coastguard Worker // Run SVC encoder for 2 quality layers (same resolution different,
1717*fb1b10abSAndroid Build Coastguard Worker // bitrates), 1 temporal layer, with screen content mode.
TEST_P(DatarateOnePassCbrSvcPostencodeDrop,OnePassCbrSvc2QL1TLScreen)1718*fb1b10abSAndroid Build Coastguard Worker TEST_P(DatarateOnePassCbrSvcPostencodeDrop, OnePassCbrSvc2QL1TLScreen) {
1719*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_initial_sz = 200;
1720*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_optimal_sz = 200;
1721*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_buf_sz = 400;
1722*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
1723*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 52;
1724*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_end_usage = VPX_CBR;
1725*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 0;
1726*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_number_layers = 2;
1727*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_number_layers = 1;
1728*fb1b10abSAndroid Build Coastguard Worker   cfg_.ts_rate_decimator[0] = 1;
1729*fb1b10abSAndroid Build Coastguard Worker   cfg_.temporal_layering_mode = 0;
1730*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_error_resilient = 1;
1731*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_threads = 2;
1732*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[0] = 1;
1733*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[0] = 1;
1734*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_num[1] = 1;
1735*fb1b10abSAndroid Build Coastguard Worker   svc_params_.scaling_factor_den[1] = 1;
1736*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_dropframe_thresh = 30;
1737*fb1b10abSAndroid Build Coastguard Worker   cfg_.kf_max_dist = 9999;
1738*fb1b10abSAndroid Build Coastguard Worker   number_spatial_layers_ = cfg_.ss_number_layers;
1739*fb1b10abSAndroid Build Coastguard Worker   number_temporal_layers_ = cfg_.ts_number_layers;
1740*fb1b10abSAndroid Build Coastguard Worker   ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
1741*fb1b10abSAndroid Build Coastguard Worker                                        30, 1, 0, 300);
1742*fb1b10abSAndroid Build Coastguard Worker   top_sl_width_ = 352;
1743*fb1b10abSAndroid Build Coastguard Worker   top_sl_height_ = 288;
1744*fb1b10abSAndroid Build Coastguard Worker   ResetModel();
1745*fb1b10abSAndroid Build Coastguard Worker   base_speed_setting_ = speed_setting_;
1746*fb1b10abSAndroid Build Coastguard Worker   tune_content_ = 1;
1747*fb1b10abSAndroid Build Coastguard Worker   use_post_encode_drop_ = 1;
1748*fb1b10abSAndroid Build Coastguard Worker   // Set the layer bitrates, for 2 spatial layers, 1 temporal.
1749*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 400;
1750*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[0] = 100;
1751*fb1b10abSAndroid Build Coastguard Worker   cfg_.ss_target_bitrate[1] = 300;
1752*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[0] = 100;
1753*fb1b10abSAndroid Build Coastguard Worker   cfg_.layer_target_bitrate[1] = 300;
1754*fb1b10abSAndroid Build Coastguard Worker   for (int sl = 0; sl < 2; ++sl) {
1755*fb1b10abSAndroid Build Coastguard Worker     float layer_framerate = 30.0;
1756*fb1b10abSAndroid Build Coastguard Worker     layer_target_avg_bandwidth_[sl] = static_cast<int>(
1757*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[sl] * 1000.0 / layer_framerate);
1758*fb1b10abSAndroid Build Coastguard Worker     bits_in_buffer_model_[sl] =
1759*fb1b10abSAndroid Build Coastguard Worker         cfg_.layer_target_bitrate[sl] * cfg_.rc_buf_initial_sz;
1760*fb1b10abSAndroid Build Coastguard Worker   }
1761*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1762*fb1b10abSAndroid Build Coastguard Worker   CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.73,
1763*fb1b10abSAndroid Build Coastguard Worker                           1.25);
1764*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_DECODER
1765*fb1b10abSAndroid Build Coastguard Worker   // The non-reference frames are expected to be mismatched frames as the
1766*fb1b10abSAndroid Build Coastguard Worker   // encoder will avoid loopfilter on these frames.
1767*fb1b10abSAndroid Build Coastguard Worker   EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
1768*fb1b10abSAndroid Build Coastguard Worker #endif
1769*fb1b10abSAndroid Build Coastguard Worker }
1770*fb1b10abSAndroid Build Coastguard Worker 
1771*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcSingleBR,
1772*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10));
1773*fb1b10abSAndroid Build Coastguard Worker 
1774*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcPostencodeDrop,
1775*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 6));
1776*fb1b10abSAndroid Build Coastguard Worker 
1777*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcInterLayerPredSingleBR,
1778*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10), ::testing::Range(0, 3));
1779*fb1b10abSAndroid Build Coastguard Worker 
1780*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcMultiBR,
1781*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10), ::testing::Range(0, 3));
1782*fb1b10abSAndroid Build Coastguard Worker 
1783*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcFrameDropMultiBR,
1784*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10), ::testing::Range(0, 2),
1785*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(0, 3));
1786*fb1b10abSAndroid Build Coastguard Worker 
1787*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
1788*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcDenoiser,
1789*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10), ::testing::Range(1, 3),
1790*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(0, 3), ::testing::Range(0, 4));
1791*fb1b10abSAndroid Build Coastguard Worker #endif
1792*fb1b10abSAndroid Build Coastguard Worker 
1793*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(DatarateOnePassCbrSvcSmallKF,
1794*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Range(5, 10), ::testing::Range(32, 36));
1795*fb1b10abSAndroid Build Coastguard Worker }  // namespace
1796*fb1b10abSAndroid Build Coastguard Worker }  // namespace svc_test
1797