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

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

Issue 955253002: Add metadata to media::VideoFrame and plumb it through IPC/MediaStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tommi's nits addressed Created 5 years, 9 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. 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 } 56 }
57 virtual void OnBufferCreated(const VideoCaptureControllerID& id, 57 virtual void OnBufferCreated(const VideoCaptureControllerID& id,
58 base::SharedMemoryHandle handle, 58 base::SharedMemoryHandle handle,
59 int length, int buffer_id) override { 59 int length, int buffer_id) override {
60 DoBufferCreated(id); 60 DoBufferCreated(id);
61 } 61 }
62 virtual void OnBufferDestroyed(const VideoCaptureControllerID& id, 62 virtual void OnBufferDestroyed(const VideoCaptureControllerID& id,
63 int buffer_id) override { 63 int buffer_id) override {
64 DoBufferDestroyed(id); 64 DoBufferDestroyed(id);
65 } 65 }
66 virtual void OnBufferReady(const VideoCaptureControllerID& id, 66 virtual void OnBufferReady(
67 int buffer_id, 67 const VideoCaptureControllerID& id,
68 const media::VideoCaptureFormat& format, 68 int buffer_id,
69 const gfx::Rect& visible_rect, 69 const gfx::Size& coded_size,
70 base::TimeTicks timestamp) override { 70 const gfx::Rect& visible_rect,
71 base::TimeTicks timestamp,
72 scoped_ptr<base::DictionaryValue> metadata) override {
71 DoBufferReady(id); 73 DoBufferReady(id);
72 base::MessageLoop::current()->PostTask( 74 base::MessageLoop::current()->PostTask(
73 FROM_HERE, 75 FROM_HERE,
74 base::Bind(&VideoCaptureController::ReturnBuffer, 76 base::Bind(&VideoCaptureController::ReturnBuffer,
75 base::Unretained(controller_), 77 base::Unretained(controller_),
76 id, 78 id,
77 this, 79 this,
78 buffer_id, 80 buffer_id,
79 0)); 81 0));
80 } 82 }
81 virtual void OnMailboxBufferReady(const VideoCaptureControllerID& id, 83 virtual void OnMailboxBufferReady(
82 int buffer_id, 84 const VideoCaptureControllerID& id,
83 const gpu::MailboxHolder& mailbox_holder, 85 int buffer_id,
84 const media::VideoCaptureFormat& format, 86 const gpu::MailboxHolder& mailbox_holder,
85 base::TimeTicks timestamp) override { 87 const gfx::Size& packed_frame_size,
88 base::TimeTicks timestamp,
89 scoped_ptr<base::DictionaryValue> metadata) override {
86 DoMailboxBufferReady(id); 90 DoMailboxBufferReady(id);
87 base::MessageLoop::current()->PostTask( 91 base::MessageLoop::current()->PostTask(
88 FROM_HERE, 92 FROM_HERE,
89 base::Bind(&VideoCaptureController::ReturnBuffer, 93 base::Bind(&VideoCaptureController::ReturnBuffer,
90 base::Unretained(controller_), 94 base::Unretained(controller_),
91 id, 95 id,
92 this, 96 this,
93 buffer_id, 97 buffer_id,
94 mailbox_holder.sync_point)); 98 mailbox_holder.sync_point));
95 } 99 }
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1); 336 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1);
333 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); 337 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1);
334 } 338 }
335 { 339 {
336 InSequence s; 340 InSequence s;
337 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1); 341 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
338 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); 342 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1);
339 } 343 }
340 device_->OnIncomingCapturedVideoFrame( 344 device_->OnIncomingCapturedVideoFrame(
341 buffer, 345 buffer,
342 media::VideoCaptureFormat(capture_resolution,
343 device_format.frame_rate,
344 media::PIXEL_FORMAT_I420),
345 WrapI420Buffer(buffer, capture_resolution), 346 WrapI420Buffer(buffer, capture_resolution),
346 base::TimeTicks()); 347 base::TimeTicks());
347 buffer = NULL; 348 buffer = NULL;
348 349
349 base::RunLoop().RunUntilIdle(); 350 base::RunLoop().RunUntilIdle();
350 Mock::VerifyAndClearExpectations(client_a_.get()); 351 Mock::VerifyAndClearExpectations(client_a_.get());
351 Mock::VerifyAndClearExpectations(client_b_.get()); 352 Mock::VerifyAndClearExpectations(client_b_.get());
352 353
353 // Second buffer which ought to use the same shared memory buffer. In this 354 // Second buffer which ought to use the same shared memory buffer. In this
354 // case pretend that the Buffer pointer is held by the device for a long 355 // case pretend that the Buffer pointer is held by the device for a long
355 // delay. This shouldn't affect anything. 356 // delay. This shouldn't affect anything.
356 buffer = 357 buffer =
357 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 358 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
358 ASSERT_TRUE(buffer.get()); 359 ASSERT_TRUE(buffer.get());
359 memset(buffer->data(), buffer_no++, buffer->size()); 360 memset(buffer->data(), buffer_no++, buffer->size());
360 device_->OnIncomingCapturedVideoFrame( 361 device_->OnIncomingCapturedVideoFrame(
361 buffer, 362 buffer,
362 media::VideoCaptureFormat(capture_resolution,
363 device_format.frame_rate,
364 media::PIXEL_FORMAT_I420),
365 WrapI420Buffer(buffer, capture_resolution), 363 WrapI420Buffer(buffer, capture_resolution),
366 base::TimeTicks()); 364 base::TimeTicks());
367 buffer = NULL; 365 buffer = NULL;
368 366
369 // The buffer should be delivered to the clients in any order. 367 // The buffer should be delivered to the clients in any order.
370 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1); 368 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1);
371 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); 369 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1);
372 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); 370 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1);
373 base::RunLoop().RunUntilIdle(); 371 base::RunLoop().RunUntilIdle();
374 Mock::VerifyAndClearExpectations(client_a_.get()); 372 Mock::VerifyAndClearExpectations(client_a_.get());
375 Mock::VerifyAndClearExpectations(client_b_.get()); 373 Mock::VerifyAndClearExpectations(client_b_.get());
376 374
377 // Add a fourth client now that some buffers have come through. 375 // Add a fourth client now that some buffers have come through.
378 controller_->AddClient(client_b_route_2, 376 controller_->AddClient(client_b_route_2,
379 client_b_.get(), 377 client_b_.get(),
380 base::kNullProcessHandle, 378 base::kNullProcessHandle,
381 1, 379 1,
382 session_1); 380 session_1);
383 Mock::VerifyAndClearExpectations(client_b_.get()); 381 Mock::VerifyAndClearExpectations(client_b_.get());
384 382
385 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. 383 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time.
386 for (int i = 0; i < kPoolSize; i++) { 384 for (int i = 0; i < kPoolSize; i++) {
387 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420, 385 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420,
388 capture_resolution); 386 capture_resolution);
389 ASSERT_TRUE(buffer.get()); 387 ASSERT_TRUE(buffer.get());
390 memset(buffer->data(), buffer_no++, buffer->size()); 388 memset(buffer->data(), buffer_no++, buffer->size());
391 device_->OnIncomingCapturedVideoFrame( 389 device_->OnIncomingCapturedVideoFrame(
392 buffer, 390 buffer,
393 media::VideoCaptureFormat(capture_resolution,
394 device_format.frame_rate,
395 media::PIXEL_FORMAT_I420),
396 WrapI420Buffer(buffer, capture_resolution), 391 WrapI420Buffer(buffer, capture_resolution),
397 base::TimeTicks()); 392 base::TimeTicks());
398 buffer = NULL; 393 buffer = NULL;
399 } 394 }
400 // ReserveOutputBuffer ought to fail now, because the pool is depleted. 395 // ReserveOutputBuffer ought to fail now, because the pool is depleted.
401 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420, 396 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420,
402 capture_resolution).get()); 397 capture_resolution).get());
403 398
404 // The new client needs to be told of 3 buffers; the old clients only 2. 399 // The new client needs to be told of 3 buffers; the old clients only 2.
405 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize); 400 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize);
(...skipping 17 matching lines...) Expand all
423 // Kill B1 via session close (posts a task to disconnect). 418 // Kill B1 via session close (posts a task to disconnect).
424 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1); 419 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1);
425 controller_->StopSession(300); 420 controller_->StopSession(300);
426 // Queue up another buffer. 421 // Queue up another buffer.
427 buffer = 422 buffer =
428 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 423 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
429 ASSERT_TRUE(buffer.get()); 424 ASSERT_TRUE(buffer.get());
430 memset(buffer->data(), buffer_no++, buffer->size()); 425 memset(buffer->data(), buffer_no++, buffer->size());
431 device_->OnIncomingCapturedVideoFrame( 426 device_->OnIncomingCapturedVideoFrame(
432 buffer, 427 buffer,
433 media::VideoCaptureFormat(capture_resolution,
434 device_format.frame_rate,
435 media::PIXEL_FORMAT_I420),
436 WrapI420Buffer(buffer, capture_resolution), 428 WrapI420Buffer(buffer, capture_resolution),
437 base::TimeTicks()); 429 base::TimeTicks());
438 buffer = NULL; 430 buffer = NULL;
439 buffer = 431 buffer =
440 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 432 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
441 { 433 {
442 // Kill A2 via session close (posts a task to disconnect, but A2 must not 434 // Kill A2 via session close (posts a task to disconnect, but A2 must not
443 // be sent either of these two buffers). 435 // be sent either of these two buffers).
444 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1); 436 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1);
445 controller_->StopSession(200); 437 controller_->StopSession(200);
446 } 438 }
447 ASSERT_TRUE(buffer.get()); 439 ASSERT_TRUE(buffer.get());
448 memset(buffer->data(), buffer_no++, buffer->size()); 440 memset(buffer->data(), buffer_no++, buffer->size());
449 device_->OnIncomingCapturedVideoFrame( 441 device_->OnIncomingCapturedVideoFrame(
450 buffer, 442 buffer,
451 media::VideoCaptureFormat(capture_resolution,
452 device_format.frame_rate,
453 media::PIXEL_FORMAT_I420),
454 WrapI420Buffer(buffer, capture_resolution), 443 WrapI420Buffer(buffer, capture_resolution),
455 base::TimeTicks()); 444 base::TimeTicks());
456 buffer = NULL; 445 buffer = NULL;
457 // B2 is the only client left, and is the only one that should 446 // B2 is the only client left, and is the only one that should
458 // get the buffer. 447 // get the buffer.
459 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2); 448 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2);
460 base::RunLoop().RunUntilIdle(); 449 base::RunLoop().RunUntilIdle();
461 Mock::VerifyAndClearExpectations(client_a_.get()); 450 Mock::VerifyAndClearExpectations(client_a_.get());
462 Mock::VerifyAndClearExpectations(client_b_.get()); 451 Mock::VerifyAndClearExpectations(client_b_.get());
463 452
(...skipping 10 matching lines...) Expand all
474 shm_buffers--; 463 shm_buffers--;
475 mailbox_buffers++; 464 mailbox_buffers++;
476 } 465 }
477 466
478 for (int i = 0; i < shm_buffers; ++i) { 467 for (int i = 0; i < shm_buffers; ++i) {
479 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420, 468 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420,
480 capture_resolution); 469 capture_resolution);
481 ASSERT_TRUE(buffer.get()); 470 ASSERT_TRUE(buffer.get());
482 device_->OnIncomingCapturedVideoFrame( 471 device_->OnIncomingCapturedVideoFrame(
483 buffer, 472 buffer,
484 media::VideoCaptureFormat(capture_resolution,
485 device_format.frame_rate,
486 media::PIXEL_FORMAT_I420),
487 WrapI420Buffer(buffer, capture_resolution), 473 WrapI420Buffer(buffer, capture_resolution),
488 base::TimeTicks()); 474 base::TimeTicks());
489 buffer = NULL; 475 buffer = NULL;
490 } 476 }
491 std::vector<uint32> mailbox_syncpoints(mailbox_buffers); 477 std::vector<uint32> mailbox_syncpoints(mailbox_buffers);
492 std::vector<uint32> release_syncpoints(mailbox_buffers); 478 std::vector<uint32> release_syncpoints(mailbox_buffers);
493 for (int i = 0; i < mailbox_buffers; ++i) { 479 for (int i = 0; i < mailbox_buffers; ++i) {
494 buffer = device_->ReserveOutputBuffer(media::VideoFrame::NATIVE_TEXTURE, 480 buffer = device_->ReserveOutputBuffer(media::VideoFrame::NATIVE_TEXTURE,
495 gfx::Size(0, 0)); 481 gfx::Size(0, 0));
496 ASSERT_TRUE(buffer.get()); 482 ASSERT_TRUE(buffer.get());
497 #if !defined(OS_ANDROID) 483 #if !defined(OS_ANDROID)
498 mailbox_syncpoints[i] = gl_helper->InsertSyncPoint(); 484 mailbox_syncpoints[i] = gl_helper->InsertSyncPoint();
499 #endif 485 #endif
500 device_->OnIncomingCapturedVideoFrame( 486 device_->OnIncomingCapturedVideoFrame(
501 buffer, 487 buffer,
502 media::VideoCaptureFormat(capture_resolution,
503 device_format.frame_rate,
504 media::PIXEL_FORMAT_TEXTURE),
505 WrapMailboxBuffer(make_scoped_ptr(new gpu::MailboxHolder( 488 WrapMailboxBuffer(make_scoped_ptr(new gpu::MailboxHolder(
506 gpu::Mailbox(), 0, mailbox_syncpoints[i])), 489 gpu::Mailbox(), 0, mailbox_syncpoints[i])),
507 base::Bind(&CacheSyncPoint, &release_syncpoints[i]), 490 base::Bind(&CacheSyncPoint, &release_syncpoints[i]),
508 capture_resolution), 491 capture_resolution),
509 base::TimeTicks()); 492 base::TimeTicks());
510 buffer = NULL; 493 buffer = NULL;
511 } 494 }
512 // ReserveOutputBuffers ought to fail now regardless of buffer format, because 495 // ReserveOutputBuffers ought to fail now regardless of buffer format, because
513 // the pool is depleted. 496 // the pool is depleted.
514 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420, 497 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); 544 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200);
562 base::RunLoop().RunUntilIdle(); 545 base::RunLoop().RunUntilIdle();
563 Mock::VerifyAndClearExpectations(client_b_.get()); 546 Mock::VerifyAndClearExpectations(client_b_.get());
564 547
565 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = 548 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer =
566 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 549 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
567 ASSERT_TRUE(buffer.get()); 550 ASSERT_TRUE(buffer.get());
568 551
569 device_->OnIncomingCapturedVideoFrame( 552 device_->OnIncomingCapturedVideoFrame(
570 buffer, 553 buffer,
571 media::VideoCaptureFormat(
572 capture_resolution, 30, media::PIXEL_FORMAT_I420),
573 WrapI420Buffer(buffer, capture_resolution), 554 WrapI420Buffer(buffer, capture_resolution),
574 base::TimeTicks()); 555 base::TimeTicks());
575 buffer = NULL; 556 buffer = NULL;
576 557
577 base::RunLoop().RunUntilIdle(); 558 base::RunLoop().RunUntilIdle();
578 } 559 }
579 560
580 // Exercises the OnError() codepath of VideoCaptureController, and tests the 561 // Exercises the OnError() codepath of VideoCaptureController, and tests the
581 // behavior of various operations after the error state has been signalled. 562 // behavior of various operations after the error state has been signalled.
582 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) { 563 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) {
(...skipping 18 matching lines...) Expand all
601 Mock::VerifyAndClearExpectations(client_a_.get()); 582 Mock::VerifyAndClearExpectations(client_a_.get());
602 583
603 const gfx::Size dims(320, 240); 584 const gfx::Size dims(320, 240);
604 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = 585 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer =
605 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims); 586 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims);
606 ASSERT_TRUE(buffer.get()); 587 ASSERT_TRUE(buffer.get());
607 588
608 device_->OnError("Test error"); 589 device_->OnError("Test error");
609 device_->OnIncomingCapturedVideoFrame( 590 device_->OnIncomingCapturedVideoFrame(
610 buffer, 591 buffer,
611 media::VideoCaptureFormat(
612 dims, device_format.frame_rate, media::PIXEL_FORMAT_I420),
613 WrapI420Buffer(buffer, dims), 592 WrapI420Buffer(buffer, dims),
614 base::TimeTicks()); 593 base::TimeTicks());
615 buffer = NULL; 594 buffer = NULL;
616 595
617 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); 596 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1);
618 base::RunLoop().RunUntilIdle(); 597 base::RunLoop().RunUntilIdle();
619 Mock::VerifyAndClearExpectations(client_a_.get()); 598 Mock::VerifyAndClearExpectations(client_a_.get());
620 599
621 // Second client connects after the error state. It also should get told of 600 // Second client connects after the error state. It also should get told of
622 // the error. 601 // the error.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 params.requested_format.ImageAllocationSize(), 638 params.requested_format.ImageAllocationSize(),
660 params.requested_format, 639 params.requested_format,
661 0 /* rotation */, 640 0 /* rotation */,
662 base::TimeTicks()); 641 base::TimeTicks());
663 EXPECT_EQ(100, controller_->RemoveClient(route, client_a_.get())); 642 EXPECT_EQ(100, controller_->RemoveClient(route, client_a_.get()));
664 Mock::VerifyAndClearExpectations(client_a_.get()); 643 Mock::VerifyAndClearExpectations(client_a_.get());
665 } 644 }
666 } 645 }
667 646
668 } // namespace content 647 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698