| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 const scoped_ptr<ChildProcess> child_process_; | 102 const scoped_ptr<ChildProcess> child_process_; |
| 103 blink::WebMediaStreamSource blink_source_; | 103 blink::WebMediaStreamSource blink_source_; |
| 104 // |mock_source_| is owned by |webkit_source_|. | 104 // |mock_source_| is owned by |webkit_source_|. |
| 105 MockMediaStreamVideoSource* mock_source_; | 105 MockMediaStreamVideoSource* mock_source_; |
| 106 bool source_started_; | 106 bool source_started_; |
| 107 }; | 107 }; |
| 108 | 108 |
| 109 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { | 109 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { |
| 110 MockMediaStreamVideoSink sink; | 110 MockMediaStreamVideoSink sink; |
| 111 blink::WebMediaStreamTrack track = CreateTrack(); | 111 blink::WebMediaStreamTrack track = CreateTrack(); |
| 112 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); | 112 sink.ConnectToTrack(track); |
| 113 | 113 |
| 114 DeliverVideoFrameAndWaitForRenderer(&sink); | 114 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 115 EXPECT_EQ(1, sink.number_of_frames()); | 115 EXPECT_EQ(1, sink.number_of_frames()); |
| 116 | 116 |
| 117 DeliverVideoFrameAndWaitForRenderer(&sink); | 117 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 118 | 118 |
| 119 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 119 sink.DisconnectFromTrack(); |
| 120 | 120 |
| 121 scoped_refptr<media::VideoFrame> frame = | 121 scoped_refptr<media::VideoFrame> frame = |
| 122 media::VideoFrame::CreateBlackFrame( | 122 media::VideoFrame::CreateBlackFrame( |
| 123 gfx::Size(MediaStreamVideoSource::kDefaultWidth, | 123 gfx::Size(MediaStreamVideoSource::kDefaultWidth, |
| 124 MediaStreamVideoSource::kDefaultHeight)); | 124 MediaStreamVideoSource::kDefaultHeight)); |
| 125 mock_source()->DeliverVideoFrame(frame); | 125 mock_source()->DeliverVideoFrame(frame); |
| 126 // Wait for the IO thread to complete delivering frames. | 126 // Wait for the IO thread to complete delivering frames. |
| 127 io_message_loop()->RunUntilIdle(); | 127 io_message_loop()->RunUntilIdle(); |
| 128 EXPECT_EQ(2, sink.number_of_frames()); | 128 EXPECT_EQ(2, sink.number_of_frames()); |
| 129 } | 129 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 153 // Do nothing. | 153 // Do nothing. |
| 154 } | 154 } |
| 155 | 155 |
| 156 // Checks that the callback given to the track is reset on the right thread. | 156 // Checks that the callback given to the track is reset on the right thread. |
| 157 TEST_F(MediaStreamVideoTrackTest, ResetCallbackOnThread) { | 157 TEST_F(MediaStreamVideoTrackTest, ResetCallbackOnThread) { |
| 158 MockMediaStreamVideoSink sink; | 158 MockMediaStreamVideoSink sink; |
| 159 blink::WebMediaStreamTrack track = CreateTrack(); | 159 blink::WebMediaStreamTrack track = CreateTrack(); |
| 160 | 160 |
| 161 base::RunLoop run_loop; | 161 base::RunLoop run_loop; |
| 162 bool correct = false; | 162 bool correct = false; |
| 163 MediaStreamVideoSink::AddToVideoTrack( | 163 sink.ConnectToTrackWithCallback( |
| 164 &sink, | 164 track, |
| 165 base::Bind( | 165 base::Bind(&CheckThreadVideoFrameReceiver, |
| 166 &CheckThreadVideoFrameReceiver, | 166 base::Owned(new CheckThreadHelper(run_loop.QuitClosure(), |
| 167 base::Owned(new CheckThreadHelper(run_loop.QuitClosure(), &correct))), | 167 &correct)))); |
| 168 track); | 168 sink.DisconnectFromTrack(); |
| 169 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | |
| 170 run_loop.Run(); | 169 run_loop.Run(); |
| 171 EXPECT_TRUE(correct) << "Not called on correct thread."; | 170 EXPECT_TRUE(correct) << "Not called on correct thread."; |
| 172 } | 171 } |
| 173 | 172 |
| 174 TEST_F(MediaStreamVideoTrackTest, SetEnabled) { | 173 TEST_F(MediaStreamVideoTrackTest, SetEnabled) { |
| 175 MockMediaStreamVideoSink sink; | 174 MockMediaStreamVideoSink sink; |
| 176 blink::WebMediaStreamTrack track = CreateTrack(); | 175 blink::WebMediaStreamTrack track = CreateTrack(); |
| 177 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); | 176 sink.ConnectToTrack(track); |
| 178 | 177 |
| 179 MediaStreamVideoTrack* video_track = | 178 MediaStreamVideoTrack* video_track = |
| 180 MediaStreamVideoTrack::GetVideoTrack(track); | 179 MediaStreamVideoTrack::GetVideoTrack(track); |
| 181 | 180 |
| 182 DeliverVideoFrameAndWaitForRenderer(&sink); | 181 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 183 EXPECT_EQ(1, sink.number_of_frames()); | 182 EXPECT_EQ(1, sink.number_of_frames()); |
| 184 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 183 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 185 | 184 |
| 186 video_track->SetEnabled(false); | 185 video_track->SetEnabled(false); |
| 187 EXPECT_FALSE(sink.enabled()); | 186 EXPECT_FALSE(sink.enabled()); |
| 188 | 187 |
| 189 DeliverVideoFrameAndWaitForRenderer(&sink); | 188 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 190 EXPECT_EQ(2, sink.number_of_frames()); | 189 EXPECT_EQ(2, sink.number_of_frames()); |
| 191 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 190 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 192 | 191 |
| 193 video_track->SetEnabled(true); | 192 video_track->SetEnabled(true); |
| 194 EXPECT_TRUE(sink.enabled()); | 193 EXPECT_TRUE(sink.enabled()); |
| 195 DeliverVideoFrameAndWaitForRenderer(&sink); | 194 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 196 EXPECT_EQ(3, sink.number_of_frames()); | 195 EXPECT_EQ(3, sink.number_of_frames()); |
| 197 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 196 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 198 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 197 sink.DisconnectFromTrack(); |
| 199 } | 198 } |
| 200 | 199 |
| 201 TEST_F(MediaStreamVideoTrackTest, SourceStopped) { | 200 TEST_F(MediaStreamVideoTrackTest, SourceStopped) { |
| 202 MockMediaStreamVideoSink sink; | 201 MockMediaStreamVideoSink sink; |
| 203 blink::WebMediaStreamTrack track = CreateTrack(); | 202 blink::WebMediaStreamTrack track = CreateTrack(); |
| 204 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); | 203 sink.ConnectToTrack(track); |
| 205 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state()); | 204 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state()); |
| 206 | 205 |
| 207 mock_source()->StopSource(); | 206 mock_source()->StopSource(); |
| 208 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state()); | 207 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state()); |
| 209 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 208 sink.DisconnectFromTrack(); |
| 210 } | 209 } |
| 211 | 210 |
| 212 TEST_F(MediaStreamVideoTrackTest, StopLastTrack) { | 211 TEST_F(MediaStreamVideoTrackTest, StopLastTrack) { |
| 213 MockMediaStreamVideoSink sink1; | 212 MockMediaStreamVideoSink sink1; |
| 214 blink::WebMediaStreamTrack track1 = CreateTrack(); | 213 blink::WebMediaStreamTrack track1 = CreateTrack(); |
| 215 MediaStreamVideoSink::AddToVideoTrack( | 214 sink1.ConnectToTrack(track1); |
| 216 &sink1, sink1.GetDeliverFrameCB(), track1); | |
| 217 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink1.state()); | 215 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink1.state()); |
| 218 | 216 |
| 219 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, | 217 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
| 220 blink_source().getReadyState()); | 218 blink_source().getReadyState()); |
| 221 | 219 |
| 222 MockMediaStreamVideoSink sink2; | 220 MockMediaStreamVideoSink sink2; |
| 223 blink::WebMediaStreamTrack track2 = CreateTrack(); | 221 blink::WebMediaStreamTrack track2 = CreateTrack(); |
| 224 MediaStreamVideoSink::AddToVideoTrack( | 222 sink2.ConnectToTrack(track2); |
| 225 &sink2, sink2.GetDeliverFrameCB(), track2); | |
| 226 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink2.state()); | 223 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink2.state()); |
| 227 | 224 |
| 228 MediaStreamVideoTrack* const native_track1 = | 225 MediaStreamVideoTrack* const native_track1 = |
| 229 MediaStreamVideoTrack::GetVideoTrack(track1); | 226 MediaStreamVideoTrack::GetVideoTrack(track1); |
| 230 native_track1->Stop(); | 227 native_track1->Stop(); |
| 231 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink1.state()); | 228 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink1.state()); |
| 232 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, | 229 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
| 233 blink_source().getReadyState()); | 230 blink_source().getReadyState()); |
| 234 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); | 231 sink1.DisconnectFromTrack(); |
| 235 | 232 |
| 236 MediaStreamVideoTrack* const native_track2 = | 233 MediaStreamVideoTrack* const native_track2 = |
| 237 MediaStreamVideoTrack::GetVideoTrack(track2); | 234 MediaStreamVideoTrack::GetVideoTrack(track2); |
| 238 native_track2->Stop(); | 235 native_track2->Stop(); |
| 239 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state()); | 236 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state()); |
| 240 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, | 237 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, |
| 241 blink_source().getReadyState()); | 238 blink_source().getReadyState()); |
| 242 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); | 239 sink2.DisconnectFromTrack(); |
| 243 } | 240 } |
| 244 | 241 |
| 245 TEST_F(MediaStreamVideoTrackTest, CheckTrackRequestsFrame) { | 242 TEST_F(MediaStreamVideoTrackTest, CheckTrackRequestsFrame) { |
| 246 UpdateVideoSourceToRespondToRequestRefreshFrame(); | 243 UpdateVideoSourceToRespondToRequestRefreshFrame(); |
| 247 blink::WebMediaStreamTrack track = CreateTrack(); | 244 blink::WebMediaStreamTrack track = CreateTrack(); |
| 248 | 245 |
| 249 // Add sink and expect to get a frame. | 246 // Add sink and expect to get a frame. |
| 250 MockMediaStreamVideoSink sink; | 247 MockMediaStreamVideoSink sink; |
| 251 base::RunLoop run_loop; | 248 base::RunLoop run_loop; |
| 252 base::Closure quit_closure = run_loop.QuitClosure(); | 249 base::Closure quit_closure = run_loop.QuitClosure(); |
| 253 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); | 250 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); |
| 254 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); | 251 sink.ConnectToTrack(track); |
| 255 run_loop.Run(); | 252 run_loop.Run(); |
| 256 EXPECT_EQ(1, sink.number_of_frames()); | 253 EXPECT_EQ(1, sink.number_of_frames()); |
| 257 | 254 |
| 258 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 255 sink.DisconnectFromTrack(); |
| 259 } | 256 } |
| 260 | 257 |
| 261 } // namespace content | 258 } // namespace content |
| OLD | NEW |