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

Side by Side Diff: content/browser/media/capture/web_contents_video_capture_device_unittest.cc

Issue 541163002: Clarify resolution change behaviors of video capture devices (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged Created 6 years, 3 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 | Annotate | Revision Log
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 #include "content/browser/media/capture/web_contents_video_capture_device.h" 5 #include "content/browser/media/capture/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 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) { 637 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) {
638 // Before the installs itself on the UI thread up to start capturing, we'll 638 // Before the installs itself on the UI thread up to start capturing, we'll
639 // delete the web contents. This should trigger an error which can happen in 639 // delete the web contents. This should trigger an error which can happen in
640 // practice; we should be able to recover gracefully. 640 // practice; we should be able to recover gracefully.
641 ResetWebContents(); 641 ResetWebContents();
642 642
643 media::VideoCaptureParams capture_params; 643 media::VideoCaptureParams capture_params;
644 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 644 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
645 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 645 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
646 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 646 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
647 capture_params.allow_resolution_change = false;
648 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 647 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
649 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); 648 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError());
650 device()->StopAndDeAllocate(); 649 device()->StopAndDeAllocate();
651 } 650 }
652 651
653 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) { 652 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) {
654 const gfx::Size capture_preferred_size( 653 const gfx::Size capture_preferred_size(
655 static_cast<int>(kTestWidth / kTestDeviceScaleFactor), 654 static_cast<int>(kTestWidth / kTestDeviceScaleFactor),
656 static_cast<int>(kTestHeight / kTestDeviceScaleFactor)); 655 static_cast<int>(kTestHeight / kTestDeviceScaleFactor));
657 ASSERT_NE(capture_preferred_size, web_contents()->GetPreferredSize()); 656 ASSERT_NE(capture_preferred_size, web_contents()->GetPreferredSize());
658 657
659 // We'll simulate the tab being closed after the capture pipeline is up and 658 // We'll simulate the tab being closed after the capture pipeline is up and
660 // running. 659 // running.
661 media::VideoCaptureParams capture_params; 660 media::VideoCaptureParams capture_params;
662 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 661 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
663 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 662 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
664 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 663 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
665 capture_params.allow_resolution_change = false;
666 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 664 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
667 // Do one capture to prove 665 // Do one capture to prove
668 source()->SetSolidColor(SK_ColorRED); 666 source()->SetSolidColor(SK_ColorRED);
669 SimulateDrawEvent(); 667 SimulateDrawEvent();
670 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); 668 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED));
671 669
672 base::RunLoop().RunUntilIdle(); 670 base::RunLoop().RunUntilIdle();
673 671
674 // Check that the preferred size of the WebContents matches the one provided 672 // Check that the preferred size of the WebContents matches the one provided
675 // by WebContentsVideoCaptureDevice. 673 // by WebContentsVideoCaptureDevice.
676 EXPECT_EQ(capture_preferred_size, web_contents()->GetPreferredSize()); 674 EXPECT_EQ(capture_preferred_size, web_contents()->GetPreferredSize());
677 675
678 // Post a task to close the tab. We should see an error reported to the 676 // Post a task to close the tab. We should see an error reported to the
679 // consumer. 677 // consumer.
680 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 678 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
681 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents, 679 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents,
682 base::Unretained(this))); 680 base::Unretained(this)));
683 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); 681 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError());
684 device()->StopAndDeAllocate(); 682 device()->StopAndDeAllocate();
685 } 683 }
686 684
687 TEST_F(WebContentsVideoCaptureDeviceTest, 685 TEST_F(WebContentsVideoCaptureDeviceTest,
688 StopDeviceBeforeCaptureMachineCreation) { 686 StopDeviceBeforeCaptureMachineCreation) {
689 media::VideoCaptureParams capture_params; 687 media::VideoCaptureParams capture_params;
690 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 688 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
691 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 689 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
692 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 690 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
693 capture_params.allow_resolution_change = false;
694 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 691 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
695 692
696 // Make a point of not running the UI messageloop here. 693 // Make a point of not running the UI messageloop here.
697 device()->StopAndDeAllocate(); 694 device()->StopAndDeAllocate();
698 DestroyVideoCaptureDevice(); 695 DestroyVideoCaptureDevice();
699 696
700 // Currently, there should be CreateCaptureMachineOnUIThread() and 697 // Currently, there should be CreateCaptureMachineOnUIThread() and
701 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message 698 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message
702 // loop. These should both succeed without crashing, and the machine should 699 // loop. These should both succeed without crashing, and the machine should
703 // wind up in the idle state. 700 // wind up in the idle state.
704 base::RunLoop().RunUntilIdle(); 701 base::RunLoop().RunUntilIdle();
705 } 702 }
706 703
707 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) { 704 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) {
708 // Set up the test to use RGB copies and an normal 705 // Set up the test to use RGB copies and an normal
709 source()->SetCanCopyToVideoFrame(false); 706 source()->SetCanCopyToVideoFrame(false);
710 source()->SetUseFrameSubscriber(false); 707 source()->SetUseFrameSubscriber(false);
711 media::VideoCaptureParams capture_params; 708 media::VideoCaptureParams capture_params;
712 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 709 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
713 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 710 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
714 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 711 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
715 capture_params.allow_resolution_change = false;
716 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 712 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
717 713
718 base::RunLoop().RunUntilIdle(); 714 base::RunLoop().RunUntilIdle();
719 715
720 for (int i = 0; i < 10; ++i) 716 for (int i = 0; i < 10; ++i)
721 SimulateDrawEvent(); 717 SimulateDrawEvent();
722 718
723 ASSERT_FALSE(client_observer()->HasError()); 719 ASSERT_FALSE(client_observer()->HasError());
724 device()->StopAndDeAllocate(); 720 device()->StopAndDeAllocate();
725 ASSERT_FALSE(client_observer()->HasError()); 721 ASSERT_FALSE(client_observer()->HasError());
726 base::RunLoop().RunUntilIdle(); 722 base::RunLoop().RunUntilIdle();
727 ASSERT_FALSE(client_observer()->HasError()); 723 ASSERT_FALSE(client_observer()->HasError());
728 } 724 }
729 725
730 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) { 726 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) {
731 media::VideoCaptureParams capture_params; 727 media::VideoCaptureParams capture_params;
732 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 728 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
733 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 729 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
734 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 730 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
735 capture_params.allow_resolution_change = false;
736 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 731 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
737 base::RunLoop().RunUntilIdle(); 732 base::RunLoop().RunUntilIdle();
738 source()->SetSolidColor(SK_ColorRED); 733 source()->SetSolidColor(SK_ColorRED);
739 SimulateDrawEvent(); 734 SimulateDrawEvent();
740 SimulateDrawEvent(); 735 SimulateDrawEvent();
741 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); 736 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED));
742 SimulateDrawEvent(); 737 SimulateDrawEvent();
743 SimulateDrawEvent(); 738 SimulateDrawEvent();
744 source()->SetSolidColor(SK_ColorGREEN); 739 source()->SetSolidColor(SK_ColorGREEN);
745 SimulateDrawEvent(); 740 SimulateDrawEvent();
(...skipping 18 matching lines...) Expand all
764 759
765 // The "happy case" test. No scaling is needed, so we should be able to change 760 // The "happy case" test. No scaling is needed, so we should be able to change
766 // the picture emitted from the source and expect to see each delivered to the 761 // the picture emitted from the source and expect to see each delivered to the
767 // consumer. The test will alternate between the three capture paths, simulating 762 // consumer. The test will alternate between the three capture paths, simulating
768 // falling in and out of accelerated compositing. 763 // falling in and out of accelerated compositing.
769 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { 764 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) {
770 media::VideoCaptureParams capture_params; 765 media::VideoCaptureParams capture_params;
771 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 766 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
772 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 767 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
773 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 768 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
774 capture_params.allow_resolution_change = false;
775 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 769 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
776 770
777 for (int i = 0; i < 6; i++) { 771 for (int i = 0; i < 6; i++) {
778 const char* name = NULL; 772 const char* name = NULL;
779 switch (i % 3) { 773 switch (i % 3) {
780 case 0: 774 case 0:
781 source()->SetCanCopyToVideoFrame(true); 775 source()->SetCanCopyToVideoFrame(true);
782 source()->SetUseFrameSubscriber(false); 776 source()->SetUseFrameSubscriber(false);
783 name = "VideoFrame"; 777 name = "VideoFrame";
784 break; 778 break;
(...skipping 30 matching lines...) Expand all
815 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLACK)); 809 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLACK));
816 } 810 }
817 device()->StopAndDeAllocate(); 811 device()->StopAndDeAllocate();
818 } 812 }
819 813
820 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) { 814 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) {
821 media::VideoCaptureParams capture_params; 815 media::VideoCaptureParams capture_params;
822 capture_params.requested_format.frame_size.SetSize(1280, 720); 816 capture_params.requested_format.frame_size.SetSize(1280, 720);
823 capture_params.requested_format.frame_rate = -2; 817 capture_params.requested_format.frame_rate = -2;
824 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 818 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
825 capture_params.allow_resolution_change = false;
826 BrowserThread::PostTask( 819 BrowserThread::PostTask(
827 BrowserThread::UI, 820 BrowserThread::UI,
828 FROM_HERE, 821 FROM_HERE,
829 base::Bind(&media::VideoCaptureDevice::AllocateAndStart, 822 base::Bind(&media::VideoCaptureDevice::AllocateAndStart,
830 base::Unretained(device()), 823 base::Unretained(device()),
831 capture_params, 824 capture_params,
832 base::Passed(client_observer()->PassClient()))); 825 base::Passed(client_observer()->PassClient())));
833 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); 826 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError());
834 BrowserThread::PostTask( 827 BrowserThread::PostTask(
835 BrowserThread::UI, 828 BrowserThread::UI,
836 FROM_HERE, 829 FROM_HERE,
837 base::Bind(&media::VideoCaptureDevice::StopAndDeAllocate, 830 base::Bind(&media::VideoCaptureDevice::StopAndDeAllocate,
838 base::Unretained(device()))); 831 base::Unretained(device())));
839 base::RunLoop().RunUntilIdle(); 832 base::RunLoop().RunUntilIdle();
840 } 833 }
841 834
842 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) { 835 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) {
843 media::VideoCaptureParams capture_params; 836 media::VideoCaptureParams capture_params;
844 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); 837 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight);
845 capture_params.requested_format.frame_rate = kTestFramesPerSecond; 838 capture_params.requested_format.frame_rate = kTestFramesPerSecond;
846 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; 839 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
847 capture_params.allow_resolution_change = false;
848 // 1x1 is too small to process; we intend for this to result in an error. 840 // 1x1 is too small to process; we intend for this to result in an error.
849 source()->SetCopyResultSize(1, 1); 841 source()->SetCopyResultSize(1, 1);
850 source()->SetSolidColor(SK_ColorRED); 842 source()->SetSolidColor(SK_ColorRED);
851 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); 843 device()->AllocateAndStart(capture_params, client_observer()->PassClient());
852 844
853 // These frames ought to be dropped during the Render stage. Let 845 // These frames ought to be dropped during the Render stage. Let
854 // several captures to happen. 846 // several captures to happen.
855 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); 847 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy());
856 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); 848 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy());
857 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); 849 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy());
858 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); 850 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy());
859 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); 851 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy());
860 852
861 // Now push some good frames through; they should be processed normally. 853 // Now push some good frames through; they should be processed normally.
862 source()->SetCopyResultSize(kTestWidth, kTestHeight); 854 source()->SetCopyResultSize(kTestWidth, kTestHeight);
863 source()->SetSolidColor(SK_ColorGREEN); 855 source()->SetSolidColor(SK_ColorGREEN);
864 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); 856 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN));
865 source()->SetSolidColor(SK_ColorRED); 857 source()->SetSolidColor(SK_ColorRED);
866 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); 858 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED));
867 859
868 device()->StopAndDeAllocate(); 860 device()->StopAndDeAllocate();
869 } 861 }
870 862
871 } // namespace 863 } // namespace
872 } // namespace content 864 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698