| Index: content/browser/renderer_host/media/video_capture_controller_unittest.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_controller_unittest.cc b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
|
| index 592a22fb050d47eb07d229122f4e390ba6a10786..21c5fbe693104a4a72b7e0d9c97b6a8caa308175 100644
|
| --- a/content/browser/renderer_host/media/video_capture_controller_unittest.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
|
| @@ -52,8 +52,7 @@ class MockVideoCaptureControllerEventHandler
|
| // VideoCaptureControllerEventHandler, to be used in EXPECT_CALL().
|
| MOCK_METHOD1(DoBufferCreated, void(VideoCaptureControllerID));
|
| MOCK_METHOD1(DoBufferDestroyed, void(VideoCaptureControllerID));
|
| - MOCK_METHOD2(DoI420BufferReady,
|
| - void(VideoCaptureControllerID, const gfx::Size&));
|
| + MOCK_METHOD2(DoBufferReady, void(VideoCaptureControllerID, const gfx::Size&));
|
| MOCK_METHOD1(DoEnded, void(VideoCaptureControllerID));
|
| MOCK_METHOD1(DoError, void(VideoCaptureControllerID));
|
|
|
| @@ -71,11 +70,11 @@ class MockVideoCaptureControllerEventHandler
|
| void OnBufferReady(VideoCaptureControllerID id,
|
| int buffer_id,
|
| const scoped_refptr<media::VideoFrame>& frame) override {
|
| - EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_I420);
|
| + EXPECT_EQ(expected_pixel_format_, frame->format());
|
| base::TimeTicks reference_time;
|
| EXPECT_TRUE(frame->metadata()->GetTimeTicks(
|
| media::VideoFrameMetadata::REFERENCE_TIME, &reference_time));
|
| - DoI420BufferReady(id, frame->coded_size());
|
| + DoBufferReady(id, frame->coded_size());
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&VideoCaptureController::ReturnBuffer,
|
| @@ -92,11 +91,14 @@ class MockVideoCaptureControllerEventHandler
|
| }
|
|
|
| VideoCaptureController* controller_;
|
| + media::VideoPixelFormat expected_pixel_format_ = media::PIXEL_FORMAT_I420;
|
| double resource_utilization_;
|
| };
|
|
|
| // Test class.
|
| -class VideoCaptureControllerTest : public testing::Test {
|
| +class VideoCaptureControllerTest
|
| + : public testing::Test,
|
| + public testing::WithParamInterface<media::VideoPixelFormat> {
|
| public:
|
| VideoCaptureControllerTest() {}
|
| ~VideoCaptureControllerTest() override {}
|
| @@ -115,13 +117,14 @@ class VideoCaptureControllerTest : public testing::Test {
|
|
|
| void TearDown() override { base::RunLoop().RunUntilIdle(); }
|
|
|
| - scoped_refptr<media::VideoFrame> WrapI420Buffer(gfx::Size dimensions,
|
| - uint8_t* data) {
|
| + scoped_refptr<media::VideoFrame> WrapBuffer(
|
| + gfx::Size dimensions,
|
| + uint8_t* data,
|
| + media::VideoPixelFormat format = media::PIXEL_FORMAT_I420) {
|
| scoped_refptr<media::VideoFrame> video_frame =
|
| media::VideoFrame::WrapExternalSharedMemory(
|
| - media::PIXEL_FORMAT_I420, dimensions, gfx::Rect(dimensions),
|
| - dimensions, data, media::VideoFrame::AllocationSize(
|
| - media::PIXEL_FORMAT_I420, dimensions),
|
| + format, dimensions, gfx::Rect(dimensions), dimensions, data,
|
| + media::VideoFrame::AllocationSize(format, dimensions),
|
| base::SharedMemory::NULLHandle(), 0u, base::TimeDelta());
|
| EXPECT_TRUE(video_frame);
|
| return video_frame;
|
| @@ -236,10 +239,14 @@ TEST_F(VideoCaptureControllerTest, AddAndRemoveClients) {
|
| // This test will connect and disconnect several clients while simulating an
|
| // active capture device being started and generating frames. It runs on one
|
| // thread and is intended to behave deterministically.
|
| -TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| +TEST_P(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| media::VideoCaptureParams session_100;
|
| - session_100.requested_format = media::VideoCaptureFormat(
|
| - gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420);
|
| + const media::VideoPixelFormat format = GetParam();
|
| + client_a_->expected_pixel_format_ = format;
|
| + client_b_->expected_pixel_format_ = format;
|
| +
|
| + session_100.requested_format =
|
| + media::VideoCaptureFormat(gfx::Size(320, 240), 30, format);
|
|
|
| media::VideoCaptureParams session_200 = session_100;
|
|
|
| @@ -279,7 +286,7 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| uint8_t buffer_no = 1;
|
| ASSERT_EQ(0.0, device_->GetBufferPoolUtilization());
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
|
| - device_->ReserveOutputBuffer(capture_resolution, media::PIXEL_FORMAT_I420,
|
| + device_->ReserveOutputBuffer(capture_resolution, format,
|
| media::PIXEL_STORAGE_CPU));
|
| ASSERT_TRUE(buffer.get());
|
| ASSERT_EQ(1.0 / kPoolSize, device_->GetBufferPoolUtilization());
|
| @@ -287,26 +294,23 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
|
| .Times(1);
|
| }
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1);
|
| - EXPECT_CALL(*client_b_,
|
| - DoI420BufferReady(client_b_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
|
| .Times(1);
|
| }
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_2, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
|
| .Times(1);
|
| }
|
| - scoped_refptr<media::VideoFrame> video_frame =
|
| - WrapI420Buffer(capture_resolution, static_cast<uint8_t*>(buffer->data()));
|
| + scoped_refptr<media::VideoFrame> video_frame = WrapBuffer(
|
| + capture_resolution, static_cast<uint8_t*>(buffer->data()), format);
|
| ASSERT_TRUE(video_frame);
|
| ASSERT_FALSE(video_frame->metadata()->HasKey(
|
| media::VideoFrameMetadata::RESOURCE_UTILIZATION));
|
| @@ -332,12 +336,12 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| // case pretend that the Buffer pointer is held by the device for a long
|
| // delay. This shouldn't affect anything.
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 =
|
| - device_->ReserveOutputBuffer(capture_resolution, media::PIXEL_FORMAT_I420,
|
| + device_->ReserveOutputBuffer(capture_resolution, format,
|
| media::PIXEL_STORAGE_CPU);
|
| ASSERT_TRUE(buffer2.get());
|
| memset(buffer2->data(), buffer_no++, buffer2->mapped_size());
|
| - video_frame = WrapI420Buffer(capture_resolution,
|
| - static_cast<uint8_t*>(buffer2->data()));
|
| + video_frame = WrapBuffer(capture_resolution,
|
| + static_cast<uint8_t*>(buffer2->data()), format);
|
| ASSERT_TRUE(video_frame);
|
| ASSERT_FALSE(video_frame->metadata()->HasKey(
|
| media::VideoFrameMetadata::RESOURCE_UTILIZATION));
|
| @@ -351,22 +355,19 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
|
| .Times(1);
|
| }
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1);
|
| - EXPECT_CALL(*client_b_,
|
| - DoI420BufferReady(client_b_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
|
| .Times(1);
|
| }
|
| {
|
| InSequence s;
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_2, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
|
| .Times(1);
|
| }
|
| base::RunLoop().RunUntilIdle();
|
| @@ -390,44 +391,39 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| // Third, fourth, and fifth buffers. Pretend they all arrive at the same time.
|
| for (int i = 0; i < kPoolSize; i++) {
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer =
|
| - device_->ReserveOutputBuffer(capture_resolution,
|
| - media::PIXEL_FORMAT_I420,
|
| + device_->ReserveOutputBuffer(capture_resolution, format,
|
| media::PIXEL_STORAGE_CPU);
|
| ASSERT_TRUE(buffer.get());
|
| memset(buffer->data(), buffer_no++, buffer->mapped_size());
|
| - video_frame = WrapI420Buffer(capture_resolution,
|
| - static_cast<uint8_t*>(buffer->data()));
|
| + video_frame = WrapBuffer(capture_resolution,
|
| + static_cast<uint8_t*>(buffer->data()), format);
|
| ASSERT_TRUE(video_frame);
|
| video_frame->metadata()->SetTimeTicks(
|
| media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
|
| device_->OnIncomingCapturedVideoFrame(std::move(buffer), video_frame);
|
| }
|
| // ReserveOutputBuffer ought to fail now, because the pool is depleted.
|
| - ASSERT_FALSE(
|
| - device_->ReserveOutputBuffer(capture_resolution,
|
| - media::PIXEL_FORMAT_I420,
|
| - media::PIXEL_STORAGE_CPU).get());
|
| + ASSERT_FALSE(device_
|
| + ->ReserveOutputBuffer(capture_resolution, format,
|
| + media::PIXEL_STORAGE_CPU)
|
| + .get());
|
|
|
| // The new client needs to be notified of the creation of |kPoolSize| buffers;
|
| // the old clients only |kPoolSize - 2|.
|
| EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize);
|
| - EXPECT_CALL(*client_b_,
|
| - DoI420BufferReady(client_b_route_2, capture_resolution))
|
| + EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2, capture_resolution))
|
| .Times(kPoolSize);
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1))
|
| .Times(kPoolSize - 2);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
|
| .Times(kPoolSize);
|
| EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2))
|
| .Times(kPoolSize - 2);
|
| - EXPECT_CALL(*client_a_,
|
| - DoI420BufferReady(client_a_route_2, capture_resolution))
|
| + EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
|
| .Times(kPoolSize);
|
| EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1))
|
| .Times(kPoolSize - 2);
|
| - EXPECT_CALL(*client_b_,
|
| - DoI420BufferReady(client_b_route_1, capture_resolution))
|
| + EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
|
| .Times(kPoolSize);
|
| base::RunLoop().RunUntilIdle();
|
| Mock::VerifyAndClearExpectations(client_a_.get());
|
| @@ -441,19 +437,19 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| controller_->StopSession(300);
|
| // Queue up another buffer.
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 =
|
| - device_->ReserveOutputBuffer(capture_resolution, media::PIXEL_FORMAT_I420,
|
| + device_->ReserveOutputBuffer(capture_resolution, format,
|
| media::PIXEL_STORAGE_CPU);
|
| ASSERT_TRUE(buffer3.get());
|
| memset(buffer3->data(), buffer_no++, buffer3->mapped_size());
|
| - video_frame = WrapI420Buffer(capture_resolution,
|
| - static_cast<uint8_t*>(buffer3->data()));
|
| + video_frame = WrapBuffer(capture_resolution,
|
| + static_cast<uint8_t*>(buffer3->data()), format);
|
| ASSERT_TRUE(video_frame);
|
| video_frame->metadata()->SetTimeTicks(
|
| media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
|
| device_->OnIncomingCapturedVideoFrame(std::move(buffer3), video_frame);
|
|
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 =
|
| - device_->ReserveOutputBuffer(capture_resolution, media::PIXEL_FORMAT_I420,
|
| + device_->ReserveOutputBuffer(capture_resolution, format,
|
| media::PIXEL_STORAGE_CPU);
|
| {
|
| // Kill A2 via session close (posts a task to disconnect, but A2 must not
|
| @@ -463,22 +459,26 @@ TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
|
| }
|
| ASSERT_TRUE(buffer4.get());
|
| memset(buffer4->data(), buffer_no++, buffer4->mapped_size());
|
| - video_frame = WrapI420Buffer(capture_resolution,
|
| - static_cast<uint8_t*>(buffer4->data()));
|
| + video_frame = WrapBuffer(capture_resolution,
|
| + static_cast<uint8_t*>(buffer4->data()), format);
|
| ASSERT_TRUE(video_frame);
|
| video_frame->metadata()->SetTimeTicks(
|
| media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
|
| device_->OnIncomingCapturedVideoFrame(std::move(buffer4), video_frame);
|
| // B2 is the only client left, and is the only one that should
|
| // get the buffer.
|
| - EXPECT_CALL(*client_b_,
|
| - DoI420BufferReady(client_b_route_2, capture_resolution))
|
| + EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2, capture_resolution))
|
| .Times(2);
|
| base::RunLoop().RunUntilIdle();
|
| Mock::VerifyAndClearExpectations(client_a_.get());
|
| Mock::VerifyAndClearExpectations(client_b_.get());
|
| }
|
|
|
| +INSTANTIATE_TEST_CASE_P(,
|
| + VideoCaptureControllerTest,
|
| + ::testing::Values(media::PIXEL_FORMAT_I420,
|
| + media::PIXEL_FORMAT_Y16));
|
| +
|
| // Exercises the OnError() codepath of VideoCaptureController, and tests the
|
| // behavior of various operations after the error state has been signalled.
|
| TEST_F(VideoCaptureControllerTest, ErrorBeforeDeviceCreation) {
|
| @@ -511,7 +511,7 @@ TEST_F(VideoCaptureControllerTest, ErrorBeforeDeviceCreation) {
|
| media::PIXEL_STORAGE_CPU));
|
| ASSERT_TRUE(buffer.get());
|
| scoped_refptr<media::VideoFrame> video_frame =
|
| - WrapI420Buffer(capture_resolution, static_cast<uint8_t*>(buffer->data()));
|
| + WrapBuffer(capture_resolution, static_cast<uint8_t*>(buffer->data()));
|
| ASSERT_TRUE(video_frame);
|
| video_frame->metadata()->SetTimeTicks(
|
| media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
|
| @@ -549,7 +549,7 @@ TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) {
|
| ASSERT_TRUE(buffer.get());
|
|
|
| scoped_refptr<media::VideoFrame> video_frame =
|
| - WrapI420Buffer(dims, static_cast<uint8_t*>(buffer->data()));
|
| + WrapBuffer(dims, static_cast<uint8_t*>(buffer->data()));
|
| ASSERT_TRUE(video_frame);
|
| device_->OnError(FROM_HERE, "Test Error");
|
| video_frame->metadata()->SetTimeTicks(
|
|
|