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

Side by Side Diff: content/renderer/media/media_stream_video_track.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 last round of comments from xjz and emircan. 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/renderer/media/media_stream_video_track.h" 5 #include "content/renderer/media/media_stream_video_track.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 track.setExtraData(new MediaStreamVideoTrack(source, 205 track.setExtraData(new MediaStreamVideoTrack(source,
206 constraints, 206 constraints,
207 callback, 207 callback,
208 enabled)); 208 enabled));
209 return track; 209 return track;
210 } 210 }
211 211
212 // static 212 // static
213 MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack( 213 MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack(
214 const blink::WebMediaStreamTrack& track) { 214 const blink::WebMediaStreamTrack& track) {
215 if (track.isNull() ||
216 track.source().getType() != blink::WebMediaStreamSource::TypeVideo) {
217 return nullptr;
218 }
215 return static_cast<MediaStreamVideoTrack*>(track.getExtraData()); 219 return static_cast<MediaStreamVideoTrack*>(track.getExtraData());
216 } 220 }
217 221
218 MediaStreamVideoTrack::MediaStreamVideoTrack( 222 MediaStreamVideoTrack::MediaStreamVideoTrack(
219 MediaStreamVideoSource* source, 223 MediaStreamVideoSource* source,
220 const blink::WebMediaConstraints& constraints, 224 const blink::WebMediaConstraints& constraints,
221 const MediaStreamVideoSource::ConstraintsCallback& callback, 225 const MediaStreamVideoSource::ConstraintsCallback& callback,
222 bool enabled) 226 bool enabled)
223 : MediaStreamTrack(true), 227 : MediaStreamTrack(true),
224 frame_deliverer_( 228 frame_deliverer_(
225 new MediaStreamVideoTrack::FrameDeliverer(source->io_task_runner(), 229 new MediaStreamVideoTrack::FrameDeliverer(source->io_task_runner(),
226 enabled)), 230 enabled)),
227 constraints_(constraints), 231 constraints_(constraints),
228 source_(source) { 232 source_(source) {
229 DCHECK(!constraints.isNull()); 233 DCHECK(!constraints.isNull());
230 source->AddTrack(this, 234 source->AddTrack(this,
231 base::Bind( 235 base::Bind(
232 &MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO, 236 &MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO,
233 frame_deliverer_), 237 frame_deliverer_),
234 constraints, callback); 238 constraints, callback);
235 } 239 }
236 240
237 MediaStreamVideoTrack::~MediaStreamVideoTrack() { 241 MediaStreamVideoTrack::~MediaStreamVideoTrack() {
238 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 242 DCHECK(main_render_thread_checker_.CalledOnValidThread());
243
244 // It's critical to check that |sinks_| is empty because a
245 // MediaStreamVideoSink holds a pointer to this track until it calls
246 // RemoveSink().
mcasas 2016/04/05 23:12:52 This is true and unfortunately so because the owne
miu 2016/04/06 00:03:18 FYI--Your comment here makes me wonder if this cha
239 DCHECK(sinks_.empty()); 247 DCHECK(sinks_.empty());
248
240 Stop(); 249 Stop();
241 DVLOG(3) << "~MediaStreamVideoTrack()"; 250 DVLOG(3) << "~MediaStreamVideoTrack()";
242 } 251 }
243 252
244 void MediaStreamVideoTrack::AddSink( 253 void MediaStreamVideoTrack::AddSink(
245 MediaStreamVideoSink* sink, const VideoCaptureDeliverFrameCB& callback) { 254 MediaStreamVideoSink* sink, const VideoCaptureDeliverFrameCB& callback) {
246 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 255 DCHECK(main_render_thread_checker_.CalledOnValidThread());
247 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end()); 256 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
248 sinks_.push_back(sink); 257 sinks_.push_back(sink);
249 frame_deliverer_->AddCallback(sink, callback); 258 frame_deliverer_->AddCallback(sink, callback);
259
250 // Request source to deliver a frame because a new sink is added. 260 // Request source to deliver a frame because a new sink is added.
251 if (source_) 261 RequestRefreshFrame();
252 source_->RequestRefreshFrame();
253 } 262 }
254 263
255 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { 264 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
256 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 265 DCHECK(main_render_thread_checker_.CalledOnValidThread());
257 std::vector<MediaStreamVideoSink*>::iterator it = 266 std::vector<MediaStreamVideoSink*>::iterator it =
258 std::find(sinks_.begin(), sinks_.end(), sink); 267 std::find(sinks_.begin(), sinks_.end(), sink);
259 DCHECK(it != sinks_.end()); 268 DCHECK(it != sinks_.end());
260 sinks_.erase(it); 269 sinks_.erase(it);
261 frame_deliverer_->RemoveCallback(sink); 270 frame_deliverer_->RemoveCallback(sink);
262 } 271 }
(...skipping 14 matching lines...) Expand all
277 OnReadyStateChanged(blink::WebMediaStreamSource::ReadyStateEnded); 286 OnReadyStateChanged(blink::WebMediaStreamSource::ReadyStateEnded);
278 } 287 }
279 288
280 void MediaStreamVideoTrack::OnReadyStateChanged( 289 void MediaStreamVideoTrack::OnReadyStateChanged(
281 blink::WebMediaStreamSource::ReadyState state) { 290 blink::WebMediaStreamSource::ReadyState state) {
282 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 291 DCHECK(main_render_thread_checker_.CalledOnValidThread());
283 for (auto* sink : sinks_) 292 for (auto* sink : sinks_)
284 sink->OnReadyStateChanged(state); 293 sink->OnReadyStateChanged(state);
285 } 294 }
286 295
296 void MediaStreamVideoTrack::RequestRefreshFrame() {
297 DCHECK(main_render_thread_checker_.CalledOnValidThread());
298 if (source_)
299 source_->RequestRefreshFrame();
300 }
301
287 } // namespace content 302 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698