| Index: talk/session/media/channel.cc
|
| diff --git a/talk/session/media/channel.cc b/talk/session/media/channel.cc
|
| index 91808524e176be6ec0b46bd40042643048cfad59..46cd9d5c8453be4c7f97eede4acdec846a9588c7 100644
|
| --- a/talk/session/media/channel.cc
|
| +++ b/talk/session/media/channel.cc
|
| @@ -265,24 +265,39 @@ 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()) {
|
| + // Set |writable_| to false such that UpdateWritableState_w can set up
|
| + // DTLS-SRTP when the writable_ becomes true again.
|
| + writable_ = false;
|
| srtp_filter_.ResetParams();
|
| }
|
|
|
| - set_transport_channel(transport_controller_->CreateTransportChannel_w(
|
| - transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP));
|
| - if (!transport_channel()) {
|
| - return false;
|
| - }
|
| + // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP.
|
| 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;
|
| }
|
| }
|
|
|
| + // We're not updating the writablity during the transition state.
|
| + set_transport_channel(transport_controller_->CreateTransportChannel_w(
|
| + transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP));
|
| + if (!transport_channel()) {
|
| + return false;
|
| + }
|
| +
|
| + // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP.
|
| + if (rtcp_transport_enabled()) {
|
| + // We can only update the RTCP ready to send after set_transport_channel has
|
| + // handled channel writability.
|
| + SetReadyToSend(
|
| + true, rtcp_transport_channel() && rtcp_transport_channel()->writable());
|
| + }
|
| transport_name_ = transport_name;
|
| return true;
|
| }
|
| @@ -318,7 +333,8 @@ void BaseChannel::set_transport_channel(TransportChannel* new_tc) {
|
| 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 +362,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 +1088,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 +1111,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;
|
|
|