Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Side by Side Diff: webrtc/modules/video_coding/qm_select_unittest.cc

Issue 1528503003: Lint enabled for webrtc/modules/video_coding folder. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/video_coding/qm_select_data.h ('k') | webrtc/modules/video_coding/receiver.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 14 matching lines...) Expand all
25 const float kSpatialLow = 0.01f; 25 const float kSpatialLow = 0.01f;
26 const float kSpatialMedium = 0.03f; 26 const float kSpatialMedium = 0.03f;
27 const float kSpatialHigh = 0.1f; 27 const float kSpatialHigh = 0.1f;
28 const float kTemporalLow = 0.01f; 28 const float kTemporalLow = 0.01f;
29 const float kTemporalMedium = 0.06f; 29 const float kTemporalMedium = 0.06f;
30 const float kTemporalHigh = 0.1f; 30 const float kTemporalHigh = 0.1f;
31 31
32 class QmSelectTest : public ::testing::Test { 32 class QmSelectTest : public ::testing::Test {
33 protected: 33 protected:
34 QmSelectTest() 34 QmSelectTest()
35 : qm_resolution_(new VCMQmResolution()), 35 : qm_resolution_(new VCMQmResolution()),
36 content_metrics_(new VideoContentMetrics()), 36 content_metrics_(new VideoContentMetrics()),
37 qm_scale_(NULL) { 37 qm_scale_(NULL) {}
38 }
39 VCMQmResolution* qm_resolution_; 38 VCMQmResolution* qm_resolution_;
40 VideoContentMetrics* content_metrics_; 39 VideoContentMetrics* content_metrics_;
41 VCMResolutionScale* qm_scale_; 40 VCMResolutionScale* qm_scale_;
42 41
43 void InitQmNativeData(float initial_bit_rate, 42 void InitQmNativeData(float initial_bit_rate,
44 int user_frame_rate, 43 int user_frame_rate,
45 int native_width, 44 int native_width,
46 int native_height, 45 int native_height,
47 int num_layers); 46 int num_layers);
48 47
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 EXPECT_EQ(-4, qm_resolution_->Initialize(1000, 30, 0, 480, 1)); 79 EXPECT_EQ(-4, qm_resolution_->Initialize(1000, 30, 0, 480, 1));
81 80
82 // Expect uninitialized error.: No valid initialization before selection. 81 // Expect uninitialized error.: No valid initialization before selection.
83 EXPECT_EQ(-7, qm_resolution_->SelectResolution(&qm_scale_)); 82 EXPECT_EQ(-7, qm_resolution_->SelectResolution(&qm_scale_));
84 83
85 VideoContentMetrics* content_metrics = NULL; 84 VideoContentMetrics* content_metrics = NULL;
86 EXPECT_EQ(0, qm_resolution_->Initialize(1000, 30, 640, 480, 1)); 85 EXPECT_EQ(0, qm_resolution_->Initialize(1000, 30, 640, 480, 1));
87 qm_resolution_->UpdateContent(content_metrics); 86 qm_resolution_->UpdateContent(content_metrics);
88 // Content metrics are NULL: Expect success and no down-sampling action. 87 // Content metrics are NULL: Expect success and no down-sampling action.
89 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 88 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
90 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0, 1.0, 1.0, 640, 480, 89 EXPECT_TRUE(
91 30.0f)); 90 IsSelectedActionCorrect(qm_scale_, 1.0, 1.0, 1.0, 640, 480, 30.0f));
92 } 91 }
93 92
94 // TODO(marpan): Add a test for number of temporal layers > 1. 93 // TODO(marpan): Add a test for number of temporal layers > 1.
95 94
96 // No down-sampling action at high rates. 95 // No down-sampling action at high rates.
97 TEST_F(QmSelectTest, NoActionHighRate) { 96 TEST_F(QmSelectTest, NoActionHighRate) {
98 // Initialize with bitrate, frame rate, native system width/height, and 97 // Initialize with bitrate, frame rate, native system width/height, and
99 // number of temporal layers. 98 // number of temporal layers.
100 InitQmNativeData(800, 30, 640, 480, 1); 99 InitQmNativeData(800, 30, 640, 480, 1);
101 100
102 // Update with encoder frame size. 101 // Update with encoder frame size.
103 uint16_t codec_width = 640; 102 uint16_t codec_width = 640;
104 uint16_t codec_height = 480; 103 uint16_t codec_height = 480;
105 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 104 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
106 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 105 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
107 106
108 // Update rates for a sequence of intervals. 107 // Update rates for a sequence of intervals.
109 int target_rate[] = {800, 800, 800}; 108 int target_rate[] = {800, 800, 800};
110 int encoder_sent_rate[] = {800, 800, 800}; 109 int encoder_sent_rate[] = {800, 800, 800};
111 int incoming_frame_rate[] = {30, 30, 30}; 110 int incoming_frame_rate[] = {30, 30, 30};
112 uint8_t fraction_lost[] = {10, 10, 10}; 111 uint8_t fraction_lost[] = {10, 10, 10};
113 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 112 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
114 fraction_lost, 3); 113 fraction_lost, 3);
115 114
116 // Update content: motion level, and 3 spatial prediction errors. 115 // Update content: motion level, and 3 spatial prediction errors.
117 UpdateQmContentData(kTemporalLow, kSpatialLow, kSpatialLow, kSpatialLow); 116 UpdateQmContentData(kTemporalLow, kSpatialLow, kSpatialLow, kSpatialLow);
118 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 117 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
119 EXPECT_EQ(0, qm_resolution_->ComputeContentClass()); 118 EXPECT_EQ(0, qm_resolution_->ComputeContentClass());
120 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 119 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
121 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 120 EXPECT_TRUE(
122 30.0f)); 121 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 30.0f));
123 } 122 }
124 123
125 // Rate is well below transition, down-sampling action is taken, 124 // Rate is well below transition, down-sampling action is taken,
126 // depending on the content state. 125 // depending on the content state.
127 TEST_F(QmSelectTest, DownActionLowRate) { 126 TEST_F(QmSelectTest, DownActionLowRate) {
128 // Initialize with bitrate, frame rate, native system width/height, and 127 // Initialize with bitrate, frame rate, native system width/height, and
129 // number of temporal layers. 128 // number of temporal layers.
130 InitQmNativeData(50, 30, 640, 480, 1); 129 InitQmNativeData(50, 30, 640, 480, 1);
131 130
132 // Update with encoder frame size. 131 // Update with encoder frame size.
133 uint16_t codec_width = 640; 132 uint16_t codec_width = 640;
134 uint16_t codec_height = 480; 133 uint16_t codec_height = 480;
135 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 134 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
136 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 135 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
137 136
138 // Update rates for a sequence of intervals. 137 // Update rates for a sequence of intervals.
139 int target_rate[] = {50, 50, 50}; 138 int target_rate[] = {50, 50, 50};
140 int encoder_sent_rate[] = {50, 50, 50}; 139 int encoder_sent_rate[] = {50, 50, 50};
141 int incoming_frame_rate[] = {30, 30, 30}; 140 int incoming_frame_rate[] = {30, 30, 30};
142 uint8_t fraction_lost[] = {10, 10, 10}; 141 uint8_t fraction_lost[] = {10, 10, 10};
143 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 142 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
144 fraction_lost, 3); 143 fraction_lost, 3);
145 144
146 // Update content: motion level, and 3 spatial prediction errors. 145 // Update content: motion level, and 3 spatial prediction errors.
147 // High motion, low spatial: 2x2 spatial expected. 146 // High motion, low spatial: 2x2 spatial expected.
148 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 147 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
149 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 148 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
150 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 149 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
151 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 150 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
152 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 151 EXPECT_TRUE(
153 30.0f)); 152 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
154 153
155 qm_resolution_->ResetDownSamplingState(); 154 qm_resolution_->ResetDownSamplingState();
156 // Low motion, low spatial: 2/3 temporal is expected. 155 // Low motion, low spatial: 2/3 temporal is expected.
157 UpdateQmContentData(kTemporalLow, kSpatialLow, kSpatialLow, kSpatialLow); 156 UpdateQmContentData(kTemporalLow, kSpatialLow, kSpatialLow, kSpatialLow);
158 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 157 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
159 EXPECT_EQ(0, qm_resolution_->ComputeContentClass()); 158 EXPECT_EQ(0, qm_resolution_->ComputeContentClass());
160 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 159 EXPECT_TRUE(
161 20.5f)); 160 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 20.5f));
162 161
163 qm_resolution_->ResetDownSamplingState(); 162 qm_resolution_->ResetDownSamplingState();
164 // Medium motion, low spatial: 2x2 spatial expected. 163 // Medium motion, low spatial: 2x2 spatial expected.
165 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 164 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
166 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 165 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
167 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 166 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
168 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 167 EXPECT_TRUE(
169 30.0f)); 168 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
170 169
171 qm_resolution_->ResetDownSamplingState(); 170 qm_resolution_->ResetDownSamplingState();
172 // High motion, high spatial: 2/3 temporal expected. 171 // High motion, high spatial: 2/3 temporal expected.
173 UpdateQmContentData(kTemporalHigh, kSpatialHigh, kSpatialHigh, kSpatialHigh); 172 UpdateQmContentData(kTemporalHigh, kSpatialHigh, kSpatialHigh, kSpatialHigh);
174 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 173 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
175 EXPECT_EQ(4, qm_resolution_->ComputeContentClass()); 174 EXPECT_EQ(4, qm_resolution_->ComputeContentClass());
176 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 175 EXPECT_TRUE(
177 20.5f)); 176 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 20.5f));
178 177
179 qm_resolution_->ResetDownSamplingState(); 178 qm_resolution_->ResetDownSamplingState();
180 // Low motion, high spatial: 1/2 temporal expected. 179 // Low motion, high spatial: 1/2 temporal expected.
181 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 180 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
182 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 181 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
183 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 182 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
184 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 183 EXPECT_TRUE(
185 15.5f)); 184 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 15.5f));
186 185
187 qm_resolution_->ResetDownSamplingState(); 186 qm_resolution_->ResetDownSamplingState();
188 // Medium motion, high spatial: 1/2 temporal expected. 187 // Medium motion, high spatial: 1/2 temporal expected.
189 UpdateQmContentData(kTemporalMedium, kSpatialHigh, kSpatialHigh, 188 UpdateQmContentData(kTemporalMedium, kSpatialHigh, kSpatialHigh,
190 kSpatialHigh); 189 kSpatialHigh);
191 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 190 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
192 EXPECT_EQ(7, qm_resolution_->ComputeContentClass()); 191 EXPECT_EQ(7, qm_resolution_->ComputeContentClass());
193 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 192 EXPECT_TRUE(
194 15.5f)); 193 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 15.5f));
195 194
196 qm_resolution_->ResetDownSamplingState(); 195 qm_resolution_->ResetDownSamplingState();
197 // High motion, medium spatial: 2x2 spatial expected. 196 // High motion, medium spatial: 2x2 spatial expected.
198 UpdateQmContentData(kTemporalHigh, kSpatialMedium, kSpatialMedium, 197 UpdateQmContentData(kTemporalHigh, kSpatialMedium, kSpatialMedium,
199 kSpatialMedium); 198 kSpatialMedium);
200 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 199 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
201 EXPECT_EQ(5, qm_resolution_->ComputeContentClass()); 200 EXPECT_EQ(5, qm_resolution_->ComputeContentClass());
202 // Target frame rate for frame dropper should be the same as previous == 15. 201 // Target frame rate for frame dropper should be the same as previous == 15.
203 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 202 EXPECT_TRUE(
204 30.0f)); 203 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
205 204
206 qm_resolution_->ResetDownSamplingState(); 205 qm_resolution_->ResetDownSamplingState();
207 // Low motion, medium spatial: high frame rate, so 1/2 temporal expected. 206 // Low motion, medium spatial: high frame rate, so 1/2 temporal expected.
208 UpdateQmContentData(kTemporalLow, kSpatialMedium, kSpatialMedium, 207 UpdateQmContentData(kTemporalLow, kSpatialMedium, kSpatialMedium,
209 kSpatialMedium); 208 kSpatialMedium);
210 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 209 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
211 EXPECT_EQ(2, qm_resolution_->ComputeContentClass()); 210 EXPECT_EQ(2, qm_resolution_->ComputeContentClass());
212 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 211 EXPECT_TRUE(
213 15.5f)); 212 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 15.5f));
214 213
215 qm_resolution_->ResetDownSamplingState(); 214 qm_resolution_->ResetDownSamplingState();
216 // Medium motion, medium spatial: high frame rate, so 2/3 temporal expected. 215 // Medium motion, medium spatial: high frame rate, so 2/3 temporal expected.
217 UpdateQmContentData(kTemporalMedium, kSpatialMedium, kSpatialMedium, 216 UpdateQmContentData(kTemporalMedium, kSpatialMedium, kSpatialMedium,
218 kSpatialMedium); 217 kSpatialMedium);
219 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 218 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
220 EXPECT_EQ(8, qm_resolution_->ComputeContentClass()); 219 EXPECT_EQ(8, qm_resolution_->ComputeContentClass());
221 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 220 EXPECT_TRUE(
222 20.5f)); 221 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 20.5f));
223 } 222 }
224 223
225 // Rate mis-match is high, and we have over-shooting. 224 // Rate mis-match is high, and we have over-shooting.
226 // since target rate is below max for down-sampling, down-sampling is selected. 225 // since target rate is below max for down-sampling, down-sampling is selected.
227 TEST_F(QmSelectTest, DownActionHighRateMMOvershoot) { 226 TEST_F(QmSelectTest, DownActionHighRateMMOvershoot) {
228 // Initialize with bitrate, frame rate, native system width/height, and 227 // Initialize with bitrate, frame rate, native system width/height, and
229 // number of temporal layers. 228 // number of temporal layers.
230 InitQmNativeData(300, 30, 640, 480, 1); 229 InitQmNativeData(300, 30, 640, 480, 1);
231 230
232 // Update with encoder frame size. 231 // Update with encoder frame size.
233 uint16_t codec_width = 640; 232 uint16_t codec_width = 640;
234 uint16_t codec_height = 480; 233 uint16_t codec_height = 480;
235 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 234 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
236 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 235 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
237 236
238 // Update rates for a sequence of intervals. 237 // Update rates for a sequence of intervals.
239 int target_rate[] = {300, 300, 300}; 238 int target_rate[] = {300, 300, 300};
240 int encoder_sent_rate[] = {900, 900, 900}; 239 int encoder_sent_rate[] = {900, 900, 900};
241 int incoming_frame_rate[] = {30, 30, 30}; 240 int incoming_frame_rate[] = {30, 30, 30};
242 uint8_t fraction_lost[] = {10, 10, 10}; 241 uint8_t fraction_lost[] = {10, 10, 10};
243 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 242 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
244 fraction_lost, 3); 243 fraction_lost, 3);
245 244
246 // Update content: motion level, and 3 spatial prediction errors. 245 // Update content: motion level, and 3 spatial prediction errors.
247 // High motion, low spatial. 246 // High motion, low spatial.
248 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 247 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
249 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 248 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
250 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 249 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
251 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState()); 250 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState());
252 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 251 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
253 1.0f, 480, 360, 30.0f)); 252 480, 360, 30.0f));
254 253
255 qm_resolution_->ResetDownSamplingState(); 254 qm_resolution_->ResetDownSamplingState();
256 // Low motion, high spatial 255 // Low motion, high spatial
257 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 256 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
258 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 257 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
259 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 258 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
260 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 259 EXPECT_TRUE(
261 20.5f)); 260 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 20.5f));
262 } 261 }
263 262
264 // Rate mis-match is high, target rate is below max for down-sampling, 263 // Rate mis-match is high, target rate is below max for down-sampling,
265 // but since we have consistent under-shooting, no down-sampling action. 264 // but since we have consistent under-shooting, no down-sampling action.
266 TEST_F(QmSelectTest, NoActionHighRateMMUndershoot) { 265 TEST_F(QmSelectTest, NoActionHighRateMMUndershoot) {
267 // Initialize with bitrate, frame rate, native system width/height, and 266 // Initialize with bitrate, frame rate, native system width/height, and
268 // number of temporal layers. 267 // number of temporal layers.
269 InitQmNativeData(300, 30, 640, 480, 1); 268 InitQmNativeData(300, 30, 640, 480, 1);
270 269
271 // Update with encoder frame size. 270 // Update with encoder frame size.
272 uint16_t codec_width = 640; 271 uint16_t codec_width = 640;
273 uint16_t codec_height = 480; 272 uint16_t codec_height = 480;
274 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 273 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
275 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 274 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
276 275
277 // Update rates for a sequence of intervals. 276 // Update rates for a sequence of intervals.
278 int target_rate[] = {300, 300, 300}; 277 int target_rate[] = {300, 300, 300};
279 int encoder_sent_rate[] = {100, 100, 100}; 278 int encoder_sent_rate[] = {100, 100, 100};
280 int incoming_frame_rate[] = {30, 30, 30}; 279 int incoming_frame_rate[] = {30, 30, 30};
281 uint8_t fraction_lost[] = {10, 10, 10}; 280 uint8_t fraction_lost[] = {10, 10, 10};
282 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 281 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
283 fraction_lost, 3); 282 fraction_lost, 3);
284 283
285 // Update content: motion level, and 3 spatial prediction errors. 284 // Update content: motion level, and 3 spatial prediction errors.
286 // High motion, low spatial. 285 // High motion, low spatial.
287 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 286 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
288 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 287 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
289 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 288 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
290 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState()); 289 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState());
291 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 290 EXPECT_TRUE(
292 30.0f)); 291 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 30.0f));
293 292
294 qm_resolution_->ResetDownSamplingState(); 293 qm_resolution_->ResetDownSamplingState();
295 // Low motion, high spatial 294 // Low motion, high spatial
296 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 295 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
297 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 296 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
298 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 297 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
299 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 298 EXPECT_TRUE(
300 30.0f)); 299 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 30.0f));
301 } 300 }
302 301
303 // Buffer is underflowing, and target rate is below max for down-sampling, 302 // Buffer is underflowing, and target rate is below max for down-sampling,
304 // so action is taken. 303 // so action is taken.
305 TEST_F(QmSelectTest, DownActionBufferUnderflow) { 304 TEST_F(QmSelectTest, DownActionBufferUnderflow) {
306 // Initialize with bitrate, frame rate, native system width/height, and 305 // Initialize with bitrate, frame rate, native system width/height, and
307 // number of temporal layers. 306 // number of temporal layers.
308 InitQmNativeData(300, 30, 640, 480, 1); 307 InitQmNativeData(300, 30, 640, 480, 1);
309 308
310 // Update with encoder frame size. 309 // Update with encoder frame size.
(...skipping 14 matching lines...) Expand all
325 uint8_t fraction_lost[] = {10, 10, 10}; 324 uint8_t fraction_lost[] = {10, 10, 10};
326 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 325 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
327 fraction_lost, 3); 326 fraction_lost, 3);
328 327
329 // Update content: motion level, and 3 spatial prediction errors. 328 // Update content: motion level, and 3 spatial prediction errors.
330 // High motion, low spatial. 329 // High motion, low spatial.
331 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 330 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
332 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 331 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
333 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 332 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
334 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState()); 333 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState());
335 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 334 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
336 1.0f, 480, 360, 30.0f)); 335 480, 360, 30.0f));
337 336
338 qm_resolution_->ResetDownSamplingState(); 337 qm_resolution_->ResetDownSamplingState();
339 // Low motion, high spatial 338 // Low motion, high spatial
340 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 339 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
341 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 340 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
342 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 341 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
343 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 342 EXPECT_TRUE(
344 20.5f)); 343 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 640, 480, 20.5f));
345 } 344 }
346 345
347 // Target rate is below max for down-sampling, but buffer level is stable, 346 // Target rate is below max for down-sampling, but buffer level is stable,
348 // so no action is taken. 347 // so no action is taken.
349 TEST_F(QmSelectTest, NoActionBufferStable) { 348 TEST_F(QmSelectTest, NoActionBufferStable) {
350 // Initialize with bitrate, frame rate, native system width/height, and 349 // Initialize with bitrate, frame rate, native system width/height, and
351 // number of temporal layers. 350 // number of temporal layers.
352 InitQmNativeData(350, 30, 640, 480, 1); 351 InitQmNativeData(350, 30, 640, 480, 1);
353 352
354 // Update with encoder frame size. 353 // Update with encoder frame size.
(...skipping 14 matching lines...) Expand all
369 uint8_t fraction_lost[] = {10, 10, 10}; 368 uint8_t fraction_lost[] = {10, 10, 10};
370 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 369 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
371 fraction_lost, 3); 370 fraction_lost, 3);
372 371
373 // Update content: motion level, and 3 spatial prediction errors. 372 // Update content: motion level, and 3 spatial prediction errors.
374 // High motion, low spatial. 373 // High motion, low spatial.
375 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 374 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
376 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 375 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
377 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 376 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
378 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 377 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
379 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 378 EXPECT_TRUE(
380 30.0f)); 379 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 30.0f));
381 380
382 qm_resolution_->ResetDownSamplingState(); 381 qm_resolution_->ResetDownSamplingState();
383 // Low motion, high spatial 382 // Low motion, high spatial
384 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 383 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
385 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 384 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
386 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 385 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
387 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 386 EXPECT_TRUE(
388 30.0f)); 387 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 30.0f));
389 } 388 }
390 389
391 // Very low rate, but no spatial down-sampling below some size (QCIF). 390 // Very low rate, but no spatial down-sampling below some size (QCIF).
392 TEST_F(QmSelectTest, LimitDownSpatialAction) { 391 TEST_F(QmSelectTest, LimitDownSpatialAction) {
393 // Initialize with bitrate, frame rate, native system width/height, and 392 // Initialize with bitrate, frame rate, native system width/height, and
394 // number of temporal layers. 393 // number of temporal layers.
395 InitQmNativeData(10, 30, 176, 144, 1); 394 InitQmNativeData(10, 30, 176, 144, 1);
396 395
397 // Update with encoder frame size. 396 // Update with encoder frame size.
398 uint16_t codec_width = 176; 397 uint16_t codec_width = 176;
399 uint16_t codec_height = 144; 398 uint16_t codec_height = 144;
400 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 399 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
401 EXPECT_EQ(0, qm_resolution_->GetImageType(codec_width, codec_height)); 400 EXPECT_EQ(0, qm_resolution_->GetImageType(codec_width, codec_height));
402 401
403 // Update rates for a sequence of intervals. 402 // Update rates for a sequence of intervals.
404 int target_rate[] = {10, 10, 10}; 403 int target_rate[] = {10, 10, 10};
405 int encoder_sent_rate[] = {10, 10, 10}; 404 int encoder_sent_rate[] = {10, 10, 10};
406 int incoming_frame_rate[] = {30, 30, 30}; 405 int incoming_frame_rate[] = {30, 30, 30};
407 uint8_t fraction_lost[] = {10, 10, 10}; 406 uint8_t fraction_lost[] = {10, 10, 10};
408 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 407 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
409 fraction_lost, 3); 408 fraction_lost, 3);
410 409
411 // Update content: motion level, and 3 spatial prediction errors. 410 // Update content: motion level, and 3 spatial prediction errors.
412 // High motion, low spatial. 411 // High motion, low spatial.
413 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 412 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
414 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 413 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
415 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 414 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
416 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 415 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
417 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 176, 144, 416 EXPECT_TRUE(
418 30.0f)); 417 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 176, 144, 30.0f));
419 } 418 }
420 419
421 // Very low rate, but no frame reduction below some frame_rate (8fps). 420 // Very low rate, but no frame reduction below some frame_rate (8fps).
422 TEST_F(QmSelectTest, LimitDownTemporalAction) { 421 TEST_F(QmSelectTest, LimitDownTemporalAction) {
423 // Initialize with bitrate, frame rate, native system width/height, and 422 // Initialize with bitrate, frame rate, native system width/height, and
424 // number of temporal layers. 423 // number of temporal layers.
425 InitQmNativeData(10, 8, 640, 480, 1); 424 InitQmNativeData(10, 8, 640, 480, 1);
426 425
427 // Update with encoder frame size. 426 // Update with encoder frame size.
428 uint16_t codec_width = 640; 427 uint16_t codec_width = 640;
429 uint16_t codec_height = 480; 428 uint16_t codec_height = 480;
430 qm_resolution_->UpdateCodecParameters(8.0f, codec_width, codec_height); 429 qm_resolution_->UpdateCodecParameters(8.0f, codec_width, codec_height);
431 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 430 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
432 431
433 // Update rates for a sequence of intervals. 432 // Update rates for a sequence of intervals.
434 int target_rate[] = {10, 10, 10}; 433 int target_rate[] = {10, 10, 10};
435 int encoder_sent_rate[] = {10, 10, 10}; 434 int encoder_sent_rate[] = {10, 10, 10};
436 int incoming_frame_rate[] = {8, 8, 8}; 435 int incoming_frame_rate[] = {8, 8, 8};
437 uint8_t fraction_lost[] = {10, 10, 10}; 436 uint8_t fraction_lost[] = {10, 10, 10};
438 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 437 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
439 fraction_lost, 3); 438 fraction_lost, 3);
440 439
441 // Update content: motion level, and 3 spatial prediction errors. 440 // Update content: motion level, and 3 spatial prediction errors.
442 // Low motion, medium spatial. 441 // Low motion, medium spatial.
443 UpdateQmContentData(kTemporalLow, kSpatialMedium, kSpatialMedium, 442 UpdateQmContentData(kTemporalLow, kSpatialMedium, kSpatialMedium,
444 kSpatialMedium); 443 kSpatialMedium);
445 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 444 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
446 EXPECT_EQ(2, qm_resolution_->ComputeContentClass()); 445 EXPECT_EQ(2, qm_resolution_->ComputeContentClass());
447 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 446 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
448 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 447 EXPECT_TRUE(
449 8.0f)); 448 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 8.0f));
450 } 449 }
451 450
452 // Two stages: spatial down-sample and then back up spatially, 451 // Two stages: spatial down-sample and then back up spatially,
453 // as rate as increased. 452 // as rate as increased.
454 TEST_F(QmSelectTest, 2StageDownSpatialUpSpatial) { 453 TEST_F(QmSelectTest, 2StageDownSpatialUpSpatial) {
455 // Initialize with bitrate, frame rate, native system width/height, and 454 // Initialize with bitrate, frame rate, native system width/height, and
456 // number of temporal layers. 455 // number of temporal layers.
457 InitQmNativeData(50, 30, 640, 480, 1); 456 InitQmNativeData(50, 30, 640, 480, 1);
458 457
459 // Update with encoder frame size. 458 // Update with encoder frame size.
460 uint16_t codec_width = 640; 459 uint16_t codec_width = 640;
461 uint16_t codec_height = 480; 460 uint16_t codec_height = 480;
462 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 461 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
463 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 462 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
464 463
465 // Update rates for a sequence of intervals. 464 // Update rates for a sequence of intervals.
466 int target_rate[] = {50, 50, 50}; 465 int target_rate[] = {50, 50, 50};
467 int encoder_sent_rate[] = {50, 50, 50}; 466 int encoder_sent_rate[] = {50, 50, 50};
468 int incoming_frame_rate[] = {30, 30, 30}; 467 int incoming_frame_rate[] = {30, 30, 30};
469 uint8_t fraction_lost[] = {10, 10, 10}; 468 uint8_t fraction_lost[] = {10, 10, 10};
470 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 469 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
471 fraction_lost, 3); 470 fraction_lost, 3);
472 471
473 // Update content: motion level, and 3 spatial prediction errors. 472 // Update content: motion level, and 3 spatial prediction errors.
474 // High motion, low spatial. 473 // High motion, low spatial.
475 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 474 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
476 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 475 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
477 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 476 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
478 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 477 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
479 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 478 EXPECT_TRUE(
480 30.0f)); 479 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
481 480
482 // Reset and go up in rate: expected to go back up, in 2 stages of 3/4. 481 // Reset and go up in rate: expected to go back up, in 2 stages of 3/4.
483 qm_resolution_->ResetRates(); 482 qm_resolution_->ResetRates();
484 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240); 483 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240);
485 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 484 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
486 // Update rates for a sequence of intervals. 485 // Update rates for a sequence of intervals.
487 int target_rate2[] = {400, 400, 400, 400, 400}; 486 int target_rate2[] = {400, 400, 400, 400, 400};
488 int encoder_sent_rate2[] = {400, 400, 400, 400, 400}; 487 int encoder_sent_rate2[] = {400, 400, 400, 400, 400};
489 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 488 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
490 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 489 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
491 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 490 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
492 fraction_lost2, 5); 491 fraction_lost2, 5);
493 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 492 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
494 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 493 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
495 float scale = (4.0f / 3.0f) / 2.0f; 494 float scale = (4.0f / 3.0f) / 2.0f;
496 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 1.0f, 480, 360, 495 EXPECT_TRUE(
497 30.0f)); 496 IsSelectedActionCorrect(qm_scale_, scale, scale, 1.0f, 480, 360, 30.0f));
498 497
499 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 498 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
500 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 499 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
501 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 500 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
502 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f, 501 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f,
503 640, 480, 30.0f)); 502 640, 480, 30.0f));
504 } 503 }
505 504
506 // Two stages: spatial down-sample and then back up spatially, since encoder 505 // Two stages: spatial down-sample and then back up spatially, since encoder
507 // is under-shooting target even though rate has not increased much. 506 // is under-shooting target even though rate has not increased much.
508 TEST_F(QmSelectTest, 2StageDownSpatialUpSpatialUndershoot) { 507 TEST_F(QmSelectTest, 2StageDownSpatialUpSpatialUndershoot) {
509 // Initialize with bitrate, frame rate, native system width/height, and 508 // Initialize with bitrate, frame rate, native system width/height, and
510 // number of temporal layers. 509 // number of temporal layers.
511 InitQmNativeData(50, 30, 640, 480, 1); 510 InitQmNativeData(50, 30, 640, 480, 1);
512 511
513 // Update with encoder frame size. 512 // Update with encoder frame size.
514 uint16_t codec_width = 640; 513 uint16_t codec_width = 640;
515 uint16_t codec_height = 480; 514 uint16_t codec_height = 480;
516 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 515 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
517 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 516 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
518 517
519 // Update rates for a sequence of intervals. 518 // Update rates for a sequence of intervals.
520 int target_rate[] = {50, 50, 50}; 519 int target_rate[] = {50, 50, 50};
521 int encoder_sent_rate[] = {50, 50, 50}; 520 int encoder_sent_rate[] = {50, 50, 50};
522 int incoming_frame_rate[] = {30, 30, 30}; 521 int incoming_frame_rate[] = {30, 30, 30};
523 uint8_t fraction_lost[] = {10, 10, 10}; 522 uint8_t fraction_lost[] = {10, 10, 10};
524 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 523 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
525 fraction_lost, 3); 524 fraction_lost, 3);
526 525
527 // Update content: motion level, and 3 spatial prediction errors. 526 // Update content: motion level, and 3 spatial prediction errors.
528 // High motion, low spatial. 527 // High motion, low spatial.
529 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 528 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
530 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 529 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
531 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 530 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
532 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 531 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
533 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 532 EXPECT_TRUE(
534 30.0f)); 533 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
535 534
536 // Reset rates and simulate under-shooting scenario.: expect to go back up. 535 // Reset rates and simulate under-shooting scenario.: expect to go back up.
537 // Goes up spatially in two stages for 1/2x1/2 down-sampling. 536 // Goes up spatially in two stages for 1/2x1/2 down-sampling.
538 qm_resolution_->ResetRates(); 537 qm_resolution_->ResetRates();
539 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240); 538 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240);
540 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 539 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
541 // Update rates for a sequence of intervals. 540 // Update rates for a sequence of intervals.
542 int target_rate2[] = {200, 200, 200, 200, 200}; 541 int target_rate2[] = {200, 200, 200, 200, 200};
543 int encoder_sent_rate2[] = {50, 50, 50, 50, 50}; 542 int encoder_sent_rate2[] = {50, 50, 50, 50, 50};
544 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 543 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
545 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 544 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
546 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 545 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
547 fraction_lost2, 5); 546 fraction_lost2, 5);
548 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 547 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
549 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState()); 548 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState());
550 float scale = (4.0f / 3.0f) / 2.0f; 549 float scale = (4.0f / 3.0f) / 2.0f;
551 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 1.0f, 480, 360, 550 EXPECT_TRUE(
552 30.0f)); 551 IsSelectedActionCorrect(qm_scale_, scale, scale, 1.0f, 480, 360, 30.0f));
553 552
554 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 553 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
555 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 554 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
556 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 555 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
557 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f, 556 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f,
558 640, 480, 30.0f)); 557 640, 480, 30.0f));
559 } 558 }
560 559
561 // Two stages: spatial down-sample and then no action to go up, 560 // Two stages: spatial down-sample and then no action to go up,
562 // as encoding rate mis-match is too high. 561 // as encoding rate mis-match is too high.
563 TEST_F(QmSelectTest, 2StageDownSpatialNoActionUp) { 562 TEST_F(QmSelectTest, 2StageDownSpatialNoActionUp) {
564 // Initialize with bitrate, frame rate, native system width/height, and 563 // Initialize with bitrate, frame rate, native system width/height, and
565 // number of temporal layers. 564 // number of temporal layers.
566 InitQmNativeData(50, 30, 640, 480, 1); 565 InitQmNativeData(50, 30, 640, 480, 1);
567 566
568 // Update with encoder frame size. 567 // Update with encoder frame size.
569 uint16_t codec_width = 640; 568 uint16_t codec_width = 640;
570 uint16_t codec_height = 480; 569 uint16_t codec_height = 480;
571 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 570 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
572 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 571 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
573 572
574 // Update rates for a sequence of intervals. 573 // Update rates for a sequence of intervals.
575 int target_rate[] = {50, 50, 50}; 574 int target_rate[] = {50, 50, 50};
576 int encoder_sent_rate[] = {50, 50, 50}; 575 int encoder_sent_rate[] = {50, 50, 50};
577 int incoming_frame_rate[] = {30, 30, 30}; 576 int incoming_frame_rate[] = {30, 30, 30};
578 uint8_t fraction_lost[] = {10, 10, 10}; 577 uint8_t fraction_lost[] = {10, 10, 10};
579 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 578 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
580 fraction_lost, 3); 579 fraction_lost, 3);
581 580
582 // Update content: motion level, and 3 spatial prediction errors. 581 // Update content: motion level, and 3 spatial prediction errors.
583 // High motion, low spatial. 582 // High motion, low spatial.
584 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 583 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
585 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 584 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
586 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 585 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
587 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 586 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
588 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 587 EXPECT_TRUE(
589 30.0f)); 588 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
590 589
591 // Reset and simulate large rate mis-match: expect no action to go back up. 590 // Reset and simulate large rate mis-match: expect no action to go back up.
592 qm_resolution_->ResetRates(); 591 qm_resolution_->ResetRates();
593 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240); 592 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240);
594 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 593 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
595 // Update rates for a sequence of intervals. 594 // Update rates for a sequence of intervals.
596 int target_rate2[] = {400, 400, 400, 400, 400}; 595 int target_rate2[] = {400, 400, 400, 400, 400};
597 int encoder_sent_rate2[] = {1000, 1000, 1000, 1000, 1000}; 596 int encoder_sent_rate2[] = {1000, 1000, 1000, 1000, 1000};
598 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 597 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
599 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 598 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
600 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 599 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
601 fraction_lost2, 5); 600 fraction_lost2, 5);
602 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 601 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
603 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState()); 602 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState());
604 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 320, 240, 603 EXPECT_TRUE(
605 30.0f)); 604 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 320, 240, 30.0f));
606 } 605 }
607 606
608 // Two stages: temporally down-sample and then back up temporally, 607 // Two stages: temporally down-sample and then back up temporally,
609 // as rate as increased. 608 // as rate as increased.
610 TEST_F(QmSelectTest, 2StatgeDownTemporalUpTemporal) { 609 TEST_F(QmSelectTest, 2StatgeDownTemporalUpTemporal) {
611 // Initialize with bitrate, frame rate, native system width/height, and 610 // Initialize with bitrate, frame rate, native system width/height, and
612 // number of temporal layers. 611 // number of temporal layers.
613 InitQmNativeData(50, 30, 640, 480, 1); 612 InitQmNativeData(50, 30, 640, 480, 1);
614 613
615 // Update with encoder frame size. 614 // Update with encoder frame size.
616 uint16_t codec_width = 640; 615 uint16_t codec_width = 640;
617 uint16_t codec_height = 480; 616 uint16_t codec_height = 480;
618 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 617 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
619 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 618 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
620 619
621 // Update rates for a sequence of intervals. 620 // Update rates for a sequence of intervals.
622 int target_rate[] = {50, 50, 50}; 621 int target_rate[] = {50, 50, 50};
623 int encoder_sent_rate[] = {50, 50, 50}; 622 int encoder_sent_rate[] = {50, 50, 50};
624 int incoming_frame_rate[] = {30, 30, 30}; 623 int incoming_frame_rate[] = {30, 30, 30};
625 uint8_t fraction_lost[] = {10, 10, 10}; 624 uint8_t fraction_lost[] = {10, 10, 10};
626 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 625 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
627 fraction_lost, 3); 626 fraction_lost, 3);
628 627
629 // Update content: motion level, and 3 spatial prediction errors. 628 // Update content: motion level, and 3 spatial prediction errors.
630 // Low motion, high spatial. 629 // Low motion, high spatial.
631 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 630 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
632 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 631 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
633 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 632 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
634 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 633 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
635 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 634 EXPECT_TRUE(
636 15.5f)); 635 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 15.5f));
637 636
638 // Reset rates and go up in rate: expect to go back up. 637 // Reset rates and go up in rate: expect to go back up.
639 qm_resolution_->ResetRates(); 638 qm_resolution_->ResetRates();
640 // Update rates for a sequence of intervals. 639 // Update rates for a sequence of intervals.
641 int target_rate2[] = {400, 400, 400, 400, 400}; 640 int target_rate2[] = {400, 400, 400, 400, 400};
642 int encoder_sent_rate2[] = {400, 400, 400, 400, 400}; 641 int encoder_sent_rate2[] = {400, 400, 400, 400, 400};
643 int incoming_frame_rate2[] = {15, 15, 15, 15, 15}; 642 int incoming_frame_rate2[] = {15, 15, 15, 15, 15};
644 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 643 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
645 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 644 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
646 fraction_lost2, 5); 645 fraction_lost2, 5);
647 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 646 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
648 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 647 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
649 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 0.5f, 640, 480, 648 EXPECT_TRUE(
650 30.0f)); 649 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 0.5f, 640, 480, 30.0f));
651 } 650 }
652 651
653 // Two stages: temporal down-sample and then back up temporally, since encoder 652 // Two stages: temporal down-sample and then back up temporally, since encoder
654 // is under-shooting target even though rate has not increased much. 653 // is under-shooting target even though rate has not increased much.
655 TEST_F(QmSelectTest, 2StatgeDownTemporalUpTemporalUndershoot) { 654 TEST_F(QmSelectTest, 2StatgeDownTemporalUpTemporalUndershoot) {
656 // Initialize with bitrate, frame rate, native system width/height, and 655 // Initialize with bitrate, frame rate, native system width/height, and
657 // number of temporal layers. 656 // number of temporal layers.
658 InitQmNativeData(50, 30, 640, 480, 1); 657 InitQmNativeData(50, 30, 640, 480, 1);
659 658
660 // Update with encoder frame size. 659 // Update with encoder frame size.
661 uint16_t codec_width = 640; 660 uint16_t codec_width = 640;
662 uint16_t codec_height = 480; 661 uint16_t codec_height = 480;
663 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 662 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
664 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 663 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
665 664
666 // Update rates for a sequence of intervals. 665 // Update rates for a sequence of intervals.
667 int target_rate[] = {50, 50, 50}; 666 int target_rate[] = {50, 50, 50};
668 int encoder_sent_rate[] = {50, 50, 50}; 667 int encoder_sent_rate[] = {50, 50, 50};
669 int incoming_frame_rate[] = {30, 30, 30}; 668 int incoming_frame_rate[] = {30, 30, 30};
670 uint8_t fraction_lost[] = {10, 10, 10}; 669 uint8_t fraction_lost[] = {10, 10, 10};
671 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 670 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
672 fraction_lost, 3); 671 fraction_lost, 3);
673 672
674 // Update content: motion level, and 3 spatial prediction errors. 673 // Update content: motion level, and 3 spatial prediction errors.
675 // Low motion, high spatial. 674 // Low motion, high spatial.
676 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 675 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
677 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 676 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
678 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 677 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
679 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 678 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
680 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 679 EXPECT_TRUE(
681 15.5f)); 680 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 2.0f, 640, 480, 15.5f));
682 681
683 // Reset rates and simulate under-shooting scenario.: expect to go back up. 682 // Reset rates and simulate under-shooting scenario.: expect to go back up.
684 qm_resolution_->ResetRates(); 683 qm_resolution_->ResetRates();
685 // Update rates for a sequence of intervals. 684 // Update rates for a sequence of intervals.
686 int target_rate2[] = {150, 150, 150, 150, 150}; 685 int target_rate2[] = {150, 150, 150, 150, 150};
687 int encoder_sent_rate2[] = {50, 50, 50, 50, 50}; 686 int encoder_sent_rate2[] = {50, 50, 50, 50, 50};
688 int incoming_frame_rate2[] = {15, 15, 15, 15, 15}; 687 int incoming_frame_rate2[] = {15, 15, 15, 15, 15};
689 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 688 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
690 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 689 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
691 fraction_lost2, 5); 690 fraction_lost2, 5);
692 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 691 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
693 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState()); 692 EXPECT_EQ(kEasyEncoding, qm_resolution_->GetEncoderState());
694 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 0.5f, 640, 480, 693 EXPECT_TRUE(
695 30.0f)); 694 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 0.5f, 640, 480, 30.0f));
696 } 695 }
697 696
698 // Two stages: temporal down-sample and then no action to go up, 697 // Two stages: temporal down-sample and then no action to go up,
699 // as encoding rate mis-match is too high. 698 // as encoding rate mis-match is too high.
700 TEST_F(QmSelectTest, 2StageDownTemporalNoActionUp) { 699 TEST_F(QmSelectTest, 2StageDownTemporalNoActionUp) {
701 // Initialize with bitrate, frame rate, native system width/height, and 700 // Initialize with bitrate, frame rate, native system width/height, and
702 // number of temporal layers. 701 // number of temporal layers.
703 InitQmNativeData(50, 30, 640, 480, 1); 702 InitQmNativeData(50, 30, 640, 480, 1);
704 703
705 // Update with encoder frame size. 704 // Update with encoder frame size.
(...skipping 23 matching lines...) Expand all
729 qm_resolution_->ResetRates(); 728 qm_resolution_->ResetRates();
730 // Update rates for a sequence of intervals. 729 // Update rates for a sequence of intervals.
731 int target_rate2[] = {600, 600, 600, 600, 600}; 730 int target_rate2[] = {600, 600, 600, 600, 600};
732 int encoder_sent_rate2[] = {1000, 1000, 1000, 1000, 1000}; 731 int encoder_sent_rate2[] = {1000, 1000, 1000, 1000, 1000};
733 int incoming_frame_rate2[] = {15, 15, 15, 15, 15}; 732 int incoming_frame_rate2[] = {15, 15, 15, 15, 15};
734 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 733 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
735 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 734 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
736 fraction_lost2, 5); 735 fraction_lost2, 5);
737 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 736 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
738 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState()); 737 EXPECT_EQ(kStressedEncoding, qm_resolution_->GetEncoderState());
739 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 738 EXPECT_TRUE(
740 15.0f)); 739 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 640, 480, 15.0f));
741 } 740 }
742 // 3 stages: spatial down-sample, followed by temporal down-sample, 741 // 3 stages: spatial down-sample, followed by temporal down-sample,
743 // and then go up to full state, as encoding rate has increased. 742 // and then go up to full state, as encoding rate has increased.
744 TEST_F(QmSelectTest, 3StageDownSpatialTemporlaUpSpatialTemporal) { 743 TEST_F(QmSelectTest, 3StageDownSpatialTemporlaUpSpatialTemporal) {
745 // Initialize with bitrate, frame rate, native system width/height, and 744 // Initialize with bitrate, frame rate, native system width/height, and
746 // number of temporal layers. 745 // number of temporal layers.
747 InitQmNativeData(80, 30, 640, 480, 1); 746 InitQmNativeData(80, 30, 640, 480, 1);
748 747
749 // Update with encoder frame size. 748 // Update with encoder frame size.
750 uint16_t codec_width = 640; 749 uint16_t codec_width = 640;
751 uint16_t codec_height = 480; 750 uint16_t codec_height = 480;
752 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 751 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
753 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 752 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
754 753
755 // Update rates for a sequence of intervals. 754 // Update rates for a sequence of intervals.
756 int target_rate[] = {80, 80, 80}; 755 int target_rate[] = {80, 80, 80};
757 int encoder_sent_rate[] = {80, 80, 80}; 756 int encoder_sent_rate[] = {80, 80, 80};
758 int incoming_frame_rate[] = {30, 30, 30}; 757 int incoming_frame_rate[] = {30, 30, 30};
759 uint8_t fraction_lost[] = {10, 10, 10}; 758 uint8_t fraction_lost[] = {10, 10, 10};
760 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 759 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
761 fraction_lost, 3); 760 fraction_lost, 3);
762 761
763 // Update content: motion level, and 3 spatial prediction errors. 762 // Update content: motion level, and 3 spatial prediction errors.
764 // High motion, low spatial. 763 // High motion, low spatial.
765 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 764 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
766 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 765 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
767 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 766 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
768 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 767 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
769 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 768 EXPECT_TRUE(
770 30.0f)); 769 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
771 770
772 // Change content data: expect temporal down-sample. 771 // Change content data: expect temporal down-sample.
773 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240); 772 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240);
774 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 773 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
775 774
776 // Reset rates and go lower in rate. 775 // Reset rates and go lower in rate.
777 qm_resolution_->ResetRates(); 776 qm_resolution_->ResetRates();
778 int target_rate2[] = {40, 40, 40, 40, 40}; 777 int target_rate2[] = {40, 40, 40, 40, 40};
779 int encoder_sent_rate2[] = {40, 40, 40, 40, 40}; 778 int encoder_sent_rate2[] = {40, 40, 40, 40, 40};
780 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 779 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
781 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 780 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
782 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 781 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
783 fraction_lost2, 5); 782 fraction_lost2, 5);
784 783
785 // Update content: motion level, and 3 spatial prediction errors. 784 // Update content: motion level, and 3 spatial prediction errors.
786 // Low motion, high spatial. 785 // Low motion, high spatial.
787 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 786 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
788 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 787 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
789 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 788 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
790 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 789 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
791 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 790 EXPECT_TRUE(
792 20.5f)); 791 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 20.5f));
793 792
794 // Reset rates and go high up in rate: expect to go back up both spatial 793 // Reset rates and go high up in rate: expect to go back up both spatial
795 // and temporally. The 1/2x1/2 spatial is undone in two stages. 794 // and temporally. The 1/2x1/2 spatial is undone in two stages.
796 qm_resolution_->ResetRates(); 795 qm_resolution_->ResetRates();
797 // Update rates for a sequence of intervals. 796 // Update rates for a sequence of intervals.
798 int target_rate3[] = {1000, 1000, 1000, 1000, 1000}; 797 int target_rate3[] = {1000, 1000, 1000, 1000, 1000};
799 int encoder_sent_rate3[] = {1000, 1000, 1000, 1000, 1000}; 798 int encoder_sent_rate3[] = {1000, 1000, 1000, 1000, 1000};
800 int incoming_frame_rate3[] = {20, 20, 20, 20, 20}; 799 int incoming_frame_rate3[] = {20, 20, 20, 20, 20};
801 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10}; 800 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10};
802 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3, 801 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3,
803 fraction_lost3, 5); 802 fraction_lost3, 5);
804 803
805 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 804 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
806 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 805 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
807 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 806 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
808 float scale = (4.0f / 3.0f) / 2.0f; 807 float scale = (4.0f / 3.0f) / 2.0f;
809 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 2.0f / 3.0f, 808 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 2.0f / 3.0f, 480,
810 480, 360, 30.0f)); 809 360, 30.0f));
811 810
812 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 811 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
813 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 812 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
814 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 813 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
815 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f, 814 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f,
816 640, 480, 30.0f)); 815 640, 480, 30.0f));
817 } 816 }
818 817
819 // No down-sampling below some total amount. 818 // No down-sampling below some total amount.
820 TEST_F(QmSelectTest, NoActionTooMuchDownSampling) { 819 TEST_F(QmSelectTest, NoActionTooMuchDownSampling) {
(...skipping 14 matching lines...) Expand all
835 uint8_t fraction_lost[] = {10, 10, 10}; 834 uint8_t fraction_lost[] = {10, 10, 10};
836 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 835 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
837 fraction_lost, 3); 836 fraction_lost, 3);
838 837
839 // Update content: motion level, and 3 spatial prediction errors. 838 // Update content: motion level, and 3 spatial prediction errors.
840 // High motion, low spatial. 839 // High motion, low spatial.
841 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 840 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
842 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 841 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
843 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 842 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
844 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 843 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
845 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 640, 360, 844 EXPECT_TRUE(
846 30.0f)); 845 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 640, 360, 30.0f));
847 846
848 // Reset and lower rates to get another spatial action (3/4x3/4). 847 // Reset and lower rates to get another spatial action (3/4x3/4).
849 // Lower the frame rate for spatial to be selected again. 848 // Lower the frame rate for spatial to be selected again.
850 qm_resolution_->ResetRates(); 849 qm_resolution_->ResetRates();
851 qm_resolution_->UpdateCodecParameters(10.0f, 640, 360); 850 qm_resolution_->UpdateCodecParameters(10.0f, 640, 360);
852 EXPECT_EQ(4, qm_resolution_->GetImageType(640, 360)); 851 EXPECT_EQ(4, qm_resolution_->GetImageType(640, 360));
853 // Update rates for a sequence of intervals. 852 // Update rates for a sequence of intervals.
854 int target_rate2[] = {70, 70, 70, 70, 70}; 853 int target_rate2[] = {70, 70, 70, 70, 70};
855 int encoder_sent_rate2[] = {70, 70, 70, 70, 70}; 854 int encoder_sent_rate2[] = {70, 70, 70, 70, 70};
856 int incoming_frame_rate2[] = {10, 10, 10, 10, 10}; 855 int incoming_frame_rate2[] = {10, 10, 10, 10, 10};
857 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 856 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
858 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 857 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
859 fraction_lost2, 5); 858 fraction_lost2, 5);
860 859
861 // Update content: motion level, and 3 spatial prediction errors. 860 // Update content: motion level, and 3 spatial prediction errors.
862 // High motion, medium spatial. 861 // High motion, medium spatial.
863 UpdateQmContentData(kTemporalHigh, kSpatialMedium, kSpatialMedium, 862 UpdateQmContentData(kTemporalHigh, kSpatialMedium, kSpatialMedium,
864 kSpatialMedium); 863 kSpatialMedium);
865 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 864 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
866 EXPECT_EQ(5, qm_resolution_->ComputeContentClass()); 865 EXPECT_EQ(5, qm_resolution_->ComputeContentClass());
867 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 866 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
868 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 867 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
869 1.0f, 480, 270, 10.0f)); 868 480, 270, 10.0f));
870 869
871 // Reset and go to very low rate: no action should be taken, 870 // Reset and go to very low rate: no action should be taken,
872 // we went down too much already. 871 // we went down too much already.
873 qm_resolution_->ResetRates(); 872 qm_resolution_->ResetRates();
874 qm_resolution_->UpdateCodecParameters(10.0f, 480, 270); 873 qm_resolution_->UpdateCodecParameters(10.0f, 480, 270);
875 EXPECT_EQ(3, qm_resolution_->GetImageType(480, 270)); 874 EXPECT_EQ(3, qm_resolution_->GetImageType(480, 270));
876 // Update rates for a sequence of intervals. 875 // Update rates for a sequence of intervals.
877 int target_rate3[] = {10, 10, 10, 10, 10}; 876 int target_rate3[] = {10, 10, 10, 10, 10};
878 int encoder_sent_rate3[] = {10, 10, 10, 10, 10}; 877 int encoder_sent_rate3[] = {10, 10, 10, 10, 10};
879 int incoming_frame_rate3[] = {10, 10, 10, 10, 10}; 878 int incoming_frame_rate3[] = {10, 10, 10, 10, 10};
880 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10}; 879 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10};
881 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3, 880 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3,
882 fraction_lost3, 5); 881 fraction_lost3, 5);
883 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 882 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
884 EXPECT_EQ(5, qm_resolution_->ComputeContentClass()); 883 EXPECT_EQ(5, qm_resolution_->ComputeContentClass());
885 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 884 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
886 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 480, 270, 885 EXPECT_TRUE(
887 10.0f)); 886 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.0f, 480, 270, 10.0f));
888 } 887 }
889 888
890 // Multiple down-sampling stages and then undo all of them. 889 // Multiple down-sampling stages and then undo all of them.
891 // Spatial down-sample 3/4x3/4, followed by temporal down-sample 2/3, 890 // Spatial down-sample 3/4x3/4, followed by temporal down-sample 2/3,
892 // followed by spatial 3/4x3/4. Then go up to full state, 891 // followed by spatial 3/4x3/4. Then go up to full state,
893 // as encoding rate has increased. 892 // as encoding rate has increased.
894 TEST_F(QmSelectTest, MultipleStagesCheckActionHistory1) { 893 TEST_F(QmSelectTest, MultipleStagesCheckActionHistory1) {
895 // Initialize with bitrate, frame rate, native system width/height, and 894 // Initialize with bitrate, frame rate, native system width/height, and
896 // number of temporal layers. 895 // number of temporal layers.
897 InitQmNativeData(150, 30, 640, 480, 1); 896 InitQmNativeData(150, 30, 640, 480, 1);
(...skipping 12 matching lines...) Expand all
910 uint8_t fraction_lost[] = {10, 10, 10}; 909 uint8_t fraction_lost[] = {10, 10, 10};
911 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 910 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
912 fraction_lost, 3); 911 fraction_lost, 3);
913 912
914 // Update content: motion level, and 3 spatial prediction errors. 913 // Update content: motion level, and 3 spatial prediction errors.
915 // Medium motion, low spatial. 914 // Medium motion, low spatial.
916 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 915 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
917 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 916 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
918 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 917 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
919 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 918 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
920 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 919 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
921 1.0f, 480, 360, 30.0f)); 920 480, 360, 30.0f));
922 // Go down 2/3 temporal. 921 // Go down 2/3 temporal.
923 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 922 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
924 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 923 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
925 qm_resolution_->ResetRates(); 924 qm_resolution_->ResetRates();
926 int target_rate2[] = {100, 100, 100, 100, 100}; 925 int target_rate2[] = {100, 100, 100, 100, 100};
927 int encoder_sent_rate2[] = {100, 100, 100, 100, 100}; 926 int encoder_sent_rate2[] = {100, 100, 100, 100, 100};
928 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 927 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
929 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 928 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
930 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 929 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
931 fraction_lost2, 5); 930 fraction_lost2, 5);
932 931
933 // Update content: motion level, and 3 spatial prediction errors. 932 // Update content: motion level, and 3 spatial prediction errors.
934 // Low motion, high spatial. 933 // Low motion, high spatial.
935 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 934 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
936 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 935 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
937 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 936 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
938 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 937 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
939 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 480, 360, 938 EXPECT_TRUE(
940 20.5f)); 939 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 480, 360, 20.5f));
941 940
942 // Go down 3/4x3/4 spatial: 941 // Go down 3/4x3/4 spatial:
943 qm_resolution_->UpdateCodecParameters(20.0f, 480, 360); 942 qm_resolution_->UpdateCodecParameters(20.0f, 480, 360);
944 qm_resolution_->ResetRates(); 943 qm_resolution_->ResetRates();
945 int target_rate3[] = {80, 80, 80, 80, 80}; 944 int target_rate3[] = {80, 80, 80, 80, 80};
946 int encoder_sent_rate3[] = {80, 80, 80, 80, 80}; 945 int encoder_sent_rate3[] = {80, 80, 80, 80, 80};
947 int incoming_frame_rate3[] = {20, 20, 20, 20, 20}; 946 int incoming_frame_rate3[] = {20, 20, 20, 20, 20};
948 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10}; 947 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10};
949 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3, 948 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3,
950 fraction_lost3, 5); 949 fraction_lost3, 5);
951 950
952 // Update content: motion level, and 3 spatial prediction errors. 951 // Update content: motion level, and 3 spatial prediction errors.
953 // High motion, low spatial. 952 // High motion, low spatial.
954 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow); 953 UpdateQmContentData(kTemporalHigh, kSpatialLow, kSpatialLow, kSpatialLow);
955 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 954 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
956 EXPECT_EQ(3, qm_resolution_->ComputeContentClass()); 955 EXPECT_EQ(3, qm_resolution_->ComputeContentClass());
957 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 956 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
958 // The two spatial actions of 3/4x3/4 are converted to 1/2x1/2, 957 // The two spatial actions of 3/4x3/4 are converted to 1/2x1/2,
959 // so scale factor is 2.0. 958 // so scale factor is 2.0.
960 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 959 EXPECT_TRUE(
961 20.0f)); 960 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 20.0f));
962 961
963 // Reset rates and go high up in rate: expect to go up: 962 // Reset rates and go high up in rate: expect to go up:
964 // 1/2x1x2 spatial and 1/2 temporally. 963 // 1/2x1x2 spatial and 1/2 temporally.
965 964
966 // Go up 1/2x1/2 spatially and 1/2 temporally. Spatial is done in 2 stages. 965 // Go up 1/2x1/2 spatially and 1/2 temporally. Spatial is done in 2 stages.
967 qm_resolution_->UpdateCodecParameters(15.0f, 320, 240); 966 qm_resolution_->UpdateCodecParameters(15.0f, 320, 240);
968 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 967 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
969 qm_resolution_->ResetRates(); 968 qm_resolution_->ResetRates();
970 // Update rates for a sequence of intervals. 969 // Update rates for a sequence of intervals.
971 int target_rate4[] = {1000, 1000, 1000, 1000, 1000}; 970 int target_rate4[] = {1000, 1000, 1000, 1000, 1000};
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 uint8_t fraction_lost[] = {10, 10, 10}; 1010 uint8_t fraction_lost[] = {10, 10, 10};
1012 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 1011 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
1013 fraction_lost, 3); 1012 fraction_lost, 3);
1014 1013
1015 // Update content: motion level, and 3 spatial prediction errors. 1014 // Update content: motion level, and 3 spatial prediction errors.
1016 // Medium motion, low spatial. 1015 // Medium motion, low spatial.
1017 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 1016 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
1018 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1017 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1019 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 1018 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
1020 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1019 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1021 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 1020 EXPECT_TRUE(
1022 30.0f)); 1021 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
1023 1022
1024 // Go down 2/3 temporal. 1023 // Go down 2/3 temporal.
1025 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240); 1024 qm_resolution_->UpdateCodecParameters(30.0f, 320, 240);
1026 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240)); 1025 EXPECT_EQ(2, qm_resolution_->GetImageType(320, 240));
1027 qm_resolution_->ResetRates(); 1026 qm_resolution_->ResetRates();
1028 int target_rate2[] = {40, 40, 40, 40, 40}; 1027 int target_rate2[] = {40, 40, 40, 40, 40};
1029 int encoder_sent_rate2[] = {40, 40, 40, 40, 40}; 1028 int encoder_sent_rate2[] = {40, 40, 40, 40, 40};
1030 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 1029 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
1031 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 1030 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
1032 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 1031 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
1033 fraction_lost2, 5); 1032 fraction_lost2, 5);
1034 1033
1035 // Update content: motion level, and 3 spatial prediction errors. 1034 // Update content: motion level, and 3 spatial prediction errors.
1036 // Medium motion, high spatial. 1035 // Medium motion, high spatial.
1037 UpdateQmContentData(kTemporalMedium, kSpatialHigh, kSpatialHigh, 1036 UpdateQmContentData(kTemporalMedium, kSpatialHigh, kSpatialHigh,
1038 kSpatialHigh); 1037 kSpatialHigh);
1039 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1038 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1040 EXPECT_EQ(7, qm_resolution_->ComputeContentClass()); 1039 EXPECT_EQ(7, qm_resolution_->ComputeContentClass());
1041 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1040 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1042 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 1041 EXPECT_TRUE(
1043 20.5f)); 1042 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 20.5f));
1044 1043
1045 // Go up 2/3 temporally. 1044 // Go up 2/3 temporally.
1046 qm_resolution_->UpdateCodecParameters(20.0f, 320, 240); 1045 qm_resolution_->UpdateCodecParameters(20.0f, 320, 240);
1047 qm_resolution_->ResetRates(); 1046 qm_resolution_->ResetRates();
1048 // Update rates for a sequence of intervals. 1047 // Update rates for a sequence of intervals.
1049 int target_rate3[] = {150, 150, 150, 150, 150}; 1048 int target_rate3[] = {150, 150, 150, 150, 150};
1050 int encoder_sent_rate3[] = {150, 150, 150, 150, 150}; 1049 int encoder_sent_rate3[] = {150, 150, 150, 150, 150};
1051 int incoming_frame_rate3[] = {20, 20, 20, 20, 20}; 1050 int incoming_frame_rate3[] = {20, 20, 20, 20, 20};
1052 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10}; 1051 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10};
1053 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3, 1052 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3,
(...skipping 15 matching lines...) Expand all
1069 uint8_t fraction_lost4[] = {10, 10, 10, 10, 10}; 1068 uint8_t fraction_lost4[] = {10, 10, 10, 10, 10};
1070 UpdateQmRateData(target_rate4, encoder_sent_rate4, incoming_frame_rate4, 1069 UpdateQmRateData(target_rate4, encoder_sent_rate4, incoming_frame_rate4,
1071 fraction_lost4, 5); 1070 fraction_lost4, 5);
1072 1071
1073 // Update content: motion level, and 3 spatial prediction errors. 1072 // Update content: motion level, and 3 spatial prediction errors.
1074 // Low motion, high spatial. 1073 // Low motion, high spatial.
1075 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 1074 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
1076 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1075 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1077 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 1076 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
1078 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1077 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1079 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 1078 EXPECT_TRUE(
1080 20.5f)); 1079 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 320, 240, 20.5f));
1081 1080
1082 // Go up spatial and temporal. Spatial undoing is done in 2 stages. 1081 // Go up spatial and temporal. Spatial undoing is done in 2 stages.
1083 qm_resolution_->UpdateCodecParameters(20.5f, 320, 240); 1082 qm_resolution_->UpdateCodecParameters(20.5f, 320, 240);
1084 qm_resolution_->ResetRates(); 1083 qm_resolution_->ResetRates();
1085 // Update rates for a sequence of intervals. 1084 // Update rates for a sequence of intervals.
1086 int target_rate5[] = {1000, 1000, 1000, 1000, 1000}; 1085 int target_rate5[] = {1000, 1000, 1000, 1000, 1000};
1087 int encoder_sent_rate5[] = {1000, 1000, 1000, 1000, 1000}; 1086 int encoder_sent_rate5[] = {1000, 1000, 1000, 1000, 1000};
1088 int incoming_frame_rate5[] = {20, 20, 20, 20, 20}; 1087 int incoming_frame_rate5[] = {20, 20, 20, 20, 20};
1089 uint8_t fraction_lost5[] = {10, 10, 10, 10, 10}; 1088 uint8_t fraction_lost5[] = {10, 10, 10, 10, 10};
1090 UpdateQmRateData(target_rate5, encoder_sent_rate5, incoming_frame_rate5, 1089 UpdateQmRateData(target_rate5, encoder_sent_rate5, incoming_frame_rate5,
1091 fraction_lost5, 5); 1090 fraction_lost5, 5);
1092 1091
1093 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1092 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1094 float scale = (4.0f / 3.0f) / 2.0f; 1093 float scale = (4.0f / 3.0f) / 2.0f;
1095 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 2.0f / 3.0f, 1094 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, scale, scale, 2.0f / 3.0f, 480,
1096 480, 360, 30.0f)); 1095 360, 30.0f));
1097 1096
1098 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 1097 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
1099 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 1098 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
1100 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1099 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1101 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f, 1100 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f,
1102 640, 480, 30.0f)); 1101 640, 480, 30.0f));
1103 } 1102 }
1104 1103
1105 // Multiple down-sampling and up-sample stages, with partial undoing. 1104 // Multiple down-sampling and up-sample stages, with partial undoing.
1106 // Spatial down-sample 3/4x3/4, followed by temporal down-sample 2/3, 1105 // Spatial down-sample 3/4x3/4, followed by temporal down-sample 2/3,
(...skipping 17 matching lines...) Expand all
1124 uint8_t fraction_lost[] = {10, 10, 10}; 1123 uint8_t fraction_lost[] = {10, 10, 10};
1125 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 1124 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
1126 fraction_lost, 3); 1125 fraction_lost, 3);
1127 1126
1128 // Update content: motion level, and 3 spatial prediction errors. 1127 // Update content: motion level, and 3 spatial prediction errors.
1129 // Medium motion, low spatial. 1128 // Medium motion, low spatial.
1130 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 1129 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
1131 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1130 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1132 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 1131 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
1133 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1132 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1134 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1133 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
1135 1.0f, 480, 360, 30.0f)); 1134 480, 360, 30.0f));
1136 1135
1137 // Go down 2/3 temporal. 1136 // Go down 2/3 temporal.
1138 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 1137 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
1139 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 1138 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
1140 qm_resolution_->ResetRates(); 1139 qm_resolution_->ResetRates();
1141 int target_rate2[] = {100, 100, 100, 100, 100}; 1140 int target_rate2[] = {100, 100, 100, 100, 100};
1142 int encoder_sent_rate2[] = {100, 100, 100, 100, 100}; 1141 int encoder_sent_rate2[] = {100, 100, 100, 100, 100};
1143 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 1142 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
1144 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 1143 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
1145 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 1144 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
1146 fraction_lost2, 5); 1145 fraction_lost2, 5);
1147 1146
1148 // Update content: motion level, and 3 spatial prediction errors. 1147 // Update content: motion level, and 3 spatial prediction errors.
1149 // Low motion, high spatial. 1148 // Low motion, high spatial.
1150 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh); 1149 UpdateQmContentData(kTemporalLow, kSpatialHigh, kSpatialHigh, kSpatialHigh);
1151 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1150 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1152 EXPECT_EQ(1, qm_resolution_->ComputeContentClass()); 1151 EXPECT_EQ(1, qm_resolution_->ComputeContentClass());
1153 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1152 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1154 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 480, 360, 1153 EXPECT_TRUE(
1155 20.5f)); 1154 IsSelectedActionCorrect(qm_scale_, 1.0f, 1.0f, 1.5f, 480, 360, 20.5f));
1156 1155
1157 // Go up 2/3 temporal. 1156 // Go up 2/3 temporal.
1158 qm_resolution_->UpdateCodecParameters(20.5f, 480, 360); 1157 qm_resolution_->UpdateCodecParameters(20.5f, 480, 360);
1159 qm_resolution_->ResetRates(); 1158 qm_resolution_->ResetRates();
1160 // Update rates for a sequence of intervals. 1159 // Update rates for a sequence of intervals.
1161 int target_rate3[] = {250, 250, 250, 250, 250}; 1160 int target_rate3[] = {250, 250, 250, 250, 250};
1162 int encoder_sent_rate3[] = {250, 250, 250, 250, 250}; 1161 int encoder_sent_rate3[] = {250, 250, 250, 250, 250};
1163 int incoming_frame_rate3[] = {20, 20, 20, 20, 120}; 1162 int incoming_frame_rate3[] = {20, 20, 20, 20, 120};
1164 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10}; 1163 uint8_t fraction_lost3[] = {10, 10, 10, 10, 10};
1165 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3, 1164 UpdateQmRateData(target_rate3, encoder_sent_rate3, incoming_frame_rate3,
(...skipping 11 matching lines...) Expand all
1177 qm_resolution_->ResetRates(); 1176 qm_resolution_->ResetRates();
1178 int target_rate4[] = {500, 500, 500, 500, 500}; 1177 int target_rate4[] = {500, 500, 500, 500, 500};
1179 int encoder_sent_rate4[] = {500, 500, 500, 500, 500}; 1178 int encoder_sent_rate4[] = {500, 500, 500, 500, 500};
1180 int incoming_frame_rate4[] = {30, 30, 30, 30, 30}; 1179 int incoming_frame_rate4[] = {30, 30, 30, 30, 30};
1181 uint8_t fraction_lost4[] = {30, 30, 30, 30, 30}; 1180 uint8_t fraction_lost4[] = {30, 30, 30, 30, 30};
1182 UpdateQmRateData(target_rate4, encoder_sent_rate4, incoming_frame_rate4, 1181 UpdateQmRateData(target_rate4, encoder_sent_rate4, incoming_frame_rate4,
1183 fraction_lost4, 5); 1182 fraction_lost4, 5);
1184 1183
1185 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1184 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1186 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1185 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1187 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1186 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 3.0f / 4.0f, 3.0f / 4.0f, 1.0f,
1188 1.0f, 640, 480, 30.0f)); 1187 640, 480, 30.0f));
1189 } 1188 }
1190 1189
1191 // Two stages of 3/4x3/4 converted to one stage of 1/2x1/2. 1190 // Two stages of 3/4x3/4 converted to one stage of 1/2x1/2.
1192 TEST_F(QmSelectTest, ConvertThreeQuartersToOneHalf) { 1191 TEST_F(QmSelectTest, ConvertThreeQuartersToOneHalf) {
1193 // Initialize with bitrate, frame rate, native system width/height, and 1192 // Initialize with bitrate, frame rate, native system width/height, and
1194 // number of temporal layers. 1193 // number of temporal layers.
1195 InitQmNativeData(150, 30, 640, 480, 1); 1194 InitQmNativeData(150, 30, 640, 480, 1);
1196 1195
1197 // Update with encoder frame size. 1196 // Update with encoder frame size.
1198 uint16_t codec_width = 640; 1197 uint16_t codec_width = 640;
1199 uint16_t codec_height = 480; 1198 uint16_t codec_height = 480;
1200 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height); 1199 qm_resolution_->UpdateCodecParameters(30.0f, codec_width, codec_height);
1201 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height)); 1200 EXPECT_EQ(5, qm_resolution_->GetImageType(codec_width, codec_height));
1202 1201
1203 // Go down 3/4x3/4 spatial. 1202 // Go down 3/4x3/4 spatial.
1204 // Update rates for a sequence of intervals. 1203 // Update rates for a sequence of intervals.
1205 int target_rate[] = {150, 150, 150}; 1204 int target_rate[] = {150, 150, 150};
1206 int encoder_sent_rate[] = {150, 150, 150}; 1205 int encoder_sent_rate[] = {150, 150, 150};
1207 int incoming_frame_rate[] = {30, 30, 30}; 1206 int incoming_frame_rate[] = {30, 30, 30};
1208 uint8_t fraction_lost[] = {10, 10, 10}; 1207 uint8_t fraction_lost[] = {10, 10, 10};
1209 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate, 1208 UpdateQmRateData(target_rate, encoder_sent_rate, incoming_frame_rate,
1210 fraction_lost, 3); 1209 fraction_lost, 3);
1211 1210
1212 // Update content: motion level, and 3 spatial prediction errors. 1211 // Update content: motion level, and 3 spatial prediction errors.
1213 // Medium motion, low spatial. 1212 // Medium motion, low spatial.
1214 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 1213 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
1215 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1214 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1216 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 1215 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
1217 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1216 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1218 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1217 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 4.0f / 3.0f, 4.0f / 3.0f, 1.0f,
1219 1.0f, 480, 360, 30.0f)); 1218 480, 360, 30.0f));
1220 1219
1221 // Set rates to go down another 3/4 spatial. Should be converted ton 1/2. 1220 // Set rates to go down another 3/4 spatial. Should be converted ton 1/2.
1222 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360); 1221 qm_resolution_->UpdateCodecParameters(30.0f, 480, 360);
1223 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360)); 1222 EXPECT_EQ(4, qm_resolution_->GetImageType(480, 360));
1224 qm_resolution_->ResetRates(); 1223 qm_resolution_->ResetRates();
1225 int target_rate2[] = {100, 100, 100, 100, 100}; 1224 int target_rate2[] = {100, 100, 100, 100, 100};
1226 int encoder_sent_rate2[] = {100, 100, 100, 100, 100}; 1225 int encoder_sent_rate2[] = {100, 100, 100, 100, 100};
1227 int incoming_frame_rate2[] = {30, 30, 30, 30, 30}; 1226 int incoming_frame_rate2[] = {30, 30, 30, 30, 30};
1228 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10}; 1227 uint8_t fraction_lost2[] = {10, 10, 10, 10, 10};
1229 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2, 1228 UpdateQmRateData(target_rate2, encoder_sent_rate2, incoming_frame_rate2,
1230 fraction_lost2, 5); 1229 fraction_lost2, 5);
1231 1230
1232 // Update content: motion level, and 3 spatial prediction errors. 1231 // Update content: motion level, and 3 spatial prediction errors.
1233 // Medium motion, low spatial. 1232 // Medium motion, low spatial.
1234 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow); 1233 UpdateQmContentData(kTemporalMedium, kSpatialLow, kSpatialLow, kSpatialLow);
1235 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_)); 1234 EXPECT_EQ(0, qm_resolution_->SelectResolution(&qm_scale_));
1236 EXPECT_EQ(6, qm_resolution_->ComputeContentClass()); 1235 EXPECT_EQ(6, qm_resolution_->ComputeContentClass());
1237 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState()); 1236 EXPECT_EQ(kStableEncoding, qm_resolution_->GetEncoderState());
1238 EXPECT_TRUE(IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 1237 EXPECT_TRUE(
1239 30.0f)); 1238 IsSelectedActionCorrect(qm_scale_, 2.0f, 2.0f, 1.0f, 320, 240, 30.0f));
1240 } 1239 }
1241 1240
1242 void QmSelectTest::InitQmNativeData(float initial_bit_rate, 1241 void QmSelectTest::InitQmNativeData(float initial_bit_rate,
1243 int user_frame_rate, 1242 int user_frame_rate,
1244 int native_width, 1243 int native_width,
1245 int native_height, 1244 int native_height,
1246 int num_layers) { 1245 int num_layers) {
1247 EXPECT_EQ(0, qm_resolution_->Initialize(initial_bit_rate, 1246 EXPECT_EQ(
1248 user_frame_rate, 1247 0, qm_resolution_->Initialize(initial_bit_rate, user_frame_rate,
1249 native_width, 1248 native_width, native_height, num_layers));
1250 native_height,
1251 num_layers));
1252 } 1249 }
1253 1250
1254 void QmSelectTest::UpdateQmContentData(float motion_metric, 1251 void QmSelectTest::UpdateQmContentData(float motion_metric,
1255 float spatial_metric, 1252 float spatial_metric,
1256 float spatial_metric_horiz, 1253 float spatial_metric_horiz,
1257 float spatial_metric_vert) { 1254 float spatial_metric_vert) {
1258 content_metrics_->motion_magnitude = motion_metric; 1255 content_metrics_->motion_magnitude = motion_metric;
1259 content_metrics_->spatial_pred_err = spatial_metric; 1256 content_metrics_->spatial_pred_err = spatial_metric;
1260 content_metrics_->spatial_pred_err_h = spatial_metric_horiz; 1257 content_metrics_->spatial_pred_err_h = spatial_metric_horiz;
1261 content_metrics_->spatial_pred_err_v = spatial_metric_vert; 1258 content_metrics_->spatial_pred_err_v = spatial_metric_vert;
(...skipping 12 matching lines...) Expand all
1274 void QmSelectTest::UpdateQmRateData(int* target_rate, 1271 void QmSelectTest::UpdateQmRateData(int* target_rate,
1275 int* encoder_sent_rate, 1272 int* encoder_sent_rate,
1276 int* incoming_frame_rate, 1273 int* incoming_frame_rate,
1277 uint8_t* fraction_lost, 1274 uint8_t* fraction_lost,
1278 int num_updates) { 1275 int num_updates) {
1279 for (int i = 0; i < num_updates; ++i) { 1276 for (int i = 0; i < num_updates; ++i) {
1280 float target_rate_update = target_rate[i]; 1277 float target_rate_update = target_rate[i];
1281 float encoder_sent_rate_update = encoder_sent_rate[i]; 1278 float encoder_sent_rate_update = encoder_sent_rate[i];
1282 float incoming_frame_rate_update = incoming_frame_rate[i]; 1279 float incoming_frame_rate_update = incoming_frame_rate[i];
1283 uint8_t fraction_lost_update = fraction_lost[i]; 1280 uint8_t fraction_lost_update = fraction_lost[i];
1284 qm_resolution_->UpdateRates(target_rate_update, 1281 qm_resolution_->UpdateRates(target_rate_update, encoder_sent_rate_update,
1285 encoder_sent_rate_update,
1286 incoming_frame_rate_update, 1282 incoming_frame_rate_update,
1287 fraction_lost_update); 1283 fraction_lost_update);
1288 } 1284 }
1289 } 1285 }
1290 1286
1291 // Check is the selected action from the QmResolution class is the same 1287 // Check is the selected action from the QmResolution class is the same
1292 // as the expected scales from |fac_width|, |fac_height|, |fac_temp|. 1288 // as the expected scales from |fac_width|, |fac_height|, |fac_temp|.
1293 bool QmSelectTest::IsSelectedActionCorrect(VCMResolutionScale* qm_scale, 1289 bool QmSelectTest::IsSelectedActionCorrect(VCMResolutionScale* qm_scale,
1294 float fac_width, 1290 float fac_width,
1295 float fac_height, 1291 float fac_height,
1296 float fac_temp, 1292 float fac_temp,
1297 uint16_t new_width, 1293 uint16_t new_width,
1298 uint16_t new_height, 1294 uint16_t new_height,
1299 float new_frame_rate) { 1295 float new_frame_rate) {
1300 if (qm_scale->spatial_width_fact == fac_width && 1296 if (qm_scale->spatial_width_fact == fac_width &&
1301 qm_scale->spatial_height_fact == fac_height && 1297 qm_scale->spatial_height_fact == fac_height &&
1302 qm_scale->temporal_fact == fac_temp && 1298 qm_scale->temporal_fact == fac_temp &&
1303 qm_scale->codec_width == new_width && 1299 qm_scale->codec_width == new_width &&
1304 qm_scale->codec_height == new_height && 1300 qm_scale->codec_height == new_height &&
1305 qm_scale->frame_rate == new_frame_rate) { 1301 qm_scale->frame_rate == new_frame_rate) {
1306 return true; 1302 return true;
1307 } else { 1303 } else {
1308 return false; 1304 return false;
1309 } 1305 }
1310 } 1306 }
1311 } // namespace webrtc 1307 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/qm_select_data.h ('k') | webrtc/modules/video_coding/receiver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698