Chromium Code Reviews| 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. | |
| 6 | |
| 7 #include "content/browser/renderer_host/media/video_capture_controller.h" | 5 #include "content/browser/renderer_host/media/video_capture_controller.h" |
| 8 | 6 |
| 9 #include <stdint.h> | 7 #include <stdint.h> |
| 10 #include <string.h> | 8 #include <string.h> |
| 11 | 9 |
| 12 #include <memory> | 10 #include <memory> |
| 13 #include <string> | 11 #include <string> |
| 14 #include <utility> | 12 #include <utility> |
| 15 | 13 |
| 16 #include "base/bind.h" | 14 #include "base/bind.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 return base::MakeUnique<content::VideoCaptureGpuJpegDecoder>(decode_done_cb); | 49 return base::MakeUnique<content::VideoCaptureGpuJpegDecoder>(decode_done_cb); |
| 52 } | 50 } |
| 53 | 51 |
| 54 class MockVideoCaptureControllerEventHandler | 52 class MockVideoCaptureControllerEventHandler |
| 55 : public VideoCaptureControllerEventHandler { | 53 : public VideoCaptureControllerEventHandler { |
| 56 public: | 54 public: |
| 57 explicit MockVideoCaptureControllerEventHandler( | 55 explicit MockVideoCaptureControllerEventHandler( |
| 58 VideoCaptureController* controller) | 56 VideoCaptureController* controller) |
| 59 : controller_(controller), resource_utilization_(-1.0) {} | 57 : controller_(controller), resource_utilization_(-1.0) {} |
| 60 ~MockVideoCaptureControllerEventHandler() override {} | 58 ~MockVideoCaptureControllerEventHandler() override {} |
| 59 void set_enable_auto_return_buffer_on_buffer_ready(bool enable) { | |
| 60 enable_auto_return_buffer_on_buffer_ready_ = enable; | |
| 61 } | |
| 61 | 62 |
| 62 // These mock methods are delegated to by our fake implementation of | 63 // These mock methods are delegated to by our fake implementation of |
| 63 // VideoCaptureControllerEventHandler, to be used in EXPECT_CALL(). | 64 // VideoCaptureControllerEventHandler, to be used in EXPECT_CALL(). |
| 64 MOCK_METHOD1(DoBufferCreated, void(VideoCaptureControllerID)); | 65 MOCK_METHOD2(DoBufferCreated, void(VideoCaptureControllerID, int buffer_id)); |
| 65 MOCK_METHOD1(DoBufferDestroyed, void(VideoCaptureControllerID)); | 66 MOCK_METHOD2(DoBufferDestroyed, |
| 67 void(VideoCaptureControllerID, int buffer_id)); | |
| 66 MOCK_METHOD2(DoBufferReady, void(VideoCaptureControllerID, const gfx::Size&)); | 68 MOCK_METHOD2(DoBufferReady, void(VideoCaptureControllerID, const gfx::Size&)); |
| 67 MOCK_METHOD1(DoEnded, void(VideoCaptureControllerID)); | 69 MOCK_METHOD1(DoEnded, void(VideoCaptureControllerID)); |
| 68 MOCK_METHOD1(DoError, void(VideoCaptureControllerID)); | 70 MOCK_METHOD1(DoError, void(VideoCaptureControllerID)); |
| 69 | 71 |
| 70 void OnError(VideoCaptureControllerID id) override { DoError(id); } | 72 void OnError(VideoCaptureControllerID id) override { DoError(id); } |
| 71 void OnBufferCreated(VideoCaptureControllerID id, | 73 void OnBufferCreated(VideoCaptureControllerID id, |
| 72 mojo::ScopedSharedBufferHandle handle, | 74 mojo::ScopedSharedBufferHandle handle, |
| 73 int length, | 75 int length, |
| 74 int buffer_id) override { | 76 int buffer_id) override { |
| 75 DoBufferCreated(id); | 77 DoBufferCreated(id, buffer_id); |
| 76 } | 78 } |
| 77 void OnBufferDestroyed(VideoCaptureControllerID id, int buffer_id) override { | 79 void OnBufferDestroyed(VideoCaptureControllerID id, int buffer_id) override { |
| 78 DoBufferDestroyed(id); | 80 DoBufferDestroyed(id, buffer_id); |
| 79 } | 81 } |
| 80 void OnBufferReady(VideoCaptureControllerID id, | 82 void OnBufferReady(VideoCaptureControllerID id, |
| 81 int buffer_id, | 83 int buffer_id, |
| 82 const scoped_refptr<media::VideoFrame>& frame) override { | 84 const scoped_refptr<media::VideoFrame>& frame) override { |
| 83 EXPECT_EQ(expected_pixel_format_, frame->format()); | 85 EXPECT_EQ(expected_pixel_format_, frame->format()); |
| 84 base::TimeTicks reference_time; | 86 base::TimeTicks reference_time; |
| 85 EXPECT_TRUE(frame->metadata()->GetTimeTicks( | 87 EXPECT_TRUE(frame->metadata()->GetTimeTicks( |
| 86 media::VideoFrameMetadata::REFERENCE_TIME, &reference_time)); | 88 media::VideoFrameMetadata::REFERENCE_TIME, &reference_time)); |
| 87 DoBufferReady(id, frame->coded_size()); | 89 DoBufferReady(id, frame->coded_size()); |
| 88 base::ThreadTaskRunnerHandle::Get()->PostTask( | 90 if (enable_auto_return_buffer_on_buffer_ready_) { |
| 89 FROM_HERE, base::Bind(&VideoCaptureController::ReturnBuffer, | 91 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 90 base::Unretained(controller_), id, this, | 92 FROM_HERE, base::Bind(&VideoCaptureController::ReturnBuffer, |
| 91 buffer_id, resource_utilization_)); | 93 base::Unretained(controller_), id, this, |
| 94 buffer_id, resource_utilization_)); | |
| 95 } | |
| 92 } | 96 } |
| 93 void OnEnded(VideoCaptureControllerID id) override { | 97 void OnEnded(VideoCaptureControllerID id) override { |
| 94 DoEnded(id); | 98 DoEnded(id); |
| 95 // OnEnded() must respond by (eventually) unregistering the client. | 99 // OnEnded() must respond by (eventually) unregistering the client. |
| 96 base::ThreadTaskRunnerHandle::Get()->PostTask( | 100 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 97 FROM_HERE, | 101 FROM_HERE, |
| 98 base::Bind(base::IgnoreResult(&VideoCaptureController::RemoveClient), | 102 base::Bind(base::IgnoreResult(&VideoCaptureController::RemoveClient), |
| 99 base::Unretained(controller_), id, this)); | 103 base::Unretained(controller_), id, this)); |
| 100 } | 104 } |
| 101 | 105 |
| 102 VideoCaptureController* controller_; | 106 VideoCaptureController* controller_; |
| 103 media::VideoPixelFormat expected_pixel_format_ = media::PIXEL_FORMAT_I420; | 107 media::VideoPixelFormat expected_pixel_format_ = media::PIXEL_FORMAT_I420; |
| 104 double resource_utilization_; | 108 double resource_utilization_; |
| 109 bool enable_auto_return_buffer_on_buffer_ready_ = true; | |
| 105 }; | 110 }; |
| 106 | 111 |
| 107 class MockConsumerFeedbackObserver | 112 class MockConsumerFeedbackObserver |
| 108 : public media::VideoFrameConsumerFeedbackObserver { | 113 : public media::VideoFrameConsumerFeedbackObserver { |
| 109 public: | 114 public: |
| 110 MOCK_METHOD2(OnUtilizationReport, | 115 MOCK_METHOD2(OnUtilizationReport, |
| 111 void(int frame_feedback_id, double utilization)); | 116 void(int frame_feedback_id, double utilization)); |
| 112 }; | 117 }; |
| 113 | 118 |
| 114 class MockFrameBufferPool : public media::FrameBufferPool { | 119 class MockFrameBufferPool : public media::FrameBufferPool { |
| 115 public: | 120 public: |
| 116 MOCK_METHOD1(SetBufferHold, void(int buffer_id)); | 121 MOCK_METHOD1(SetBufferHold, void(int buffer_id)); |
| 117 MOCK_METHOD1(ReleaseBufferHold, void(int buffer_id)); | 122 MOCK_METHOD1(ReleaseBufferHold, void(int buffer_id)); |
| 118 }; | 123 }; |
| 119 | 124 |
| 120 // Test class. | 125 // Test fixture for testing a unit consisting of an instance of |
| 126 // VideoCaptureController connected to an instance of VideoCaptureDeviceClient, | |
| 127 // an instance of VideoCaptureBufferPoolImpl, as well as related threading glue | |
| 128 // that replicates how it is used in production. | |
| 121 class VideoCaptureControllerTest | 129 class VideoCaptureControllerTest |
| 122 : public testing::Test, | 130 : public testing::Test, |
| 123 public testing::WithParamInterface<media::VideoPixelFormat> { | 131 public testing::WithParamInterface<media::VideoPixelFormat> { |
| 124 public: | 132 public: |
| 125 VideoCaptureControllerTest() {} | 133 VideoCaptureControllerTest() |
| 134 : arbitrary_format_(gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420), | |
| 135 arbitrary_route_id_(0x99), | |
| 136 arbitrary_session_id_(100) {} | |
| 126 ~VideoCaptureControllerTest() override {} | 137 ~VideoCaptureControllerTest() override {} |
| 127 | 138 |
| 128 protected: | 139 protected: |
| 129 static const int kPoolSize = 3; | 140 static const int kPoolSize = 3; |
| 130 | 141 |
| 131 void SetUp() override { | 142 void SetUp() override { |
| 132 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool( | |
| 133 new media::VideoCaptureBufferPoolImpl( | |
| 134 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), | |
| 135 kPoolSize)); | |
| 136 controller_.reset(new VideoCaptureController()); | 143 controller_.reset(new VideoCaptureController()); |
| 137 device_client_.reset(new media::VideoCaptureDeviceClient( | 144 InitializeNewDeviceClientAndBufferPoolInstances(); |
| 138 base::MakeUnique<VideoFrameReceiverOnIOThread>( | |
| 139 controller_->GetWeakPtrForIOThread()), | |
| 140 buffer_pool, | |
| 141 base::Bind( | |
| 142 &CreateGpuJpegDecoder, | |
| 143 base::Bind(&media::VideoFrameReceiver::OnIncomingCapturedVideoFrame, | |
| 144 controller_->GetWeakPtrForIOThread())))); | |
| 145 auto frame_receiver_observer = base::MakeUnique<MockFrameBufferPool>(); | 145 auto frame_receiver_observer = base::MakeUnique<MockFrameBufferPool>(); |
| 146 mock_frame_receiver_observer_ = frame_receiver_observer.get(); | 146 mock_frame_receiver_observer_ = frame_receiver_observer.get(); |
| 147 controller_->SetFrameBufferPool(std::move(frame_receiver_observer)); | 147 controller_->SetFrameBufferPool(std::move(frame_receiver_observer)); |
| 148 auto consumer_feedback_observer = | 148 auto consumer_feedback_observer = |
| 149 base::MakeUnique<MockConsumerFeedbackObserver>(); | 149 base::MakeUnique<MockConsumerFeedbackObserver>(); |
| 150 mock_consumer_feedback_observer_ = consumer_feedback_observer.get(); | 150 mock_consumer_feedback_observer_ = consumer_feedback_observer.get(); |
| 151 controller_->SetConsumerFeedbackObserver( | 151 controller_->SetConsumerFeedbackObserver( |
| 152 std::move(consumer_feedback_observer)); | 152 std::move(consumer_feedback_observer)); |
| 153 client_a_.reset( | 153 client_a_.reset( |
| 154 new MockVideoCaptureControllerEventHandler(controller_.get())); | 154 new MockVideoCaptureControllerEventHandler(controller_.get())); |
| 155 client_b_.reset( | 155 client_b_.reset( |
| 156 new MockVideoCaptureControllerEventHandler(controller_.get())); | 156 new MockVideoCaptureControllerEventHandler(controller_.get())); |
| 157 } | 157 } |
| 158 | 158 |
| 159 void TearDown() override { base::RunLoop().RunUntilIdle(); } | 159 void TearDown() override { base::RunLoop().RunUntilIdle(); } |
| 160 | 160 |
| 161 void InitializeNewDeviceClientAndBufferPoolInstances() { | |
| 162 buffer_pool_ = new media::VideoCaptureBufferPoolImpl( | |
| 163 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), | |
| 164 kPoolSize); | |
| 165 device_client_.reset(new media::VideoCaptureDeviceClient( | |
| 166 base::MakeUnique<VideoFrameReceiverOnIOThread>( | |
| 167 controller_->GetWeakPtrForIOThread()), | |
| 168 buffer_pool_, | |
| 169 base::Bind( | |
| 170 &CreateGpuJpegDecoder, | |
| 171 base::Bind(&media::VideoFrameReceiver::OnIncomingCapturedVideoFrame, | |
| 172 controller_->GetWeakPtrForIOThread())))); | |
| 173 } | |
| 174 | |
| 175 void SendStubFrameToDeviceClient(const media::VideoCaptureFormat format) { | |
| 176 auto stub_frame = media::VideoFrame::CreateZeroInitializedFrame( | |
| 177 format.pixel_format, format.frame_size, | |
| 178 gfx::Rect(format.frame_size.width(), format.frame_size.height()), | |
| 179 format.frame_size, base::TimeDelta()); | |
| 180 const int rotation = 0; | |
| 181 const int frame_feedback_id = 0; | |
| 182 device_client_->OnIncomingCapturedData( | |
| 183 stub_frame->data(0), | |
| 184 media::VideoFrame::AllocationSize(stub_frame->format(), | |
| 185 stub_frame->coded_size()), | |
| 186 format, rotation, base::TimeTicks(), base::TimeDelta(), | |
| 187 frame_feedback_id); | |
| 188 } | |
| 189 | |
| 161 TestBrowserThreadBundle bundle_; | 190 TestBrowserThreadBundle bundle_; |
| 191 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool_; | |
| 162 std::unique_ptr<MockVideoCaptureControllerEventHandler> client_a_; | 192 std::unique_ptr<MockVideoCaptureControllerEventHandler> client_a_; |
| 163 std::unique_ptr<MockVideoCaptureControllerEventHandler> client_b_; | 193 std::unique_ptr<MockVideoCaptureControllerEventHandler> client_b_; |
| 164 std::unique_ptr<VideoCaptureController> controller_; | 194 std::unique_ptr<VideoCaptureController> controller_; |
| 165 std::unique_ptr<media::VideoCaptureDevice::Client> device_client_; | 195 std::unique_ptr<media::VideoCaptureDevice::Client> device_client_; |
| 166 MockFrameBufferPool* mock_frame_receiver_observer_; | 196 MockFrameBufferPool* mock_frame_receiver_observer_; |
| 167 MockConsumerFeedbackObserver* mock_consumer_feedback_observer_; | 197 MockConsumerFeedbackObserver* mock_consumer_feedback_observer_; |
| 168 const float arbitrary_frame_rate_ = 10.0f; | 198 const float arbitrary_frame_rate_ = 10.0f; |
| 169 const base::TimeTicks arbitrary_reference_time_ = base::TimeTicks(); | 199 const base::TimeTicks arbitrary_reference_time_ = base::TimeTicks(); |
| 170 const base::TimeDelta arbitrary_timestamp_ = base::TimeDelta(); | 200 const base::TimeDelta arbitrary_timestamp_ = base::TimeDelta(); |
| 201 const media::VideoCaptureFormat arbitrary_format_; | |
| 202 const VideoCaptureControllerID arbitrary_route_id_; | |
| 203 const media::VideoCaptureSessionId arbitrary_session_id_; | |
| 171 | 204 |
| 172 private: | 205 private: |
| 173 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest); | 206 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest); |
| 174 }; | 207 }; |
| 175 | 208 |
| 176 // A simple test of VideoCaptureController's ability to add, remove, and keep | 209 // A simple test of VideoCaptureController's ability to add, remove, and keep |
| 177 // track of clients. | 210 // track of clients. |
| 178 TEST_F(VideoCaptureControllerTest, AddAndRemoveClients) { | 211 TEST_F(VideoCaptureControllerTest, AddAndRemoveClients) { |
| 179 media::VideoCaptureParams session_100; | 212 media::VideoCaptureParams session_100; |
| 180 session_100.requested_format = media::VideoCaptureFormat( | 213 session_100.requested_format = media::VideoCaptureFormat( |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 292 media::VideoCaptureDevice::Client::Buffer buffer = | 325 media::VideoCaptureDevice::Client::Buffer buffer = |
| 293 device_client_->ReserveOutputBuffer( | 326 device_client_->ReserveOutputBuffer( |
| 294 device_format.frame_size, device_format.pixel_format, | 327 device_format.frame_size, device_format.pixel_format, |
| 295 device_format.pixel_storage, arbitrary_frame_feedback_id); | 328 device_format.pixel_storage, arbitrary_frame_feedback_id); |
| 296 ASSERT_TRUE(buffer.is_valid()); | 329 ASSERT_TRUE(buffer.is_valid()); |
| 297 auto buffer_access = buffer.handle_provider()->GetHandleForInProcessAccess(); | 330 auto buffer_access = buffer.handle_provider()->GetHandleForInProcessAccess(); |
| 298 ASSERT_EQ(1.0 / kPoolSize, device_client_->GetBufferPoolUtilization()); | 331 ASSERT_EQ(1.0 / kPoolSize, device_client_->GetBufferPoolUtilization()); |
| 299 memset(buffer_access->data(), buffer_no++, buffer_access->mapped_size()); | 332 memset(buffer_access->data(), buffer_no++, buffer_access->mapped_size()); |
| 300 { | 333 { |
| 301 InSequence s; | 334 InSequence s; |
| 302 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1); | 335 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1, _)).Times(1); |
| 303 EXPECT_CALL(*client_a_, | 336 EXPECT_CALL(*client_a_, |
| 304 DoBufferReady(client_a_route_1, device_format.frame_size)) | 337 DoBufferReady(client_a_route_1, device_format.frame_size)) |
| 305 .Times(1); | 338 .Times(1); |
| 306 } | 339 } |
| 307 { | 340 { |
| 308 InSequence s; | 341 InSequence s; |
| 309 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1); | 342 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1, _)).Times(1); |
| 310 EXPECT_CALL(*client_b_, | 343 EXPECT_CALL(*client_b_, |
| 311 DoBufferReady(client_b_route_1, device_format.frame_size)) | 344 DoBufferReady(client_b_route_1, device_format.frame_size)) |
| 312 .Times(1); | 345 .Times(1); |
| 313 } | 346 } |
| 314 { | 347 { |
| 315 InSequence s; | 348 InSequence s; |
| 316 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1); | 349 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2, _)).Times(1); |
| 317 EXPECT_CALL(*client_a_, | 350 EXPECT_CALL(*client_a_, |
| 318 DoBufferReady(client_a_route_2, device_format.frame_size)) | 351 DoBufferReady(client_a_route_2, device_format.frame_size)) |
| 319 .Times(1); | 352 .Times(1); |
| 320 } | 353 } |
| 321 client_a_->resource_utilization_ = 0.5; | 354 client_a_->resource_utilization_ = 0.5; |
| 322 client_b_->resource_utilization_ = -1.0; | 355 client_b_->resource_utilization_ = -1.0; |
| 323 { | 356 { |
| 324 InSequence s; | 357 InSequence s; |
| 325 EXPECT_CALL(*mock_frame_receiver_observer_, SetBufferHold(buffer.id())) | 358 EXPECT_CALL(*mock_frame_receiver_observer_, SetBufferHold(buffer.id())) |
| 326 .Times(1); | 359 .Times(1); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 372 .Times(1); | 405 .Times(1); |
| 373 } | 406 } |
| 374 | 407 |
| 375 device_client_->OnIncomingCapturedBuffer(std::move(buffer2), device_format, | 408 device_client_->OnIncomingCapturedBuffer(std::move(buffer2), device_format, |
| 376 arbitrary_reference_time_, | 409 arbitrary_reference_time_, |
| 377 arbitrary_timestamp_); | 410 arbitrary_timestamp_); |
| 378 | 411 |
| 379 // The buffer should be delivered to the clients in any order. | 412 // The buffer should be delivered to the clients in any order. |
| 380 { | 413 { |
| 381 InSequence s; | 414 InSequence s; |
| 382 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1); | 415 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1, _)).Times(1); |
| 383 EXPECT_CALL(*client_a_, | 416 EXPECT_CALL(*client_a_, |
| 384 DoBufferReady(client_a_route_1, device_format.frame_size)) | 417 DoBufferReady(client_a_route_1, device_format.frame_size)) |
| 385 .Times(1); | 418 .Times(1); |
| 386 } | 419 } |
| 387 { | 420 { |
| 388 InSequence s; | 421 InSequence s; |
| 389 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1); | 422 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1, _)).Times(1); |
| 390 EXPECT_CALL(*client_b_, | 423 EXPECT_CALL(*client_b_, |
| 391 DoBufferReady(client_b_route_1, device_format.frame_size)) | 424 DoBufferReady(client_b_route_1, device_format.frame_size)) |
| 392 .Times(1); | 425 .Times(1); |
| 393 } | 426 } |
| 394 { | 427 { |
| 395 InSequence s; | 428 InSequence s; |
| 396 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1); | 429 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2, _)).Times(1); |
| 397 EXPECT_CALL(*client_a_, | 430 EXPECT_CALL(*client_a_, |
| 398 DoBufferReady(client_a_route_2, device_format.frame_size)) | 431 DoBufferReady(client_a_route_2, device_format.frame_size)) |
| 399 .Times(1); | 432 .Times(1); |
| 400 } | 433 } |
| 401 base::RunLoop().RunUntilIdle(); | 434 base::RunLoop().RunUntilIdle(); |
| 402 Mock::VerifyAndClearExpectations(client_a_.get()); | 435 Mock::VerifyAndClearExpectations(client_a_.get()); |
| 403 Mock::VerifyAndClearExpectations(client_b_.get()); | 436 Mock::VerifyAndClearExpectations(client_b_.get()); |
| 404 Mock::VerifyAndClearExpectations(mock_consumer_feedback_observer_); | 437 Mock::VerifyAndClearExpectations(mock_consumer_feedback_observer_); |
| 405 Mock::VerifyAndClearExpectations(mock_frame_receiver_observer_); | 438 Mock::VerifyAndClearExpectations(mock_frame_receiver_observer_); |
| 406 | 439 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 425 } | 458 } |
| 426 // ReserveOutputBuffer ought to fail now, because the pool is depleted. | 459 // ReserveOutputBuffer ought to fail now, because the pool is depleted. |
| 427 ASSERT_FALSE(device_client_ | 460 ASSERT_FALSE(device_client_ |
| 428 ->ReserveOutputBuffer( | 461 ->ReserveOutputBuffer( |
| 429 device_format.frame_size, device_format.pixel_format, | 462 device_format.frame_size, device_format.pixel_format, |
| 430 device_format.pixel_storage, arbitrary_frame_feedback_id) | 463 device_format.pixel_storage, arbitrary_frame_feedback_id) |
| 431 .is_valid()); | 464 .is_valid()); |
| 432 | 465 |
| 433 // The new client needs to be notified of the creation of |kPoolSize| buffers; | 466 // The new client needs to be notified of the creation of |kPoolSize| buffers; |
| 434 // the old clients only |kPoolSize - 2|. | 467 // the old clients only |kPoolSize - 2|. |
| 435 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize); | 468 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2, _)) |
| 469 .Times(kPoolSize); | |
| 436 EXPECT_CALL(*client_b_, | 470 EXPECT_CALL(*client_b_, |
| 437 DoBufferReady(client_b_route_2, device_format.frame_size)) | 471 DoBufferReady(client_b_route_2, device_format.frame_size)) |
| 438 .Times(kPoolSize); | 472 .Times(kPoolSize); |
| 439 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)) | 473 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1, _)) |
| 440 .Times(kPoolSize - 2); | 474 .Times(kPoolSize - 2); |
| 441 EXPECT_CALL(*client_a_, | 475 EXPECT_CALL(*client_a_, |
| 442 DoBufferReady(client_a_route_1, device_format.frame_size)) | 476 DoBufferReady(client_a_route_1, device_format.frame_size)) |
| 443 .Times(kPoolSize); | 477 .Times(kPoolSize); |
| 444 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)) | 478 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2, _)) |
| 445 .Times(kPoolSize - 2); | 479 .Times(kPoolSize - 2); |
| 446 EXPECT_CALL(*client_a_, | 480 EXPECT_CALL(*client_a_, |
| 447 DoBufferReady(client_a_route_2, device_format.frame_size)) | 481 DoBufferReady(client_a_route_2, device_format.frame_size)) |
| 448 .Times(kPoolSize); | 482 .Times(kPoolSize); |
| 449 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)) | 483 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1, _)) |
| 450 .Times(kPoolSize - 2); | 484 .Times(kPoolSize - 2); |
| 451 EXPECT_CALL(*client_b_, | 485 EXPECT_CALL(*client_b_, |
| 452 DoBufferReady(client_b_route_1, device_format.frame_size)) | 486 DoBufferReady(client_b_route_1, device_format.frame_size)) |
| 453 .Times(kPoolSize); | 487 .Times(kPoolSize); |
| 454 base::RunLoop().RunUntilIdle(); | 488 base::RunLoop().RunUntilIdle(); |
| 455 Mock::VerifyAndClearExpectations(client_a_.get()); | 489 Mock::VerifyAndClearExpectations(client_a_.get()); |
| 456 Mock::VerifyAndClearExpectations(client_b_.get()); | 490 Mock::VerifyAndClearExpectations(client_b_.get()); |
| 457 | 491 |
| 458 // Now test the interaction of client shutdown and buffer delivery. | 492 // Now test the interaction of client shutdown and buffer delivery. |
| 459 // Kill A1 via renderer disconnect (synchronous). | 493 // Kill A1 via renderer disconnect (synchronous). |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 644 device_client_->OnIncomingCapturedBuffer( | 678 device_client_->OnIncomingCapturedBuffer( |
| 645 std::move(buffer), arbitrary_format, arbitrary_reference_time_, | 679 std::move(buffer), arbitrary_format, arbitrary_reference_time_, |
| 646 arbitrary_timestamp_); | 680 arbitrary_timestamp_); |
| 647 | 681 |
| 648 base::RunLoop().RunUntilIdle(); | 682 base::RunLoop().RunUntilIdle(); |
| 649 Mock::VerifyAndClearExpectations(client_a_.get()); | 683 Mock::VerifyAndClearExpectations(client_a_.get()); |
| 650 Mock::VerifyAndClearExpectations(mock_consumer_feedback_observer_); | 684 Mock::VerifyAndClearExpectations(mock_consumer_feedback_observer_); |
| 651 } | 685 } |
| 652 } | 686 } |
| 653 | 687 |
| 688 TEST_F(VideoCaptureControllerTest, | |
| 689 DeviceClientIsReleasedBeforeAnyBufferWasShared) { | |
| 690 // Register |client_a_| at |controller_|. | |
| 691 media::VideoCaptureParams requested_params; | |
| 692 requested_params.requested_format = arbitrary_format_; | |
| 693 controller_->AddClient(arbitrary_route_id_, client_a_.get(), | |
| 694 arbitrary_session_id_, requested_params); | |
| 695 base::RunLoop().RunUntilIdle(); | |
| 696 | |
| 697 // |device_client_| is released by the device. | |
| 698 EXPECT_CALL(*client_a_, DoBufferDestroyed(arbitrary_route_id_, _)).Times(0); | |
| 699 device_client_.reset(); | |
| 700 base::RunLoop().RunUntilIdle(); | |
| 701 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 702 } | |
| 703 | |
| 704 TEST_F(VideoCaptureControllerTest, | |
| 705 DeviceClientIsReleasedAfterFrameHasBeenConsumed) { | |
| 706 // Register |client_a_| at |controller_|. | |
| 707 media::VideoCaptureParams requested_params; | |
| 708 requested_params.requested_format = arbitrary_format_; | |
| 709 controller_->AddClient(arbitrary_route_id_, client_a_.get(), | |
| 710 arbitrary_session_id_, requested_params); | |
| 711 base::RunLoop().RunUntilIdle(); | |
| 712 | |
| 713 // Device sends a frame to |device_client_| and |client_a_| reports to | |
| 714 // |controller_| that it has finished consuming the frame. | |
| 715 int buffer_id_reported_to_client = -1; | |
| 716 { | |
| 717 InSequence s; | |
| 718 EXPECT_CALL(*client_a_, DoBufferCreated(_, _)) | |
| 719 .Times(1) | |
| 720 .WillOnce(SaveArg<1>(&buffer_id_reported_to_client)); | |
| 721 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1); | |
| 722 } | |
| 723 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0); | |
| 724 SendStubFrameToDeviceClient(arbitrary_format_); | |
| 725 base::RunLoop().RunUntilIdle(); | |
| 726 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 727 | |
| 728 // |device_client_| is released by the device. | |
| 729 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, buffer_id_reported_to_client)) | |
| 730 .Times(1); | |
|
mcasas
2017/02/03 23:24:22
.Times(1) is superfluous since it's the default va
chfremer
2017/02/06 18:16:35
Done.
| |
| 731 device_client_.reset(); | |
| 732 base::RunLoop().RunUntilIdle(); | |
| 733 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 734 } | |
| 735 | |
| 736 TEST_F(VideoCaptureControllerTest, | |
| 737 DeviceClientIsReleasedWhileFrameIsBeingConsumed) { | |
| 738 client_a_->set_enable_auto_return_buffer_on_buffer_ready(false); | |
| 739 // Register |client_a_| at |controller_|. | |
| 740 media::VideoCaptureParams requested_params; | |
| 741 requested_params.requested_format = arbitrary_format_; | |
| 742 controller_->AddClient(arbitrary_route_id_, client_a_.get(), | |
| 743 arbitrary_session_id_, requested_params); | |
| 744 base::RunLoop().RunUntilIdle(); | |
| 745 | |
| 746 // Device sends a frame to |device_client_|. | |
| 747 int buffer_id_reported_to_client = -1; | |
|
mcasas
2017/02/03 23:24:22
Should we s/-1/media::VideoCaptureBufferPool::kInv
chfremer
2017/02/06 18:16:35
Done.
| |
| 748 { | |
| 749 InSequence s; | |
| 750 EXPECT_CALL(*client_a_, DoBufferCreated(_, _)) | |
| 751 .Times(1) | |
| 752 .WillOnce(SaveArg<1>(&buffer_id_reported_to_client)); | |
| 753 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1); | |
| 754 } | |
| 755 SendStubFrameToDeviceClient(arbitrary_format_); | |
| 756 base::RunLoop().RunUntilIdle(); | |
| 757 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 758 | |
| 759 // |device_client_| is released by the device. | |
| 760 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0); | |
| 761 device_client_.reset(); | |
| 762 base::RunLoop().RunUntilIdle(); | |
| 763 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 764 | |
| 765 // |client_a_| signals to |controller_| that it has finished consuming the | |
| 766 // frame. | |
| 767 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(1); | |
| 768 const double arbitrary_utilization = 0.0; | |
| 769 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(), | |
| 770 buffer_id_reported_to_client, | |
| 771 arbitrary_utilization); | |
| 772 base::RunLoop().RunUntilIdle(); | |
| 773 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 774 } | |
| 775 | |
| 776 TEST_F(VideoCaptureControllerTest, | |
| 777 NewDeviceClientSendsNewBufferWhileRetiredBufferStillBeingConsumed) { | |
| 778 client_a_->set_enable_auto_return_buffer_on_buffer_ready(false); | |
| 779 // Register |client_a_| at |controller_|. | |
| 780 media::VideoCaptureParams requested_params; | |
| 781 requested_params.requested_format = arbitrary_format_; | |
| 782 controller_->AddClient(arbitrary_route_id_, client_a_.get(), | |
| 783 arbitrary_session_id_, requested_params); | |
| 784 base::RunLoop().RunUntilIdle(); | |
| 785 | |
| 786 // Device sends a frame to |device_client_|. | |
| 787 int first_buffer_id = -1; | |
| 788 { | |
| 789 InSequence s; | |
| 790 EXPECT_CALL(*client_a_, DoBufferCreated(_, _)) | |
| 791 .Times(1) | |
| 792 .WillOnce(SaveArg<1>(&first_buffer_id)); | |
| 793 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1); | |
| 794 } | |
| 795 SendStubFrameToDeviceClient(arbitrary_format_); | |
| 796 base::RunLoop().RunUntilIdle(); | |
| 797 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 798 | |
| 799 // |device_client_| is released by the device. | |
| 800 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0); | |
| 801 device_client_.reset(); | |
| 802 base::RunLoop().RunUntilIdle(); | |
| 803 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 804 | |
| 805 // A new |device_client_| is created with a new buffer pool. | |
| 806 InitializeNewDeviceClientAndBufferPoolInstances(); | |
| 807 | |
| 808 // Device sends a frame to the new |device_client_|. | |
| 809 int second_buffer_id = -1; | |
| 810 { | |
| 811 InSequence s; | |
| 812 EXPECT_CALL(*client_a_, DoBufferCreated(_, _)) | |
| 813 .Times(1) | |
| 814 .WillOnce(SaveArg<1>(&second_buffer_id)); | |
| 815 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1); | |
| 816 } | |
| 817 SendStubFrameToDeviceClient(arbitrary_format_); | |
| 818 base::RunLoop().RunUntilIdle(); | |
| 819 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 820 | |
| 821 EXPECT_NE(first_buffer_id, second_buffer_id); | |
| 822 | |
| 823 // |client_a_| signals to |controller_| that it has finished consuming the | |
| 824 // first frame. | |
| 825 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, first_buffer_id)).Times(1); | |
| 826 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, second_buffer_id)).Times(0); | |
| 827 const double arbitrary_utilization = 0.0; | |
| 828 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(), | |
| 829 first_buffer_id, arbitrary_utilization); | |
| 830 base::RunLoop().RunUntilIdle(); | |
| 831 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 832 | |
| 833 // |client_a_| signals to |controller_| that it has finished consuming the | |
| 834 // second frame. Since the new |device_client_| is still alive, the second | |
| 835 // buffer is expected to stay alive. | |
| 836 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, first_buffer_id)).Times(0); | |
| 837 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, second_buffer_id)).Times(0); | |
| 838 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(), | |
| 839 second_buffer_id, arbitrary_utilization); | |
| 840 base::RunLoop().RunUntilIdle(); | |
| 841 Mock::VerifyAndClearExpectations(client_a_.get()); | |
| 842 } | |
| 843 | |
| 654 } // namespace content | 844 } // namespace content |
| OLD | NEW |