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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 DoBufferDestroyed(id); | 79 DoBufferDestroyed(id); |
80 } | 80 } |
81 void OnBufferReady(VideoCaptureControllerID id, | 81 void OnBufferReady(VideoCaptureControllerID id, |
82 int buffer_id, | 82 int buffer_id, |
83 const scoped_refptr<media::VideoFrame>& frame, | 83 const scoped_refptr<media::VideoFrame>& frame, |
84 const base::TimeTicks& timestamp) override { | 84 const base::TimeTicks& timestamp) override { |
85 if (!frame->HasTextures()) { | 85 if (!frame->HasTextures()) { |
86 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_I420); | 86 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_I420); |
87 DoI420BufferReady(id, frame->coded_size()); | 87 DoI420BufferReady(id, frame->coded_size()); |
88 base::ThreadTaskRunnerHandle::Get()->PostTask( | 88 base::ThreadTaskRunnerHandle::Get()->PostTask( |
89 FROM_HERE, base::Bind(&VideoCaptureController::ReturnBuffer, | 89 FROM_HERE, |
90 base::Unretained(controller_), id, this, | 90 base::Bind(&VideoCaptureController::ReturnBuffer, |
91 buffer_id, 0, resource_utilization_)); | 91 base::Unretained(controller_), id, this, buffer_id, 0, |
| 92 gpu::SyncToken(), resource_utilization_)); |
92 } else { | 93 } else { |
93 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_ARGB); | 94 EXPECT_EQ(frame->format(), media::PIXEL_FORMAT_ARGB); |
94 DoTextureBufferReady(id, frame->coded_size()); | 95 DoTextureBufferReady(id, frame->coded_size()); |
95 base::ThreadTaskRunnerHandle::Get()->PostTask( | 96 base::ThreadTaskRunnerHandle::Get()->PostTask( |
96 FROM_HERE, base::Bind(&VideoCaptureController::ReturnBuffer, | 97 FROM_HERE, base::Bind(&VideoCaptureController::ReturnBuffer, |
97 base::Unretained(controller_), id, this, | 98 base::Unretained(controller_), id, this, |
98 buffer_id, frame->mailbox_holder(0).sync_point, | 99 buffer_id, frame->mailbox_holder(0).sync_token, |
99 resource_utilization_)); | 100 resource_utilization_)); |
100 } | 101 } |
101 } | 102 } |
102 void OnEnded(VideoCaptureControllerID id) override { | 103 void OnEnded(VideoCaptureControllerID id) override { |
103 DoEnded(id); | 104 DoEnded(id); |
104 // OnEnded() must respond by (eventually) unregistering the client. | 105 // OnEnded() must respond by (eventually) unregistering the client. |
105 base::ThreadTaskRunnerHandle::Get()->PostTask( | 106 base::ThreadTaskRunnerHandle::Get()->PostTask( |
106 FROM_HERE, | 107 FROM_HERE, |
107 base::Bind(base::IgnoreResult(&VideoCaptureController::RemoveClient), | 108 base::Bind(base::IgnoreResult(&VideoCaptureController::RemoveClient), |
108 base::Unretained(controller_), id, this)); | 109 base::Unretained(controller_), id, this)); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 ASSERT_EQ(1, controller_->GetClientCount()) | 255 ASSERT_EQ(1, controller_->GetClientCount()) |
255 << "Removing non-existant session 200 should be a no-op."; | 256 << "Removing non-existant session 200 should be a no-op."; |
256 ASSERT_EQ(400, | 257 ASSERT_EQ(400, |
257 controller_->RemoveClient(client_b_route_2, client_b_.get())) | 258 controller_->RemoveClient(client_b_route_2, client_b_.get())) |
258 << "Removing client B/2 should return its session_id."; | 259 << "Removing client B/2 should return its session_id."; |
259 // Clients in controller: [] | 260 // Clients in controller: [] |
260 ASSERT_EQ(0, controller_->GetClientCount()) | 261 ASSERT_EQ(0, controller_->GetClientCount()) |
261 << "Client count should return to zero after all clients are gone."; | 262 << "Client count should return to zero after all clients are gone."; |
262 } | 263 } |
263 | 264 |
264 static void CacheSyncPoint(uint32* called_release_sync_point, | 265 static void CacheSyncToken(gpu::SyncToken* called_release_sync_token, |
265 uint32 release_sync_point) { | 266 const gpu::SyncToken& release_sync_token) { |
266 *called_release_sync_point = release_sync_point; | 267 *called_release_sync_token = release_sync_token; |
267 } | 268 } |
268 | 269 |
269 // This test will connect and disconnect several clients while simulating an | 270 // This test will connect and disconnect several clients while simulating an |
270 // active capture device being started and generating frames. It runs on one | 271 // active capture device being started and generating frames. It runs on one |
271 // thread and is intended to behave deterministically. | 272 // thread and is intended to behave deterministically. |
272 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) { | 273 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) { |
273 // VideoCaptureController::ReturnBuffer() uses ImageTransportFactory. | 274 // VideoCaptureController::ReturnBuffer() uses ImageTransportFactory. |
274 #if !defined(OS_ANDROID) | 275 #if !defined(OS_ANDROID) |
275 ImageTransportFactory::InitializeForUnitTests( | 276 ImageTransportFactory::InitializeForUnitTests( |
276 scoped_ptr<ImageTransportFactory>(new NoTransportImageTransportFactory)); | 277 scoped_ptr<ImageTransportFactory>(new NoTransportImageTransportFactory)); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = | 519 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = |
519 device_->ReserveOutputBuffer(capture_resolution, | 520 device_->ReserveOutputBuffer(capture_resolution, |
520 media::PIXEL_FORMAT_I420, | 521 media::PIXEL_FORMAT_I420, |
521 media::PIXEL_STORAGE_CPU); | 522 media::PIXEL_STORAGE_CPU); |
522 ASSERT_TRUE(buffer.get()); | 523 ASSERT_TRUE(buffer.get()); |
523 video_frame = | 524 video_frame = |
524 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); | 525 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); |
525 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, | 526 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, |
526 base::TimeTicks()); | 527 base::TimeTicks()); |
527 } | 528 } |
528 std::vector<uint32> mailbox_syncpoints(mailbox_buffers); | 529 std::vector<gpu::SyncToken> mailbox_synctokens(mailbox_buffers); |
529 std::vector<uint32> release_syncpoints(mailbox_buffers); | 530 std::vector<gpu::SyncToken> release_synctokens(mailbox_buffers); |
530 for (int i = 0; i < mailbox_buffers; ++i) { | 531 for (int i = 0; i < mailbox_buffers; ++i) { |
531 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = | 532 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = |
532 device_->ReserveOutputBuffer(capture_resolution, | 533 device_->ReserveOutputBuffer(capture_resolution, |
533 media::PIXEL_FORMAT_ARGB, | 534 media::PIXEL_FORMAT_ARGB, |
534 media::PIXEL_STORAGE_TEXTURE); | 535 media::PIXEL_STORAGE_TEXTURE); |
535 ASSERT_TRUE(buffer.get()); | 536 ASSERT_TRUE(buffer.get()); |
536 #if !defined(OS_ANDROID) | 537 #if !defined(OS_ANDROID) |
537 mailbox_syncpoints[i] = | 538 mailbox_synctokens[i] = gpu::SyncToken( |
538 ImageTransportFactory::GetInstance()->GetGLHelper()->InsertSyncPoint(); | 539 ImageTransportFactory::GetInstance()->GetGLHelper()->InsertSyncPoint()); |
539 #endif | 540 #endif |
540 device_->OnIncomingCapturedVideoFrame( | 541 device_->OnIncomingCapturedVideoFrame( |
541 buffer.Pass(), | 542 buffer.Pass(), |
542 WrapMailboxBuffer(gpu::MailboxHolder(gpu::Mailbox::Generate(), 0, | 543 WrapMailboxBuffer(gpu::MailboxHolder(gpu::Mailbox::Generate(), |
543 mailbox_syncpoints[i]), | 544 mailbox_synctokens[i], 0), |
544 base::Bind(&CacheSyncPoint, &release_syncpoints[i]), | 545 base::Bind(&CacheSyncToken, &release_synctokens[i]), |
545 capture_resolution), | 546 capture_resolution), |
546 base::TimeTicks()); | 547 base::TimeTicks()); |
547 } | 548 } |
548 // ReserveOutputBuffers ought to fail now regardless of buffer format, because | 549 // ReserveOutputBuffers ought to fail now regardless of buffer format, because |
549 // the pool is depleted. | 550 // the pool is depleted. |
550 ASSERT_FALSE( | 551 ASSERT_FALSE( |
551 device_->ReserveOutputBuffer(capture_resolution, | 552 device_->ReserveOutputBuffer(capture_resolution, |
552 media::PIXEL_FORMAT_I420, | 553 media::PIXEL_FORMAT_I420, |
553 media::PIXEL_STORAGE_CPU).get()); | 554 media::PIXEL_STORAGE_CPU).get()); |
554 ASSERT_FALSE( | 555 ASSERT_FALSE( |
555 device_->ReserveOutputBuffer(capture_resolution, | 556 device_->ReserveOutputBuffer(capture_resolution, |
556 media::PIXEL_FORMAT_ARGB, | 557 media::PIXEL_FORMAT_ARGB, |
557 media::PIXEL_STORAGE_TEXTURE).get()); | 558 media::PIXEL_STORAGE_TEXTURE).get()); |
558 EXPECT_CALL(*client_b_, | 559 EXPECT_CALL(*client_b_, |
559 DoI420BufferReady(client_b_route_2, capture_resolution)) | 560 DoI420BufferReady(client_b_route_2, capture_resolution)) |
560 .Times(shm_buffers); | 561 .Times(shm_buffers); |
561 EXPECT_CALL(*client_b_, | 562 EXPECT_CALL(*client_b_, |
562 DoTextureBufferReady(client_b_route_2, capture_resolution)) | 563 DoTextureBufferReady(client_b_route_2, capture_resolution)) |
563 .Times(mailbox_buffers); | 564 .Times(mailbox_buffers); |
564 #if !defined(OS_ANDROID) | 565 #if !defined(OS_ANDROID) |
565 EXPECT_CALL(*client_b_, DoBufferDestroyed(client_b_route_2)); | 566 EXPECT_CALL(*client_b_, DoBufferDestroyed(client_b_route_2)); |
566 #endif | 567 #endif |
567 base::RunLoop().RunUntilIdle(); | 568 base::RunLoop().RunUntilIdle(); |
568 for (size_t i = 0; i < mailbox_syncpoints.size(); ++i) { | 569 for (size_t i = 0; i < mailbox_synctokens.size(); ++i) { |
569 // A new release sync point must be inserted when the video frame is | 570 // A new release sync point must be inserted when the video frame is |
570 // returned to the Browser process. | 571 // returned to the Browser process. |
571 // See: MockVideoCaptureControllerEventHandler::OnMailboxBufferReady() and | 572 // See: MockVideoCaptureControllerEventHandler::OnMailboxBufferReady() and |
572 // VideoCaptureController::ReturnBuffer() | 573 // VideoCaptureController::ReturnBuffer() |
573 ASSERT_NE(mailbox_syncpoints[i], release_syncpoints[i]); | 574 ASSERT_NE(mailbox_synctokens[i], release_synctokens[i]); |
574 } | 575 } |
575 Mock::VerifyAndClearExpectations(client_b_.get()); | 576 Mock::VerifyAndClearExpectations(client_b_.get()); |
576 | 577 |
577 #if !defined(OS_ANDROID) | 578 #if !defined(OS_ANDROID) |
578 ImageTransportFactory::Terminate(); | 579 ImageTransportFactory::Terminate(); |
579 #endif | 580 #endif |
580 } | 581 } |
581 | 582 |
582 // Exercises the OnError() codepath of VideoCaptureController, and tests the | 583 // Exercises the OnError() codepath of VideoCaptureController, and tests the |
583 // behavior of various operations after the error state has been signalled. | 584 // behavior of various operations after the error state has been signalled. |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 | 663 |
663 // Second client connects after the error state. It also should get told of | 664 // Second client connects after the error state. It also should get told of |
664 // the error. | 665 // the error. |
665 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); | 666 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); |
666 controller_->AddClient( | 667 controller_->AddClient( |
667 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); | 668 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); |
668 Mock::VerifyAndClearExpectations(client_b_.get()); | 669 Mock::VerifyAndClearExpectations(client_b_.get()); |
669 } | 670 } |
670 | 671 |
671 } // namespace content | 672 } // namespace content |
OLD | NEW |