Index: content/renderer/media/media_stream_video_track.cc |
diff --git a/content/renderer/media/media_stream_video_track.cc b/content/renderer/media/media_stream_video_track.cc |
index 00e75faba188b6801f73a3f51218854afe3afb9a..4914de050dbddbf6bf108e66fbdd12114c008a38 100644 |
--- a/content/renderer/media/media_stream_video_track.cc |
+++ b/content/renderer/media/media_stream_video_track.cc |
@@ -212,6 +212,10 @@ blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( |
// static |
MediaStreamVideoTrack* MediaStreamVideoTrack::GetVideoTrack( |
const blink::WebMediaStreamTrack& track) { |
+ if (track.isNull() || |
+ track.source().getType() != blink::WebMediaStreamSource::TypeVideo) { |
+ return nullptr; |
+ } |
return static_cast<MediaStreamVideoTrack*>(track.getExtraData()); |
} |
@@ -236,7 +240,12 @@ MediaStreamVideoTrack::MediaStreamVideoTrack( |
MediaStreamVideoTrack::~MediaStreamVideoTrack() { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
+ |
+ // It's critical to check that |sinks_| is empty because a |
+ // MediaStreamVideoSink holds a pointer to this track until it calls |
+ // 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
|
DCHECK(sinks_.empty()); |
+ |
Stop(); |
DVLOG(3) << "~MediaStreamVideoTrack()"; |
} |
@@ -247,9 +256,9 @@ void MediaStreamVideoTrack::AddSink( |
DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end()); |
sinks_.push_back(sink); |
frame_deliverer_->AddCallback(sink, callback); |
+ |
// Request source to deliver a frame because a new sink is added. |
- if (source_) |
- source_->RequestRefreshFrame(); |
+ RequestRefreshFrame(); |
} |
void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { |
@@ -284,4 +293,10 @@ void MediaStreamVideoTrack::OnReadyStateChanged( |
sink->OnReadyStateChanged(state); |
} |
+void MediaStreamVideoTrack::RequestRefreshFrame() { |
+ DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
+ if (source_) |
+ source_->RequestRefreshFrame(); |
+} |
+ |
} // namespace content |