Index: talk/app/webrtc/rtpsender.cc |
diff --git a/talk/app/webrtc/rtpsender.cc b/talk/app/webrtc/rtpsender.cc |
index a30bf0b163616f7022530f7c993d9ad153561969..5e627a9fbbe61a0af25e57d5a64053418542a2c8 100644 |
--- a/talk/app/webrtc/rtpsender.cc |
+++ b/talk/app/webrtc/rtpsender.cc |
@@ -273,6 +273,8 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
// Detach from old track. |
if (track_) { |
track_->UnregisterObserver(this); |
+ track_->RemoveSink(sink_); |
+ sink_ = nullptr; |
} |
// Attach to new track. |
@@ -286,6 +288,8 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
// Update video provider. |
if (can_send_track()) { |
VideoSourceInterface* source = track_->GetSource(); |
+ sink_ = provider_->GetSink(ssrc_); |
+ RTC_CHECK(sink_); |
// TODO(deadbeef): If SetTrack is called with a disabled track, and the |
// previous track was enabled, this could cause a frame from the new track |
// to slip out. Really, what we need is for SetCaptureDevice and |
@@ -295,6 +299,7 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
provider_->SetCaptureDevice(ssrc_, |
source ? source->GetVideoCapturer() : nullptr); |
SetVideoSend(); |
+ track_->AddSink(sink_); |
} else if (prev_can_send_track) { |
provider_->SetCaptureDevice(ssrc_, nullptr); |
provider_->SetVideoSend(ssrc_, false, nullptr); |
@@ -310,6 +315,8 @@ void VideoRtpSender::SetSsrc(uint32_t ssrc) { |
if (can_send_track()) { |
provider_->SetCaptureDevice(ssrc_, nullptr); |
provider_->SetVideoSend(ssrc_, false, nullptr); |
+ track_->RemoveSink(sink_); |
+ sink_ = nullptr; |
} |
ssrc_ = ssrc; |
if (can_send_track()) { |
@@ -317,6 +324,8 @@ void VideoRtpSender::SetSsrc(uint32_t ssrc) { |
provider_->SetCaptureDevice(ssrc_, |
source ? source->GetVideoCapturer() : nullptr); |
SetVideoSend(); |
+ sink_ = provider_->GetSink(ssrc_); |
+ track_->AddSink(sink_); |
} |
} |
@@ -327,6 +336,9 @@ void VideoRtpSender::Stop() { |
} |
if (track_) { |
track_->UnregisterObserver(this); |
+ RTC_DCHECK(sink_); |
+ RTC_DCHECK(sink_ == provider_->GetSink(ssrc_)); |
+ track_->RemoveSink(sink_); |
} |
if (can_send_track()) { |
provider_->SetCaptureDevice(ssrc_, nullptr); |