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/media/capture/web_contents_video_capture_device.h" | 5 #include "content/browser/media/capture/web_contents_video_capture_device.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 MOCK_METHOD7(OnIncomingCapturedData, | 236 MOCK_METHOD7(OnIncomingCapturedData, |
237 void(const uint8_t* data, | 237 void(const uint8_t* data, |
238 int length, | 238 int length, |
239 const media::VideoCaptureFormat& frame_format, | 239 const media::VideoCaptureFormat& frame_format, |
240 int rotation, | 240 int rotation, |
241 base::TimeTicks reference_time, | 241 base::TimeTicks reference_time, |
242 base::TimeDelta timestamp, | 242 base::TimeDelta timestamp, |
243 int frame_feedback_id)); | 243 int frame_feedback_id)); |
244 | 244 |
245 MOCK_METHOD0(DoOnIncomingCapturedBuffer, void(void)); | 245 MOCK_METHOD0(DoOnIncomingCapturedBuffer, void(void)); |
| 246 MOCK_METHOD0(OnStarted, void(void)); |
246 | 247 |
247 media::VideoCaptureDevice::Client::Buffer ReserveOutputBuffer( | 248 media::VideoCaptureDevice::Client::Buffer ReserveOutputBuffer( |
248 const gfx::Size& dimensions, | 249 const gfx::Size& dimensions, |
249 media::VideoPixelFormat format, | 250 media::VideoPixelFormat format, |
250 media::VideoPixelStorage storage, | 251 media::VideoPixelStorage storage, |
251 int frame_feedback_id) override { | 252 int frame_feedback_id) override { |
252 CHECK_EQ(format, media::PIXEL_FORMAT_I420); | 253 CHECK_EQ(format, media::PIXEL_FORMAT_I420); |
253 int buffer_id_to_drop = | 254 int buffer_id_to_drop = |
254 media::VideoCaptureBufferPool::kInvalidId; // Ignored. | 255 media::VideoCaptureBufferPool::kInvalidId; // Ignored. |
255 const int buffer_id = buffer_pool_->ReserveForProducer( | 256 const int buffer_id = buffer_pool_->ReserveForProducer( |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 wait_color_yuv_(kWaitColorNotSet), | 340 wait_color_yuv_(kWaitColorNotSet), |
340 expecting_frames_(true) { | 341 expecting_frames_(true) { |
341 client_.reset(new StubClient( | 342 client_.reset(new StubClient( |
342 base::Bind(&StubClientObserver::DidDeliverFrame, | 343 base::Bind(&StubClientObserver::DidDeliverFrame, |
343 base::Unretained(this)), | 344 base::Unretained(this)), |
344 base::Bind(&StubClientObserver::OnError, base::Unretained(this)))); | 345 base::Bind(&StubClientObserver::OnError, base::Unretained(this)))); |
345 } | 346 } |
346 | 347 |
347 virtual ~StubClientObserver() {} | 348 virtual ~StubClientObserver() {} |
348 | 349 |
349 std::unique_ptr<media::VideoCaptureDevice::Client> PassClient() { | 350 std::unique_ptr<StubClient> PassClient() { return std::move(client_); } |
350 return std::move(client_); | |
351 } | |
352 | 351 |
353 void SetIsExpectingFrames(bool expecting_frames) { | 352 void SetIsExpectingFrames(bool expecting_frames) { |
354 expecting_frames_ = expecting_frames; | 353 expecting_frames_ = expecting_frames; |
355 } | 354 } |
356 | 355 |
357 void QuitIfConditionsMet(SkColor color, const gfx::Size& size) { | 356 void QuitIfConditionsMet(SkColor color, const gfx::Size& size) { |
358 EXPECT_TRUE(expecting_frames_); | 357 EXPECT_TRUE(expecting_frames_); |
359 if (error_encountered_ || wait_color_yuv_ == kNotInterested || | 358 if (error_encountered_ || wait_color_yuv_ == kNotInterested || |
360 wait_color_yuv_ == color) { | 359 wait_color_yuv_ == color) { |
361 last_frame_color_yuv_ = color; | 360 last_frame_color_yuv_ = color; |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 std::unique_ptr<media::VideoCaptureDevice> device_; | 628 std::unique_ptr<media::VideoCaptureDevice> device_; |
630 }; | 629 }; |
631 | 630 |
632 // In real-world use cases, there can exist a race condition between starting | 631 // In real-world use cases, there can exist a race condition between starting |
633 // capture on a WebContents and having the WebContents be destroyed in the | 632 // capture on a WebContents and having the WebContents be destroyed in the |
634 // meantime. This tests that WebContentsVideoCaptureDevice errors-out | 633 // meantime. This tests that WebContentsVideoCaptureDevice errors-out |
635 // gracefully. | 634 // gracefully. |
636 TEST_F(WebContentsVideoCaptureDeviceTest, | 635 TEST_F(WebContentsVideoCaptureDeviceTest, |
637 SafelyStartsUpAfterWebContentsHasGone) { | 636 SafelyStartsUpAfterWebContentsHasGone) { |
638 ResetWebContents(); | 637 ResetWebContents(); |
639 device()->AllocateAndStart(DefaultCaptureParams(), | 638 auto client = client_observer()->PassClient(); |
640 client_observer()->PassClient()); | 639 EXPECT_CALL(*client, OnStarted()); |
| 640 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
641 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); | 641 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); |
642 device()->StopAndDeAllocate(); | 642 device()->StopAndDeAllocate(); |
643 } | 643 } |
644 | 644 |
645 // Tests that WebContentsVideoCaptureDevice starts, captures a frame, and then | 645 // Tests that WebContentsVideoCaptureDevice starts, captures a frame, and then |
646 // gracefully errors-out if the WebContents is destroyed before the device is | 646 // gracefully errors-out if the WebContents is destroyed before the device is |
647 // stopped. | 647 // stopped. |
648 TEST_F(WebContentsVideoCaptureDeviceTest, | 648 TEST_F(WebContentsVideoCaptureDeviceTest, |
649 RunsThenErrorsOutWhenWebContentsIsDestroyed) { | 649 RunsThenErrorsOutWhenWebContentsIsDestroyed) { |
650 // We'll simulate the tab being closed after the capture pipeline is up and | 650 // We'll simulate the tab being closed after the capture pipeline is up and |
651 // running. | 651 // running. |
652 device()->AllocateAndStart(DefaultCaptureParams(), | 652 auto client = client_observer()->PassClient(); |
653 client_observer()->PassClient()); | 653 EXPECT_CALL(*client, OnStarted()); |
| 654 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
654 | 655 |
655 // Do one capture to prove the tab is initially open and being captured | 656 // Do one capture to prove the tab is initially open and being captured |
656 // normally. | 657 // normally. |
657 test_view()->SetSolidColor(SK_ColorRED); | 658 test_view()->SetSolidColor(SK_ColorRED); |
658 SimulateDrawEvent(); | 659 SimulateDrawEvent(); |
659 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 660 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
660 | 661 |
661 base::RunLoop().RunUntilIdle(); | 662 base::RunLoop().RunUntilIdle(); |
662 | 663 |
663 // Post a task to close the tab. We should see an error reported to the | 664 // Post a task to close the tab. We should see an error reported to the |
(...skipping 23 matching lines...) Expand all Loading... |
687 // wind up in the idle state. | 688 // wind up in the idle state. |
688 base::RunLoop().RunUntilIdle(); | 689 base::RunLoop().RunUntilIdle(); |
689 } | 690 } |
690 | 691 |
691 // Tests that frames are delivered to different clients across restarts of the | 692 // Tests that frames are delivered to different clients across restarts of the |
692 // same instance. | 693 // same instance. |
693 TEST_F(WebContentsVideoCaptureDeviceTest, | 694 TEST_F(WebContentsVideoCaptureDeviceTest, |
694 DeliversToCorrectClientAcrossRestarts) { | 695 DeliversToCorrectClientAcrossRestarts) { |
695 // While the device is up-and-running, expect frame captures. | 696 // While the device is up-and-running, expect frame captures. |
696 client_observer()->SetIsExpectingFrames(true); | 697 client_observer()->SetIsExpectingFrames(true); |
697 device()->AllocateAndStart(DefaultCaptureParams(), | 698 auto client = client_observer()->PassClient(); |
698 client_observer()->PassClient()); | 699 EXPECT_CALL(*client, OnStarted()); |
| 700 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
699 base::RunLoop().RunUntilIdle(); | 701 base::RunLoop().RunUntilIdle(); |
700 test_view()->SetSolidColor(SK_ColorRED); | 702 test_view()->SetSolidColor(SK_ColorRED); |
701 SimulateDrawEvent(); | 703 SimulateDrawEvent(); |
702 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 704 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
703 SimulateDrawEvent(); | 705 SimulateDrawEvent(); |
704 test_view()->SetSolidColor(SK_ColorGREEN); | 706 test_view()->SetSolidColor(SK_ColorGREEN); |
705 SimulateDrawEvent(); | 707 SimulateDrawEvent(); |
706 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); | 708 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); |
707 SimulateDrawEvent(); | 709 SimulateDrawEvent(); |
708 device()->StopAndDeAllocate(); | 710 device()->StopAndDeAllocate(); |
709 | 711 |
710 base::RunLoop().RunUntilIdle(); | 712 base::RunLoop().RunUntilIdle(); |
711 | 713 |
712 // Now that the device is stopped, expect frames are no longer captured. | 714 // Now that the device is stopped, expect frames are no longer captured. |
713 client_observer()->SetIsExpectingFrames(false); | 715 client_observer()->SetIsExpectingFrames(false); |
714 SimulateDrawEvent(); | 716 SimulateDrawEvent(); |
715 SimulateDrawEvent(); | 717 SimulateDrawEvent(); |
716 base::RunLoop().RunUntilIdle(); | 718 base::RunLoop().RunUntilIdle(); |
717 | 719 |
718 // Re-start the device with a different client. Only the second client should | 720 // Re-start the device with a different client. Only the second client should |
719 // expect to see any frame captures. | 721 // expect to see any frame captures. |
720 StubClientObserver observer2; | 722 StubClientObserver observer2; |
721 observer2.SetIsExpectingFrames(true); | 723 observer2.SetIsExpectingFrames(true); |
722 device()->AllocateAndStart(DefaultCaptureParams(), observer2.PassClient()); | 724 auto client2 = observer2.PassClient(); |
| 725 EXPECT_CALL(*client2, OnStarted()); |
| 726 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client2)); |
723 test_view()->SetSolidColor(SK_ColorBLUE); | 727 test_view()->SetSolidColor(SK_ColorBLUE); |
724 SimulateDrawEvent(); | 728 SimulateDrawEvent(); |
725 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorBLUE)); | 729 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorBLUE)); |
726 test_view()->SetSolidColor(SK_ColorYELLOW); | 730 test_view()->SetSolidColor(SK_ColorYELLOW); |
727 SimulateDrawEvent(); | 731 SimulateDrawEvent(); |
728 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorYELLOW)); | 732 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorYELLOW)); |
729 device()->StopAndDeAllocate(); | 733 device()->StopAndDeAllocate(); |
730 } | 734 } |
731 | 735 |
732 // The "happy case" test. No scaling is needed, so we should be able to change | 736 // The "happy case" test. No scaling is needed, so we should be able to change |
733 // the picture emitted from the source and expect to see each delivered to the | 737 // the picture emitted from the source and expect to see each delivered to the |
734 // consumer. The test will alternate between the RGB/SkBitmap and YUV/VideoFrame | 738 // consumer. The test will alternate between the RGB/SkBitmap and YUV/VideoFrame |
735 // capture paths. | 739 // capture paths. |
736 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { | 740 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { |
737 device()->AllocateAndStart(DefaultCaptureParams(), | 741 auto client = client_observer()->PassClient(); |
738 client_observer()->PassClient()); | 742 EXPECT_CALL(*client, OnStarted()); |
| 743 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
739 | 744 |
740 for (int i = 0; i < 3; i++) { | 745 for (int i = 0; i < 3; i++) { |
741 SCOPED_TRACE(base::StringPrintf("Iteration #%d", i)); | 746 SCOPED_TRACE(base::StringPrintf("Iteration #%d", i)); |
742 | 747 |
743 test_view()->SetSolidColor(SK_ColorRED); | 748 test_view()->SetSolidColor(SK_ColorRED); |
744 for (int j = 0; j <= i; j++) | 749 for (int j = 0; j <= i; j++) |
745 SimulateDrawEvent(); | 750 SimulateDrawEvent(); |
746 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 751 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
747 | 752 |
748 test_view()->SetSolidColor(SK_ColorGREEN); | 753 test_view()->SetSolidColor(SK_ColorGREEN); |
(...skipping 15 matching lines...) Expand all Loading... |
764 device()->StopAndDeAllocate(); | 769 device()->StopAndDeAllocate(); |
765 } | 770 } |
766 | 771 |
767 // Tests that, when configured with the FIXED_ASPECT_RATIO resolution change | 772 // Tests that, when configured with the FIXED_ASPECT_RATIO resolution change |
768 // policy, the source size changes result in video frames of possibly varying | 773 // policy, the source size changes result in video frames of possibly varying |
769 // resolutions, but all with the same aspect ratio. | 774 // resolutions, but all with the same aspect ratio. |
770 TEST_F(WebContentsVideoCaptureDeviceTest, VariableResolution_FixedAspectRatio) { | 775 TEST_F(WebContentsVideoCaptureDeviceTest, VariableResolution_FixedAspectRatio) { |
771 auto capture_params = DefaultCaptureParams(); | 776 auto capture_params = DefaultCaptureParams(); |
772 capture_params.resolution_change_policy = | 777 capture_params.resolution_change_policy = |
773 media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO; | 778 media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO; |
774 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); | 779 auto client = client_observer()->PassClient(); |
| 780 EXPECT_CALL(*client, OnStarted()); |
| 781 device()->AllocateAndStart(capture_params, std::move(client)); |
775 | 782 |
776 // Source size equals maximum size. Expect delivered frames to be | 783 // Source size equals maximum size. Expect delivered frames to be |
777 // kTestWidth by kTestHeight. | 784 // kTestWidth by kTestHeight. |
778 test_view()->SetSolidColor(SK_ColorRED); | 785 test_view()->SetSolidColor(SK_ColorRED); |
779 const float device_scale_factor = GetDeviceScaleFactor(); | 786 const float device_scale_factor = GetDeviceScaleFactor(); |
780 SimulateSourceSizeChange(gfx::ConvertSizeToDIP( | 787 SimulateSourceSizeChange(gfx::ConvertSizeToDIP( |
781 device_scale_factor, gfx::Size(kTestWidth, kTestHeight))); | 788 device_scale_factor, gfx::Size(kTestWidth, kTestHeight))); |
782 SimulateDrawsUntilNewFrameSizeArrives( | 789 SimulateDrawsUntilNewFrameSizeArrives( |
783 SK_ColorRED, gfx::Size(kTestWidth, kTestHeight)); | 790 SK_ColorRED, gfx::Size(kTestWidth, kTestHeight)); |
784 | 791 |
(...skipping 25 matching lines...) Expand all Loading... |
810 device()->StopAndDeAllocate(); | 817 device()->StopAndDeAllocate(); |
811 } | 818 } |
812 | 819 |
813 // Tests that, when configured with the ANY_WITHIN_LIMIT resolution change | 820 // Tests that, when configured with the ANY_WITHIN_LIMIT resolution change |
814 // policy, the source size changes result in video frames of possibly varying | 821 // policy, the source size changes result in video frames of possibly varying |
815 // resolutions. | 822 // resolutions. |
816 TEST_F(WebContentsVideoCaptureDeviceTest, VariableResolution_AnyWithinLimits) { | 823 TEST_F(WebContentsVideoCaptureDeviceTest, VariableResolution_AnyWithinLimits) { |
817 auto capture_params = DefaultCaptureParams(); | 824 auto capture_params = DefaultCaptureParams(); |
818 capture_params.resolution_change_policy = | 825 capture_params.resolution_change_policy = |
819 media::RESOLUTION_POLICY_ANY_WITHIN_LIMIT; | 826 media::RESOLUTION_POLICY_ANY_WITHIN_LIMIT; |
820 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); | 827 auto client = client_observer()->PassClient(); |
| 828 EXPECT_CALL(*client, OnStarted()); |
| 829 device()->AllocateAndStart(capture_params, std::move(client)); |
821 | 830 |
822 // Source size equals maximum size. Expect delivered frames to be | 831 // Source size equals maximum size. Expect delivered frames to be |
823 // kTestWidth by kTestHeight. | 832 // kTestWidth by kTestHeight. |
824 test_view()->SetSolidColor(SK_ColorRED); | 833 test_view()->SetSolidColor(SK_ColorRED); |
825 const float device_scale_factor = GetDeviceScaleFactor(); | 834 const float device_scale_factor = GetDeviceScaleFactor(); |
826 SimulateSourceSizeChange(gfx::ConvertSizeToDIP( | 835 SimulateSourceSizeChange(gfx::ConvertSizeToDIP( |
827 device_scale_factor, gfx::Size(kTestWidth, kTestHeight))); | 836 device_scale_factor, gfx::Size(kTestWidth, kTestHeight))); |
828 SimulateDrawsUntilNewFrameSizeArrives( | 837 SimulateDrawsUntilNewFrameSizeArrives( |
829 SK_ColorRED, gfx::Size(kTestWidth, kTestHeight)); | 838 SK_ColorRED, gfx::Size(kTestWidth, kTestHeight)); |
830 | 839 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 policy == media::RESOLUTION_POLICY_FIXED_RESOLUTION ? oddball_size | 890 policy == media::RESOLUTION_POLICY_FIXED_RESOLUTION ? oddball_size |
882 : standard_size, | 891 : standard_size, |
883 1.0f / GetDeviceScaleFactor()); | 892 1.0f / GetDeviceScaleFactor()); |
884 ASSERT_NE(capture_preferred_size, web_contents()->GetPreferredSize()); | 893 ASSERT_NE(capture_preferred_size, web_contents()->GetPreferredSize()); |
885 | 894 |
886 // Start the WebContentsVideoCaptureDevice. | 895 // Start the WebContentsVideoCaptureDevice. |
887 auto capture_params = DefaultCaptureParams(); | 896 auto capture_params = DefaultCaptureParams(); |
888 capture_params.requested_format.frame_size = oddball_size; | 897 capture_params.requested_format.frame_size = oddball_size; |
889 capture_params.resolution_change_policy = policy; | 898 capture_params.resolution_change_policy = policy; |
890 StubClientObserver unused_observer; | 899 StubClientObserver unused_observer; |
891 device()->AllocateAndStart(capture_params, unused_observer.PassClient()); | 900 auto client = unused_observer.PassClient(); |
| 901 EXPECT_CALL(*client, OnStarted()); |
| 902 device()->AllocateAndStart(capture_params, std::move(client)); |
892 base::RunLoop().RunUntilIdle(); | 903 base::RunLoop().RunUntilIdle(); |
893 | 904 |
894 // Check that the preferred size of the WebContents matches the one provided | 905 // Check that the preferred size of the WebContents matches the one provided |
895 // by WebContentsVideoCaptureDevice. | 906 // by WebContentsVideoCaptureDevice. |
896 EXPECT_EQ(capture_preferred_size, web_contents()->GetPreferredSize()); | 907 EXPECT_EQ(capture_preferred_size, web_contents()->GetPreferredSize()); |
897 | 908 |
898 // Stop the WebContentsVideoCaptureDevice. | 909 // Stop the WebContentsVideoCaptureDevice. |
899 device()->StopAndDeAllocate(); | 910 device()->StopAndDeAllocate(); |
900 base::RunLoop().RunUntilIdle(); | 911 base::RunLoop().RunUntilIdle(); |
901 }; | 912 }; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 policies[i], gfx::Size(1000, 1000), gfx::Size(1000, 1000)); | 958 policies[i], gfx::Size(1000, 1000), gfx::Size(1000, 1000)); |
948 RunTestForPreferredSize( | 959 RunTestForPreferredSize( |
949 policies[i], gfx::Size(1600, 1000), gfx::Size(1600, 1000)); | 960 policies[i], gfx::Size(1600, 1000), gfx::Size(1600, 1000)); |
950 RunTestForPreferredSize( | 961 RunTestForPreferredSize( |
951 policies[i], gfx::Size(837, 999), gfx::Size(837, 999)); | 962 policies[i], gfx::Size(837, 999), gfx::Size(837, 999)); |
952 } | 963 } |
953 } | 964 } |
954 | 965 |
955 // Tests the Suspend/Resume() functionality. | 966 // Tests the Suspend/Resume() functionality. |
956 TEST_F(WebContentsVideoCaptureDeviceTest, SuspendsAndResumes) { | 967 TEST_F(WebContentsVideoCaptureDeviceTest, SuspendsAndResumes) { |
957 device()->AllocateAndStart(DefaultCaptureParams(), | 968 auto client = client_observer()->PassClient(); |
958 client_observer()->PassClient()); | 969 EXPECT_CALL(*client, OnStarted()); |
| 970 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
959 | 971 |
960 for (int i = 0; i < 3; ++i) { | 972 for (int i = 0; i < 3; ++i) { |
961 // Draw a RED frame and wait for a normal frame capture to occur. | 973 // Draw a RED frame and wait for a normal frame capture to occur. |
962 test_view()->SetSolidColor(SK_ColorRED); | 974 test_view()->SetSolidColor(SK_ColorRED); |
963 SimulateDrawEvent(); | 975 SimulateDrawEvent(); |
964 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 976 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
965 | 977 |
966 // Suspend capture and then draw a GREEN frame. No frame capture should | 978 // Suspend capture and then draw a GREEN frame. No frame capture should |
967 // occur. | 979 // occur. |
968 device()->MaybeSuspend(); | 980 device()->MaybeSuspend(); |
(...skipping 12 matching lines...) Expand all Loading... |
981 test_view()->SetSolidColor(SK_ColorBLUE); | 993 test_view()->SetSolidColor(SK_ColorBLUE); |
982 SimulateDrawEvent(); | 994 SimulateDrawEvent(); |
983 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLUE)); | 995 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLUE)); |
984 } | 996 } |
985 | 997 |
986 device()->StopAndDeAllocate(); | 998 device()->StopAndDeAllocate(); |
987 } | 999 } |
988 | 1000 |
989 // Tests the RequestRefreshFrame() functionality. | 1001 // Tests the RequestRefreshFrame() functionality. |
990 TEST_F(WebContentsVideoCaptureDeviceTest, ProvidesRefreshFrames) { | 1002 TEST_F(WebContentsVideoCaptureDeviceTest, ProvidesRefreshFrames) { |
991 device()->AllocateAndStart(DefaultCaptureParams(), | 1003 auto client = client_observer()->PassClient(); |
992 client_observer()->PassClient()); | 1004 EXPECT_CALL(*client, OnStarted()); |
| 1005 device()->AllocateAndStart(DefaultCaptureParams(), std::move(client)); |
993 | 1006 |
994 // Request a refresh frame before the first frame has been drawn. This forces | 1007 // Request a refresh frame before the first frame has been drawn. This forces |
995 // a capture. | 1008 // a capture. |
996 test_view()->SetSolidColor(SK_ColorRED); | 1009 test_view()->SetSolidColor(SK_ColorRED); |
997 SimulateRefreshFrameRequest(); | 1010 SimulateRefreshFrameRequest(); |
998 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 1011 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
999 | 1012 |
1000 // Now, draw a frame and wait for a normal frame capture to occur. | 1013 // Now, draw a frame and wait for a normal frame capture to occur. |
1001 test_view()->SetSolidColor(SK_ColorGREEN); | 1014 test_view()->SetSolidColor(SK_ColorGREEN); |
1002 SimulateDrawEvent(); | 1015 SimulateDrawEvent(); |
1003 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); | 1016 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); |
1004 | 1017 |
1005 // Now, make three more refresh frame requests. Although the source has | 1018 // Now, make three more refresh frame requests. Although the source has |
1006 // changed to BLUE, no draw event has occurred. Therefore, expect the refresh | 1019 // changed to BLUE, no draw event has occurred. Therefore, expect the refresh |
1007 // frames to contain the content from the last drawn frame, which is GREEN. | 1020 // frames to contain the content from the last drawn frame, which is GREEN. |
1008 test_view()->SetSolidColor(SK_ColorBLUE); | 1021 test_view()->SetSolidColor(SK_ColorBLUE); |
1009 for (int i = 0; i < 3; ++i) { | 1022 for (int i = 0; i < 3; ++i) { |
1010 SimulateRefreshFrameRequest(); | 1023 SimulateRefreshFrameRequest(); |
1011 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); | 1024 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); |
1012 } | 1025 } |
1013 | 1026 |
1014 device()->StopAndDeAllocate(); | 1027 device()->StopAndDeAllocate(); |
1015 } | 1028 } |
1016 | 1029 |
1017 } // namespace | 1030 } // namespace |
1018 } // namespace content | 1031 } // namespace content |
OLD | NEW |