| OLD | NEW |
| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 public: | 44 public: |
| 45 explicit MockVideoCaptureControllerEventHandler( | 45 explicit MockVideoCaptureControllerEventHandler( |
| 46 VideoCaptureController* controller) | 46 VideoCaptureController* controller) |
| 47 : controller_(controller), | 47 : controller_(controller), |
| 48 resource_utilization_(-1.0) {} | 48 resource_utilization_(-1.0) {} |
| 49 ~MockVideoCaptureControllerEventHandler() override {} | 49 ~MockVideoCaptureControllerEventHandler() override {} |
| 50 | 50 |
| 51 // These mock methods are delegated to by our fake implementation of | 51 // These mock methods are delegated to by our fake implementation of |
| 52 // VideoCaptureControllerEventHandler, to be used in EXPECT_CALL(). | 52 // VideoCaptureControllerEventHandler, to be used in EXPECT_CALL(). |
| 53 MOCK_METHOD1(DoBufferCreated, void(VideoCaptureControllerID)); | 53 MOCK_METHOD1(DoBufferCreated, void(VideoCaptureControllerID)); |
| 54 MOCK_METHOD1(DoBufferCreated2, void(VideoCaptureControllerID)); |
| 54 MOCK_METHOD1(DoBufferDestroyed, void(VideoCaptureControllerID)); | 55 MOCK_METHOD1(DoBufferDestroyed, void(VideoCaptureControllerID)); |
| 55 MOCK_METHOD2(DoI420BufferReady, | 56 MOCK_METHOD2(DoI420BufferReady, |
| 56 void(VideoCaptureControllerID, const gfx::Size&)); | 57 void(VideoCaptureControllerID, const gfx::Size&)); |
| 57 MOCK_METHOD2(DoTextureBufferReady, | 58 MOCK_METHOD2(DoTextureBufferReady, |
| 58 void(VideoCaptureControllerID, const gfx::Size&)); | 59 void(VideoCaptureControllerID, const gfx::Size&)); |
| 59 MOCK_METHOD1(DoEnded, void(VideoCaptureControllerID)); | 60 MOCK_METHOD1(DoEnded, void(VideoCaptureControllerID)); |
| 60 MOCK_METHOD1(DoError, void(VideoCaptureControllerID)); | 61 MOCK_METHOD1(DoError, void(VideoCaptureControllerID)); |
| 61 | 62 |
| 62 void OnError(VideoCaptureControllerID id) override { | 63 void OnError(VideoCaptureControllerID id) override { |
| 63 DoError(id); | 64 DoError(id); |
| 64 } | 65 } |
| 65 void OnBufferCreated(VideoCaptureControllerID id, | 66 void OnBufferCreated(VideoCaptureControllerID id, |
| 66 base::SharedMemoryHandle handle, | 67 base::SharedMemoryHandle handle, |
| 67 int length, int buffer_id) override { | 68 int length, int buffer_id) override { |
| 68 DoBufferCreated(id); | 69 DoBufferCreated(id); |
| 69 } | 70 } |
| 71 void OnBufferCreated2( |
| 72 VideoCaptureControllerID id, |
| 73 const std::vector<gfx::GpuMemoryBufferHandle>& handles, |
| 74 const gfx::Size& size, |
| 75 int buffer_id) override { |
| 76 DoBufferCreated2(id); |
| 77 } |
| 70 void OnBufferDestroyed(VideoCaptureControllerID id, int buffer_id) override { | 78 void OnBufferDestroyed(VideoCaptureControllerID id, int buffer_id) override { |
| 71 DoBufferDestroyed(id); | 79 DoBufferDestroyed(id); |
| 72 } | 80 } |
| 73 void OnBufferReady(VideoCaptureControllerID id, | 81 void OnBufferReady(VideoCaptureControllerID id, |
| 74 int buffer_id, | 82 int buffer_id, |
| 75 const scoped_refptr<media::VideoFrame>& frame, | 83 const scoped_refptr<media::VideoFrame>& frame, |
| 76 const base::TimeTicks& timestamp) override { | 84 const base::TimeTicks& timestamp) override { |
| 77 if (!frame->HasTextures()) { | 85 if (!frame->HasTextures()) { |
| 78 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_I420); | 86 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_I420); |
| 79 DoI420BufferReady(id, frame->coded_size()); | 87 DoI420BufferReady(id, frame->coded_size()); |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 // Now, simulate an incoming captured buffer from the capture device. As a | 319 // Now, simulate an incoming captured buffer from the capture device. As a |
| 312 // side effect this will cause the first buffer to be shared with clients. | 320 // side effect this will cause the first buffer to be shared with clients. |
| 313 uint8 buffer_no = 1; | 321 uint8 buffer_no = 1; |
| 314 ASSERT_EQ(0.0, device_->GetBufferPoolUtilization()); | 322 ASSERT_EQ(0.0, device_->GetBufferPoolUtilization()); |
| 315 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer( | 323 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer( |
| 316 device_->ReserveOutputBuffer(capture_resolution, | 324 device_->ReserveOutputBuffer(capture_resolution, |
| 317 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 325 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 318 media::PIXEL_STORAGE_CPU)); | 326 media::PIXEL_STORAGE_CPU)); |
| 319 ASSERT_TRUE(buffer.get()); | 327 ASSERT_TRUE(buffer.get()); |
| 320 ASSERT_EQ(1.0 / kPoolSize, device_->GetBufferPoolUtilization()); | 328 ASSERT_EQ(1.0 / kPoolSize, device_->GetBufferPoolUtilization()); |
| 321 memset(buffer->data(), buffer_no++, buffer->size()); | 329 memset(buffer->data(), buffer_no++, buffer->mapped_size()); |
| 322 { | 330 { |
| 323 InSequence s; | 331 InSequence s; |
| 324 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1); | 332 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1); |
| 325 EXPECT_CALL(*client_a_, | 333 EXPECT_CALL(*client_a_, |
| 326 DoI420BufferReady(client_a_route_1, capture_resolution)) | 334 DoI420BufferReady(client_a_route_1, capture_resolution)) |
| 327 .Times(1); | 335 .Times(1); |
| 328 } | 336 } |
| 329 { | 337 { |
| 330 InSequence s; | 338 InSequence s; |
| 331 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1); | 339 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 361 ASSERT_EQ(0.5, resource_utilization_in_metadata); | 369 ASSERT_EQ(0.5, resource_utilization_in_metadata); |
| 362 | 370 |
| 363 // Second buffer which ought to use the same shared memory buffer. In this | 371 // Second buffer which ought to use the same shared memory buffer. In this |
| 364 // case pretend that the Buffer pointer is held by the device for a long | 372 // case pretend that the Buffer pointer is held by the device for a long |
| 365 // delay. This shouldn't affect anything. | 373 // delay. This shouldn't affect anything. |
| 366 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 = | 374 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 = |
| 367 device_->ReserveOutputBuffer(capture_resolution, | 375 device_->ReserveOutputBuffer(capture_resolution, |
| 368 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 376 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 369 media::PIXEL_STORAGE_CPU); | 377 media::PIXEL_STORAGE_CPU); |
| 370 ASSERT_TRUE(buffer2.get()); | 378 ASSERT_TRUE(buffer2.get()); |
| 371 memset(buffer2->data(), buffer_no++, buffer2->size()); | 379 memset(buffer2->data(), buffer_no++, buffer2->mapped_size()); |
| 372 video_frame = | 380 video_frame = |
| 373 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer2->data())); | 381 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer2->data())); |
| 374 ASSERT_FALSE(video_frame->metadata()->HasKey( | 382 ASSERT_FALSE(video_frame->metadata()->HasKey( |
| 375 media::VideoFrameMetadata::RESOURCE_UTILIZATION)); | 383 media::VideoFrameMetadata::RESOURCE_UTILIZATION)); |
| 376 client_a_->resource_utilization_ = 0.5; | 384 client_a_->resource_utilization_ = 0.5; |
| 377 client_b_->resource_utilization_ = 3.14; | 385 client_b_->resource_utilization_ = 3.14; |
| 378 device_->OnIncomingCapturedVideoFrame(buffer2.Pass(), video_frame, | 386 device_->OnIncomingCapturedVideoFrame(buffer2.Pass(), video_frame, |
| 379 base::TimeTicks()); | 387 base::TimeTicks()); |
| 380 | 388 |
| 381 // The buffer should be delivered to the clients in any order. | 389 // The buffer should be delivered to the clients in any order. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 407 session_1); | 415 session_1); |
| 408 Mock::VerifyAndClearExpectations(client_b_.get()); | 416 Mock::VerifyAndClearExpectations(client_b_.get()); |
| 409 | 417 |
| 410 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. | 418 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. |
| 411 for (int i = 0; i < kPoolSize; i++) { | 419 for (int i = 0; i < kPoolSize; i++) { |
| 412 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = | 420 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = |
| 413 device_->ReserveOutputBuffer(capture_resolution, | 421 device_->ReserveOutputBuffer(capture_resolution, |
| 414 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 422 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 415 media::PIXEL_STORAGE_CPU); | 423 media::PIXEL_STORAGE_CPU); |
| 416 ASSERT_TRUE(buffer.get()); | 424 ASSERT_TRUE(buffer.get()); |
| 417 memset(buffer->data(), buffer_no++, buffer->size()); | 425 memset(buffer->data(), buffer_no++, buffer->mapped_size()); |
| 418 video_frame = | 426 video_frame = |
| 419 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); | 427 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); |
| 420 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, | 428 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, |
| 421 base::TimeTicks()); | 429 base::TimeTicks()); |
| 422 } | 430 } |
| 423 // ReserveOutputBuffer ought to fail now, because the pool is depleted. | 431 // ReserveOutputBuffer ought to fail now, because the pool is depleted. |
| 424 ASSERT_FALSE( | 432 ASSERT_FALSE( |
| 425 device_->ReserveOutputBuffer(capture_resolution, | 433 device_->ReserveOutputBuffer(capture_resolution, |
| 426 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 434 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 427 media::PIXEL_STORAGE_CPU).get()); | 435 media::PIXEL_STORAGE_CPU).get()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 455 controller_->RemoveClient(client_a_route_1, client_a_.get()); | 463 controller_->RemoveClient(client_a_route_1, client_a_.get()); |
| 456 // Kill B1 via session close (posts a task to disconnect). | 464 // Kill B1 via session close (posts a task to disconnect). |
| 457 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1); | 465 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1); |
| 458 controller_->StopSession(300); | 466 controller_->StopSession(300); |
| 459 // Queue up another buffer. | 467 // Queue up another buffer. |
| 460 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 = | 468 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 = |
| 461 device_->ReserveOutputBuffer(capture_resolution, | 469 device_->ReserveOutputBuffer(capture_resolution, |
| 462 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 470 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 463 media::PIXEL_STORAGE_CPU); | 471 media::PIXEL_STORAGE_CPU); |
| 464 ASSERT_TRUE(buffer3.get()); | 472 ASSERT_TRUE(buffer3.get()); |
| 465 memset(buffer3->data(), buffer_no++, buffer3->size()); | 473 memset(buffer3->data(), buffer_no++, buffer3->mapped_size()); |
| 466 video_frame = | 474 video_frame = |
| 467 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer3->data())); | 475 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer3->data())); |
| 468 device_->OnIncomingCapturedVideoFrame(buffer3.Pass(), video_frame, | 476 device_->OnIncomingCapturedVideoFrame(buffer3.Pass(), video_frame, |
| 469 base::TimeTicks()); | 477 base::TimeTicks()); |
| 470 | 478 |
| 471 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 = | 479 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 = |
| 472 device_->ReserveOutputBuffer(capture_resolution, | 480 device_->ReserveOutputBuffer(capture_resolution, |
| 473 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, | 481 media::VIDEO_CAPTURE_PIXEL_FORMAT_I420, |
| 474 media::PIXEL_STORAGE_CPU); | 482 media::PIXEL_STORAGE_CPU); |
| 475 { | 483 { |
| 476 // Kill A2 via session close (posts a task to disconnect, but A2 must not | 484 // Kill A2 via session close (posts a task to disconnect, but A2 must not |
| 477 // be sent either of these two buffers). | 485 // be sent either of these two buffers). |
| 478 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1); | 486 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1); |
| 479 controller_->StopSession(200); | 487 controller_->StopSession(200); |
| 480 } | 488 } |
| 481 ASSERT_TRUE(buffer4.get()); | 489 ASSERT_TRUE(buffer4.get()); |
| 482 memset(buffer4->data(), buffer_no++, buffer4->size()); | 490 memset(buffer4->data(), buffer_no++, buffer4->mapped_size()); |
| 483 video_frame = | 491 video_frame = |
| 484 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer4->data())); | 492 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer4->data())); |
| 485 device_->OnIncomingCapturedVideoFrame(buffer4.Pass(), video_frame, | 493 device_->OnIncomingCapturedVideoFrame(buffer4.Pass(), video_frame, |
| 486 base::TimeTicks()); | 494 base::TimeTicks()); |
| 487 // B2 is the only client left, and is the only one that should | 495 // B2 is the only client left, and is the only one that should |
| 488 // get the buffer. | 496 // get the buffer. |
| 489 EXPECT_CALL(*client_b_, | 497 EXPECT_CALL(*client_b_, |
| 490 DoI420BufferReady(client_b_route_2, capture_resolution)) | 498 DoI420BufferReady(client_b_route_2, capture_resolution)) |
| 491 .Times(2); | 499 .Times(2); |
| 492 base::RunLoop().RunUntilIdle(); | 500 base::RunLoop().RunUntilIdle(); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 | 662 |
| 655 // Second client connects after the error state. It also should get told of | 663 // Second client connects after the error state. It also should get told of |
| 656 // the error. | 664 // the error. |
| 657 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); | 665 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); |
| 658 controller_->AddClient( | 666 controller_->AddClient( |
| 659 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); | 667 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); |
| 660 Mock::VerifyAndClearExpectations(client_b_.get()); | 668 Mock::VerifyAndClearExpectations(client_b_.get()); |
| 661 } | 669 } |
| 662 | 670 |
| 663 } // namespace content | 671 } // namespace content |
| OLD | NEW |