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

Side by Side Diff: content/renderer/media/media_stream_video_track_unittest.cc

Issue 1849003002: Add video frame refresh to MediaStream and VideoCapture stacks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nick's PS3 comments (moving non-observer impl out of MSVideoSink interface). Created 4 years, 8 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
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_video_track.cc ('k') | content/renderer/media/mock_media_stream_video_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698