Index: talk/session/media/channel.cc |
diff --git a/talk/session/media/channel.cc b/talk/session/media/channel.cc |
index 91808524e176be6ec0b46bd40042643048cfad59..025e0224614a950a5a02ce5ec4df2b29c55fce13 100644 |
--- a/talk/session/media/channel.cc |
+++ b/talk/session/media/channel.cc |
@@ -265,29 +265,45 @@ bool BaseChannel::SetTransport_w(const std::string& transport_name) { |
// changes and wait until the DTLS handshake is complete to set the newly |
// negotiated parameters. |
if (ShouldSetupDtlsSrtp()) { |
+ // Setting to non-writable will send RTCP BYE so we can only clean up the |
+ // srtp filter parameters after this. |
+ ChannelNotWritable_w(); |
srtp_filter_.ResetParams(); |
} |
- set_transport_channel(transport_controller_->CreateTransportChannel_w( |
- transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
+ // We're not updating the writablity during the transition state. |
+ set_transport_channel( |
+ transport_controller_->CreateTransportChannel_w( |
+ transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP), |
+ false /* update_writablity */); |
if (!transport_channel()) { |
return false; |
} |
if (rtcp_transport_enabled()) { |
LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name() |
<< " on " << transport_name << " transport "; |
- set_rtcp_transport_channel(transport_controller_->CreateTransportChannel_w( |
- transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP)); |
+ set_rtcp_transport_channel( |
+ transport_controller_->CreateTransportChannel_w( |
+ transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP), |
+ false /* update_writablity */); |
if (!rtcp_transport_channel()) { |
return false; |
} |
} |
+ // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
+ // setting new channel |
+ UpdateWritableState_w(); |
+ SetReadyToSend(false, transport_channel() && transport_channel()->writable()); |
+ SetReadyToSend( |
+ true, rtcp_transport_channel() && rtcp_transport_channel()->writable()); |
+ |
transport_name_ = transport_name; |
return true; |
} |
-void BaseChannel::set_transport_channel(TransportChannel* new_tc) { |
+void BaseChannel::set_transport_channel(TransportChannel* new_tc, |
+ bool update_writablity) { |
ASSERT(worker_thread_ == rtc::Thread::Current()); |
TransportChannel* old_tc = transport_channel_; |
@@ -312,13 +328,16 @@ void BaseChannel::set_transport_channel(TransportChannel* new_tc) { |
} |
} |
- // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
- // setting new channel |
- UpdateWritableState_w(); |
- SetReadyToSend(false, new_tc && new_tc->writable()); |
+ if (update_writablity) { |
+ // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
+ // setting new channel |
+ UpdateWritableState_w(); |
+ SetReadyToSend(false, new_tc && new_tc->writable()); |
+ } |
} |
-void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) { |
+void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc, |
+ bool update_writablity) { |
ASSERT(worker_thread_ == rtc::Thread::Current()); |
TransportChannel* old_tc = rtcp_transport_channel_; |
@@ -346,10 +365,12 @@ void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) { |
} |
} |
- // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
- // setting new channel |
- UpdateWritableState_w(); |
- SetReadyToSend(true, new_tc && new_tc->writable()); |
+ if (update_writablity) { |
+ // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
+ // setting new channel |
+ UpdateWritableState_w(); |
+ SetReadyToSend(true, new_tc && new_tc->writable()); |
+ } |
} |
void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { |
@@ -1070,7 +1091,7 @@ void BaseChannel::ActivateRtcpMux() { |
void BaseChannel::ActivateRtcpMux_w() { |
if (!rtcp_mux_filter_.IsActive()) { |
rtcp_mux_filter_.SetActive(); |
- set_rtcp_transport_channel(nullptr); |
+ set_rtcp_transport_channel(nullptr, true); |
rtcp_transport_enabled_ = false; |
} |
} |
@@ -1093,7 +1114,7 @@ bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action, |
LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() |
<< " by destroying RTCP transport channel for " |
<< transport_name(); |
- set_rtcp_transport_channel(nullptr); |
+ set_rtcp_transport_channel(nullptr, true); |
rtcp_transport_enabled_ = false; |
} |
break; |