Chromium Code Reviews| Index: talk/app/webrtc/rtpsender.cc |
| diff --git a/talk/app/webrtc/rtpsender.cc b/talk/app/webrtc/rtpsender.cc |
| index 72a9114eb4df315dcdbd85e1fdc792ad3ddb704d..293b3600754ee0dd456fa4bea4c44e476376c1f0 100644 |
| --- a/talk/app/webrtc/rtpsender.cc |
| +++ b/talk/app/webrtc/rtpsender.cc |
| @@ -268,9 +268,17 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
| } |
| VideoTrackInterface* video_track = static_cast<VideoTrackInterface*>(track); |
| + // TODO(nisse): To make code a little simpler, ensure that |
| + // GetSink(0) returns NULL, and that AddSink and RemoveSink with |
| + // NULL is safe. |
| + rtc::VideoSinkInterface<cricket::VideoFrame>* sink = |
| + provider_->GetSink(ssrc_); |
| + |
| // Detach from old track. |
| if (track_) { |
| track_->UnregisterObserver(this); |
| + if (sink) |
| + track_->RemoveSink(sink); |
| } |
| // Attach to new track. |
| @@ -279,6 +287,8 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
| if (track_) { |
| cached_track_enabled_ = track_->enabled(); |
| track_->RegisterObserver(this); |
| + if (sink) |
| + video_track->AddSink(sink); |
| } |
| // Update video provider. |
| @@ -325,6 +335,14 @@ void VideoRtpSender::Stop() { |
| } |
| if (track_) { |
| track_->UnregisterObserver(this); |
| + |
| + rtc::VideoSinkInterface<cricket::VideoFrame>* sink = |
| + provider_->GetSink(ssrc_); |
| + if (sink) |
| + track_->RemoveSink(sink); |
| + else |
| + LOG(LS_ERROR) |
| + << "VideoRtpSender::Stop called with a NULL sink. Too late???"; |
|
perkj_webrtc
2016/01/26 15:40:56
Is there ever a case when this is fine? If not- I
nisse-webrtc
2016/01/28 08:24:53
I think track_->RemoveSink(nullptr) will succeed a
|
| } |
| if (can_send_track()) { |
| provider_->SetCaptureDevice(ssrc_, nullptr); |