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

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

Issue 2607203002: [Mojo Video Capture] Retire buffers when Android Chromium goes to the background (Closed)
Patch Set: Added tests and fixed a bug uncovered by the tests. Created 3 years, 11 months 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.
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
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
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
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
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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 base::RunLoop().RunUntilIdle(); 620 base::RunLoop().RunUntilIdle();
587 Mock::VerifyAndClearExpectations(client_a_.get()); 621 Mock::VerifyAndClearExpectations(client_a_.get());
588 622
589 // Second client connects after the error state. It also should get told of 623 // Second client connects after the error state. It also should get told of
590 // the error. 624 // the error.
591 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); 625 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1);
592 controller_->AddClient(route_id, client_b_.get(), 200, session_200); 626 controller_->AddClient(route_id, client_b_.get(), 200, session_200);
593 Mock::VerifyAndClearExpectations(client_b_.get()); 627 Mock::VerifyAndClearExpectations(client_b_.get());
594 } 628 }
595 629
630 TEST_F(VideoCaptureControllerTest,
631 DeviceClientIsReleasedBeforeAnyBufferWasShared) {
632 // Register |client_a_| at |controller_|.
633 media::VideoCaptureParams requested_params;
634 requested_params.requested_format = arbitrary_format_;
635 controller_->AddClient(arbitrary_route_id_, client_a_.get(),
636 arbitrary_session_id_, requested_params);
637 base::RunLoop().RunUntilIdle();
638
639 // |device_client_| is released by the device.
640 EXPECT_CALL(*client_a_, DoBufferDestroyed(arbitrary_route_id_, _)).Times(0);
641 device_client_.reset();
642 base::RunLoop().RunUntilIdle();
643 Mock::VerifyAndClearExpectations(client_a_.get());
644 }
645
646 TEST_F(VideoCaptureControllerTest,
647 DeviceClientIsReleasedAfterFrameHasBeenConsumed) {
648 // Register |client_a_| at |controller_|.
649 media::VideoCaptureParams requested_params;
650 requested_params.requested_format = arbitrary_format_;
651 controller_->AddClient(arbitrary_route_id_, client_a_.get(),
652 arbitrary_session_id_, requested_params);
653 base::RunLoop().RunUntilIdle();
654
655 // Device sends a frame to |device_client_| and |client_a_| reports to
656 // |controller_| that it has finished consuming the frame.
657 {
658 InSequence s;
659 EXPECT_CALL(*client_a_, DoBufferCreated(_, _))
660 .Times(1);
661 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1);
662 }
663 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0);
664 SendStubFrameToDeviceClient(arbitrary_format_);
665 base::RunLoop().RunUntilIdle();
666 Mock::VerifyAndClearExpectations(client_a_.get());
667
668 // |device_client_| is released by the device.
669 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(1);
670 device_client_.reset();
671 base::RunLoop().RunUntilIdle();
672 Mock::VerifyAndClearExpectations(client_a_.get());
673 }
674
675 TEST_F(VideoCaptureControllerTest,
676 DeviceClientIsReleasedWhileFrameIsBeingConsumed) {
677 client_a_->set_enable_auto_return_buffer_on_buffer_ready(false);
678 // Register |client_a_| at |controller_|.
679 media::VideoCaptureParams requested_params;
680 requested_params.requested_format = arbitrary_format_;
681 controller_->AddClient(arbitrary_route_id_, client_a_.get(),
682 arbitrary_session_id_, requested_params);
683 base::RunLoop().RunUntilIdle();
684
685 // Device sends a frame to |device_client_|.
686 int buffer_id = 0;
687 {
688 InSequence s;
689 EXPECT_CALL(*client_a_, DoBufferCreated(_, _))
690 .Times(1)
691 .WillOnce(SaveArg<1>(&buffer_id));
692 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1);
693 }
694 SendStubFrameToDeviceClient(arbitrary_format_);
695 base::RunLoop().RunUntilIdle();
696 Mock::VerifyAndClearExpectations(client_a_.get());
697
698 // |device_client_| is released by the device.
699 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0);
700 device_client_.reset();
701 base::RunLoop().RunUntilIdle();
702 Mock::VerifyAndClearExpectations(client_a_.get());
703
704 // |client_a_| signals to |controller_| that it has finished consuming the
705 // frame.
706 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(1);
707 const double arbitrary_utilization = 0.0;
708 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(), buffer_id,
709 arbitrary_utilization);
710 base::RunLoop().RunUntilIdle();
711 Mock::VerifyAndClearExpectations(client_a_.get());
712 }
713
714 TEST_F(VideoCaptureControllerTest,
715 NewDeviceClientSendsNewBufferWhileRetiredBufferStillBeingConsumed) {
716 client_a_->set_enable_auto_return_buffer_on_buffer_ready(false);
717 // Register |client_a_| at |controller_|.
718 media::VideoCaptureParams requested_params;
719 requested_params.requested_format = arbitrary_format_;
720 controller_->AddClient(arbitrary_route_id_, client_a_.get(),
721 arbitrary_session_id_, requested_params);
722 base::RunLoop().RunUntilIdle();
723
724 // Device sends a frame to |device_client_|.
725 int first_buffer_id = 0;
726 {
727 InSequence s;
728 EXPECT_CALL(*client_a_, DoBufferCreated(_, _))
729 .Times(1)
730 .WillOnce(SaveArg<1>(&first_buffer_id));
731 EXPECT_CALL(*client_a_, DoBufferReady(_, _)).Times(1);
732 }
733 SendStubFrameToDeviceClient(arbitrary_format_);
734 base::RunLoop().RunUntilIdle();
735 Mock::VerifyAndClearExpectations(client_a_.get());
736
737 // |device_client_| is released by the device.
738 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, _)).Times(0);
739 device_client_.reset();
740 base::RunLoop().RunUntilIdle();
741 Mock::VerifyAndClearExpectations(client_a_.get());
742
743 // A new |device_client_| is created with a new buffer pool.
744 InitializeNewDeviceClientAndBufferPoolInstances();
745
746 // Device sends a frame to the new |device_client_|.
747 int second_buffer_id = 0;
748 {
749 InSequence s;
750 EXPECT_CALL(*client_a_, DoBufferCreated(_, _))
751 .Times(1)
752 .WillOnce(SaveArg<1>(&second_buffer_id));
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 EXPECT_NE(first_buffer_id, second_buffer_id);
760
761 // |client_a_| signals to |controller_| that it has finished consuming the
762 // first frame.
763 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, first_buffer_id)).Times(1);
764 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, second_buffer_id)).Times(0);
765 const double arbitrary_utilization = 0.0;
766 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(),
767 first_buffer_id, arbitrary_utilization);
768 base::RunLoop().RunUntilIdle();
769 Mock::VerifyAndClearExpectations(client_a_.get());
770
771 // |client_a_| signals to |controller_| that it has finished consuming the
772 // second frame. Since the new |device_client_| is still alive, the second
773 // buffer is expected to stay alive.
774 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, first_buffer_id)).Times(0);
775 EXPECT_CALL(*client_a_, DoBufferDestroyed(_, second_buffer_id)).Times(0);
776 controller_->ReturnBuffer(arbitrary_route_id_, client_a_.get(),
777 second_buffer_id, arbitrary_utilization);
778 base::RunLoop().RunUntilIdle();
779 Mock::VerifyAndClearExpectations(client_a_.get());
780 }
781
596 } // namespace content 782 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698