OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2010 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 10 matching lines...) Expand all Loading... |
21 #include "webrtc/media/base/testutils.h" | 21 #include "webrtc/media/base/testutils.h" |
22 #include "webrtc/media/base/videoadapter.h" | 22 #include "webrtc/media/base/videoadapter.h" |
23 | 23 |
24 namespace cricket { | 24 namespace cricket { |
25 | 25 |
26 class VideoAdapterTest : public testing::Test { | 26 class VideoAdapterTest : public testing::Test { |
27 public: | 27 public: |
28 virtual void SetUp() { | 28 virtual void SetUp() { |
29 capturer_.reset(new FakeVideoCapturer); | 29 capturer_.reset(new FakeVideoCapturer); |
30 capture_format_ = capturer_->GetSupportedFormats()->at(0); | 30 capture_format_ = capturer_->GetSupportedFormats()->at(0); |
31 capture_format_.interval = VideoFormat::FpsToInterval(50); | 31 capture_format_.interval = VideoFormat::FpsToInterval(30); |
32 adapter_.SetExpectedInputFrameInterval(capture_format_.interval); | |
33 | 32 |
34 listener_.reset(new VideoCapturerListener(&adapter_)); | 33 listener_.reset(new VideoCapturerListener(&adapter_)); |
35 capturer_->SignalFrameCaptured.connect( | 34 capturer_->SignalFrameCaptured.connect( |
36 listener_.get(), &VideoCapturerListener::OnFrameCaptured); | 35 listener_.get(), &VideoCapturerListener::OnFrameCaptured); |
37 } | 36 } |
38 | 37 |
39 virtual void TearDown() { | 38 virtual void TearDown() { |
40 // Explicitly disconnect the VideoCapturer before to avoid data races | 39 // Explicitly disconnect the VideoCapturer before to avoid data races |
41 // (frames delivered to VideoCapturerListener while it's being destructed). | 40 // (frames delivered to VideoCapturerListener while it's being destructed). |
42 capturer_->SignalFrameCaptured.disconnect_all(); | 41 capturer_->SignalFrameCaptured.disconnect_all(); |
(...skipping 23 matching lines...) Expand all Loading... |
66 void OnFrameCaptured(VideoCapturer* capturer, | 65 void OnFrameCaptured(VideoCapturer* capturer, |
67 const CapturedFrame* captured_frame) { | 66 const CapturedFrame* captured_frame) { |
68 rtc::CritScope lock(&crit_); | 67 rtc::CritScope lock(&crit_); |
69 const int in_width = captured_frame->width; | 68 const int in_width = captured_frame->width; |
70 const int in_height = abs(captured_frame->height); | 69 const int in_height = abs(captured_frame->height); |
71 int cropped_width; | 70 int cropped_width; |
72 int cropped_height; | 71 int cropped_height; |
73 int out_width; | 72 int out_width; |
74 int out_height; | 73 int out_height; |
75 video_adapter_->AdaptFrameResolution(in_width, in_height, | 74 video_adapter_->AdaptFrameResolution(in_width, in_height, |
| 75 captured_frame->time_stamp, |
76 &cropped_width, &cropped_height, | 76 &cropped_width, &cropped_height, |
77 &out_width, &out_height); | 77 &out_width, &out_height); |
78 if (out_width != 0 && out_height != 0) { | 78 if (out_width != 0 && out_height != 0) { |
79 cropped_width_ = cropped_width; | 79 cropped_width_ = cropped_width; |
80 cropped_height_ = cropped_height; | 80 cropped_height_ = cropped_height; |
81 out_width_ = out_width; | 81 out_width_ = out_width; |
82 out_height_ = out_height; | 82 out_height_ = out_height; |
83 last_adapt_was_no_op_ = | 83 last_adapt_was_no_op_ = |
84 (in_width == cropped_width && in_height == cropped_height && | 84 (in_width == cropped_width && in_height == cropped_height && |
85 in_width == out_width && in_height == out_height); | 85 in_width == out_width && in_height == out_height); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 // Verify no crash and that frames aren't dropped. | 163 // Verify no crash and that frames aren't dropped. |
164 VideoCapturerListener::Stats stats = listener_->GetStats(); | 164 VideoCapturerListener::Stats stats = listener_->GetStats(); |
165 EXPECT_GE(stats.captured_frames, 10); | 165 EXPECT_GE(stats.captured_frames, 10); |
166 EXPECT_EQ(0, stats.dropped_frames); | 166 EXPECT_EQ(0, stats.dropped_frames); |
167 VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height, | 167 VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height, |
168 capture_format_.width, capture_format_.height); | 168 capture_format_.width, capture_format_.height); |
169 } | 169 } |
170 | 170 |
171 // Adapt the frame rate to be half of the capture rate at the beginning. Expect | 171 // Adapt the frame rate to be half of the capture rate at the beginning. Expect |
172 // the number of dropped frames to be half of the number the captured frames. | 172 // the number of dropped frames to be half of the number the captured frames. |
173 TEST_F(VideoAdapterTest, AdaptFramerate) { | 173 TEST_F(VideoAdapterTest, AdaptFramerateToHalf) { |
174 VideoFormat request_format = capture_format_; | 174 VideoFormat request_format = capture_format_; |
175 request_format.interval *= 2; | 175 request_format.interval *= 2; |
176 adapter_.OnOutputFormatRequest(request_format); | 176 adapter_.OnOutputFormatRequest(request_format); |
177 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); | 177 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); |
| 178 |
| 179 // Capture 10 frames and verify that every other frame is dropped. The first |
| 180 // frame should not be dropped. |
| 181 capturer_->CaptureFrame(); |
| 182 EXPECT_GE(listener_->GetStats().captured_frames, 1); |
| 183 EXPECT_EQ(0, listener_->GetStats().dropped_frames); |
| 184 |
| 185 capturer_->CaptureFrame(); |
| 186 EXPECT_GE(listener_->GetStats().captured_frames, 2); |
| 187 EXPECT_EQ(0, listener_->GetStats().dropped_frames); |
| 188 |
| 189 capturer_->CaptureFrame(); |
| 190 EXPECT_GE(listener_->GetStats().captured_frames, 3); |
| 191 EXPECT_EQ(1, listener_->GetStats().dropped_frames); |
| 192 |
| 193 capturer_->CaptureFrame(); |
| 194 EXPECT_GE(listener_->GetStats().captured_frames, 4); |
| 195 EXPECT_EQ(1, listener_->GetStats().dropped_frames); |
| 196 |
| 197 capturer_->CaptureFrame(); |
| 198 EXPECT_GE(listener_->GetStats().captured_frames, 5); |
| 199 EXPECT_EQ(2, listener_->GetStats().dropped_frames); |
| 200 |
| 201 capturer_->CaptureFrame(); |
| 202 EXPECT_GE(listener_->GetStats().captured_frames, 6); |
| 203 EXPECT_EQ(2, listener_->GetStats().dropped_frames); |
| 204 |
| 205 capturer_->CaptureFrame(); |
| 206 EXPECT_GE(listener_->GetStats().captured_frames, 7); |
| 207 EXPECT_EQ(3, listener_->GetStats().dropped_frames); |
| 208 |
| 209 capturer_->CaptureFrame(); |
| 210 EXPECT_GE(listener_->GetStats().captured_frames, 8); |
| 211 EXPECT_EQ(3, listener_->GetStats().dropped_frames); |
| 212 |
| 213 capturer_->CaptureFrame(); |
| 214 EXPECT_GE(listener_->GetStats().captured_frames, 9); |
| 215 EXPECT_EQ(4, listener_->GetStats().dropped_frames); |
| 216 |
| 217 capturer_->CaptureFrame(); |
| 218 EXPECT_GE(listener_->GetStats().captured_frames, 10); |
| 219 EXPECT_EQ(4, listener_->GetStats().dropped_frames); |
| 220 } |
| 221 |
| 222 // Adapt the frame rate to be two thirds of the capture rate at the beginning. |
| 223 // Expect the number of dropped frames to be one thirds of the number the |
| 224 // captured frames. |
| 225 TEST_F(VideoAdapterTest, AdaptFramerateToTwoThirds) { |
| 226 VideoFormat request_format = capture_format_; |
| 227 request_format.interval = request_format.interval * 3 / 2; |
| 228 adapter_.OnOutputFormatRequest(request_format); |
| 229 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); |
| 230 |
| 231 // Capture 10 frames and verify that every third frame is dropped. The first |
| 232 // frame should not be dropped. |
| 233 capturer_->CaptureFrame(); |
| 234 EXPECT_GE(listener_->GetStats().captured_frames, 1); |
| 235 EXPECT_EQ(0, listener_->GetStats().dropped_frames); |
| 236 |
| 237 capturer_->CaptureFrame(); |
| 238 EXPECT_GE(listener_->GetStats().captured_frames, 2); |
| 239 EXPECT_EQ(0, listener_->GetStats().dropped_frames); |
| 240 |
| 241 capturer_->CaptureFrame(); |
| 242 EXPECT_GE(listener_->GetStats().captured_frames, 3); |
| 243 EXPECT_EQ(1, listener_->GetStats().dropped_frames); |
| 244 |
| 245 capturer_->CaptureFrame(); |
| 246 EXPECT_GE(listener_->GetStats().captured_frames, 4); |
| 247 EXPECT_EQ(1, listener_->GetStats().dropped_frames); |
| 248 |
| 249 capturer_->CaptureFrame(); |
| 250 EXPECT_GE(listener_->GetStats().captured_frames, 5); |
| 251 EXPECT_EQ(1, listener_->GetStats().dropped_frames); |
| 252 |
| 253 capturer_->CaptureFrame(); |
| 254 EXPECT_GE(listener_->GetStats().captured_frames, 6); |
| 255 EXPECT_EQ(2, listener_->GetStats().dropped_frames); |
| 256 |
| 257 capturer_->CaptureFrame(); |
| 258 EXPECT_GE(listener_->GetStats().captured_frames, 7); |
| 259 EXPECT_EQ(2, listener_->GetStats().dropped_frames); |
| 260 |
| 261 capturer_->CaptureFrame(); |
| 262 EXPECT_GE(listener_->GetStats().captured_frames, 8); |
| 263 EXPECT_EQ(2, listener_->GetStats().dropped_frames); |
| 264 |
| 265 capturer_->CaptureFrame(); |
| 266 EXPECT_GE(listener_->GetStats().captured_frames, 9); |
| 267 EXPECT_EQ(3, listener_->GetStats().dropped_frames); |
| 268 |
| 269 capturer_->CaptureFrame(); |
| 270 EXPECT_GE(listener_->GetStats().captured_frames, 10); |
| 271 EXPECT_EQ(3, listener_->GetStats().dropped_frames); |
| 272 } |
| 273 |
| 274 // Request frame rate twice as high as captured frame rate. Expect no frame |
| 275 // drop. |
| 276 TEST_F(VideoAdapterTest, AdaptFramerateHighLimit) { |
| 277 VideoFormat request_format = capture_format_; |
| 278 request_format.interval /= 2; |
| 279 adapter_.OnOutputFormatRequest(request_format); |
| 280 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); |
178 for (int i = 0; i < 10; ++i) | 281 for (int i = 0; i < 10; ++i) |
179 capturer_->CaptureFrame(); | 282 capturer_->CaptureFrame(); |
180 | 283 |
181 // Verify frame drop and no resolution change. | 284 // Verify no frame drop. |
182 VideoCapturerListener::Stats stats = listener_->GetStats(); | 285 EXPECT_EQ(0, listener_->GetStats().dropped_frames); |
183 EXPECT_GE(stats.captured_frames, 10); | |
184 EXPECT_EQ(stats.captured_frames / 2, stats.dropped_frames); | |
185 VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height, | |
186 capture_format_.width, capture_format_.height); | |
187 } | 286 } |
188 | 287 |
189 // Adapt the frame rate to be half of the capture rate at the beginning. Expect | 288 // After the first timestamp, add a big offset to the timestamps. Expect that |
190 // the number of dropped frames to be half of the number the captured frames. | 289 // the adapter is conservative and resets to the new offset and does not drop |
191 TEST_F(VideoAdapterTest, AdaptFramerateVariable) { | 290 // any frame. |
192 VideoFormat request_format = capture_format_; | 291 TEST_F(VideoAdapterTest, AdaptFramerateTimestampOffset) { |
193 request_format.interval = request_format.interval * 3 / 2; | 292 const int64_t capture_interval = VideoFormat::FpsToInterval(30); |
194 adapter_.OnOutputFormatRequest(request_format); | 293 adapter_.OnOutputFormatRequest( |
195 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); | 294 VideoFormat(640, 480, capture_interval, cricket::FOURCC_ANY)); |
196 for (int i = 0; i < 30; ++i) | |
197 capturer_->CaptureFrame(); | |
198 | 295 |
199 // Verify frame drop and no resolution change. | 296 const int64_t first_timestamp = 0; |
200 VideoCapturerListener::Stats stats = listener_->GetStats(); | 297 adapter_.AdaptFrameResolution(640, 480, first_timestamp, |
201 EXPECT_GE(stats.captured_frames, 30); | 298 &cropped_width_, &cropped_height_, |
202 // Verify 2 / 3 kept (20) and 1 / 3 dropped (10). | 299 &out_width_, &out_height_); |
203 EXPECT_EQ(stats.captured_frames * 1 / 3, stats.dropped_frames); | 300 EXPECT_GT(out_width_, 0); |
204 VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height, | 301 EXPECT_GT(out_height_, 0); |
205 capture_format_.width, capture_format_.height); | 302 |
| 303 const int64_t big_offset = -987654321LL * 1000; |
| 304 const int64_t second_timestamp = big_offset; |
| 305 adapter_.AdaptFrameResolution(640, 480, second_timestamp, |
| 306 &cropped_width_, &cropped_height_, |
| 307 &out_width_, &out_height_); |
| 308 EXPECT_GT(out_width_, 0); |
| 309 EXPECT_GT(out_height_, 0); |
| 310 |
| 311 const int64_t third_timestamp = big_offset + capture_interval; |
| 312 adapter_.AdaptFrameResolution(640, 480, third_timestamp, |
| 313 &cropped_width_, &cropped_height_, |
| 314 &out_width_, &out_height_); |
| 315 EXPECT_GT(out_width_, 0); |
| 316 EXPECT_GT(out_height_, 0); |
| 317 } |
| 318 |
| 319 // Request 30 fps and send 30 fps with jitter. Expect that no frame is dropped. |
| 320 TEST_F(VideoAdapterTest, AdaptFramerateTimestampJitter) { |
| 321 const int64_t capture_interval = VideoFormat::FpsToInterval(30); |
| 322 adapter_.OnOutputFormatRequest( |
| 323 VideoFormat(640, 480, capture_interval, cricket::FOURCC_ANY)); |
| 324 |
| 325 adapter_.AdaptFrameResolution(640, 480, capture_interval * 0 / 10, |
| 326 &cropped_width_, &cropped_height_, |
| 327 &out_width_, &out_height_); |
| 328 EXPECT_GT(out_width_, 0); |
| 329 EXPECT_GT(out_height_, 0); |
| 330 |
| 331 adapter_.AdaptFrameResolution(640, 480, capture_interval * 10 / 10 - 1, |
| 332 &cropped_width_, &cropped_height_, |
| 333 &out_width_, &out_height_); |
| 334 EXPECT_GT(out_width_, 0); |
| 335 EXPECT_GT(out_height_, 0); |
| 336 |
| 337 adapter_.AdaptFrameResolution(640, 480, capture_interval * 25 / 10, |
| 338 &cropped_width_, &cropped_height_, |
| 339 &out_width_, &out_height_); |
| 340 EXPECT_GT(out_width_, 0); |
| 341 EXPECT_GT(out_height_, 0); |
| 342 |
| 343 adapter_.AdaptFrameResolution(640, 480, capture_interval * 30 / 10, |
| 344 &cropped_width_, &cropped_height_, |
| 345 &out_width_, &out_height_); |
| 346 EXPECT_GT(out_width_, 0); |
| 347 EXPECT_GT(out_height_, 0); |
| 348 |
| 349 adapter_.AdaptFrameResolution(640, 480, capture_interval * 35 / 10, |
| 350 &cropped_width_, &cropped_height_, |
| 351 &out_width_, &out_height_); |
| 352 EXPECT_GT(out_width_, 0); |
| 353 EXPECT_GT(out_height_, 0); |
| 354 |
| 355 adapter_.AdaptFrameResolution(640, 480, capture_interval * 50 / 10, |
| 356 &cropped_width_, &cropped_height_, |
| 357 &out_width_, &out_height_); |
| 358 EXPECT_GT(out_width_, 0); |
| 359 EXPECT_GT(out_height_, 0); |
206 } | 360 } |
207 | 361 |
208 // Adapt the frame rate to be half of the capture rate after capturing no less | 362 // Adapt the frame rate to be half of the capture rate after capturing no less |
209 // than 10 frames. Expect no frame dropped before adaptation and frame dropped | 363 // than 10 frames. Expect no frame dropped before adaptation and frame dropped |
210 // after adaptation. | 364 // after adaptation. |
211 TEST_F(VideoAdapterTest, AdaptFramerateOntheFly) { | 365 TEST_F(VideoAdapterTest, AdaptFramerateOntheFly) { |
212 VideoFormat request_format = capture_format_; | 366 VideoFormat request_format = capture_format_; |
213 adapter_.OnOutputFormatRequest(request_format); | 367 adapter_.OnOutputFormatRequest(request_format); |
214 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); | 368 EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_)); |
215 for (int i = 0; i < 10; ++i) | 369 for (int i = 0; i < 10; ++i) |
(...skipping 14 matching lines...) Expand all Loading... |
230 } | 384 } |
231 | 385 |
232 // Set a very high output pixel resolution. Expect no cropping or resolution | 386 // Set a very high output pixel resolution. Expect no cropping or resolution |
233 // change. | 387 // change. |
234 TEST_F(VideoAdapterTest, AdaptFrameResolutionHighLimit) { | 388 TEST_F(VideoAdapterTest, AdaptFrameResolutionHighLimit) { |
235 VideoFormat output_format = capture_format_; | 389 VideoFormat output_format = capture_format_; |
236 output_format.width *= 10; | 390 output_format.width *= 10; |
237 output_format.height *= 10; | 391 output_format.height *= 10; |
238 adapter_.OnOutputFormatRequest(output_format); | 392 adapter_.OnOutputFormatRequest(output_format); |
239 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, | 393 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, |
240 &cropped_width_, &cropped_height_, | 394 0, &cropped_width_, &cropped_height_, |
241 &out_width_, &out_height_); | 395 &out_width_, &out_height_); |
242 EXPECT_EQ(capture_format_.width, cropped_width_); | 396 EXPECT_EQ(capture_format_.width, cropped_width_); |
243 EXPECT_EQ(capture_format_.height, cropped_height_); | 397 EXPECT_EQ(capture_format_.height, cropped_height_); |
244 EXPECT_EQ(capture_format_.width, out_width_); | 398 EXPECT_EQ(capture_format_.width, out_width_); |
245 EXPECT_EQ(capture_format_.height, out_height_); | 399 EXPECT_EQ(capture_format_.height, out_height_); |
246 } | 400 } |
247 | 401 |
248 // Adapt the frame resolution to be the same as capture resolution. Expect no | 402 // Adapt the frame resolution to be the same as capture resolution. Expect no |
249 // cropping or resolution change. | 403 // cropping or resolution change. |
250 TEST_F(VideoAdapterTest, AdaptFrameResolutionIdentical) { | 404 TEST_F(VideoAdapterTest, AdaptFrameResolutionIdentical) { |
251 adapter_.OnOutputFormatRequest(capture_format_); | 405 adapter_.OnOutputFormatRequest(capture_format_); |
252 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, | 406 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, |
253 &cropped_width_, &cropped_height_, | 407 0, &cropped_width_, &cropped_height_, |
254 &out_width_, &out_height_); | 408 &out_width_, &out_height_); |
255 EXPECT_EQ(capture_format_.width, cropped_width_); | 409 EXPECT_EQ(capture_format_.width, cropped_width_); |
256 EXPECT_EQ(capture_format_.height, cropped_height_); | 410 EXPECT_EQ(capture_format_.height, cropped_height_); |
257 EXPECT_EQ(capture_format_.width, out_width_); | 411 EXPECT_EQ(capture_format_.width, out_width_); |
258 EXPECT_EQ(capture_format_.height, out_height_); | 412 EXPECT_EQ(capture_format_.height, out_height_); |
259 } | 413 } |
260 | 414 |
261 // Adapt the frame resolution to be a quarter of the capture resolution. Expect | 415 // Adapt the frame resolution to be a quarter of the capture resolution. Expect |
262 // no cropping, but a resolution change. | 416 // no cropping, but a resolution change. |
263 TEST_F(VideoAdapterTest, AdaptFrameResolutionQuarter) { | 417 TEST_F(VideoAdapterTest, AdaptFrameResolutionQuarter) { |
264 VideoFormat request_format = capture_format_; | 418 VideoFormat request_format = capture_format_; |
265 request_format.width /= 2; | 419 request_format.width /= 2; |
266 request_format.height /= 2; | 420 request_format.height /= 2; |
267 adapter_.OnOutputFormatRequest(request_format); | 421 adapter_.OnOutputFormatRequest(request_format); |
268 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, | 422 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, |
269 &cropped_width_, &cropped_height_, | 423 0, &cropped_width_, &cropped_height_, |
270 &out_width_, &out_height_); | 424 &out_width_, &out_height_); |
271 EXPECT_EQ(capture_format_.width, cropped_width_); | 425 EXPECT_EQ(capture_format_.width, cropped_width_); |
272 EXPECT_EQ(capture_format_.height, cropped_height_); | 426 EXPECT_EQ(capture_format_.height, cropped_height_); |
273 EXPECT_EQ(request_format.width, out_width_); | 427 EXPECT_EQ(request_format.width, out_width_); |
274 EXPECT_EQ(request_format.height, out_height_); | 428 EXPECT_EQ(request_format.height, out_height_); |
275 } | 429 } |
276 | 430 |
277 // Adapt the pixel resolution to 0. Expect frame drop. | 431 // Adapt the pixel resolution to 0. Expect frame drop. |
278 TEST_F(VideoAdapterTest, AdaptFrameResolutionDrop) { | 432 TEST_F(VideoAdapterTest, AdaptFrameResolutionDrop) { |
279 VideoFormat output_format = capture_format_; | 433 VideoFormat output_format = capture_format_; |
280 output_format.width = 0; | 434 output_format.width = 0; |
281 output_format.height = 0; | 435 output_format.height = 0; |
282 adapter_.OnOutputFormatRequest(output_format); | 436 adapter_.OnOutputFormatRequest(output_format); |
283 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, | 437 adapter_.AdaptFrameResolution(capture_format_.width, capture_format_.height, |
284 &cropped_width_, &cropped_height_, | 438 0, &cropped_width_, &cropped_height_, |
285 &out_width_, &out_height_); | 439 &out_width_, &out_height_); |
286 EXPECT_EQ(0, out_width_); | 440 EXPECT_EQ(0, out_width_); |
287 EXPECT_EQ(0, out_height_); | 441 EXPECT_EQ(0, out_height_); |
288 } | 442 } |
289 | 443 |
290 // Adapt the frame resolution to be a quarter of the capture resolution at the | 444 // Adapt the frame resolution to be a quarter of the capture resolution at the |
291 // beginning. Expect no cropping but a resolution change. | 445 // beginning. Expect no cropping but a resolution change. |
292 TEST_F(VideoAdapterTest, AdaptResolution) { | 446 TEST_F(VideoAdapterTest, AdaptResolution) { |
293 VideoFormat request_format = capture_format_; | 447 VideoFormat request_format = capture_format_; |
294 request_format.width /= 2; | 448 request_format.width /= 2; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 for (int i = 0; i < 10; ++i) | 495 for (int i = 0; i < 10; ++i) |
342 capturer_->CaptureFrame(); | 496 capturer_->CaptureFrame(); |
343 | 497 |
344 // Verify all frames are dropped. | 498 // Verify all frames are dropped. |
345 VideoCapturerListener::Stats stats = listener_->GetStats(); | 499 VideoCapturerListener::Stats stats = listener_->GetStats(); |
346 EXPECT_GE(stats.captured_frames, 10); | 500 EXPECT_GE(stats.captured_frames, 10); |
347 EXPECT_EQ(stats.captured_frames, stats.dropped_frames); | 501 EXPECT_EQ(stats.captured_frames, stats.dropped_frames); |
348 } | 502 } |
349 | 503 |
350 TEST_F(VideoAdapterTest, TestOnOutputFormatRequest) { | 504 TEST_F(VideoAdapterTest, TestOnOutputFormatRequest) { |
351 VideoFormat format(640, 400, VideoFormat::FpsToInterval(30), 0); | 505 VideoFormat format(640, 400, 0, 0); |
352 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | 506 adapter_.AdaptFrameResolution(640, 400, 0, |
353 adapter_.AdaptFrameResolution(640, 400, | |
354 &cropped_width_, &cropped_height_, | 507 &cropped_width_, &cropped_height_, |
355 &out_width_, &out_height_); | 508 &out_width_, &out_height_); |
356 EXPECT_EQ(640, cropped_width_); | 509 EXPECT_EQ(640, cropped_width_); |
357 EXPECT_EQ(400, cropped_height_); | 510 EXPECT_EQ(400, cropped_height_); |
358 EXPECT_EQ(640, out_width_); | 511 EXPECT_EQ(640, out_width_); |
359 EXPECT_EQ(400, out_height_); | 512 EXPECT_EQ(400, out_height_); |
360 | 513 |
361 // Format request 640x400. | 514 // Format request 640x400. |
362 format.height = 400; | 515 format.height = 400; |
363 adapter_.OnOutputFormatRequest(format); | 516 adapter_.OnOutputFormatRequest(format); |
364 adapter_.AdaptFrameResolution(640, 400, | 517 adapter_.AdaptFrameResolution(640, 400, 0, |
365 &cropped_width_, &cropped_height_, | 518 &cropped_width_, &cropped_height_, |
366 &out_width_, &out_height_); | 519 &out_width_, &out_height_); |
367 EXPECT_EQ(640, cropped_width_); | 520 EXPECT_EQ(640, cropped_width_); |
368 EXPECT_EQ(400, cropped_height_); | 521 EXPECT_EQ(400, cropped_height_); |
369 EXPECT_EQ(640, out_width_); | 522 EXPECT_EQ(640, out_width_); |
370 EXPECT_EQ(400, out_height_); | 523 EXPECT_EQ(400, out_height_); |
371 | 524 |
372 // Request 1280x720, higher than input, but aspect 16:9. Expect cropping but | 525 // Request 1280x720, higher than input, but aspect 16:9. Expect cropping but |
373 // no scaling. | 526 // no scaling. |
374 format.width = 1280; | 527 format.width = 1280; |
375 format.height = 720; | 528 format.height = 720; |
376 adapter_.OnOutputFormatRequest(format); | 529 adapter_.OnOutputFormatRequest(format); |
377 adapter_.AdaptFrameResolution(640, 400, | 530 adapter_.AdaptFrameResolution(640, 400, 0, |
378 &cropped_width_, &cropped_height_, | 531 &cropped_width_, &cropped_height_, |
379 &out_width_, &out_height_); | 532 &out_width_, &out_height_); |
380 EXPECT_EQ(640, cropped_width_); | 533 EXPECT_EQ(640, cropped_width_); |
381 EXPECT_EQ(360, cropped_height_); | 534 EXPECT_EQ(360, cropped_height_); |
382 EXPECT_EQ(640, out_width_); | 535 EXPECT_EQ(640, out_width_); |
383 EXPECT_EQ(360, out_height_); | 536 EXPECT_EQ(360, out_height_); |
384 | 537 |
385 // Request 0x0. | 538 // Request 0x0. |
386 format.width = 0; | 539 format.width = 0; |
387 format.height = 0; | 540 format.height = 0; |
388 adapter_.OnOutputFormatRequest(format); | 541 adapter_.OnOutputFormatRequest(format); |
389 adapter_.AdaptFrameResolution(640, 400, | 542 adapter_.AdaptFrameResolution(640, 400, 0, |
390 &cropped_width_, &cropped_height_, | 543 &cropped_width_, &cropped_height_, |
391 &out_width_, &out_height_); | 544 &out_width_, &out_height_); |
392 EXPECT_EQ(0, out_width_); | 545 EXPECT_EQ(0, out_width_); |
393 EXPECT_EQ(0, out_height_); | 546 EXPECT_EQ(0, out_height_); |
394 | 547 |
395 // Request 320x200. Expect scaling, but no cropping. | 548 // Request 320x200. Expect scaling, but no cropping. |
396 format.width = 320; | 549 format.width = 320; |
397 format.height = 200; | 550 format.height = 200; |
398 adapter_.OnOutputFormatRequest(format); | 551 adapter_.OnOutputFormatRequest(format); |
399 adapter_.AdaptFrameResolution(640, 400, | 552 adapter_.AdaptFrameResolution(640, 400, 0, |
400 &cropped_width_, &cropped_height_, | 553 &cropped_width_, &cropped_height_, |
401 &out_width_, &out_height_); | 554 &out_width_, &out_height_); |
402 EXPECT_EQ(640, cropped_width_); | 555 EXPECT_EQ(640, cropped_width_); |
403 EXPECT_EQ(400, cropped_height_); | 556 EXPECT_EQ(400, cropped_height_); |
404 EXPECT_EQ(320, out_width_); | 557 EXPECT_EQ(320, out_width_); |
405 EXPECT_EQ(200, out_height_); | 558 EXPECT_EQ(200, out_height_); |
406 | 559 |
407 // Request resolution close to 2/3 scale. Expect adapt down. Scaling to 2/3 | 560 // Request resolution close to 2/3 scale. Expect adapt down. Scaling to 2/3 |
408 // is not optimized and not allowed, therefore 1/2 scaling will be used | 561 // is not optimized and not allowed, therefore 1/2 scaling will be used |
409 // instead. | 562 // instead. |
410 format.width = 424; | 563 format.width = 424; |
411 format.height = 265; | 564 format.height = 265; |
412 adapter_.OnOutputFormatRequest(format); | 565 adapter_.OnOutputFormatRequest(format); |
413 adapter_.AdaptFrameResolution(640, 400, | 566 adapter_.AdaptFrameResolution(640, 400, 0, |
414 &cropped_width_, &cropped_height_, | 567 &cropped_width_, &cropped_height_, |
415 &out_width_, &out_height_); | 568 &out_width_, &out_height_); |
416 EXPECT_EQ(640, cropped_width_); | 569 EXPECT_EQ(640, cropped_width_); |
417 EXPECT_EQ(400, cropped_height_); | 570 EXPECT_EQ(400, cropped_height_); |
418 EXPECT_EQ(320, out_width_); | 571 EXPECT_EQ(320, out_width_); |
419 EXPECT_EQ(200, out_height_); | 572 EXPECT_EQ(200, out_height_); |
420 | 573 |
421 // Request resolution of 3 / 8. Expect adapt down. | 574 // Request resolution of 3 / 8. Expect adapt down. |
422 format.width = 640 * 3 / 8; | 575 format.width = 640 * 3 / 8; |
423 format.height = 400 * 3 / 8; | 576 format.height = 400 * 3 / 8; |
424 adapter_.OnOutputFormatRequest(format); | 577 adapter_.OnOutputFormatRequest(format); |
425 adapter_.AdaptFrameResolution(640, 400, | 578 adapter_.AdaptFrameResolution(640, 400, 0, |
426 &cropped_width_, &cropped_height_, | 579 &cropped_width_, &cropped_height_, |
427 &out_width_, &out_height_); | 580 &out_width_, &out_height_); |
428 EXPECT_EQ(640, cropped_width_); | 581 EXPECT_EQ(640, cropped_width_); |
429 EXPECT_EQ(400, cropped_height_); | 582 EXPECT_EQ(400, cropped_height_); |
430 EXPECT_EQ(640 * 3 / 8, out_width_); | 583 EXPECT_EQ(640 * 3 / 8, out_width_); |
431 EXPECT_EQ(400 * 3 / 8, out_height_); | 584 EXPECT_EQ(400 * 3 / 8, out_height_); |
432 | 585 |
433 // Switch back up. Expect adapt. | 586 // Switch back up. Expect adapt. |
434 format.width = 320; | 587 format.width = 320; |
435 format.height = 200; | 588 format.height = 200; |
436 adapter_.OnOutputFormatRequest(format); | 589 adapter_.OnOutputFormatRequest(format); |
437 adapter_.AdaptFrameResolution(640, 400, | 590 adapter_.AdaptFrameResolution(640, 400, 0, |
438 &cropped_width_, &cropped_height_, | 591 &cropped_width_, &cropped_height_, |
439 &out_width_, &out_height_); | 592 &out_width_, &out_height_); |
440 EXPECT_EQ(640, cropped_width_); | 593 EXPECT_EQ(640, cropped_width_); |
441 EXPECT_EQ(400, cropped_height_); | 594 EXPECT_EQ(400, cropped_height_); |
442 EXPECT_EQ(320, out_width_); | 595 EXPECT_EQ(320, out_width_); |
443 EXPECT_EQ(200, out_height_); | 596 EXPECT_EQ(200, out_height_); |
444 | 597 |
445 // Format request 480x300. | 598 // Format request 480x300. |
446 format.width = 480; | 599 format.width = 480; |
447 format.height = 300; | 600 format.height = 300; |
448 adapter_.OnOutputFormatRequest(format); | 601 adapter_.OnOutputFormatRequest(format); |
449 adapter_.AdaptFrameResolution(640, 400, | 602 adapter_.AdaptFrameResolution(640, 400, 0, |
450 &cropped_width_, &cropped_height_, | 603 &cropped_width_, &cropped_height_, |
451 &out_width_, &out_height_); | 604 &out_width_, &out_height_); |
452 EXPECT_EQ(640, cropped_width_); | 605 EXPECT_EQ(640, cropped_width_); |
453 EXPECT_EQ(400, cropped_height_); | 606 EXPECT_EQ(400, cropped_height_); |
454 EXPECT_EQ(480, out_width_); | 607 EXPECT_EQ(480, out_width_); |
455 EXPECT_EQ(300, out_height_); | 608 EXPECT_EQ(300, out_height_); |
456 } | 609 } |
457 | 610 |
458 TEST_F(VideoAdapterTest, TestViewRequestPlusCameraSwitch) { | 611 TEST_F(VideoAdapterTest, TestViewRequestPlusCameraSwitch) { |
459 // Start at HD. | 612 // Start at HD. |
460 VideoFormat format(1280, 720, VideoFormat::FpsToInterval(30), 0); | 613 VideoFormat format(1280, 720, 0, 0); |
461 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | 614 adapter_.AdaptFrameResolution(1280, 720, 0, |
462 adapter_.AdaptFrameResolution(1280, 720, | |
463 &cropped_width_, &cropped_height_, | 615 &cropped_width_, &cropped_height_, |
464 &out_width_, &out_height_); | 616 &out_width_, &out_height_); |
465 EXPECT_EQ(1280, cropped_width_); | 617 EXPECT_EQ(1280, cropped_width_); |
466 EXPECT_EQ(720, cropped_height_); | 618 EXPECT_EQ(720, cropped_height_); |
467 EXPECT_EQ(1280, out_width_); | 619 EXPECT_EQ(1280, out_width_); |
468 EXPECT_EQ(720, out_height_); | 620 EXPECT_EQ(720, out_height_); |
469 | 621 |
470 // Format request for VGA. | 622 // Format request for VGA. |
471 format.width = 640; | 623 format.width = 640; |
472 format.height = 360; | 624 format.height = 360; |
473 adapter_.OnOutputFormatRequest(format); | 625 adapter_.OnOutputFormatRequest(format); |
474 adapter_.AdaptFrameResolution(1280, 720, | 626 adapter_.AdaptFrameResolution(1280, 720, 0, |
475 &cropped_width_, &cropped_height_, | 627 &cropped_width_, &cropped_height_, |
476 &out_width_, &out_height_); | 628 &out_width_, &out_height_); |
477 EXPECT_EQ(1280, cropped_width_); | 629 EXPECT_EQ(1280, cropped_width_); |
478 EXPECT_EQ(720, cropped_height_); | 630 EXPECT_EQ(720, cropped_height_); |
479 EXPECT_EQ(640, out_width_); | 631 EXPECT_EQ(640, out_width_); |
480 EXPECT_EQ(360, out_height_); | 632 EXPECT_EQ(360, out_height_); |
481 | 633 |
482 // Now, the camera reopens at VGA. | 634 // Now, the camera reopens at VGA. |
483 // Both the frame and the output format should be 640x360. | 635 // Both the frame and the output format should be 640x360. |
484 adapter_.AdaptFrameResolution(640, 360, | 636 adapter_.AdaptFrameResolution(640, 360, 0, |
485 &cropped_width_, &cropped_height_, | 637 &cropped_width_, &cropped_height_, |
486 &out_width_, &out_height_); | 638 &out_width_, &out_height_); |
487 EXPECT_EQ(640, cropped_width_); | 639 EXPECT_EQ(640, cropped_width_); |
488 EXPECT_EQ(360, cropped_height_); | 640 EXPECT_EQ(360, cropped_height_); |
489 EXPECT_EQ(640, out_width_); | 641 EXPECT_EQ(640, out_width_); |
490 EXPECT_EQ(360, out_height_); | 642 EXPECT_EQ(360, out_height_); |
491 | 643 |
492 // And another view request comes in for 640x360, which should have no | 644 // And another view request comes in for 640x360, which should have no |
493 // real impact. | 645 // real impact. |
494 adapter_.OnOutputFormatRequest(format); | 646 adapter_.OnOutputFormatRequest(format); |
495 adapter_.AdaptFrameResolution(640, 360, | 647 adapter_.AdaptFrameResolution(640, 360, 0, |
496 &cropped_width_, &cropped_height_, | 648 &cropped_width_, &cropped_height_, |
497 &out_width_, &out_height_); | 649 &out_width_, &out_height_); |
498 EXPECT_EQ(640, cropped_width_); | 650 EXPECT_EQ(640, cropped_width_); |
499 EXPECT_EQ(360, cropped_height_); | 651 EXPECT_EQ(360, cropped_height_); |
500 EXPECT_EQ(640, out_width_); | 652 EXPECT_EQ(640, out_width_); |
501 EXPECT_EQ(360, out_height_); | 653 EXPECT_EQ(360, out_height_); |
502 } | 654 } |
503 | 655 |
504 TEST_F(VideoAdapterTest, TestVGAWidth) { | 656 TEST_F(VideoAdapterTest, TestVGAWidth) { |
505 // Reqeuested Output format is 640x360. | 657 // Reqeuested Output format is 640x360. |
506 VideoFormat format(640, 360, VideoFormat::FpsToInterval(30), FOURCC_I420); | 658 VideoFormat format(640, 360, 0, FOURCC_I420); |
507 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | |
508 adapter_.OnOutputFormatRequest(format); | 659 adapter_.OnOutputFormatRequest(format); |
509 | 660 |
510 adapter_.AdaptFrameResolution(640, 480, | 661 adapter_.AdaptFrameResolution(640, 480, 0, |
511 &cropped_width_, &cropped_height_, | 662 &cropped_width_, &cropped_height_, |
512 &out_width_, &out_height_); | 663 &out_width_, &out_height_); |
513 // Expect cropping. | 664 // Expect cropping. |
514 EXPECT_EQ(640, cropped_width_); | 665 EXPECT_EQ(640, cropped_width_); |
515 EXPECT_EQ(360, cropped_height_); | 666 EXPECT_EQ(360, cropped_height_); |
516 EXPECT_EQ(640, out_width_); | 667 EXPECT_EQ(640, out_width_); |
517 EXPECT_EQ(360, out_height_); | 668 EXPECT_EQ(360, out_height_); |
518 | 669 |
519 // But if frames come in at 640x360, we shouldn't adapt them down. | 670 // But if frames come in at 640x360, we shouldn't adapt them down. |
520 adapter_.AdaptFrameResolution(640, 360, | 671 adapter_.AdaptFrameResolution(640, 360, 0, |
521 &cropped_width_, &cropped_height_, | 672 &cropped_width_, &cropped_height_, |
522 &out_width_, &out_height_); | 673 &out_width_, &out_height_); |
523 EXPECT_EQ(640, cropped_width_); | 674 EXPECT_EQ(640, cropped_width_); |
524 EXPECT_EQ(360, cropped_height_); | 675 EXPECT_EQ(360, cropped_height_); |
525 EXPECT_EQ(640, out_width_); | 676 EXPECT_EQ(640, out_width_); |
526 EXPECT_EQ(360, out_height_); | 677 EXPECT_EQ(360, out_height_); |
527 | 678 |
528 adapter_.AdaptFrameResolution(640, 480, | 679 adapter_.AdaptFrameResolution(640, 480, 0, |
529 &cropped_width_, &cropped_height_, | 680 &cropped_width_, &cropped_height_, |
530 &out_width_, &out_height_); | 681 &out_width_, &out_height_); |
531 EXPECT_EQ(640, cropped_width_); | 682 EXPECT_EQ(640, cropped_width_); |
532 EXPECT_EQ(360, cropped_height_); | 683 EXPECT_EQ(360, cropped_height_); |
533 EXPECT_EQ(640, out_width_); | 684 EXPECT_EQ(640, out_width_); |
534 EXPECT_EQ(360, out_height_); | 685 EXPECT_EQ(360, out_height_); |
535 } | 686 } |
536 | 687 |
537 TEST_F(VideoAdapterTest, TestOnResolutionRequestInSmallSteps) { | 688 TEST_F(VideoAdapterTest, TestOnResolutionRequestInSmallSteps) { |
538 adapter_.AdaptFrameResolution(1280, 720, | 689 adapter_.AdaptFrameResolution(1280, 720, 0, |
539 &cropped_width_, &cropped_height_, | 690 &cropped_width_, &cropped_height_, |
540 &out_width_, &out_height_); | 691 &out_width_, &out_height_); |
541 EXPECT_EQ(1280, cropped_width_); | 692 EXPECT_EQ(1280, cropped_width_); |
542 EXPECT_EQ(720, cropped_height_); | 693 EXPECT_EQ(720, cropped_height_); |
543 EXPECT_EQ(1280, out_width_); | 694 EXPECT_EQ(1280, out_width_); |
544 EXPECT_EQ(720, out_height_); | 695 EXPECT_EQ(720, out_height_); |
545 | 696 |
546 // Adapt down one step. | 697 // Adapt down one step. |
547 adapter_.OnResolutionRequest(rtc::Optional<int>(1280 * 720 - 1), | 698 adapter_.OnResolutionRequest(rtc::Optional<int>(1280 * 720 - 1), |
548 rtc::Optional<int>()); | 699 rtc::Optional<int>()); |
549 adapter_.AdaptFrameResolution(1280, 720, | 700 adapter_.AdaptFrameResolution(1280, 720, 0, |
550 &cropped_width_, &cropped_height_, | 701 &cropped_width_, &cropped_height_, |
551 &out_width_, &out_height_); | 702 &out_width_, &out_height_); |
552 EXPECT_EQ(1280, cropped_width_); | 703 EXPECT_EQ(1280, cropped_width_); |
553 EXPECT_EQ(720, cropped_height_); | 704 EXPECT_EQ(720, cropped_height_); |
554 EXPECT_EQ(960, out_width_); | 705 EXPECT_EQ(960, out_width_); |
555 EXPECT_EQ(540, out_height_); | 706 EXPECT_EQ(540, out_height_); |
556 | 707 |
557 // Adapt down one step more. | 708 // Adapt down one step more. |
558 adapter_.OnResolutionRequest(rtc::Optional<int>(960 * 540 - 1), | 709 adapter_.OnResolutionRequest(rtc::Optional<int>(960 * 540 - 1), |
559 rtc::Optional<int>()); | 710 rtc::Optional<int>()); |
560 adapter_.AdaptFrameResolution(1280, 720, | 711 adapter_.AdaptFrameResolution(1280, 720, 0, |
561 &cropped_width_, &cropped_height_, | 712 &cropped_width_, &cropped_height_, |
562 &out_width_, &out_height_); | 713 &out_width_, &out_height_); |
563 EXPECT_EQ(1280, cropped_width_); | 714 EXPECT_EQ(1280, cropped_width_); |
564 EXPECT_EQ(720, cropped_height_); | 715 EXPECT_EQ(720, cropped_height_); |
565 EXPECT_EQ(640, out_width_); | 716 EXPECT_EQ(640, out_width_); |
566 EXPECT_EQ(360, out_height_); | 717 EXPECT_EQ(360, out_height_); |
567 | 718 |
568 // Adapt down one step more. | 719 // Adapt down one step more. |
569 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), | 720 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), |
570 rtc::Optional<int>()); | 721 rtc::Optional<int>()); |
571 adapter_.AdaptFrameResolution(1280, 720, | 722 adapter_.AdaptFrameResolution(1280, 720, 0, |
572 &cropped_width_, &cropped_height_, | 723 &cropped_width_, &cropped_height_, |
573 &out_width_, &out_height_); | 724 &out_width_, &out_height_); |
574 EXPECT_EQ(1280, cropped_width_); | 725 EXPECT_EQ(1280, cropped_width_); |
575 EXPECT_EQ(720, cropped_height_); | 726 EXPECT_EQ(720, cropped_height_); |
576 EXPECT_EQ(480, out_width_); | 727 EXPECT_EQ(480, out_width_); |
577 EXPECT_EQ(270, out_height_); | 728 EXPECT_EQ(270, out_height_); |
578 | 729 |
579 // Adapt up one step. | 730 // Adapt up one step. |
580 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 731 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
581 rtc::Optional<int>(480 * 270)); | 732 rtc::Optional<int>(480 * 270)); |
582 adapter_.AdaptFrameResolution(1280, 720, | 733 adapter_.AdaptFrameResolution(1280, 720, 0, |
583 &cropped_width_, &cropped_height_, | 734 &cropped_width_, &cropped_height_, |
584 &out_width_, &out_height_); | 735 &out_width_, &out_height_); |
585 EXPECT_EQ(1280, cropped_width_); | 736 EXPECT_EQ(1280, cropped_width_); |
586 EXPECT_EQ(720, cropped_height_); | 737 EXPECT_EQ(720, cropped_height_); |
587 EXPECT_EQ(640, out_width_); | 738 EXPECT_EQ(640, out_width_); |
588 EXPECT_EQ(360, out_height_); | 739 EXPECT_EQ(360, out_height_); |
589 | 740 |
590 // Adapt up one step more. | 741 // Adapt up one step more. |
591 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 742 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
592 rtc::Optional<int>(640 * 360)); | 743 rtc::Optional<int>(640 * 360)); |
593 adapter_.AdaptFrameResolution(1280, 720, | 744 adapter_.AdaptFrameResolution(1280, 720, 0, |
594 &cropped_width_, &cropped_height_, | 745 &cropped_width_, &cropped_height_, |
595 &out_width_, &out_height_); | 746 &out_width_, &out_height_); |
596 EXPECT_EQ(1280, cropped_width_); | 747 EXPECT_EQ(1280, cropped_width_); |
597 EXPECT_EQ(720, cropped_height_); | 748 EXPECT_EQ(720, cropped_height_); |
598 EXPECT_EQ(960, out_width_); | 749 EXPECT_EQ(960, out_width_); |
599 EXPECT_EQ(540, out_height_); | 750 EXPECT_EQ(540, out_height_); |
600 | 751 |
601 // Adapt up one step more. | 752 // Adapt up one step more. |
602 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 753 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
603 rtc::Optional<int>(960 * 720)); | 754 rtc::Optional<int>(960 * 720)); |
604 adapter_.AdaptFrameResolution(1280, 720, | 755 adapter_.AdaptFrameResolution(1280, 720, 0, |
605 &cropped_width_, &cropped_height_, | 756 &cropped_width_, &cropped_height_, |
606 &out_width_, &out_height_); | 757 &out_width_, &out_height_); |
607 EXPECT_EQ(1280, cropped_width_); | 758 EXPECT_EQ(1280, cropped_width_); |
608 EXPECT_EQ(720, cropped_height_); | 759 EXPECT_EQ(720, cropped_height_); |
609 EXPECT_EQ(1280, out_width_); | 760 EXPECT_EQ(1280, out_width_); |
610 EXPECT_EQ(720, out_height_); | 761 EXPECT_EQ(720, out_height_); |
611 } | 762 } |
612 | 763 |
613 TEST_F(VideoAdapterTest, TestOnResolutionRequestMaxZero) { | 764 TEST_F(VideoAdapterTest, TestOnResolutionRequestMaxZero) { |
614 adapter_.AdaptFrameResolution(1280, 720, | 765 adapter_.AdaptFrameResolution(1280, 720, 0, |
615 &cropped_width_, &cropped_height_, | 766 &cropped_width_, &cropped_height_, |
616 &out_width_, &out_height_); | 767 &out_width_, &out_height_); |
617 EXPECT_EQ(1280, cropped_width_); | 768 EXPECT_EQ(1280, cropped_width_); |
618 EXPECT_EQ(720, cropped_height_); | 769 EXPECT_EQ(720, cropped_height_); |
619 EXPECT_EQ(1280, out_width_); | 770 EXPECT_EQ(1280, out_width_); |
620 EXPECT_EQ(720, out_height_); | 771 EXPECT_EQ(720, out_height_); |
621 | 772 |
622 adapter_.OnResolutionRequest(rtc::Optional<int>(0), rtc::Optional<int>()); | 773 adapter_.OnResolutionRequest(rtc::Optional<int>(0), rtc::Optional<int>()); |
623 adapter_.AdaptFrameResolution(1280, 720, | 774 adapter_.AdaptFrameResolution(1280, 720, 0, |
624 &cropped_width_, &cropped_height_, | 775 &cropped_width_, &cropped_height_, |
625 &out_width_, &out_height_); | 776 &out_width_, &out_height_); |
626 EXPECT_EQ(0, out_width_); | 777 EXPECT_EQ(0, out_width_); |
627 EXPECT_EQ(0, out_height_); | 778 EXPECT_EQ(0, out_height_); |
628 } | 779 } |
629 | 780 |
630 TEST_F(VideoAdapterTest, TestOnResolutionRequestInLargeSteps) { | 781 TEST_F(VideoAdapterTest, TestOnResolutionRequestInLargeSteps) { |
631 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), | 782 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), |
632 rtc::Optional<int>()); | 783 rtc::Optional<int>()); |
633 adapter_.AdaptFrameResolution(1280, 720, | 784 adapter_.AdaptFrameResolution(1280, 720, 0, |
634 &cropped_width_, &cropped_height_, | 785 &cropped_width_, &cropped_height_, |
635 &out_width_, &out_height_); | 786 &out_width_, &out_height_); |
636 EXPECT_EQ(1280, cropped_width_); | 787 EXPECT_EQ(1280, cropped_width_); |
637 EXPECT_EQ(720, cropped_height_); | 788 EXPECT_EQ(720, cropped_height_); |
638 EXPECT_EQ(480, out_width_); | 789 EXPECT_EQ(480, out_width_); |
639 EXPECT_EQ(270, out_height_); | 790 EXPECT_EQ(270, out_height_); |
640 | 791 |
641 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 792 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
642 rtc::Optional<int>(960 * 720)); | 793 rtc::Optional<int>(960 * 720)); |
643 adapter_.AdaptFrameResolution(1280, 720, | 794 adapter_.AdaptFrameResolution(1280, 720, 0, |
644 &cropped_width_, &cropped_height_, | 795 &cropped_width_, &cropped_height_, |
645 &out_width_, &out_height_); | 796 &out_width_, &out_height_); |
646 EXPECT_EQ(1280, cropped_width_); | 797 EXPECT_EQ(1280, cropped_width_); |
647 EXPECT_EQ(720, cropped_height_); | 798 EXPECT_EQ(720, cropped_height_); |
648 EXPECT_EQ(1280, out_width_); | 799 EXPECT_EQ(1280, out_width_); |
649 EXPECT_EQ(720, out_height_); | 800 EXPECT_EQ(720, out_height_); |
650 } | 801 } |
651 | 802 |
652 TEST_F(VideoAdapterTest, TestOnOutputFormatRequestCapsMaxResolution) { | 803 TEST_F(VideoAdapterTest, TestOnOutputFormatRequestCapsMaxResolution) { |
653 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), | 804 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), |
654 rtc::Optional<int>()); | 805 rtc::Optional<int>()); |
655 adapter_.AdaptFrameResolution(1280, 720, | 806 adapter_.AdaptFrameResolution(1280, 720, 0, |
656 &cropped_width_, &cropped_height_, | 807 &cropped_width_, &cropped_height_, |
657 &out_width_, &out_height_); | 808 &out_width_, &out_height_); |
658 EXPECT_EQ(1280, cropped_width_); | 809 EXPECT_EQ(1280, cropped_width_); |
659 EXPECT_EQ(720, cropped_height_); | 810 EXPECT_EQ(720, cropped_height_); |
660 EXPECT_EQ(480, out_width_); | 811 EXPECT_EQ(480, out_width_); |
661 EXPECT_EQ(270, out_height_); | 812 EXPECT_EQ(270, out_height_); |
662 | 813 |
663 VideoFormat new_format(640, 360, VideoFormat::FpsToInterval(30), FOURCC_I420); | 814 VideoFormat new_format(640, 360, 0, FOURCC_I420); |
664 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | |
665 adapter_.OnOutputFormatRequest(new_format); | 815 adapter_.OnOutputFormatRequest(new_format); |
666 adapter_.AdaptFrameResolution(1280, 720, | 816 adapter_.AdaptFrameResolution(1280, 720, 0, |
667 &cropped_width_, &cropped_height_, | 817 &cropped_width_, &cropped_height_, |
668 &out_width_, &out_height_); | 818 &out_width_, &out_height_); |
669 EXPECT_EQ(1280, cropped_width_); | 819 EXPECT_EQ(1280, cropped_width_); |
670 EXPECT_EQ(720, cropped_height_); | 820 EXPECT_EQ(720, cropped_height_); |
671 EXPECT_EQ(480, out_width_); | 821 EXPECT_EQ(480, out_width_); |
672 EXPECT_EQ(270, out_height_); | 822 EXPECT_EQ(270, out_height_); |
673 | 823 |
674 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 824 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
675 rtc::Optional<int>(960 * 720)); | 825 rtc::Optional<int>(960 * 720)); |
676 adapter_.AdaptFrameResolution(1280, 720, | 826 adapter_.AdaptFrameResolution(1280, 720, 0, |
677 &cropped_width_, &cropped_height_, | 827 &cropped_width_, &cropped_height_, |
678 &out_width_, &out_height_); | 828 &out_width_, &out_height_); |
679 EXPECT_EQ(1280, cropped_width_); | 829 EXPECT_EQ(1280, cropped_width_); |
680 EXPECT_EQ(720, cropped_height_); | 830 EXPECT_EQ(720, cropped_height_); |
681 EXPECT_EQ(640, out_width_); | 831 EXPECT_EQ(640, out_width_); |
682 EXPECT_EQ(360, out_height_); | 832 EXPECT_EQ(360, out_height_); |
683 } | 833 } |
684 | 834 |
685 TEST_F(VideoAdapterTest, TestOnResolutionRequestReset) { | 835 TEST_F(VideoAdapterTest, TestOnResolutionRequestReset) { |
686 adapter_.AdaptFrameResolution(1280, 720, | 836 adapter_.AdaptFrameResolution(1280, 720, 0, |
687 &cropped_width_, &cropped_height_, | 837 &cropped_width_, &cropped_height_, |
688 &out_width_, &out_height_); | 838 &out_width_, &out_height_); |
689 EXPECT_EQ(1280, cropped_width_); | 839 EXPECT_EQ(1280, cropped_width_); |
690 EXPECT_EQ(720, cropped_height_); | 840 EXPECT_EQ(720, cropped_height_); |
691 EXPECT_EQ(1280, out_width_); | 841 EXPECT_EQ(1280, out_width_); |
692 EXPECT_EQ(720, out_height_); | 842 EXPECT_EQ(720, out_height_); |
693 | 843 |
694 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), | 844 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), |
695 rtc::Optional<int>()); | 845 rtc::Optional<int>()); |
696 adapter_.AdaptFrameResolution(1280, 720, | 846 adapter_.AdaptFrameResolution(1280, 720, 0, |
697 &cropped_width_, &cropped_height_, | 847 &cropped_width_, &cropped_height_, |
698 &out_width_, &out_height_); | 848 &out_width_, &out_height_); |
699 EXPECT_EQ(1280, cropped_width_); | 849 EXPECT_EQ(1280, cropped_width_); |
700 EXPECT_EQ(720, cropped_height_); | 850 EXPECT_EQ(720, cropped_height_); |
701 EXPECT_EQ(480, out_width_); | 851 EXPECT_EQ(480, out_width_); |
702 EXPECT_EQ(270, out_height_); | 852 EXPECT_EQ(270, out_height_); |
703 | 853 |
704 adapter_.OnResolutionRequest(rtc::Optional<int>(), rtc::Optional<int>()); | 854 adapter_.OnResolutionRequest(rtc::Optional<int>(), rtc::Optional<int>()); |
705 adapter_.AdaptFrameResolution(1280, 720, | 855 adapter_.AdaptFrameResolution(1280, 720, 0, |
706 &cropped_width_, &cropped_height_, | 856 &cropped_width_, &cropped_height_, |
707 &out_width_, &out_height_); | 857 &out_width_, &out_height_); |
708 EXPECT_EQ(1280, cropped_width_); | 858 EXPECT_EQ(1280, cropped_width_); |
709 EXPECT_EQ(720, cropped_height_); | 859 EXPECT_EQ(720, cropped_height_); |
710 EXPECT_EQ(1280, out_width_); | 860 EXPECT_EQ(1280, out_width_); |
711 EXPECT_EQ(720, out_height_); | 861 EXPECT_EQ(720, out_height_); |
712 } | 862 } |
713 | 863 |
714 TEST_F(VideoAdapterTest, TestCroppingWithResolutionRequest) { | 864 TEST_F(VideoAdapterTest, TestCroppingWithResolutionRequest) { |
715 // Ask for 640x360 (16:9 aspect). | 865 // Ask for 640x360 (16:9 aspect). |
716 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | 866 adapter_.OnOutputFormatRequest(VideoFormat(640, 360, 0, FOURCC_I420)); |
717 adapter_.OnOutputFormatRequest( | |
718 VideoFormat(640, 360, VideoFormat::FpsToInterval(30), FOURCC_I420)); | |
719 // Send 640x480 (4:3 aspect). | 867 // Send 640x480 (4:3 aspect). |
720 adapter_.AdaptFrameResolution(640, 480, | 868 adapter_.AdaptFrameResolution(640, 480, 0, |
721 &cropped_width_, &cropped_height_, | 869 &cropped_width_, &cropped_height_, |
722 &out_width_, &out_height_); | 870 &out_width_, &out_height_); |
723 // Expect cropping to 16:9 format and no scaling. | 871 // Expect cropping to 16:9 format and no scaling. |
724 EXPECT_EQ(640, cropped_width_); | 872 EXPECT_EQ(640, cropped_width_); |
725 EXPECT_EQ(360, cropped_height_); | 873 EXPECT_EQ(360, cropped_height_); |
726 EXPECT_EQ(640, out_width_); | 874 EXPECT_EQ(640, out_width_); |
727 EXPECT_EQ(360, out_height_); | 875 EXPECT_EQ(360, out_height_); |
728 | 876 |
729 // Adapt down one step. | 877 // Adapt down one step. |
730 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), | 878 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 - 1), |
731 rtc::Optional<int>()); | 879 rtc::Optional<int>()); |
732 // Expect cropping to 16:9 format and 3/4 scaling. | 880 // Expect cropping to 16:9 format and 3/4 scaling. |
733 adapter_.AdaptFrameResolution(640, 480, | 881 adapter_.AdaptFrameResolution(640, 480, 0, |
734 &cropped_width_, &cropped_height_, | 882 &cropped_width_, &cropped_height_, |
735 &out_width_, &out_height_); | 883 &out_width_, &out_height_); |
736 EXPECT_EQ(640, cropped_width_); | 884 EXPECT_EQ(640, cropped_width_); |
737 EXPECT_EQ(360, cropped_height_); | 885 EXPECT_EQ(360, cropped_height_); |
738 EXPECT_EQ(480, out_width_); | 886 EXPECT_EQ(480, out_width_); |
739 EXPECT_EQ(270, out_height_); | 887 EXPECT_EQ(270, out_height_); |
740 | 888 |
741 // Adapt down one step more. | 889 // Adapt down one step more. |
742 adapter_.OnResolutionRequest(rtc::Optional<int>(480 * 270 - 1), | 890 adapter_.OnResolutionRequest(rtc::Optional<int>(480 * 270 - 1), |
743 rtc::Optional<int>()); | 891 rtc::Optional<int>()); |
744 // Expect cropping to 16:9 format and 1/2 scaling. | 892 // Expect cropping to 16:9 format and 1/2 scaling. |
745 adapter_.AdaptFrameResolution(640, 480, | 893 adapter_.AdaptFrameResolution(640, 480, 0, |
746 &cropped_width_, &cropped_height_, | 894 &cropped_width_, &cropped_height_, |
747 &out_width_, &out_height_); | 895 &out_width_, &out_height_); |
748 EXPECT_EQ(640, cropped_width_); | 896 EXPECT_EQ(640, cropped_width_); |
749 EXPECT_EQ(360, cropped_height_); | 897 EXPECT_EQ(360, cropped_height_); |
750 EXPECT_EQ(320, out_width_); | 898 EXPECT_EQ(320, out_width_); |
751 EXPECT_EQ(180, out_height_); | 899 EXPECT_EQ(180, out_height_); |
752 | 900 |
753 // Adapt up one step. | 901 // Adapt up one step. |
754 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 902 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
755 rtc::Optional<int>(320 * 180)); | 903 rtc::Optional<int>(320 * 180)); |
756 // Expect cropping to 16:9 format and 3/4 scaling. | 904 // Expect cropping to 16:9 format and 3/4 scaling. |
757 adapter_.AdaptFrameResolution(640, 480, | 905 adapter_.AdaptFrameResolution(640, 480, 0, |
758 &cropped_width_, &cropped_height_, | 906 &cropped_width_, &cropped_height_, |
759 &out_width_, &out_height_); | 907 &out_width_, &out_height_); |
760 EXPECT_EQ(640, cropped_width_); | 908 EXPECT_EQ(640, cropped_width_); |
761 EXPECT_EQ(360, cropped_height_); | 909 EXPECT_EQ(360, cropped_height_); |
762 EXPECT_EQ(480, out_width_); | 910 EXPECT_EQ(480, out_width_); |
763 EXPECT_EQ(270, out_height_); | 911 EXPECT_EQ(270, out_height_); |
764 | 912 |
765 // Adapt up one step more. | 913 // Adapt up one step more. |
766 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 914 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
767 rtc::Optional<int>(480 * 270)); | 915 rtc::Optional<int>(480 * 270)); |
768 // Expect cropping to 16:9 format and no scaling. | 916 // Expect cropping to 16:9 format and no scaling. |
769 adapter_.AdaptFrameResolution(640, 480, | 917 adapter_.AdaptFrameResolution(640, 480, 0, |
770 &cropped_width_, &cropped_height_, | 918 &cropped_width_, &cropped_height_, |
771 &out_width_, &out_height_); | 919 &out_width_, &out_height_); |
772 EXPECT_EQ(640, cropped_width_); | 920 EXPECT_EQ(640, cropped_width_); |
773 EXPECT_EQ(360, cropped_height_); | 921 EXPECT_EQ(360, cropped_height_); |
774 EXPECT_EQ(640, out_width_); | 922 EXPECT_EQ(640, out_width_); |
775 EXPECT_EQ(360, out_height_); | 923 EXPECT_EQ(360, out_height_); |
776 | 924 |
777 // Try to adapt up one step more. | 925 // Try to adapt up one step more. |
778 adapter_.OnResolutionRequest(rtc::Optional<int>(), | 926 adapter_.OnResolutionRequest(rtc::Optional<int>(), |
779 rtc::Optional<int>(640 * 360)); | 927 rtc::Optional<int>(640 * 360)); |
780 // Expect cropping to 16:9 format and no scaling. | 928 // Expect cropping to 16:9 format and no scaling. |
781 adapter_.AdaptFrameResolution(640, 480, | 929 adapter_.AdaptFrameResolution(640, 480, 0, |
782 &cropped_width_, &cropped_height_, | 930 &cropped_width_, &cropped_height_, |
783 &out_width_, &out_height_); | 931 &out_width_, &out_height_); |
784 EXPECT_EQ(640, cropped_width_); | 932 EXPECT_EQ(640, cropped_width_); |
785 EXPECT_EQ(360, cropped_height_); | 933 EXPECT_EQ(360, cropped_height_); |
786 EXPECT_EQ(640, out_width_); | 934 EXPECT_EQ(640, out_width_); |
787 EXPECT_EQ(360, out_height_); | 935 EXPECT_EQ(360, out_height_); |
788 } | 936 } |
789 | 937 |
790 TEST_F(VideoAdapterTest, TestCroppingOddResolution) { | 938 TEST_F(VideoAdapterTest, TestCroppingOddResolution) { |
791 // Ask for 640x360 (16:9 aspect), with 3/16 scaling. | 939 // Ask for 640x360 (16:9 aspect), with 3/16 scaling. |
792 adapter_.SetExpectedInputFrameInterval(VideoFormat::FpsToInterval(30)); | |
793 adapter_.OnOutputFormatRequest( | 940 adapter_.OnOutputFormatRequest( |
794 VideoFormat(640, 360, VideoFormat::FpsToInterval(30), FOURCC_I420)); | 941 VideoFormat(640, 360, 0, FOURCC_I420)); |
795 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 * 3 / 16 * 3 / 16), | 942 adapter_.OnResolutionRequest(rtc::Optional<int>(640 * 360 * 3 / 16 * 3 / 16), |
796 rtc::Optional<int>()); | 943 rtc::Optional<int>()); |
797 | 944 |
798 // Send 640x480 (4:3 aspect). | 945 // Send 640x480 (4:3 aspect). |
799 adapter_.AdaptFrameResolution(640, 480, | 946 adapter_.AdaptFrameResolution(640, 480, 0, |
800 &cropped_width_, &cropped_height_, | 947 &cropped_width_, &cropped_height_, |
801 &out_width_, &out_height_); | 948 &out_width_, &out_height_); |
802 | 949 |
803 // Instead of getting the exact aspect ratio with cropped resolution 640x360, | 950 // Instead of getting the exact aspect ratio with cropped resolution 640x360, |
804 // the resolution should be adjusted to get a perfect scale factor instead. | 951 // the resolution should be adjusted to get a perfect scale factor instead. |
805 EXPECT_EQ(640, cropped_width_); | 952 EXPECT_EQ(640, cropped_width_); |
806 EXPECT_EQ(368, cropped_height_); | 953 EXPECT_EQ(368, cropped_height_); |
807 EXPECT_EQ(120, out_width_); | 954 EXPECT_EQ(120, out_width_); |
808 EXPECT_EQ(69, out_height_); | 955 EXPECT_EQ(69, out_height_); |
809 } | 956 } |
810 | 957 |
811 } // namespace cricket | 958 } // namespace cricket |
OLD | NEW |