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

Side by Side Diff: content/browser/renderer_host/media/video_capture_controller_unittest.cc

Issue 1476523005: Verify returned frames from media::VideoFrame::Wrap*() methods (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: LOG in video_Frame and CHECK/return outside. 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Unit test for VideoCaptureController. 5 // Unit test for VideoCaptureController.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 client_a_.reset(new MockVideoCaptureControllerEventHandler( 110 client_a_.reset(new MockVideoCaptureControllerEventHandler(
111 controller_.get())); 111 controller_.get()));
112 client_b_.reset(new MockVideoCaptureControllerEventHandler( 112 client_b_.reset(new MockVideoCaptureControllerEventHandler(
113 controller_.get())); 113 controller_.get()));
114 } 114 }
115 115
116 void TearDown() override { base::RunLoop().RunUntilIdle(); } 116 void TearDown() override { base::RunLoop().RunUntilIdle(); }
117 117
118 scoped_refptr<media::VideoFrame> WrapI420Buffer(gfx::Size dimensions, 118 scoped_refptr<media::VideoFrame> WrapI420Buffer(gfx::Size dimensions,
119 uint8* data) { 119 uint8* data) {
120 return media::VideoFrame::WrapExternalSharedMemory( 120 scoped_refptr<media::VideoFrame> video_frame =
121 media::PIXEL_FORMAT_I420, dimensions, gfx::Rect(dimensions), dimensions, 121 media::VideoFrame::WrapExternalSharedMemory(
122 data, 122 media::PIXEL_FORMAT_I420, dimensions, gfx::Rect(dimensions),
123 media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420, dimensions), 123 dimensions, data, media::VideoFrame::AllocationSize(
124 base::SharedMemory::NULLHandle(), 0u, base::TimeDelta()); 124 media::PIXEL_FORMAT_I420, dimensions),
125 base::SharedMemory::NULLHandle(), 0u, base::TimeDelta());
126 CHECK(video_frame);
127 return video_frame;
125 } 128 }
126 129
127 TestBrowserThreadBundle bundle_; 130 TestBrowserThreadBundle bundle_;
128 scoped_ptr<MockVideoCaptureControllerEventHandler> client_a_; 131 scoped_ptr<MockVideoCaptureControllerEventHandler> client_a_;
129 scoped_ptr<MockVideoCaptureControllerEventHandler> client_b_; 132 scoped_ptr<MockVideoCaptureControllerEventHandler> client_b_;
130 scoped_ptr<VideoCaptureController> controller_; 133 scoped_ptr<VideoCaptureController> controller_;
131 scoped_ptr<media::VideoCaptureDevice::Client> device_; 134 scoped_ptr<media::VideoCaptureDevice::Client> device_;
132 135
133 private: 136 private:
134 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest); 137 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest);
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 } 308 }
306 { 309 {
307 InSequence s; 310 InSequence s;
308 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1); 311 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
309 EXPECT_CALL(*client_a_, 312 EXPECT_CALL(*client_a_,
310 DoI420BufferReady(client_a_route_2, capture_resolution)) 313 DoI420BufferReady(client_a_route_2, capture_resolution))
311 .Times(1); 314 .Times(1);
312 } 315 }
313 scoped_refptr<media::VideoFrame> video_frame = 316 scoped_refptr<media::VideoFrame> video_frame =
314 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); 317 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data()));
318 CHECK(video_frame);
315 ASSERT_FALSE(video_frame->metadata()->HasKey( 319 ASSERT_FALSE(video_frame->metadata()->HasKey(
316 media::VideoFrameMetadata::RESOURCE_UTILIZATION)); 320 media::VideoFrameMetadata::RESOURCE_UTILIZATION));
317 client_a_->resource_utilization_ = 0.5; 321 client_a_->resource_utilization_ = 0.5;
318 client_b_->resource_utilization_ = -1.0; 322 client_b_->resource_utilization_ = -1.0;
319 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, 323 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame,
320 base::TimeTicks()); 324 base::TimeTicks());
321 325
322 base::RunLoop().RunUntilIdle(); 326 base::RunLoop().RunUntilIdle();
323 Mock::VerifyAndClearExpectations(client_a_.get()); 327 Mock::VerifyAndClearExpectations(client_a_.get());
324 Mock::VerifyAndClearExpectations(client_b_.get()); 328 Mock::VerifyAndClearExpectations(client_b_.get());
325 // Expect VideoCaptureController set the metadata in |video_frame| to hold a 329 // Expect VideoCaptureController set the metadata in |video_frame| to hold a
326 // resource utilization of 0.5 (the largest of all reported values). 330 // resource utilization of 0.5 (the largest of all reported values).
327 double resource_utilization_in_metadata = -1.0; 331 double resource_utilization_in_metadata = -1.0;
328 ASSERT_TRUE(video_frame->metadata()->GetDouble( 332 ASSERT_TRUE(video_frame->metadata()->GetDouble(
329 media::VideoFrameMetadata::RESOURCE_UTILIZATION, 333 media::VideoFrameMetadata::RESOURCE_UTILIZATION,
330 &resource_utilization_in_metadata)); 334 &resource_utilization_in_metadata));
331 ASSERT_EQ(0.5, resource_utilization_in_metadata); 335 ASSERT_EQ(0.5, resource_utilization_in_metadata);
332 336
333 // Second buffer which ought to use the same shared memory buffer. In this 337 // Second buffer which ought to use the same shared memory buffer. In this
334 // case pretend that the Buffer pointer is held by the device for a long 338 // case pretend that the Buffer pointer is held by the device for a long
335 // delay. This shouldn't affect anything. 339 // delay. This shouldn't affect anything.
336 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 = 340 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 =
337 device_->ReserveOutputBuffer(capture_resolution, 341 device_->ReserveOutputBuffer(capture_resolution,
338 media::PIXEL_FORMAT_I420, 342 media::PIXEL_FORMAT_I420,
339 media::PIXEL_STORAGE_CPU); 343 media::PIXEL_STORAGE_CPU);
340 ASSERT_TRUE(buffer2.get()); 344 ASSERT_TRUE(buffer2.get());
341 memset(buffer2->data(), buffer_no++, buffer2->mapped_size()); 345 memset(buffer2->data(), buffer_no++, buffer2->mapped_size());
342 video_frame = 346 video_frame =
343 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer2->data())); 347 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer2->data()));
348 CHECK(video_frame);
344 ASSERT_FALSE(video_frame->metadata()->HasKey( 349 ASSERT_FALSE(video_frame->metadata()->HasKey(
345 media::VideoFrameMetadata::RESOURCE_UTILIZATION)); 350 media::VideoFrameMetadata::RESOURCE_UTILIZATION));
346 client_a_->resource_utilization_ = 0.5; 351 client_a_->resource_utilization_ = 0.5;
347 client_b_->resource_utilization_ = 3.14; 352 client_b_->resource_utilization_ = 3.14;
348 device_->OnIncomingCapturedVideoFrame(buffer2.Pass(), video_frame, 353 device_->OnIncomingCapturedVideoFrame(buffer2.Pass(), video_frame,
349 base::TimeTicks()); 354 base::TimeTicks());
350 355
351 // The buffer should be delivered to the clients in any order. 356 // The buffer should be delivered to the clients in any order.
352 EXPECT_CALL(*client_a_, 357 EXPECT_CALL(*client_a_,
353 DoI420BufferReady(client_a_route_1, capture_resolution)) 358 DoI420BufferReady(client_a_route_1, capture_resolution))
(...skipping 26 matching lines...) Expand all
380 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. 385 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time.
381 for (int i = 0; i < kPoolSize; i++) { 386 for (int i = 0; i < kPoolSize; i++) {
382 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = 387 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer =
383 device_->ReserveOutputBuffer(capture_resolution, 388 device_->ReserveOutputBuffer(capture_resolution,
384 media::PIXEL_FORMAT_I420, 389 media::PIXEL_FORMAT_I420,
385 media::PIXEL_STORAGE_CPU); 390 media::PIXEL_STORAGE_CPU);
386 ASSERT_TRUE(buffer.get()); 391 ASSERT_TRUE(buffer.get());
387 memset(buffer->data(), buffer_no++, buffer->mapped_size()); 392 memset(buffer->data(), buffer_no++, buffer->mapped_size());
388 video_frame = 393 video_frame =
389 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); 394 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data()));
395 CHECK(video_frame);
390 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, 396 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame,
391 base::TimeTicks()); 397 base::TimeTicks());
392 } 398 }
393 // ReserveOutputBuffer ought to fail now, because the pool is depleted. 399 // ReserveOutputBuffer ought to fail now, because the pool is depleted.
394 ASSERT_FALSE( 400 ASSERT_FALSE(
395 device_->ReserveOutputBuffer(capture_resolution, 401 device_->ReserveOutputBuffer(capture_resolution,
396 media::PIXEL_FORMAT_I420, 402 media::PIXEL_FORMAT_I420,
397 media::PIXEL_STORAGE_CPU).get()); 403 media::PIXEL_STORAGE_CPU).get());
398 404
399 // The new client needs to be told of 3 buffers; the old clients only 2. 405 // The new client needs to be told of 3 buffers; the old clients only 2.
(...skipping 28 matching lines...) Expand all
428 controller_->StopSession(300); 434 controller_->StopSession(300);
429 // Queue up another buffer. 435 // Queue up another buffer.
430 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 = 436 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 =
431 device_->ReserveOutputBuffer(capture_resolution, 437 device_->ReserveOutputBuffer(capture_resolution,
432 media::PIXEL_FORMAT_I420, 438 media::PIXEL_FORMAT_I420,
433 media::PIXEL_STORAGE_CPU); 439 media::PIXEL_STORAGE_CPU);
434 ASSERT_TRUE(buffer3.get()); 440 ASSERT_TRUE(buffer3.get());
435 memset(buffer3->data(), buffer_no++, buffer3->mapped_size()); 441 memset(buffer3->data(), buffer_no++, buffer3->mapped_size());
436 video_frame = 442 video_frame =
437 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer3->data())); 443 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer3->data()));
444 CHECK(video_frame);
438 device_->OnIncomingCapturedVideoFrame(buffer3.Pass(), video_frame, 445 device_->OnIncomingCapturedVideoFrame(buffer3.Pass(), video_frame,
439 base::TimeTicks()); 446 base::TimeTicks());
440 447
441 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 = 448 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 =
442 device_->ReserveOutputBuffer(capture_resolution, 449 device_->ReserveOutputBuffer(capture_resolution,
443 media::PIXEL_FORMAT_I420, 450 media::PIXEL_FORMAT_I420,
444 media::PIXEL_STORAGE_CPU); 451 media::PIXEL_STORAGE_CPU);
445 { 452 {
446 // Kill A2 via session close (posts a task to disconnect, but A2 must not 453 // Kill A2 via session close (posts a task to disconnect, but A2 must not
447 // be sent either of these two buffers). 454 // be sent either of these two buffers).
448 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1); 455 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1);
449 controller_->StopSession(200); 456 controller_->StopSession(200);
450 } 457 }
451 ASSERT_TRUE(buffer4.get()); 458 ASSERT_TRUE(buffer4.get());
452 memset(buffer4->data(), buffer_no++, buffer4->mapped_size()); 459 memset(buffer4->data(), buffer_no++, buffer4->mapped_size());
453 video_frame = 460 video_frame =
454 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer4->data())); 461 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer4->data()));
462 CHECK(video_frame);
455 device_->OnIncomingCapturedVideoFrame(buffer4.Pass(), video_frame, 463 device_->OnIncomingCapturedVideoFrame(buffer4.Pass(), video_frame,
456 base::TimeTicks()); 464 base::TimeTicks());
457 // B2 is the only client left, and is the only one that should 465 // B2 is the only client left, and is the only one that should
458 // get the buffer. 466 // get the buffer.
459 EXPECT_CALL(*client_b_, 467 EXPECT_CALL(*client_b_,
460 DoI420BufferReady(client_b_route_2, capture_resolution)) 468 DoI420BufferReady(client_b_route_2, capture_resolution))
461 .Times(2); 469 .Times(2);
462 base::RunLoop().RunUntilIdle(); 470 base::RunLoop().RunUntilIdle();
463 Mock::VerifyAndClearExpectations(client_a_.get()); 471 Mock::VerifyAndClearExpectations(client_a_.get());
464 Mock::VerifyAndClearExpectations(client_b_.get()); 472 Mock::VerifyAndClearExpectations(client_b_.get());
(...skipping 28 matching lines...) Expand all
493 base::RunLoop().RunUntilIdle(); 501 base::RunLoop().RunUntilIdle();
494 Mock::VerifyAndClearExpectations(client_b_.get()); 502 Mock::VerifyAndClearExpectations(client_b_.get());
495 503
496 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer( 504 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
497 device_->ReserveOutputBuffer(capture_resolution, 505 device_->ReserveOutputBuffer(capture_resolution,
498 media::PIXEL_FORMAT_I420, 506 media::PIXEL_FORMAT_I420,
499 media::PIXEL_STORAGE_CPU)); 507 media::PIXEL_STORAGE_CPU));
500 ASSERT_TRUE(buffer.get()); 508 ASSERT_TRUE(buffer.get());
501 scoped_refptr<media::VideoFrame> video_frame = 509 scoped_refptr<media::VideoFrame> video_frame =
502 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); 510 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data()));
511 CHECK(video_frame);
503 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, 512 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame,
504 base::TimeTicks()); 513 base::TimeTicks());
505 514
506 base::RunLoop().RunUntilIdle(); 515 base::RunLoop().RunUntilIdle();
507 } 516 }
508 517
509 // Exercises the OnError() codepath of VideoCaptureController, and tests the 518 // Exercises the OnError() codepath of VideoCaptureController, and tests the
510 // behavior of various operations after the error state has been signalled. 519 // behavior of various operations after the error state has been signalled.
511 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) { 520 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) {
512 media::VideoCaptureParams session_100; 521 media::VideoCaptureParams session_100;
(...skipping 17 matching lines...) Expand all
530 Mock::VerifyAndClearExpectations(client_a_.get()); 539 Mock::VerifyAndClearExpectations(client_a_.get());
531 540
532 const gfx::Size dims(320, 240); 541 const gfx::Size dims(320, 240);
533 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer( 542 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
534 device_->ReserveOutputBuffer(dims, media::PIXEL_FORMAT_I420, 543 device_->ReserveOutputBuffer(dims, media::PIXEL_FORMAT_I420,
535 media::PIXEL_STORAGE_CPU)); 544 media::PIXEL_STORAGE_CPU));
536 ASSERT_TRUE(buffer.get()); 545 ASSERT_TRUE(buffer.get());
537 546
538 scoped_refptr<media::VideoFrame> video_frame = 547 scoped_refptr<media::VideoFrame> video_frame =
539 WrapI420Buffer(dims, static_cast<uint8*>(buffer->data())); 548 WrapI420Buffer(dims, static_cast<uint8*>(buffer->data()));
549 CHECK(video_frame);
540 device_->OnError(FROM_HERE, "Test Error"); 550 device_->OnError(FROM_HERE, "Test Error");
541 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, 551 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame,
542 base::TimeTicks()); 552 base::TimeTicks());
543 553
544 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); 554 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1);
545 base::RunLoop().RunUntilIdle(); 555 base::RunLoop().RunUntilIdle();
546 Mock::VerifyAndClearExpectations(client_a_.get()); 556 Mock::VerifyAndClearExpectations(client_a_.get());
547 557
548 // Second client connects after the error state. It also should get told of 558 // Second client connects after the error state. It also should get told of
549 // the error. 559 // the error.
550 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); 560 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1);
551 controller_->AddClient( 561 controller_->AddClient(
552 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); 562 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200);
553 Mock::VerifyAndClearExpectations(client_b_.get()); 563 Mock::VerifyAndClearExpectations(client_b_.get());
554 } 564 }
555 565
556 } // namespace content 566 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698