OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |