| 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 #include "content/browser/renderer_host/media/web_contents_video_capture_device.
h" | 5 #include "content/browser/renderer_host/media/web_contents_video_capture_device.
h" |
| 6 | 6 |
| 7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
| 8 #include "base/debug/debugger.h" | 8 #include "base/debug/debugger.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 base::AutoLock guard(lock_); | 400 base::AutoLock guard(lock_); |
| 401 error_encountered_ = true; | 401 error_encountered_ = true; |
| 402 } | 402 } |
| 403 PostColorOrError(kNothingYet); | 403 PostColorOrError(kNothingYet); |
| 404 } | 404 } |
| 405 | 405 |
| 406 virtual void OnFrameInfo(const media::VideoCaptureCapability& info) OVERRIDE { | 406 virtual void OnFrameInfo(const media::VideoCaptureCapability& info) OVERRIDE { |
| 407 EXPECT_EQ(kTestWidth, info.width); | 407 EXPECT_EQ(kTestWidth, info.width); |
| 408 EXPECT_EQ(kTestHeight, info.height); | 408 EXPECT_EQ(kTestHeight, info.height); |
| 409 EXPECT_EQ(kTestFramesPerSecond, info.frame_rate); | 409 EXPECT_EQ(kTestFramesPerSecond, info.frame_rate); |
| 410 EXPECT_EQ(media::VideoCaptureCapability::kI420, info.color); | 410 EXPECT_EQ(media::PIXEL_FORMAT_I420, info.color); |
| 411 } | 411 } |
| 412 | 412 |
| 413 private: | 413 private: |
| 414 base::Lock lock_; | 414 base::Lock lock_; |
| 415 bool error_encountered_; | 415 bool error_encountered_; |
| 416 SkColor wait_color_yuv_; | 416 SkColor wait_color_yuv_; |
| 417 scoped_refptr<VideoCaptureBufferPool> buffer_pool_; | 417 scoped_refptr<VideoCaptureBufferPool> buffer_pool_; |
| 418 | 418 |
| 419 DISALLOW_COPY_AND_ASSIGN(StubConsumer); | 419 DISALLOW_COPY_AND_ASSIGN(StubConsumer); |
| 420 }; | 420 }; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) { | 540 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) { |
| 541 // Before the installs itself on the UI thread up to start capturing, we'll | 541 // Before the installs itself on the UI thread up to start capturing, we'll |
| 542 // delete the web contents. This should trigger an error which can happen in | 542 // delete the web contents. This should trigger an error which can happen in |
| 543 // practice; we should be able to recover gracefully. | 543 // practice; we should be able to recover gracefully. |
| 544 ResetWebContents(); | 544 ResetWebContents(); |
| 545 | 545 |
| 546 media::VideoCaptureCapability capture_format( | 546 media::VideoCaptureCapability capture_format( |
| 547 kTestWidth, | 547 kTestWidth, |
| 548 kTestHeight, | 548 kTestHeight, |
| 549 kTestFramesPerSecond, | 549 kTestFramesPerSecond, |
| 550 media::VideoCaptureCapability::kI420, | 550 media::PIXEL_FORMAT_I420, |
| 551 0, | 551 0, |
| 552 false, | 552 false, |
| 553 media::ConstantResolutionVideoCaptureDevice); | 553 media::ConstantResolutionVideoCaptureDevice); |
| 554 device()->Allocate(capture_format, consumer()); | 554 device()->Allocate(capture_format, consumer()); |
| 555 device()->Start(); | 555 device()->Start(); |
| 556 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); | 556 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); |
| 557 device()->DeAllocate(); | 557 device()->DeAllocate(); |
| 558 } | 558 } |
| 559 | 559 |
| 560 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) { | 560 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) { |
| 561 // We'll simulate the tab being closed after the capture pipeline is up and | 561 // We'll simulate the tab being closed after the capture pipeline is up and |
| 562 // running. | 562 // running. |
| 563 media::VideoCaptureCapability capture_format( | 563 media::VideoCaptureCapability capture_format( |
| 564 kTestWidth, | 564 kTestWidth, |
| 565 kTestHeight, | 565 kTestHeight, |
| 566 kTestFramesPerSecond, | 566 kTestFramesPerSecond, |
| 567 media::VideoCaptureCapability::kI420, | 567 media::PIXEL_FORMAT_I420, |
| 568 0, | 568 0, |
| 569 false, | 569 false, |
| 570 media::ConstantResolutionVideoCaptureDevice); | 570 media::ConstantResolutionVideoCaptureDevice); |
| 571 device()->Allocate(capture_format, consumer()); | 571 device()->Allocate(capture_format, consumer()); |
| 572 device()->Start(); | 572 device()->Start(); |
| 573 | 573 |
| 574 // Do one capture to prove | 574 // Do one capture to prove |
| 575 source()->SetSolidColor(SK_ColorRED); | 575 source()->SetSolidColor(SK_ColorRED); |
| 576 SimulateDrawEvent(); | 576 SimulateDrawEvent(); |
| 577 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); | 577 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); |
| 578 | 578 |
| 579 base::RunLoop().RunUntilIdle(); | 579 base::RunLoop().RunUntilIdle(); |
| 580 | 580 |
| 581 // Post a task to close the tab. We should see an error reported to the | 581 // Post a task to close the tab. We should see an error reported to the |
| 582 // consumer. | 582 // consumer. |
| 583 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 583 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 584 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents, | 584 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents, |
| 585 base::Unretained(this))); | 585 base::Unretained(this))); |
| 586 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); | 586 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); |
| 587 device()->DeAllocate(); | 587 device()->DeAllocate(); |
| 588 } | 588 } |
| 589 | 589 |
| 590 TEST_F(WebContentsVideoCaptureDeviceTest, | 590 TEST_F(WebContentsVideoCaptureDeviceTest, |
| 591 StopDeviceBeforeCaptureMachineCreation) { | 591 StopDeviceBeforeCaptureMachineCreation) { |
| 592 media::VideoCaptureCapability capture_format( | 592 media::VideoCaptureCapability capture_format( |
| 593 kTestWidth, | 593 kTestWidth, |
| 594 kTestHeight, | 594 kTestHeight, |
| 595 kTestFramesPerSecond, | 595 kTestFramesPerSecond, |
| 596 media::VideoCaptureCapability::kI420, | 596 media::PIXEL_FORMAT_I420, |
| 597 0, | 597 0, |
| 598 false, | 598 false, |
| 599 media::ConstantResolutionVideoCaptureDevice); | 599 media::ConstantResolutionVideoCaptureDevice); |
| 600 device()->Allocate(capture_format, consumer()); | 600 device()->Allocate(capture_format, consumer()); |
| 601 device()->Start(); | 601 device()->Start(); |
| 602 // Make a point of not running the UI messageloop here. | 602 // Make a point of not running the UI messageloop here. |
| 603 device()->Stop(); | 603 device()->Stop(); |
| 604 device()->DeAllocate(); | 604 device()->DeAllocate(); |
| 605 DestroyVideoCaptureDevice(); | 605 DestroyVideoCaptureDevice(); |
| 606 | 606 |
| 607 // Currently, there should be CreateCaptureMachineOnUIThread() and | 607 // Currently, there should be CreateCaptureMachineOnUIThread() and |
| 608 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message | 608 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message |
| 609 // loop. These should both succeed without crashing, and the machine should | 609 // loop. These should both succeed without crashing, and the machine should |
| 610 // wind up in the idle state. | 610 // wind up in the idle state. |
| 611 base::RunLoop().RunUntilIdle(); | 611 base::RunLoop().RunUntilIdle(); |
| 612 } | 612 } |
| 613 | 613 |
| 614 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) { | 614 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) { |
| 615 // Set up the test to use RGB copies and an normal | 615 // Set up the test to use RGB copies and an normal |
| 616 source()->SetCanCopyToVideoFrame(false); | 616 source()->SetCanCopyToVideoFrame(false); |
| 617 source()->SetUseFrameSubscriber(false); | 617 source()->SetUseFrameSubscriber(false); |
| 618 media::VideoCaptureCapability capture_format( | 618 media::VideoCaptureCapability capture_format( |
| 619 kTestWidth, | 619 kTestWidth, |
| 620 kTestHeight, | 620 kTestHeight, |
| 621 kTestFramesPerSecond, | 621 kTestFramesPerSecond, |
| 622 media::VideoCaptureCapability::kI420, | 622 media::PIXEL_FORMAT_I420, |
| 623 0, | 623 0, |
| 624 false, | 624 false, |
| 625 media::ConstantResolutionVideoCaptureDevice); | 625 media::ConstantResolutionVideoCaptureDevice); |
| 626 device()->Allocate(capture_format, consumer()); | 626 device()->Allocate(capture_format, consumer()); |
| 627 | 627 |
| 628 device()->Start(); | 628 device()->Start(); |
| 629 // Make a point of not running the UI messageloop here. | 629 // Make a point of not running the UI messageloop here. |
| 630 // TODO(ajwong): Why do we care? | 630 // TODO(ajwong): Why do we care? |
| 631 base::RunLoop().RunUntilIdle(); | 631 base::RunLoop().RunUntilIdle(); |
| 632 | 632 |
| 633 for (int i = 0; i < 10; ++i) | 633 for (int i = 0; i < 10; ++i) |
| 634 SimulateDrawEvent(); | 634 SimulateDrawEvent(); |
| 635 | 635 |
| 636 device()->Stop(); | 636 device()->Stop(); |
| 637 device()->DeAllocate(); | 637 device()->DeAllocate(); |
| 638 // Currently, there should be CreateCaptureMachineOnUIThread() and | 638 // Currently, there should be CreateCaptureMachineOnUIThread() and |
| 639 // DestroyCaptureMachineOnUIThread() tasks pending on the current message | 639 // DestroyCaptureMachineOnUIThread() tasks pending on the current message |
| 640 // loop. These should both succeed without crashing, and the machine should | 640 // loop. These should both succeed without crashing, and the machine should |
| 641 // wind up in the idle state. | 641 // wind up in the idle state. |
| 642 ASSERT_FALSE(consumer()->HasError()); | 642 ASSERT_FALSE(consumer()->HasError()); |
| 643 base::RunLoop().RunUntilIdle(); | 643 base::RunLoop().RunUntilIdle(); |
| 644 ASSERT_FALSE(consumer()->HasError()); | 644 ASSERT_FALSE(consumer()->HasError()); |
| 645 } | 645 } |
| 646 | 646 |
| 647 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) { | 647 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) { |
| 648 media::VideoCaptureCapability capture_format( | 648 media::VideoCaptureCapability capture_format( |
| 649 kTestWidth, | 649 kTestWidth, |
| 650 kTestHeight, | 650 kTestHeight, |
| 651 kTestFramesPerSecond, | 651 kTestFramesPerSecond, |
| 652 media::VideoCaptureCapability::kI420, | 652 media::PIXEL_FORMAT_I420, |
| 653 0, | 653 0, |
| 654 false, | 654 false, |
| 655 media::ConstantResolutionVideoCaptureDevice); | 655 media::ConstantResolutionVideoCaptureDevice); |
| 656 device()->Allocate(capture_format, consumer()); | 656 device()->Allocate(capture_format, consumer()); |
| 657 device()->Start(); | 657 device()->Start(); |
| 658 base::RunLoop().RunUntilIdle(); | 658 base::RunLoop().RunUntilIdle(); |
| 659 source()->SetSolidColor(SK_ColorRED); | 659 source()->SetSolidColor(SK_ColorRED); |
| 660 SimulateDrawEvent(); | 660 SimulateDrawEvent(); |
| 661 SimulateDrawEvent(); | 661 SimulateDrawEvent(); |
| 662 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); | 662 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 684 | 684 |
| 685 // The "happy case" test. No scaling is needed, so we should be able to change | 685 // The "happy case" test. No scaling is needed, so we should be able to change |
| 686 // the picture emitted from the source and expect to see each delivered to the | 686 // the picture emitted from the source and expect to see each delivered to the |
| 687 // consumer. The test will alternate between the three capture paths, simulating | 687 // consumer. The test will alternate between the three capture paths, simulating |
| 688 // falling in and out of accelerated compositing. | 688 // falling in and out of accelerated compositing. |
| 689 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { | 689 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { |
| 690 media::VideoCaptureCapability capture_format( | 690 media::VideoCaptureCapability capture_format( |
| 691 kTestWidth, | 691 kTestWidth, |
| 692 kTestHeight, | 692 kTestHeight, |
| 693 kTestFramesPerSecond, | 693 kTestFramesPerSecond, |
| 694 media::VideoCaptureCapability::kI420, | 694 media::PIXEL_FORMAT_I420, |
| 695 0, | 695 0, |
| 696 false, | 696 false, |
| 697 media::ConstantResolutionVideoCaptureDevice); | 697 media::ConstantResolutionVideoCaptureDevice); |
| 698 device()->Allocate(capture_format, consumer()); | 698 device()->Allocate(capture_format, consumer()); |
| 699 | 699 |
| 700 device()->Start(); | 700 device()->Start(); |
| 701 | 701 |
| 702 for (int i = 0; i < 6; i++) { | 702 for (int i = 0; i < 6; i++) { |
| 703 const char* name = NULL; | 703 const char* name = NULL; |
| 704 switch (i % 3) { | 704 switch (i % 3) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorBLACK)); | 740 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorBLACK)); |
| 741 } | 741 } |
| 742 device()->DeAllocate(); | 742 device()->DeAllocate(); |
| 743 } | 743 } |
| 744 | 744 |
| 745 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) { | 745 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) { |
| 746 media::VideoCaptureCapability capture_format( | 746 media::VideoCaptureCapability capture_format( |
| 747 1280, | 747 1280, |
| 748 720, | 748 720, |
| 749 -2, | 749 -2, |
| 750 media::VideoCaptureCapability::kI420, | 750 media::PIXEL_FORMAT_I420, |
| 751 0, | 751 0, |
| 752 false, | 752 false, |
| 753 media::ConstantResolutionVideoCaptureDevice); | 753 media::ConstantResolutionVideoCaptureDevice); |
| 754 BrowserThread::PostTask(BrowserThread::UI, | 754 BrowserThread::PostTask(BrowserThread::UI, |
| 755 FROM_HERE, | 755 FROM_HERE, |
| 756 base::Bind(&media::VideoCaptureDevice::Allocate, | 756 base::Bind(&media::VideoCaptureDevice::Allocate, |
| 757 base::Unretained(device()), | 757 base::Unretained(device()), |
| 758 capture_format, | 758 capture_format, |
| 759 consumer())); | 759 consumer())); |
| 760 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); | 760 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForError()); |
| 761 } | 761 } |
| 762 | 762 |
| 763 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) { | 763 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) { |
| 764 media::VideoCaptureCapability capture_format( | 764 media::VideoCaptureCapability capture_format( |
| 765 kTestWidth, | 765 kTestWidth, |
| 766 kTestHeight, | 766 kTestHeight, |
| 767 kTestFramesPerSecond, | 767 kTestFramesPerSecond, |
| 768 media::VideoCaptureCapability::kI420, | 768 media::PIXEL_FORMAT_I420, |
| 769 0, | 769 0, |
| 770 false, | 770 false, |
| 771 media::ConstantResolutionVideoCaptureDevice); | 771 media::ConstantResolutionVideoCaptureDevice); |
| 772 device()->Allocate(capture_format, consumer()); | 772 device()->Allocate(capture_format, consumer()); |
| 773 | 773 |
| 774 // 1x1 is too small to process; we intend for this to result in an error. | 774 // 1x1 is too small to process; we intend for this to result in an error. |
| 775 source()->SetCopyResultSize(1, 1); | 775 source()->SetCopyResultSize(1, 1); |
| 776 source()->SetSolidColor(SK_ColorRED); | 776 source()->SetSolidColor(SK_ColorRED); |
| 777 device()->Start(); | 777 device()->Start(); |
| 778 | 778 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 790 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorGREEN)); | 790 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorGREEN)); |
| 791 source()->SetSolidColor(SK_ColorRED); | 791 source()->SetSolidColor(SK_ColorRED); |
| 792 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); | 792 ASSERT_NO_FATAL_FAILURE(consumer()->WaitForNextColor(SK_ColorRED)); |
| 793 | 793 |
| 794 device()->Stop(); | 794 device()->Stop(); |
| 795 device()->DeAllocate(); | 795 device()->DeAllocate(); |
| 796 } | 796 } |
| 797 | 797 |
| 798 } // namespace | 798 } // namespace |
| 799 } // namespace content | 799 } // namespace content |
| OLD | NEW |