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

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

Issue 1427543002: Modified old wait sync point functions to also accept new sync tokens. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: format Created 5 years, 1 month 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. 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
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,
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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 ASSERT_EQ(1, controller_->GetClientCount()) 254 ASSERT_EQ(1, controller_->GetClientCount())
254 << "Removing non-existant session 200 should be a no-op."; 255 << "Removing non-existant session 200 should be a no-op.";
255 ASSERT_EQ(400, 256 ASSERT_EQ(400,
256 controller_->RemoveClient(client_b_route_2, client_b_.get())) 257 controller_->RemoveClient(client_b_route_2, client_b_.get()))
257 << "Removing client B/2 should return its session_id."; 258 << "Removing client B/2 should return its session_id.";
258 // Clients in controller: [] 259 // Clients in controller: []
259 ASSERT_EQ(0, controller_->GetClientCount()) 260 ASSERT_EQ(0, controller_->GetClientCount())
260 << "Client count should return to zero after all clients are gone."; 261 << "Client count should return to zero after all clients are gone.";
261 } 262 }
262 263
263 static void CacheSyncPoint(uint32* called_release_sync_point, 264 static void CacheSyncToken(gpu::SyncToken* called_release_sync_token,
264 uint32 release_sync_point) { 265 const gpu::SyncToken& release_sync_token) {
265 *called_release_sync_point = release_sync_point; 266 *called_release_sync_token = release_sync_token;
266 } 267 }
267 268
268 // This test will connect and disconnect several clients while simulating an 269 // This test will connect and disconnect several clients while simulating an
269 // active capture device being started and generating frames. It runs on one 270 // active capture device being started and generating frames. It runs on one
270 // thread and is intended to behave deterministically. 271 // thread and is intended to behave deterministically.
271 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) { 272 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) {
272 // VideoCaptureController::ReturnBuffer() uses ImageTransportFactory. 273 // VideoCaptureController::ReturnBuffer() uses ImageTransportFactory.
273 #if !defined(OS_ANDROID) 274 #if !defined(OS_ANDROID)
274 ImageTransportFactory::InitializeForUnitTests( 275 ImageTransportFactory::InitializeForUnitTests(
275 scoped_ptr<ImageTransportFactory>(new NoTransportImageTransportFactory)); 276 scoped_ptr<ImageTransportFactory>(new NoTransportImageTransportFactory));
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = 518 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer =
518 device_->ReserveOutputBuffer(capture_resolution, 519 device_->ReserveOutputBuffer(capture_resolution,
519 media::PIXEL_FORMAT_I420, 520 media::PIXEL_FORMAT_I420,
520 media::PIXEL_STORAGE_CPU); 521 media::PIXEL_STORAGE_CPU);
521 ASSERT_TRUE(buffer.get()); 522 ASSERT_TRUE(buffer.get());
522 video_frame = 523 video_frame =
523 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data())); 524 WrapI420Buffer(capture_resolution, static_cast<uint8*>(buffer->data()));
524 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame, 525 device_->OnIncomingCapturedVideoFrame(buffer.Pass(), video_frame,
525 base::TimeTicks()); 526 base::TimeTicks());
526 } 527 }
527 std::vector<uint32> mailbox_syncpoints(mailbox_buffers); 528 std::vector<gpu::SyncToken> mailbox_synctokens(mailbox_buffers);
528 std::vector<uint32> release_syncpoints(mailbox_buffers); 529 std::vector<gpu::SyncToken> release_synctokens(mailbox_buffers);
529 for (int i = 0; i < mailbox_buffers; ++i) { 530 for (int i = 0; i < mailbox_buffers; ++i) {
530 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer = 531 scoped_ptr<media::VideoCaptureDevice::Client::Buffer> buffer =
531 device_->ReserveOutputBuffer(capture_resolution, 532 device_->ReserveOutputBuffer(capture_resolution,
532 media::PIXEL_FORMAT_ARGB, 533 media::PIXEL_FORMAT_ARGB,
533 media::PIXEL_STORAGE_TEXTURE); 534 media::PIXEL_STORAGE_TEXTURE);
534 ASSERT_TRUE(buffer.get()); 535 ASSERT_TRUE(buffer.get());
535 #if !defined(OS_ANDROID) 536 #if !defined(OS_ANDROID)
536 mailbox_syncpoints[i] = 537 mailbox_synctokens[i] = gpu::SyncToken(
537 ImageTransportFactory::GetInstance()->GetGLHelper()->InsertSyncPoint(); 538 ImageTransportFactory::GetInstance()->GetGLHelper()->InsertSyncPoint());
538 #endif 539 #endif
539 device_->OnIncomingCapturedVideoFrame( 540 device_->OnIncomingCapturedVideoFrame(
540 buffer.Pass(), 541 buffer.Pass(),
541 WrapMailboxBuffer(gpu::MailboxHolder(gpu::Mailbox::Generate(), 0, 542 WrapMailboxBuffer(gpu::MailboxHolder(gpu::Mailbox::Generate(),
542 mailbox_syncpoints[i]), 543 mailbox_synctokens[i], 0),
543 base::Bind(&CacheSyncPoint, &release_syncpoints[i]), 544 base::Bind(&CacheSyncToken, &release_synctokens[i]),
544 capture_resolution), 545 capture_resolution),
545 base::TimeTicks()); 546 base::TimeTicks());
546 } 547 }
547 // ReserveOutputBuffers ought to fail now regardless of buffer format, because 548 // ReserveOutputBuffers ought to fail now regardless of buffer format, because
548 // the pool is depleted. 549 // the pool is depleted.
549 ASSERT_FALSE( 550 ASSERT_FALSE(
550 device_->ReserveOutputBuffer(capture_resolution, 551 device_->ReserveOutputBuffer(capture_resolution,
551 media::PIXEL_FORMAT_I420, 552 media::PIXEL_FORMAT_I420,
552 media::PIXEL_STORAGE_CPU).get()); 553 media::PIXEL_STORAGE_CPU).get());
553 ASSERT_FALSE( 554 ASSERT_FALSE(
554 device_->ReserveOutputBuffer(capture_resolution, 555 device_->ReserveOutputBuffer(capture_resolution,
555 media::PIXEL_FORMAT_ARGB, 556 media::PIXEL_FORMAT_ARGB,
556 media::PIXEL_STORAGE_TEXTURE).get()); 557 media::PIXEL_STORAGE_TEXTURE).get());
557 EXPECT_CALL(*client_b_, 558 EXPECT_CALL(*client_b_,
558 DoI420BufferReady(client_b_route_2, capture_resolution)) 559 DoI420BufferReady(client_b_route_2, capture_resolution))
559 .Times(shm_buffers); 560 .Times(shm_buffers);
560 EXPECT_CALL(*client_b_, 561 EXPECT_CALL(*client_b_,
561 DoTextureBufferReady(client_b_route_2, capture_resolution)) 562 DoTextureBufferReady(client_b_route_2, capture_resolution))
562 .Times(mailbox_buffers); 563 .Times(mailbox_buffers);
563 #if !defined(OS_ANDROID) 564 #if !defined(OS_ANDROID)
564 EXPECT_CALL(*client_b_, DoBufferDestroyed(client_b_route_2)); 565 EXPECT_CALL(*client_b_, DoBufferDestroyed(client_b_route_2));
565 #endif 566 #endif
566 base::RunLoop().RunUntilIdle(); 567 base::RunLoop().RunUntilIdle();
567 for (size_t i = 0; i < mailbox_syncpoints.size(); ++i) { 568 for (size_t i = 0; i < mailbox_synctokens.size(); ++i) {
568 // A new release sync point must be inserted when the video frame is 569 // A new release sync point must be inserted when the video frame is
569 // returned to the Browser process. 570 // returned to the Browser process.
570 // See: MockVideoCaptureControllerEventHandler::OnMailboxBufferReady() and 571 // See: MockVideoCaptureControllerEventHandler::OnMailboxBufferReady() and
571 // VideoCaptureController::ReturnBuffer() 572 // VideoCaptureController::ReturnBuffer()
572 ASSERT_NE(mailbox_syncpoints[i], release_syncpoints[i]); 573 ASSERT_NE(mailbox_synctokens[i], release_synctokens[i]);
573 } 574 }
574 Mock::VerifyAndClearExpectations(client_b_.get()); 575 Mock::VerifyAndClearExpectations(client_b_.get());
575 576
576 #if !defined(OS_ANDROID) 577 #if !defined(OS_ANDROID)
577 ImageTransportFactory::Terminate(); 578 ImageTransportFactory::Terminate();
578 #endif 579 #endif
579 } 580 }
580 581
581 // Exercises the OnError() codepath of VideoCaptureController, and tests the 582 // Exercises the OnError() codepath of VideoCaptureController, and tests the
582 // behavior of various operations after the error state has been signalled. 583 // behavior of various operations after the error state has been signalled.
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 662
662 // 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
663 // the error. 664 // the error.
664 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); 665 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1);
665 controller_->AddClient( 666 controller_->AddClient(
666 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); 667 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200);
667 Mock::VerifyAndClearExpectations(client_b_.get()); 668 Mock::VerifyAndClearExpectations(client_b_.get());
668 } 669 }
669 670
670 } // namespace content 671 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698