| 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;
|
|
|