Index: webrtc/api/rtpsender.cc |
diff --git a/webrtc/api/rtpsender.cc b/webrtc/api/rtpsender.cc |
index f66e66b4356c7b8fdf6740b40ba4577ad4334ae5..2e01d961d43696ef878c6336c9573f849cd4a885 100644 |
--- a/webrtc/api/rtpsender.cc |
+++ b/webrtc/api/rtpsender.cc |
@@ -45,40 +45,38 @@ void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) { |
AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, |
const std::string& stream_id, |
- AudioProviderInterface* provider, |
+ cricket::VoiceChannel* channel, |
StatsCollector* stats) |
: id_(track->id()), |
stream_id_(stream_id), |
- provider_(provider), |
+ channel_(channel), |
stats_(stats), |
track_(track), |
cached_track_enabled_(track->enabled()), |
sink_adapter_(new LocalAudioSinkAdapter()) { |
- RTC_DCHECK(provider != nullptr); |
track_->RegisterObserver(this); |
track_->AddSink(sink_adapter_.get()); |
} |
AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, |
- AudioProviderInterface* provider, |
+ cricket::VoiceChannel* channel, |
StatsCollector* stats) |
: id_(track->id()), |
stream_id_(rtc::CreateRandomUuid()), |
- provider_(provider), |
+ channel_(channel), |
stats_(stats), |
track_(track), |
cached_track_enabled_(track->enabled()), |
sink_adapter_(new LocalAudioSinkAdapter()) { |
- RTC_DCHECK(provider != nullptr); |
track_->RegisterObserver(this); |
track_->AddSink(sink_adapter_.get()); |
} |
-AudioRtpSender::AudioRtpSender(AudioProviderInterface* provider, |
+AudioRtpSender::AudioRtpSender(cricket::VoiceChannel* channel, |
StatsCollector* stats) |
: id_(rtc::CreateRandomUuid()), |
stream_id_(rtc::CreateRandomUuid()), |
- provider_(provider), |
+ channel_(channel), |
stats_(stats), |
sink_adapter_(new LocalAudioSinkAdapter()) {} |
@@ -132,26 +130,31 @@ bool AudioRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
track_->AddSink(sink_adapter_.get()); |
} |
- // Update audio provider. |
+ // Update audio channel. |
if (can_send_track()) { |
SetAudioSend(); |
if (stats_) { |
stats_->AddLocalAudioTrack(track_.get(), ssrc_); |
} |
} else if (prev_can_send_track) { |
- cricket::AudioOptions options; |
- provider_->SetAudioSend(ssrc_, false, options, nullptr); |
+ ClearAudioSend(); |
} |
return true; |
} |
RtpParameters AudioRtpSender::GetParameters() const { |
- return provider_->GetAudioRtpSendParameters(ssrc_); |
+ if (!channel_ || stopped_) { |
+ return RtpParameters(); |
+ } |
+ return channel_->GetRtpSendParameters(ssrc_); |
} |
bool AudioRtpSender::SetParameters(const RtpParameters& parameters) { |
TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters"); |
- return provider_->SetAudioRtpSendParameters(ssrc_, parameters); |
+ if (!channel_ || stopped_) { |
+ return false; |
+ } |
+ return channel_->SetRtpSendParameters(ssrc_, parameters); |
} |
void AudioRtpSender::SetSsrc(uint32_t ssrc) { |
@@ -161,8 +164,7 @@ void AudioRtpSender::SetSsrc(uint32_t ssrc) { |
} |
// If we are already sending with a particular SSRC, stop sending. |
if (can_send_track()) { |
- cricket::AudioOptions options; |
- provider_->SetAudioSend(ssrc_, false, options, nullptr); |
+ ClearAudioSend(); |
if (stats_) { |
stats_->RemoveLocalAudioTrack(track_.get(), ssrc_); |
} |
@@ -187,8 +189,7 @@ void AudioRtpSender::Stop() { |
track_->UnregisterObserver(this); |
} |
if (can_send_track()) { |
- cricket::AudioOptions options; |
- provider_->SetAudioSend(ssrc_, false, options, nullptr); |
+ ClearAudioSend(); |
if (stats_) { |
stats_->RemoveLocalAudioTrack(track_.get(), ssrc_); |
} |
@@ -198,6 +199,10 @@ void AudioRtpSender::Stop() { |
void AudioRtpSender::SetAudioSend() { |
RTC_DCHECK(!stopped_ && can_send_track()); |
+ if (!channel_) { |
+ LOG(LS_ERROR) << "SetAudioSend: No audio channel exists."; |
+ return; |
+ } |
cricket::AudioOptions options; |
#if !defined(WEBRTC_CHROMIUM_BUILD) |
// TODO(tommi): Remove this hack when we move CreateAudioSource out of |
@@ -212,37 +217,50 @@ void AudioRtpSender::SetAudioSend() { |
#endif |
cricket::AudioSource* source = sink_adapter_.get(); |
- ASSERT(source != nullptr); |
- provider_->SetAudioSend(ssrc_, track_->enabled(), options, source); |
+ RTC_DCHECK(source != nullptr); |
+ if (!channel_->SetAudioSend(ssrc_, track_->enabled(), &options, source)) { |
+ LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc_; |
+ } |
+} |
+ |
+void AudioRtpSender::ClearAudioSend() { |
+ RTC_DCHECK(ssrc_ != 0); |
+ RTC_DCHECK(!stopped_); |
+ if (!channel_) { |
+ LOG(LS_WARNING) << "ClearAudioSend: No audio channel exists."; |
+ return; |
+ } |
+ cricket::AudioOptions options; |
+ if (!channel_->SetAudioSend(ssrc_, false, &options, nullptr)) { |
+ LOG(LS_WARNING) << "ClearAudioSend: ssrc is incorrect: " << ssrc_; |
+ } |
} |
VideoRtpSender::VideoRtpSender(VideoTrackInterface* track, |
const std::string& stream_id, |
- VideoProviderInterface* provider) |
+ cricket::VideoChannel* channel) |
: id_(track->id()), |
stream_id_(stream_id), |
- provider_(provider), |
+ channel_(channel), |
track_(track), |
cached_track_enabled_(track->enabled()) { |
- RTC_DCHECK(provider != nullptr); |
track_->RegisterObserver(this); |
} |
VideoRtpSender::VideoRtpSender(VideoTrackInterface* track, |
- VideoProviderInterface* provider) |
+ cricket::VideoChannel* channel) |
: id_(track->id()), |
stream_id_(rtc::CreateRandomUuid()), |
- provider_(provider), |
+ channel_(channel), |
track_(track), |
cached_track_enabled_(track->enabled()) { |
- RTC_DCHECK(provider != nullptr); |
track_->RegisterObserver(this); |
} |
-VideoRtpSender::VideoRtpSender(VideoProviderInterface* provider) |
+VideoRtpSender::VideoRtpSender(cricket::VideoChannel* channel) |
: id_(rtc::CreateRandomUuid()), |
stream_id_(rtc::CreateRandomUuid()), |
- provider_(provider) {} |
+ channel_(channel) {} |
VideoRtpSender::~VideoRtpSender() { |
Stop(); |
@@ -288,7 +306,7 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
track_->RegisterObserver(this); |
} |
- // Update video provider. |
+ // Update video channel. |
if (can_send_track()) { |
SetVideoSend(); |
} else if (prev_can_send_track) { |
@@ -298,12 +316,18 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { |
} |
RtpParameters VideoRtpSender::GetParameters() const { |
- return provider_->GetVideoRtpSendParameters(ssrc_); |
+ if (!channel_ || stopped_) { |
+ return RtpParameters(); |
+ } |
+ return channel_->GetRtpSendParameters(ssrc_); |
} |
bool VideoRtpSender::SetParameters(const RtpParameters& parameters) { |
TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters"); |
- return provider_->SetVideoRtpSendParameters(ssrc_, parameters); |
+ if (!channel_ || stopped_) { |
+ return false; |
+ } |
+ return channel_->SetRtpSendParameters(ssrc_, parameters); |
} |
void VideoRtpSender::SetSsrc(uint32_t ssrc) { |
@@ -338,19 +362,32 @@ void VideoRtpSender::Stop() { |
void VideoRtpSender::SetVideoSend() { |
RTC_DCHECK(!stopped_ && can_send_track()); |
+ if (!channel_) { |
+ LOG(LS_ERROR) << "SetVideoSend: No video channel exists."; |
+ return; |
+ } |
cricket::VideoOptions options; |
VideoTrackSourceInterface* source = track_->GetSource(); |
if (source) { |
options.is_screencast = rtc::Optional<bool>(source->is_screencast()); |
options.video_noise_reduction = source->needs_denoising(); |
} |
- provider_->SetVideoSend(ssrc_, track_->enabled(), &options, track_); |
+ if (!channel_->SetVideoSend(ssrc_, track_->enabled(), &options, track_)) { |
+ RTC_DCHECK(false); |
+ } |
} |
void VideoRtpSender::ClearVideoSend() { |
RTC_DCHECK(ssrc_ != 0); |
- RTC_DCHECK(provider_ != nullptr); |
- provider_->SetVideoSend(ssrc_, false, nullptr, nullptr); |
+ RTC_DCHECK(!stopped_); |
+ if (!channel_) { |
+ LOG(LS_WARNING) << "SetVideoSend: No video channel exists."; |
+ return; |
+ } |
+ // Allow SetVideoSend to fail since |enable| is false and |source| is null. |
+ // This the normal case when the underlying media channel has already been |
+ // deleted. |
+ channel_->SetVideoSend(ssrc_, false, nullptr, nullptr); |
} |
} // namespace webrtc |