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 |