Refactoring of RTCP options in BaseChannel.

Previously, BaseChannel supported a "no RTCP" mode, which wasn't
being used any more and is being deleted.

Also, "RTCP mux required" previously worked by calling "ActivateRtcpMux"
after construction. Now it works by explicitly passing a
"require_rtcp_mux" parameter into the constructor.

BUG=None

Review-Url: https://codereview.webrtc.org/2622613004
Cr-Original-Commit-Position: refs/heads/master@{#16045}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: ac22f70906175831270b399e20d0519198ac6922
diff --git a/api/rtcstatscollector_unittest.cc b/api/rtcstatscollector_unittest.cc
index 4d17003..a942662 100644
--- a/api/rtcstatscollector_unittest.cc
+++ b/api/rtcstatscollector_unittest.cc
@@ -101,7 +101,7 @@
 namespace {
 
 const int64_t kGetStatsReportTimeoutMs = 1000;
-const bool kDefaultRtcpEnabled = false;
+const bool kDefaultRtcpMuxRequired = true;
 const bool kDefaultSrtpRequired = true;
 
 struct CertificateInfo {
@@ -598,12 +598,12 @@
   cricket::VoiceChannel voice_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
       test_->media_engine(), voice_media_channel, "VoiceContentName",
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
-      video_media_channel, "VideoContentName", kDefaultRtcpEnabled,
+      video_media_channel, "VideoContentName", kDefaultRtcpMuxRequired,
       kDefaultSrtpRequired);
 
   // Audio
@@ -1446,7 +1446,7 @@
   cricket::VoiceChannel voice_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
       test_->media_engine(), voice_media_channel, "VoiceContentName",
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   cricket::VoiceMediaInfo voice_media_info;
 
@@ -1518,7 +1518,7 @@
   MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
-      video_media_channel, "VideoContentName", kDefaultRtcpEnabled,
+      video_media_channel, "VideoContentName", kDefaultRtcpMuxRequired,
       kDefaultSrtpRequired);
 
   cricket::VideoMediaInfo video_media_info;
@@ -1598,7 +1598,7 @@
   cricket::VoiceChannel voice_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
       test_->media_engine(), voice_media_channel, "VoiceContentName",
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   cricket::VoiceMediaInfo voice_media_info;
 
@@ -1665,7 +1665,7 @@
   MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
-      video_media_channel, "VideoContentName", kDefaultRtcpEnabled,
+      video_media_channel, "VideoContentName", kDefaultRtcpMuxRequired,
       kDefaultSrtpRequired);
 
   cricket::VideoMediaInfo video_media_info;
@@ -1744,11 +1744,11 @@
   cricket::VoiceChannel voice_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
       test_->media_engine(), voice_media_channel, "VoiceContentName",
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       test_->worker_thread(), test_->network_thread(), nullptr,
-      video_media_channel, "VideoContentName", kDefaultRtcpEnabled,
+      video_media_channel, "VideoContentName", kDefaultRtcpMuxRequired,
       kDefaultSrtpRequired);
 
   cricket::VoiceMediaInfo voice_media_info;
