OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 EXPECT_EQ(expected_height1, sink1.frame_size().height()); | 191 EXPECT_EQ(expected_height1, sink1.frame_size().height()); |
192 | 192 |
193 EXPECT_EQ(1, sink2.number_of_frames()); | 193 EXPECT_EQ(1, sink2.number_of_frames()); |
194 EXPECT_EQ(expected_width2, sink2.frame_size().width()); | 194 EXPECT_EQ(expected_width2, sink2.frame_size().width()); |
195 EXPECT_EQ(expected_height2, sink2.frame_size().height()); | 195 EXPECT_EQ(expected_height2, sink2.frame_size().height()); |
196 | 196 |
197 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); | 197 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); |
198 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); | 198 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); |
199 } | 199 } |
200 | 200 |
| 201 void SetSourceSupportedFormats(const media::VideoCaptureFormats& formats) { |
| 202 mock_source_->SetSupportedFormats(formats); |
| 203 } |
| 204 |
201 void ReleaseTrackAndSourceOnAddTrackCallback( | 205 void ReleaseTrackAndSourceOnAddTrackCallback( |
202 const blink::WebMediaStreamTrack& track_to_release) { | 206 const blink::WebMediaStreamTrack& track_to_release) { |
203 track_to_release_ = track_to_release; | 207 track_to_release_ = track_to_release; |
204 } | 208 } |
205 | 209 |
206 private: | 210 private: |
207 void OnConstraintsApplied(MediaStreamSource* source, | 211 void OnConstraintsApplied(MediaStreamSource* source, |
208 MediaStreamRequestResult result, | 212 MediaStreamRequestResult result, |
209 const blink::WebString& result_name) { | 213 const blink::WebString& result_name) { |
210 ASSERT_EQ(source, webkit_source_.extraData()); | 214 ASSERT_EQ(source, webkit_source_.extraData()); |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 EXPECT_EQ(0, sink.number_of_frames()); | 735 EXPECT_EQ(0, sink.number_of_frames()); |
732 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink); | 736 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink); |
733 EXPECT_EQ(1, sink.number_of_frames()); | 737 EXPECT_EQ(1, sink.number_of_frames()); |
734 // Expect the delivered frame to be passed unchanged since its smaller than | 738 // Expect the delivered frame to be passed unchanged since its smaller than |
735 // max requested. | 739 // max requested. |
736 EXPECT_EQ(320, sink.frame_size().width()); | 740 EXPECT_EQ(320, sink.frame_size().width()); |
737 EXPECT_EQ(240, sink.frame_size().height()); | 741 EXPECT_EQ(240, sink.frame_size().height()); |
738 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 742 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
739 } | 743 } |
740 | 744 |
741 // Test that a source producing no frames calls back the MSVCS to tell so, and | 745 // Test that a source producing no frames change the source readyState to muted. |
742 // this in turn tells the Track attached. Then start passing frames, and check | |
743 // that in a reasonable time frame the muted state turns to false. | 746 // that in a reasonable time frame the muted state turns to false. |
744 TEST_F(MediaStreamVideoSourceTest, MutedSource) { | 747 TEST_F(MediaStreamVideoSourceTest, MutedSource) { |
| 748 // Setup the source for support a frame rate of 2000fps in order to test |
| 749 // the muted event faster. This is since the frame monitoring uses |
| 750 // PostDelayedTask that is dependent on the source frame rate. |
| 751 media::VideoCaptureFormats formats; |
| 752 formats.push_back(media::VideoCaptureFormat( |
| 753 gfx::Size(640, 480), 2000, media::PIXEL_FORMAT_I420)); |
| 754 SetSourceSupportedFormats(formats); |
| 755 |
745 MockMediaConstraintFactory factory; | 756 MockMediaConstraintFactory factory; |
746 blink::WebMediaStreamTrack track = | 757 blink::WebMediaStreamTrack track = |
747 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), | 758 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), |
748 640, 480, 30); | 759 640, 480, 2000); |
749 | |
750 MockMediaStreamVideoSink sink; | 760 MockMediaStreamVideoSink sink; |
751 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); | 761 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); |
752 EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), false); | 762 EXPECT_EQ(track.source().readyState(), |
| 763 blink::WebMediaStreamSource::ReadyStateLive); |
753 | 764 |
754 base::RunLoop run_loop; | 765 base::RunLoop run_loop; |
755 base::Closure quit_closure = run_loop.QuitClosure(); | 766 base::Closure quit_closure = run_loop.QuitClosure(); |
756 bool muted_state = false; | 767 bool muted_state = false; |
757 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) | 768 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) |
758 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); | 769 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); |
759 run_loop.Run(); | 770 run_loop.Run(); |
760 EXPECT_EQ(muted_state, true); | 771 EXPECT_EQ(muted_state, true); |
761 // TODO(mcasas): When added, check |track|'s (WebMediaStreamTrack) Muted | |
762 // attribute, should be true. In the meantime, check the MediaStreamTrack's. | |
763 EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), true); | |
764 | 772 |
| 773 EXPECT_EQ(track.source().readyState(), |
| 774 blink::WebMediaStreamSource::ReadyStateMuted); |
| 775 |
| 776 base::RunLoop run_loop2; |
| 777 base::Closure quit_closure2 = run_loop2.QuitClosure(); |
765 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) | 778 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) |
766 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); | 779 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure2))); |
767 // Mock frame delivery happens asynchronously, not according to the configured | 780 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink); |
768 // frame rate, potentially many frames can pass before the muted state is | 781 run_loop2.Run(); |
769 // flipped. |kMaxFrameCount| is used as a reasonable high bound of this value. | 782 |
770 const int kMaxFrameCount = 10000; | |
771 int i = 0; | |
772 while (muted_state != false || ++i > kMaxFrameCount) | |
773 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink); | |
774 EXPECT_EQ(muted_state, false); | 783 EXPECT_EQ(muted_state, false); |
775 EXPECT_LT(i, kMaxFrameCount); | 784 EXPECT_EQ(track.source().readyState(), |
776 EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), false); | 785 blink::WebMediaStreamSource::ReadyStateLive); |
777 | 786 |
778 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 787 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
779 } | 788 } |
780 | 789 |
781 // Test that a source producing no frames calls back the MSVCS to tell so, and | |
782 // this in turn tells all the Tracks attached. | |
783 TEST_F(MediaStreamVideoSourceTest, MutedSourceWithTwoTracks) { | |
784 MockMediaConstraintFactory factory1; | |
785 blink::WebMediaStreamTrack track1 = | |
786 CreateTrackAndStartSource(factory1.CreateWebMediaConstraints(), | |
787 MediaStreamVideoSource::kDefaultWidth, | |
788 MediaStreamVideoSource::kDefaultHeight, | |
789 30); | |
790 | |
791 MockMediaConstraintFactory factory2; | |
792 factory2.AddMandatory(MediaStreamVideoSource::kMaxFrameRate, 15); | |
793 blink::WebMediaStreamTrack track2 = CreateTrack( | |
794 "123", factory2.CreateWebMediaConstraints()); | |
795 EXPECT_EQ(0, NumberOfFailedConstraintsCallbacks()); | |
796 | |
797 MockMediaStreamVideoSink sink1; | |
798 MediaStreamVideoSink::AddToVideoTrack(&sink1, sink1.GetDeliverFrameCB(), | |
799 track1); | |
800 EXPECT_EQ(MediaStreamTrack::GetTrack(track1)->GetMutedState(), false); | |
801 | |
802 MockMediaStreamVideoSink sink2; | |
803 MediaStreamVideoSink::AddToVideoTrack(&sink2, sink2.GetDeliverFrameCB(), | |
804 track2); | |
805 EXPECT_EQ(MediaStreamTrack::GetTrack(track2)->GetMutedState(), false); | |
806 | |
807 base::RunLoop run_loop; | |
808 base::Closure quit_closure = run_loop.QuitClosure(); | |
809 bool muted_state = false; | |
810 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) | |
811 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); | |
812 run_loop.Run(); | |
813 EXPECT_EQ(muted_state, true); | |
814 | |
815 // TODO(mcasas): When added, check |track|'s (WebMediaStreamTrack) Muted | |
816 // attribute, should be true. In the meantime, check the MediaStreamTrack's. | |
817 EXPECT_EQ(MediaStreamTrack::GetTrack(track1)->GetMutedState(), true); | |
818 EXPECT_EQ(MediaStreamTrack::GetTrack(track2)->GetMutedState(), true); | |
819 | |
820 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); | |
821 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); | |
822 } | |
823 | |
824 } // namespace content | 790 } // namespace content |
OLD | NEW |