diff --git a/api/rtpsenderreceiver_unittest.cc b/api/rtpsenderreceiver_unittest.cc
index b6c5184..7f6cb3a 100644
--- a/api/rtpsenderreceiver_unittest.cc
+++ b/api/rtpsenderreceiver_unittest.cc
@@ -62,18 +62,18 @@
         stream_(MediaStream::Create(kStreamLabel1)) {
     // Create channels to be used by the RtpSenders and RtpReceivers.
     channel_manager_.Init();
-    bool rtcp_enabled = false;
+    bool rtcp_mux_required = true;
     bool srtp_required = true;
     cricket::TransportChannel* rtp_transport =
         fake_transport_controller_.CreateTransportChannel(
             cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
     voice_channel_ = channel_manager_.CreateVoiceChannel(
         &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
-        cricket::CN_AUDIO, nullptr, rtcp_enabled, srtp_required,
+        cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required,
         cricket::AudioOptions());
     video_channel_ = channel_manager_.CreateVideoChannel(
         &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
-        cricket::CN_VIDEO, nullptr, rtcp_enabled, srtp_required,
+        cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required,
         cricket::VideoOptions());
     voice_media_channel_ = media_engine_->GetVoiceChannel(0);
     video_media_channel_ = media_engine_->GetVideoChannel(0);
diff --git a/api/statscollector_unittest.cc b/api/statscollector_unittest.cc
index 5cabaaf..5a0614e 100644
--- a/api/statscollector_unittest.cc
+++ b/api/statscollector_unittest.cc
@@ -51,7 +51,7 @@
 using webrtc::StatsReports;
 
 namespace {
-const bool kDefaultRtcpEnabled = false;
+const bool kDefaultRtcpMuxRequired = true;
 const bool kDefaultSrtpRequired = true;
 }
 
@@ -867,7 +867,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   StatsReports reports;  // returned values.
   cricket::VideoSenderInfo video_sender_info;
   cricket::VideoMediaInfo stats_read;
@@ -916,7 +916,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   StatsReports reports;  // returned values.
   cricket::VideoSenderInfo video_sender_info;
@@ -992,7 +992,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel, "video",
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1031,7 +1031,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1100,7 +1100,7 @@
   const std::string kVcName("vcname");
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1161,7 +1161,7 @@
   const std::string kVcName("vcname");
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1188,7 +1188,7 @@
   const std::string kVcName("vcname");
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1248,7 +1248,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddIncomingVideoTrackStats();
   stats.AddStream(stream_);
 
@@ -1561,7 +1561,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   // Create a local stream with a local audio track and adds it to the stats.
   if (stream_ == NULL)
@@ -1671,7 +1671,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingAudioTrackStats();
   stats.AddStream(stream_);
   stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack);
@@ -1707,7 +1707,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddIncomingAudioTrackStats();
   stats.AddStream(stream_);
 
@@ -1737,7 +1737,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   AddOutgoingAudioTrackStats();
   stats.AddStream(stream_);
   stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
@@ -1801,7 +1801,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   // Create a local stream with a local audio track and adds it to the stats.
   AddOutgoingAudioTrackStats();
@@ -1891,7 +1891,7 @@
   const std::string kVcName("vcname");
   cricket::VoiceChannel voice_channel(
       worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
 
   // Create a local stream with a local audio track and adds it to the stats.
   AddOutgoingAudioTrackStats();
@@ -1951,7 +1951,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   StatsReports reports;  // returned values.
   cricket::VideoSenderInfo video_sender_info;
   cricket::VideoMediaInfo stats_read;
@@ -1999,7 +1999,7 @@
   MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
   cricket::VideoChannel video_channel(
       worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpEnabled, kDefaultSrtpRequired);
+      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   StatsReports reports;  // returned values.
   cricket::VideoReceiverInfo video_receiver_info;
   cricket::VideoMediaInfo stats_read;
diff --git a/api/webrtcsession.cc b/api/webrtcsession.cc
index aa172ce..30a0a7c 100644
--- a/api/webrtcsession.cc
+++ b/api/webrtcsession.cc
@@ -1787,7 +1787,6 @@
                                        const std::string* bundle_transport) {
   bool require_rtcp_mux =
       rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  bool create_rtcp_transport_channel = !require_rtcp_mux;
 
   std::string transport_name =
       bundle_transport ? *bundle_transport : content->name;
@@ -1796,7 +1795,7 @@
       transport_controller_->CreateTransportChannel(
           transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
   cricket::TransportChannel* rtcp_transport = nullptr;
-  if (create_rtcp_transport_channel) {
+  if (!require_rtcp_mux) {
     rtcp_transport = transport_controller_->CreateTransportChannel(
         transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
   }
@@ -1804,18 +1803,13 @@
   voice_channel_.reset(channel_manager_->CreateVoiceChannel(
       media_controller_, rtp_transport, rtcp_transport,
       transport_controller_->signaling_thread(), content->name,
-      bundle_transport, create_rtcp_transport_channel, SrtpRequired(),
-      audio_options_));
+      bundle_transport, require_rtcp_mux, SrtpRequired(), audio_options_));
   if (!voice_channel_) {
     return false;
   }
 
-  voice_channel_->SignalDestroyRtcpTransport.connect(
-      this, &WebRtcSession::OnDestroyRtcpTransport_n);
-  if (require_rtcp_mux) {
-    voice_channel_->ActivateRtcpMux();
-  }
-
+  voice_channel_->SignalRtcpMuxFullyActive.connect(
+      this, &WebRtcSession::DestroyRtcpTransport_n);
   voice_channel_->SignalDtlsSrtpSetupFailure.connect(
       this, &WebRtcSession::OnDtlsSrtpSetupFailure);
 
@@ -1829,7 +1823,6 @@
                                        const std::string* bundle_transport) {
   bool require_rtcp_mux =
       rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  bool create_rtcp_transport_channel = !require_rtcp_mux;
 
   std::string transport_name =
       bundle_transport ? *bundle_transport : content->name;
@@ -1838,7 +1831,7 @@
       transport_controller_->CreateTransportChannel(
           transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
   cricket::TransportChannel* rtcp_transport = nullptr;
-  if (create_rtcp_transport_channel) {
+  if (!require_rtcp_mux) {
     rtcp_transport = transport_controller_->CreateTransportChannel(
         transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
   }
@@ -1846,18 +1839,14 @@
   video_channel_.reset(channel_manager_->CreateVideoChannel(
       media_controller_, rtp_transport, rtcp_transport,
       transport_controller_->signaling_thread(), content->name,
-      bundle_transport, create_rtcp_transport_channel, SrtpRequired(),
-      video_options_));
+      bundle_transport, require_rtcp_mux, SrtpRequired(), video_options_));
 
   if (!video_channel_) {
     return false;
   }
 
-  video_channel_->SignalDestroyRtcpTransport.connect(
-      this, &WebRtcSession::OnDestroyRtcpTransport_n);
-  if (require_rtcp_mux) {
-    video_channel_->ActivateRtcpMux();
-  }
+  video_channel_->SignalRtcpMuxFullyActive.connect(
+      this, &WebRtcSession::DestroyRtcpTransport_n);
   video_channel_->SignalDtlsSrtpSetupFailure.connect(
       this, &WebRtcSession::OnDtlsSrtpSetupFailure);
 
@@ -1894,7 +1883,6 @@
   } else {
     bool require_rtcp_mux =
         rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-    bool create_rtcp_transport_channel = !sctp && !require_rtcp_mux;
 
     std::string transport_name =
         bundle_transport ? *bundle_transport : content->name;
@@ -1902,7 +1890,7 @@
         transport_controller_->CreateTransportChannel(
             transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
     cricket::TransportChannel* rtcp_transport = nullptr;
-    if (create_rtcp_transport_channel) {
+    if (!require_rtcp_mux) {
       rtcp_transport = transport_controller_->CreateTransportChannel(
           transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
     }
@@ -1910,18 +1898,14 @@
     rtp_data_channel_.reset(channel_manager_->CreateRtpDataChannel(
         media_controller_, rtp_transport, rtcp_transport,
         transport_controller_->signaling_thread(), content->name,
-        bundle_transport, create_rtcp_transport_channel, SrtpRequired()));
+        bundle_transport, require_rtcp_mux, SrtpRequired()));
 
     if (!rtp_data_channel_) {
       return false;
     }
 
-    rtp_data_channel_->SignalDestroyRtcpTransport.connect(
-        this, &WebRtcSession::OnDestroyRtcpTransport_n);
-
-    if (require_rtcp_mux) {
-      rtp_data_channel_->ActivateRtcpMux();
-    }
+    rtp_data_channel_->SignalRtcpMuxFullyActive.connect(
+        this, &WebRtcSession::DestroyRtcpTransport_n);
     rtp_data_channel_->SignalDtlsSrtpSetupFailure.connect(
         this, &WebRtcSession::OnDtlsSrtpSetupFailure);
     rtp_data_channel_->SignalSentPacket.connect(this,
@@ -2389,8 +2373,7 @@
                 transport_controller_.get(), transport_name, component));
 }
 
-void WebRtcSession::OnDestroyRtcpTransport_n(
-    const std::string& transport_name) {
+void WebRtcSession::DestroyRtcpTransport_n(const std::string& transport_name) {
   ASSERT(network_thread()->IsCurrent());
   transport_controller_->DestroyTransportChannel_n(
       transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
diff --git a/api/webrtcsession.h b/api/webrtcsession.h
index 42e0e4b..f75328f 100644
--- a/api/webrtcsession.h
+++ b/api/webrtcsession.h
@@ -554,7 +554,7 @@
   const std::string GetTransportName(const std::string& content_name);
 
   void DestroyTransport(const std::string& transport_name, int component);
-  void OnDestroyRtcpTransport_n(const std::string& transport_name);
+  void DestroyRtcpTransport_n(const std::string& transport_name);
   void DestroyVideoChannel();
   void DestroyVoiceChannel();
   void DestroyDataChannel();
diff --git a/pc/channel.cc b/pc/channel.cc
index 182d4ca..942e826 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -163,13 +163,13 @@
                          rtc::Thread* signaling_thread,
                          MediaChannel* media_channel,
                          const std::string& content_name,
-                         bool rtcp,
+                         bool rtcp_mux_required,
                          bool srtp_required)
     : worker_thread_(worker_thread),
       network_thread_(network_thread),
       signaling_thread_(signaling_thread),
       content_name_(content_name),
-      rtcp_enabled_(rtcp),
+      rtcp_mux_required_(rtcp_mux_required),
       srtp_required_(srtp_required),
       media_channel_(media_channel),
       selected_candidate_pair_(nullptr) {
@@ -240,6 +240,9 @@
   if (rtcp_transport_ && !SetDtlsSrtpCryptoSuites_n(rtcp_transport_, true)) {
     return false;
   }
+  if (rtcp_mux_required_) {
+    rtcp_mux_filter_.SetActive();
+  }
   return true;
 }
 
@@ -291,8 +294,8 @@
     srtp_filter_.ResetParams();
   }
 
-  // If this BaseChannel uses RTCP and we haven't fully negotiated RTCP mux,
-  // we need an RTCP channel.
+  // If this BaseChannel doesn't require RTCP mux and we haven't fully
+  // negotiated RTCP mux, we need an RTCP transport.
   if (NeedsRtcpTransport()) {
     LOG(LS_INFO) << "Setting RTCP Transport for " << content_name() << " on "
                  << transport_name() << " transport " << rtcp_transport;
@@ -452,7 +455,9 @@
 }
 
 bool BaseChannel::NeedsRtcpTransport() {
-  return rtcp_enabled_ && !rtcp_mux_filter_.IsFullyActive();
+  // If this BaseChannel doesn't require RTCP mux and we haven't fully
+  // negotiated RTCP mux, we need an RTCP transport.
+  return !rtcp_mux_required_ && !rtcp_mux_filter_.IsFullyActive();
 }
 
 bool BaseChannel::IsReadyToReceiveMedia_w() const {
@@ -1157,26 +1162,6 @@
   return true;
 }
 
-void BaseChannel::ActivateRtcpMux() {
-  network_thread_->Invoke<void>(RTC_FROM_HERE,
-                                Bind(&BaseChannel::ActivateRtcpMux_n, this));
-}
-
-void BaseChannel::ActivateRtcpMux_n() {
-  if (!rtcp_mux_filter_.IsActive()) {
-    rtcp_mux_filter_.SetActive();
-    bool need_to_delete_rtcp = (rtcp_transport() != nullptr);
-    SetTransportChannel_n(true, nullptr);
-    if (need_to_delete_rtcp) {
-      SignalDestroyRtcpTransport(rtp_transport()->transport_name());
-    }
-    // Update aggregate writable/ready-to-send state between RTP and RTCP upon
-    // removing channel.
-    UpdateWritableState_n();
-    SetTransportChannelReadyToSend(true, false);
-  }
-}
-
 bool BaseChannel::SetRtcpMux_n(bool enable,
                                ContentAction action,
                                ContentSource src,
@@ -1198,10 +1183,9 @@
         LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
                      << " by destroying RTCP transport channel for "
                      << transport_name();
-        bool need_to_delete_rtcp = (rtcp_transport() != nullptr);
-        SetTransportChannel_n(true, nullptr);
-        if (need_to_delete_rtcp) {
-          SignalDestroyRtcpTransport(rtp_transport()->transport_name());
+        if (rtcp_transport()) {
+          SetTransportChannel_n(true, nullptr);
+          SignalRtcpMuxFullyActive(rtp_transport()->transport_name());
         }
         UpdateWritableState_n();
         SetTransportChannelReadyToSend(true, false);
@@ -1462,14 +1446,14 @@
                            MediaEngineInterface* media_engine,
                            VoiceMediaChannel* media_channel,
                            const std::string& content_name,
-                           bool rtcp,
+                           bool rtcp_mux_required,
                            bool srtp_required)
     : BaseChannel(worker_thread,
                   network_thread,
                   signaling_thread,
                   media_channel,
                   content_name,
-                  rtcp,
+                  rtcp_mux_required,
                   srtp_required),
       media_engine_(media_engine),
       received_media_(false) {}
@@ -1875,14 +1859,14 @@
                            rtc::Thread* signaling_thread,
                            VideoMediaChannel* media_channel,
                            const std::string& content_name,
-                           bool rtcp,
+                           bool rtcp_mux_required,
                            bool srtp_required)
     : BaseChannel(worker_thread,
                   network_thread,
                   signaling_thread,
                   media_channel,
                   content_name,
-                  rtcp,
+                  rtcp_mux_required,
                   srtp_required) {}
 
 bool VideoChannel::Init_w(TransportChannel* rtp_transport,
@@ -2136,14 +2120,14 @@
                                rtc::Thread* signaling_thread,
                                DataMediaChannel* media_channel,
                                const std::string& content_name,
-                               bool rtcp,
+                               bool rtcp_mux_required,
                                bool srtp_required)
     : BaseChannel(worker_thread,
                   network_thread,
                   signaling_thread,
                   media_channel,
                   content_name,
-                  rtcp,
+                  rtcp_mux_required,
                   srtp_required) {}
 
 RtpDataChannel::~RtpDataChannel() {
diff --git a/pc/channel.h b/pc/channel.h
index e5180ca..c7749a9 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -83,7 +83,7 @@
               rtc::Thread* signaling_thread,
               MediaChannel* channel,
               const std::string& content_name,
-              bool rtcp,
+              bool rtcp_mux_required,
               bool srtp_required);
   virtual ~BaseChannel();
   bool Init_w(TransportChannel* rtp_transport,
@@ -107,11 +107,6 @@
 
   bool writable() const { return writable_; }
 
-  // Activate RTCP mux, regardless of the state so far.  Once
-  // activated, it can not be deactivated, and if the remote
-  // description doesn't support RTCP mux, setting the remote
-  // description will fail.
-  void ActivateRtcpMux();
   bool SetTransport(TransportChannel* rtp_transport,
                     TransportChannel* rtcp_transport);
   bool PushdownLocalDescription(const SessionDescription* local_desc,
@@ -161,9 +156,10 @@
   // Forward TransportChannel SignalSentPacket to worker thread.
   sigslot::signal1<const rtc::SentPacket&> SignalSentPacket;
 
-  // Emitted whenever the rtcp-mux is active and the rtcp-transport can be
-  // destroyed.
-  sigslot::signal1<const std::string&> SignalDestroyRtcpTransport;
+  // Emitted whenever rtcp-mux is fully negotiated and the rtcp-transport can
+  // be destroyed.
+  // Fired on the network thread.
+  sigslot::signal1<const std::string&> SignalRtcpMuxFullyActive;
 
   TransportChannel* rtp_transport() const { return rtp_transport_; }
   TransportChannel* rtcp_transport() const { return rtcp_transport_; }
@@ -335,7 +331,6 @@
                  ContentAction action,
                  ContentSource src,
                  std::string* error_desc);
-  void ActivateRtcpMux_n();
   bool SetRtcpMux_n(bool enable,
                     ContentAction action,
                     ContentSource src,
@@ -382,10 +377,9 @@
   std::unique_ptr<ConnectionMonitor> connection_monitor_;
 
   std::string transport_name_;
-  // Is RTCP used at all by this type of channel?
-  // Expected to be true (as of typing this) for everything except data
-  // channels.
-  const bool rtcp_enabled_;
+  // True if RTCP-multiplexing is required. In other words, no standalone RTCP
+  // transport will ever be used for this channel.
+  const bool rtcp_mux_required_;
   // TODO(johan): Replace TransportChannel* with rtc::PacketTransportInterface*.
   TransportChannel* rtp_transport_ = nullptr;
   std::vector<std::pair<rtc::Socket::Option, int> > socket_options_;
@@ -428,7 +422,7 @@
                MediaEngineInterface* media_engine,
                VoiceMediaChannel* channel,
                const std::string& content_name,
-               bool rtcp,
+               bool rtcp_mux_required,
                bool srtp_required);
   ~VoiceChannel();
   bool Init_w(TransportChannel* rtp_transport,
@@ -547,7 +541,7 @@
                rtc::Thread* signaling_thread,
                VideoMediaChannel* channel,
                const std::string& content_name,
-               bool rtcp,
+               bool rtcp_mux_required,
                bool srtp_required);
   ~VideoChannel();
   bool Init_w(TransportChannel* rtp_transport,
@@ -627,7 +621,7 @@
                  rtc::Thread* signaling_thread,
                  DataMediaChannel* channel,
                  const std::string& content_name,
-                 bool rtcp,
+                 bool rtcp_mux_required,
                  bool srtp_required);
   ~RtpDataChannel();
   bool Init_w(TransportChannel* rtp_transport,
diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc
index f8346c9..3970588 100644
--- a/pc/channel_unittest.cc
+++ b/pc/channel_unittest.cc
@@ -95,8 +95,14 @@
 template<class T>
 class ChannelTest : public testing::Test, public sigslot::has_slots<> {
  public:
-  enum Flags { RTCP = 0x1, RTCP_MUX = 0x2, SECURE = 0x4, SSRC_MUX = 0x8,
-               DTLS = 0x10, GCM_CIPHER = 0x20 };
+  enum Flags {
+    RTCP_MUX = 0x1,
+    RTCP_MUX_REQUIRED = 0x2,
+    SECURE = 0x4,
+    SSRC_MUX = 0x8,
+    DTLS = 0x10,
+    GCM_CIPHER = 0x20
+  };
 
   ChannelTest(bool verify_playout,
               rtc::ArrayView<const uint8_t> rtp_data,
@@ -132,6 +138,9 @@
                       typename T::MediaChannel* ch2,
                       int flags1,
                       int flags2) {
+    // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
+    ASSERT_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
+    ASSERT_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
     rtc::Thread* worker_thread = rtc::Thread::Current();
     media_channel1_ = ch1;
     media_channel2_ = ch2;
@@ -145,10 +154,10 @@
                                           &ChannelTest<T>::OnMediaMonitor1);
     channel2_->SignalMediaMonitor.connect(this,
                                           &ChannelTest<T>::OnMediaMonitor2);
-    channel1_->SignalDestroyRtcpTransport.connect(
+    channel1_->SignalRtcpMuxFullyActive.connect(
         transport_controller1_.get(),
         &cricket::FakeTransportController::DestroyRtcpTransport);
-    channel2_->SignalDestroyRtcpTransport.connect(
+    channel2_->SignalRtcpMuxFullyActive.connect(
         transport_controller2_.get(),
         &cricket::FakeTransportController::DestroyRtcpTransport);
     if ((flags1 & DTLS) && (flags2 & DTLS)) {
@@ -201,7 +210,8 @@
                              : nullptr;
     typename T::Channel* channel = new typename T::Channel(
         worker_thread, network_thread, signaling_thread, engine, ch,
-        cricket::CN_AUDIO, (flags & RTCP) != 0, (flags & SECURE) != 0);
+        cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
+        (flags & SECURE) != 0);
     rtc::CryptoOptions crypto_options;
     crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
     channel->SetCryptoOptions(crypto_options);
@@ -529,7 +539,7 @@
   // Test that SetLocalContent and SetRemoteContent properly set RTCP
   // mux.
   void TestSetContentsRtcpMux() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(channel1_->rtcp_transport() != NULL);
     EXPECT_TRUE(channel2_->rtcp_transport() != NULL);
     typename T::Content content;
@@ -549,7 +559,7 @@
   // Test that SetLocalContent and SetRemoteContent properly set RTCP
   // mux when a provisional answer is received.
   void TestSetContentsRtcpMuxWithPrAnswer() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(channel1_->rtcp_transport() != NULL);
     EXPECT_TRUE(channel2_->rtcp_transport() != NULL);
     typename T::Content content;
@@ -573,9 +583,7 @@
   void TestSetRemoteContentUpdate() {
     CreateChannels(0, 0);
     typename T::Content content;
-    CreateContent(RTCP | RTCP_MUX | SECURE,
-                  kPcmuCodec, kH264Codec,
-                  &content);
+    CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
     EXPECT_EQ(0U, media_channel1_->codecs().size());
     EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
     EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
@@ -1024,7 +1032,7 @@
       }
     };
     CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
-                   RTCP | RTCP_MUX, RTCP | RTCP_MUX);
+                   RTCP_MUX, RTCP_MUX);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_TRUE(SendTerminate());
@@ -1032,7 +1040,7 @@
 
   // Send voice RTP data to the other side and ensure it gets there.
   void SendRtpToRtp() {
-    CreateChannels(0, 0);
+    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_EQ(1U, GetChannels1().size());
@@ -1047,7 +1055,7 @@
   }
 
   void TestDeinit() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     SendRtp1();
@@ -1059,51 +1067,9 @@
     channel2_.reset(nullptr);
   }
 
-  // Check that RTCP is not transmitted if both sides don't support RTCP.
-  void SendNoRtcpToNoRtcp() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_EQ(1U, GetChannels1().size());
-    EXPECT_EQ(1U, GetChannels2().size());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTCP is not transmitted if the callee doesn't support RTCP.
-  void SendNoRtcpToRtcp() {
-    CreateChannels(0, RTCP);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_EQ(1U, GetChannels1().size());
-    EXPECT_EQ(2U, GetChannels2().size());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTCP is not transmitted if the caller doesn't support RTCP.
-  void SendRtcpToNoRtcp() {
-    CreateChannels(RTCP, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_EQ(2U, GetChannels1().size());
-    EXPECT_EQ(1U, GetChannels2().size());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTCP is transmitted if both sides support RTCP.
+  // Check that RTCP can be transmitted between both sides.
   void SendRtcpToRtcp() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_EQ(2U, GetChannels1().size());
@@ -1119,7 +1085,7 @@
 
   // Check that RTCP is transmitted if only the initiator supports mux.
   void SendRtcpMuxToRtcp() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP);
+    CreateChannels(RTCP_MUX, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_EQ(2U, GetChannels1().size());
@@ -1135,7 +1101,7 @@
 
   // Check that RTP and RTCP are transmitted ok when both sides support mux.
   void SendRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
+    CreateChannels(RTCP_MUX, RTCP_MUX);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(2U, GetChannels1().size());
     EXPECT_EQ(1U, GetChannels2().size());
@@ -1159,8 +1125,7 @@
   // Check that RTP and RTCP are transmitted ok when both sides
   // support mux and one the offerer requires mux.
   void SendRequireRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
-    channel1_->ActivateRtcpMux();
+    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(1U, GetChannels1().size());
     EXPECT_EQ(1U, GetChannels2().size());
@@ -1181,10 +1146,9 @@
   }
 
   // Check that RTP and RTCP are transmitted ok when both sides
-  // support mux and one the answerer requires rtcp mux.
+  // support mux and only the answerer requires rtcp mux.
   void SendRtcpMuxToRequireRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
-    channel2_->ActivateRtcpMux();
+    CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(2U, GetChannels1().size());
     EXPECT_EQ(1U, GetChannels2().size());
@@ -1208,9 +1172,7 @@
   // Check that RTP and RTCP are transmitted ok when both sides
   // require mux.
   void SendRequireRtcpMuxToRequireRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
-    channel1_->ActivateRtcpMux();
-    channel2_->ActivateRtcpMux();
+    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(1U, GetChannels1().size());
     EXPECT_EQ(1U, GetChannels2().size());
@@ -1234,8 +1196,7 @@
   // Check that SendAccept fails if the answerer doesn't support mux
   // and the offerer requires it.
   void SendRequireRtcpMuxToNoRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP);
-    channel1_->ActivateRtcpMux();
+    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(1U, GetChannels1().size());
     EXPECT_EQ(2U, GetChannels2().size());
@@ -1244,7 +1205,7 @@
 
   // Check that RTCP data sent by the initiator before the accept is not muxed.
   void SendEarlyRtcpMuxToRtcp() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP);
+    CreateChannels(RTCP_MUX, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(2U, GetChannels1().size());
     EXPECT_EQ(2U, GetChannels2().size());
@@ -1277,7 +1238,7 @@
   // but that we properly demux before we get the accept message, since there
   // is a race between RTP data and the jingle accept.
   void SendEarlyRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP | RTCP_MUX, RTCP | RTCP_MUX);
+    CreateChannels(RTCP_MUX, RTCP_MUX);
     EXPECT_TRUE(SendInitiate());
     EXPECT_EQ(2U, GetChannels1().size());
     EXPECT_EQ(1U, GetChannels2().size());
@@ -1310,8 +1271,8 @@
     ASSERT((flags1_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0);
     ASSERT((flags2_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0);
 
-    int flags1 = RTCP | SECURE | flags1_in;
-    int flags2 = RTCP | SECURE | flags2_in;
+    int flags1 = SECURE | flags1_in;
+    int flags2 = SECURE | flags2_in;
     bool dtls1 = !!(flags1_in & DTLS);
     bool dtls2 = !!(flags2_in & DTLS);
     CreateChannels(flags1, flags2);
@@ -1351,7 +1312,7 @@
 
   // Test that we properly handling SRTP negotiating down to RTP.
   void SendSrtpToRtp() {
-    CreateChannels(RTCP | SECURE, RTCP);
+    CreateChannels(SECURE, 0);
     EXPECT_FALSE(channel1_->secure());
     EXPECT_FALSE(channel2_->secure());
     EXPECT_TRUE(SendInitiate());
@@ -1378,8 +1339,8 @@
   void SendEarlyMediaUsingRtcpMuxSrtp() {
       int sequence_number1_1 = 0, sequence_number2_2 = 0;
 
-      CreateChannels(SSRC_MUX | RTCP | RTCP_MUX | SECURE,
-                     SSRC_MUX | RTCP | RTCP_MUX | SECURE);
+      CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
+                     SSRC_MUX | RTCP_MUX | SECURE);
       EXPECT_TRUE(SendOffer());
       EXPECT_TRUE(SendProvisionalAnswer());
       EXPECT_TRUE(channel1_->secure());
@@ -1419,7 +1380,7 @@
 
   // Test that we properly send RTP without SRTP from a thread.
   void SendRtpToRtpOnThread() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     ScopedCallThread send_rtp1([this] { SendRtp1(); });
@@ -1442,7 +1403,7 @@
 
   // Test that we properly send SRTP with RTCP from a thread.
   void SendSrtpToSrtpOnThread() {
-    CreateChannels(RTCP | SECURE, RTCP | SECURE);
+    CreateChannels(SECURE, SECURE);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     ScopedCallThread send_rtp1([this] { SendRtp1(); });
@@ -1466,7 +1427,7 @@
   // Test that the mediachannel retains its sending state after the transport
   // becomes non-writable.
   void SendWithWritabilityLoss() {
-    CreateChannels(0, 0);
+    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_EQ(1U, GetChannels1().size());
@@ -1534,7 +1495,7 @@
     // and |channel2_|.
     int pl_type1 = pl_types[0];
     int pl_type2 = pl_types[1];
-    int flags = SSRC_MUX | RTCP;
+    int flags = SSRC_MUX;
     if (secure) flags |= SECURE;
     uint32_t expected_channels = 2U;
     if (rtcp_mux) {
@@ -1724,7 +1685,7 @@
   }
 
   void TestFlushRtcp() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     EXPECT_TRUE(SendInitiate());
     EXPECT_TRUE(SendAccept());
     EXPECT_EQ(2U, GetChannels1().size());
@@ -1779,7 +1740,7 @@
     // TODO(deadbeef): Fix this.
     fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
 
-    CreateChannels(RTCP | SECURE, RTCP | SECURE);
+    CreateChannels(SECURE, SECURE);
     EXPECT_FALSE(channel1_->secure());
     EXPECT_FALSE(channel2_->secure());
     EXPECT_TRUE(SendInitiate());
@@ -1832,7 +1793,7 @@
   }
 
   void TestOnReadyToSend() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     TransportChannel* rtp = channel1_->rtp_transport();
     TransportChannel* rtcp = channel1_->rtcp_transport();
     EXPECT_FALSE(media_channel1_->ready_to_send());
@@ -1877,7 +1838,7 @@
   }
 
   void TestOnReadyToSendWithRtcpMux() {
-    CreateChannels(RTCP, RTCP);
+    CreateChannels(0, 0);
     typename T::Content content;
     CreateContent(0, kPcmuCodec, kH264Codec, &content);
     // Both sides agree on mux. Should no longer be a separate RTCP channel.
@@ -2060,7 +2021,7 @@
       transport_controller ? transport_controller->signaling_thread() : nullptr;
   cricket::VideoChannel* channel = new cricket::VideoChannel(
       worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
-      (flags & RTCP) != 0, (flags & SECURE) != 0);
+      (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
   rtc::CryptoOptions crypto_options;
   crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
   channel->SetCryptoOptions(crypto_options);
@@ -2228,18 +2189,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(VoiceChannelSingleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
@@ -2396,7 +2345,7 @@
 
 // Test that we can scale the output volume properly for 1:1 calls.
 TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
-  CreateChannels(RTCP, RTCP);
+  CreateChannels(0, 0);
   EXPECT_TRUE(SendInitiate());
   EXPECT_TRUE(SendAccept());
   double volume;
@@ -2420,7 +2369,7 @@
 
 // Test that we can scale the output volume properly for multiway calls.
 TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
-  CreateChannels(RTCP, RTCP);
+  CreateChannels(0, 0);
   EXPECT_TRUE(SendInitiate());
   EXPECT_TRUE(SendAccept());
   EXPECT_TRUE(AddStream1(1));
@@ -2573,18 +2522,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(VoiceChannelDoubleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
@@ -2741,7 +2678,7 @@
 
 // Test that we can scale the output volume properly for 1:1 calls.
 TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
-  CreateChannels(RTCP, RTCP);
+  CreateChannels(0, 0);
   EXPECT_TRUE(SendInitiate());
   EXPECT_TRUE(SendAccept());
   double volume;
@@ -2765,7 +2702,7 @@
 
 // Test that we can scale the output volume properly for multiway calls.
 TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
-  CreateChannels(RTCP, RTCP);
+  CreateChannels(0, 0);
   EXPECT_TRUE(SendInitiate());
   EXPECT_TRUE(SendAccept());
   EXPECT_TRUE(AddStream1(1));
@@ -2914,18 +2851,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(VideoChannelSingleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
@@ -3158,18 +3083,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(VideoChannelDoubleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
@@ -3342,7 +3255,7 @@
       transport_controller ? transport_controller->signaling_thread() : nullptr;
   cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
       worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
-      (flags & RTCP) != 0, (flags & SECURE) != 0);
+      (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
   rtc::CryptoOptions crypto_options;
   crypto_options.enable_gcm_crypto_suites = (flags & GCM_CIPHER) != 0;
   channel->SetCryptoOptions(crypto_options);
@@ -3466,18 +3379,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(RtpDataChannelSingleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
@@ -3610,18 +3511,6 @@
   Base::SendRtpToRtp();
 }
 
-TEST_F(RtpDataChannelDoubleThreadTest, SendNoRtcpToNoRtcp) {
-  Base::SendNoRtcpToNoRtcp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendNoRtcpToRtcp) {
-  Base::SendNoRtcpToRtcp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToNoRtcp) {
-  Base::SendRtcpToNoRtcp();
-}
-
 TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
   Base::SendRtcpToRtcp();
 }
diff --git a/pc/channelmanager.cc b/pc/channelmanager.cc
index f8ed770..02a53f8 100644
--- a/pc/channelmanager.cc
+++ b/pc/channelmanager.cc
@@ -212,14 +212,14 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required,
     const AudioOptions& options) {
   return worker_thread_->Invoke<VoiceChannel*>(
       RTC_FROM_HERE,
       Bind(&ChannelManager::CreateVoiceChannel_w, this, media_controller,
            rtp_transport, rtcp_transport, signaling_thread, content_name,
-           bundle_transport_name, rtcp, srtp_required, options));
+           bundle_transport_name, rtcp_mux_required, srtp_required, options));
 }
 
 VoiceChannel* ChannelManager::CreateVoiceChannel_w(
@@ -229,7 +229,7 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required,
     const AudioOptions& options) {
   RTC_DCHECK(initialized_);
@@ -243,7 +243,7 @@
 
   VoiceChannel* voice_channel = new VoiceChannel(
       worker_thread_, network_thread_, signaling_thread, media_engine_.get(),
-      media_channel, content_name, rtcp, srtp_required);
+      media_channel, content_name, rtcp_mux_required, srtp_required);
   voice_channel->SetCryptoOptions(crypto_options_);
 
   if (!voice_channel->Init_w(rtp_transport, rtcp_transport)) {
@@ -284,14 +284,14 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required,
     const VideoOptions& options) {
   return worker_thread_->Invoke<VideoChannel*>(
       RTC_FROM_HERE,
       Bind(&ChannelManager::CreateVideoChannel_w, this, media_controller,
            rtp_transport, rtcp_transport, signaling_thread, content_name,
-           bundle_transport_name, rtcp, srtp_required, options));
+           bundle_transport_name, rtcp_mux_required, srtp_required, options));
 }
 
 VideoChannel* ChannelManager::CreateVideoChannel_w(
@@ -301,7 +301,7 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required,
     const VideoOptions& options) {
   RTC_DCHECK(initialized_);
@@ -313,9 +313,9 @@
     return NULL;
   }
 
-  VideoChannel* video_channel =
-      new VideoChannel(worker_thread_, network_thread_, signaling_thread,
-                       media_channel, content_name, rtcp, srtp_required);
+  VideoChannel* video_channel = new VideoChannel(
+      worker_thread_, network_thread_, signaling_thread, media_channel,
+      content_name, rtcp_mux_required, srtp_required);
   video_channel->SetCryptoOptions(crypto_options_);
   if (!video_channel->Init_w(rtp_transport, rtcp_transport)) {
     delete video_channel;
@@ -356,13 +356,13 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required) {
   return worker_thread_->Invoke<RtpDataChannel*>(
       RTC_FROM_HERE,
       Bind(&ChannelManager::CreateRtpDataChannel_w, this, media_controller,
            rtp_transport, rtcp_transport, signaling_thread, content_name,
-           bundle_transport_name, rtcp, srtp_required));
+           bundle_transport_name, rtcp_mux_required, srtp_required));
 }
 
 RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
@@ -372,7 +372,7 @@
     rtc::Thread* signaling_thread,
     const std::string& content_name,
     const std::string* bundle_transport_name,
-    bool rtcp,
+    bool rtcp_mux_required,
     bool srtp_required) {
   // This is ok to alloc from a thread other than the worker thread.
   RTC_DCHECK(initialized_);
@@ -386,9 +386,9 @@
     return nullptr;
   }
 
-  RtpDataChannel* data_channel =
-      new RtpDataChannel(worker_thread_, network_thread_, signaling_thread,
-                         media_channel, content_name, rtcp, srtp_required);
+  RtpDataChannel* data_channel = new RtpDataChannel(
+      worker_thread_, network_thread_, signaling_thread, media_channel,
+      content_name, rtcp_mux_required, srtp_required);
   data_channel->SetCryptoOptions(crypto_options_);
   if (!data_channel->Init_w(rtp_transport, rtcp_transport)) {
     LOG(LS_WARNING) << "Failed to init data channel.";
diff --git a/pc/channelmanager.h b/pc/channelmanager.h
index 89af44a..2ee7227 100644
--- a/pc/channelmanager.h
+++ b/pc/channelmanager.h
@@ -95,7 +95,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required,
       const AudioOptions& options);
   // Destroys a voice channel created with the Create API.
@@ -109,7 +109,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required,
       const VideoOptions& options);
   // Destroys a video channel created with the Create API.
@@ -121,7 +121,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required);
   // Destroys a data channel created with the Create API.
   void DestroyRtpDataChannel(RtpDataChannel* data_channel);
@@ -172,7 +172,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required,
       const AudioOptions& options);
   void DestroyVoiceChannel_w(VoiceChannel* voice_channel);
@@ -183,7 +183,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required,
       const VideoOptions& options);
   void DestroyVideoChannel_w(VideoChannel* video_channel);
@@ -194,7 +194,7 @@
       rtc::Thread* signaling_thread,
       const std::string& content_name,
       const std::string* bundle_transport_name,
-      bool rtcp,
+      bool rtcp_mux_required,
       bool srtp_required);
   void DestroyRtpDataChannel_w(RtpDataChannel* data_channel);
 
diff --git a/pc/channelmanager_unittest.cc b/pc/channelmanager_unittest.cc
index 34d9108..84a8375 100644
--- a/pc/channelmanager_unittest.cc
+++ b/pc/channelmanager_unittest.cc
@@ -21,7 +21,7 @@
 #include "webrtc/pc/channelmanager.h"
 
 namespace cricket {
-const bool kDefaultRtcpEnabled = false;
+const bool kDefaultRtcpMuxRequired = true;
 const bool kDefaultSrtpRequired = true;
 }
 
@@ -107,18 +107,18 @@
           cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
   cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_AUDIO, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired, AudioOptions());
+      rtc::Thread::Current(), cricket::CN_AUDIO, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired, AudioOptions());
   EXPECT_TRUE(voice_channel != nullptr);
   cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_VIDEO, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired, VideoOptions());
+      rtc::Thread::Current(), cricket::CN_VIDEO, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired, VideoOptions());
   EXPECT_TRUE(video_channel != nullptr);
   cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_DATA, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired);
+      rtc::Thread::Current(), cricket::CN_DATA, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   EXPECT_TRUE(rtp_data_channel != nullptr);
   cm_->DestroyVideoChannel(video_channel);
   cm_->DestroyVoiceChannel(voice_channel);
@@ -141,18 +141,18 @@
           cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
   cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_AUDIO, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired, AudioOptions());
+      rtc::Thread::Current(), cricket::CN_AUDIO, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired, AudioOptions());
   EXPECT_TRUE(voice_channel != nullptr);
   cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_VIDEO, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired, VideoOptions());
+      rtc::Thread::Current(), cricket::CN_VIDEO, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired, VideoOptions());
   EXPECT_TRUE(video_channel != nullptr);
   cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
       &fake_mc_, rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_DATA, nullptr, kDefaultRtcpEnabled,
-      kDefaultSrtpRequired);
+      rtc::Thread::Current(), cricket::CN_DATA, nullptr,
+      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
   EXPECT_TRUE(rtp_data_channel != nullptr);
   cm_->DestroyVideoChannel(video_channel);
   cm_->DestroyVoiceChannel(voice_channel);