Delete media transport integration.

MediaTransport is deprecated and the code is unused.

No-Try: True
Bug: webrtc:9719
Change-Id: I5b864c1e74bf04df16c15f51b8fac3d407331dcd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/160620
Commit-Queue: Bjorn Mellem <mellem@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29923}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 4d0b61f..bc44bbb 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -606,7 +606,6 @@
       ":libjingle_peerconnection",
       ":pc_test_utils",
       "../api:callfactory_api",
-      "../api:fake_media_transport",
       "../api:rtc_event_log_output_file",
       "../api:rtc_stats_api",
       "../api:rtp_parameters",
diff --git a/pc/channel.cc b/pc/channel.cc
index 8392775..fc5337a 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -150,10 +150,6 @@
   TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
   RTC_DCHECK_RUN_ON(worker_thread_);
 
-  if (media_transport_config_.media_transport) {
-    media_transport_config_.media_transport->RemoveNetworkChangeCallback(this);
-  }
-
   // Eats any outstanding messages or packets.
   worker_thread_->Clear(&invoker_);
   worker_thread_->Clear(this);
@@ -171,15 +167,8 @@
   }
   rtp_transport_->SignalReadyToSend.connect(
       this, &BaseChannel::OnTransportReadyToSend);
-
-  // If media transport is used, it's responsible for providing network
-  // route changed callbacks.
-  if (!media_transport_config_.media_transport) {
-    rtp_transport_->SignalNetworkRouteChanged.connect(
-        this, &BaseChannel::OnNetworkRouteChanged);
-  }
-  // TODO(bugs.webrtc.org/9719): Media transport should also be used to provide
-  // 'writable' state here.
+  rtp_transport_->SignalNetworkRouteChanged.connect(
+      this, &BaseChannel::OnNetworkRouteChanged);
   rtp_transport_->SignalWritableState.connect(this,
                                               &BaseChannel::OnWritableState);
   rtp_transport_->SignalSentPacket.connect(this,
@@ -208,12 +197,6 @@
   // Both RTP and RTCP channels should be set, we can call SetInterface on
   // the media channel and it can set network options.
   media_channel_->SetInterface(this, media_transport_config);
-
-  RTC_LOG(LS_INFO) << "BaseChannel::Init_w, media_transport_config="
-                   << media_transport_config.DebugString();
-  if (media_transport_config_.media_transport) {
-    media_transport_config_.media_transport->AddNetworkChangeCallback(this);
-  }
 }
 
 void BaseChannel::Deinit() {
@@ -802,9 +785,6 @@
                   ssrc_generator) {}
 
 VoiceChannel::~VoiceChannel() {
-  if (media_transport()) {
-    media_transport()->SetFirstAudioPacketReceivedObserver(nullptr);
-  }
   TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel");
   // this can't be done in the base class, since it calls a virtual
   DisableMedia_w();
@@ -817,24 +797,10 @@
                              [this] { UpdateMediaSendRecvState_w(); });
 }
 
-void BaseChannel::OnNetworkRouteChanged(
-    const rtc::NetworkRoute& network_route) {
-  OnNetworkRouteChanged(absl::make_optional(network_route));
-}
-
 void VoiceChannel::Init_w(
     webrtc::RtpTransportInternal* rtp_transport,
     const webrtc::MediaTransportConfig& media_transport_config) {
   BaseChannel::Init_w(rtp_transport, media_transport_config);
-  if (media_transport_config.media_transport) {
-    media_transport_config.media_transport->SetFirstAudioPacketReceivedObserver(
-        this);
-  }
-}
-
-void VoiceChannel::OnFirstAudioPacketReceived(int64_t channel_id) {
-  has_received_packet_ = true;
-  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED);
 }
 
 void VoiceChannel::UpdateMediaSendRecvState_w() {
diff --git a/pc/channel.h b/pc/channel.h
index 62fcaa2..c2b9e40 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -74,8 +74,7 @@
                     public rtc::MessageHandler,
                     public sigslot::has_slots<>,
                     public MediaChannel::NetworkInterface,
-                    public webrtc::RtpPacketSinkInterface,
-                    public webrtc::MediaTransportNetworkChangeCallback {
+                    public webrtc::RtpPacketSinkInterface {
  public:
   // If |srtp_required| is true, the channel will not send or receive any
   // RTP/RTCP packets without using SRTP (either using SDES or DTLS-SRTP).
@@ -156,11 +155,6 @@
   // Fired on the network thread.
   sigslot::signal1<const std::string&> SignalRtcpMuxFullyActive;
 
-  // Returns media transport, can be null if media transport is not available.
-  webrtc::MediaTransportInterface* media_transport() {
-    return media_transport_config_.media_transport;
-  }
-
   // From RtpTransport - public for testing only
   void OnTransportReadyToSend(bool ready);
 
@@ -287,9 +281,6 @@
   void SignalSentPacket_n(const rtc::SentPacket& sent_packet);
   bool IsReadyToSendMedia_n() const;
 
-  // MediaTransportNetworkChangeCallback override.
-  void OnNetworkRouteChanged(const rtc::NetworkRoute& network_route) override;
-
   rtc::Thread* const worker_thread_;
   rtc::Thread* const network_thread_;
   rtc::Thread* const signaling_thread_;
@@ -337,8 +328,7 @@
 
 // VoiceChannel is a specialization that adds support for early media, DTMF,
 // and input/output level monitoring.
-class VoiceChannel : public BaseChannel,
-                     public webrtc::AudioPacketReceivedObserver {
+class VoiceChannel : public BaseChannel {
  public:
   VoiceChannel(rtc::Thread* worker_thread,
                rtc::Thread* network_thread,
@@ -372,8 +362,6 @@
                           webrtc::SdpType type,
                           std::string* error_desc) override;
 
-  void OnFirstAudioPacketReceived(int64_t channel_id) override;
-
   // Last AudioSendParameters sent down to the media_channel() via
   // SetSendParameters.
   AudioSendParameters last_send_params_;
diff --git a/pc/channel_manager_unittest.cc b/pc/channel_manager_unittest.cc
index ab3b88b..9078513 100644
--- a/pc/channel_manager_unittest.cc
+++ b/pc/channel_manager_unittest.cc
@@ -13,7 +13,6 @@
 #include <memory>
 
 #include "api/rtc_error.h"
-#include "api/test/fake_media_transport.h"
 #include "api/transport/media/media_transport_config.h"
 #include "api/video/builtin_video_bitrate_allocator_factory.h"
 #include "media/base/fake_media_engine.h"
@@ -74,18 +73,6 @@
     return dtls_srtp_transport;
   }
 
-  std::unique_ptr<webrtc::MediaTransportInterface> CreateMediaTransport(
-      rtc::PacketTransportInternal* packet_transport) {
-    webrtc::MediaTransportSettings settings;
-    settings.is_caller = true;
-    auto media_transport_result =
-        fake_media_transport_factory_.CreateMediaTransport(
-            packet_transport, network_.get(),
-            /*is_caller=*/settings);
-    RTC_CHECK(media_transport_result.ok());
-    return media_transport_result.MoveValue();
-  }
-
   void TestCreateDestroyChannels(
       webrtc::RtpTransportInternal* rtp_transport,
       webrtc::MediaTransportConfig media_transport_config) {
@@ -122,7 +109,6 @@
   cricket::FakeDataEngine* fdme_;
   std::unique_ptr<cricket::ChannelManager> cm_;
   cricket::FakeCall fake_call_;
-  webrtc::FakeMediaTransportFactory fake_media_transport_factory_;
   rtc::UniqueRandomIdGenerator ssrc_generator_;
 };
 
@@ -192,14 +178,6 @@
                             webrtc::MediaTransportConfig());
 }
 
-TEST_F(ChannelManagerTest, CreateDestroyChannelsWithMediaTransport) {
-  EXPECT_TRUE(cm_->Init());
-  auto rtp_transport = CreateDtlsSrtpTransport();
-  auto media_transport = CreateMediaTransport(rtp_dtls_transport_.get());
-  TestCreateDestroyChannels(
-      rtp_transport.get(), webrtc::MediaTransportConfig(media_transport.get()));
-}
-
 TEST_F(ChannelManagerTest, CreateDestroyChannelsOnThread) {
   network_->Start();
   worker_->Start();
diff --git a/pc/datagram_rtp_transport.h b/pc/datagram_rtp_transport.h
index 8aadf97..f9684c6 100644
--- a/pc/datagram_rtp_transport.h
+++ b/pc/datagram_rtp_transport.h
@@ -18,6 +18,7 @@
 
 #include "api/crypto/crypto_options.h"
 #include "api/transport/datagram_transport_interface.h"
+#include "api/transport/media/media_transport_interface.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
 #include "p2p/base/ice_transport_internal.h"
diff --git a/pc/jsep_transport.cc b/pc/jsep_transport.cc
index 79b933c9..37f3162 100644
--- a/pc/jsep_transport.cc
+++ b/pc/jsep_transport.cc
@@ -111,7 +111,6 @@
     std::unique_ptr<DtlsTransportInternal> rtp_dtls_transport,
     std::unique_ptr<DtlsTransportInternal> rtcp_dtls_transport,
     std::unique_ptr<SctpTransportInternal> sctp_transport,
-    std::unique_ptr<webrtc::MediaTransportInterface> media_transport,
     std::unique_ptr<webrtc::DatagramTransportInterface> datagram_transport,
     webrtc::DataChannelTransportInterface* data_channel_transport)
     : network_thread_(rtc::Thread::Current()),
@@ -139,7 +138,6 @@
                           ? new rtc::RefCountedObject<webrtc::SctpTransport>(
                                 std::move(sctp_transport))
                           : nullptr),
-      media_transport_(std::move(media_transport)),
       datagram_transport_(std::move(datagram_transport)),
       datagram_rtp_transport_(std::move(datagram_rtp_transport)),
       data_channel_transport_(data_channel_transport) {
@@ -149,7 +147,6 @@
   // present.
   RTC_DCHECK_EQ((rtcp_ice_transport_ != nullptr),
                 (rtcp_dtls_transport_ != nullptr));
-  RTC_DCHECK(!datagram_transport_ || !media_transport_);
   // Verify the "only one out of these three can be set" invariant.
   if (unencrypted_rtp_transport_) {
     RTC_DCHECK(!sdes_transport);
@@ -173,10 +170,6 @@
             datagram_rtp_transport_.get(), default_rtp_transport()});
   }
 
-  if (media_transport_) {
-    media_transport_->SetMediaTransportStateCallback(this);
-  }
-
   if (data_channel_transport_ && sctp_data_channel_transport_) {
     composite_data_channel_transport_ =
         std::make_unique<webrtc::CompositeDataChannelTransport>(
@@ -186,11 +179,6 @@
 }
 
 JsepTransport::~JsepTransport() {
-  // Disconnect media transport state callbacks.
-  if (media_transport_) {
-    media_transport_->SetMediaTransportStateCallback(nullptr);
-  }
-
   if (sctp_transport_) {
     sctp_transport_->Clear();
   }
@@ -784,18 +772,6 @@
   return true;
 }
 
-void JsepTransport::OnStateChanged(webrtc::MediaTransportState state) {
-  // TODO(bugs.webrtc.org/9719) This method currently fires on the network
-  // thread, but media transport does not make such guarantees. We need to make
-  // sure this callback is guaranteed to be executed on the network thread.
-  RTC_DCHECK_RUN_ON(network_thread_);
-  {
-    rtc::CritScope scope(&accessor_lock_);
-    media_transport_state_ = state;
-  }
-  SignalMediaTransportStateChanged();
-}
-
 void JsepTransport::NegotiateDatagramTransport(SdpType type) {
   RTC_DCHECK(type == SdpType::kAnswer || type == SdpType::kPrAnswer);
   rtc::CritScope lock(&accessor_lock_);
diff --git a/pc/jsep_transport.h b/pc/jsep_transport.h
index 658e8e7..5f7d46f 100644
--- a/pc/jsep_transport.h
+++ b/pc/jsep_transport.h
@@ -21,7 +21,6 @@
 #include "api/ice_transport_interface.h"
 #include "api/jsep.h"
 #include "api/transport/datagram_transport_interface.h"
-#include "api/transport/media/media_transport_interface.h"
 #include "media/sctp/sctp_transport_internal.h"
 #include "p2p/base/dtls_transport.h"
 #include "p2p/base/p2p_constants.h"
@@ -89,16 +88,11 @@
 //
 // On Threading: JsepTransport performs work solely on the network thread, and
 // so its methods should only be called on the network thread.
-class JsepTransport : public sigslot::has_slots<>,
-                      public webrtc::MediaTransportStateCallback {
+class JsepTransport : public sigslot::has_slots<> {
  public:
   // |mid| is just used for log statements in order to identify the Transport.
   // Note that |local_certificate| is allowed to be null since a remote
   // description may be set before a local certificate is generated.
-  //
-  // |media_trasport| is optional (experimental). If available it will be used
-  // to send / receive encoded audio and video frames instead of RTP.
-  // Currently |media_transport| can co-exist with RTP / RTCP transports.
   JsepTransport(
       const std::string& mid,
       const rtc::scoped_refptr<rtc::RTCCertificate>& local_certificate,
@@ -111,7 +105,6 @@
       std::unique_ptr<DtlsTransportInternal> rtp_dtls_transport,
       std::unique_ptr<DtlsTransportInternal> rtcp_dtls_transport,
       std::unique_ptr<SctpTransportInternal> sctp_transport,
-      std::unique_ptr<webrtc::MediaTransportInterface> media_transport,
       std::unique_ptr<webrtc::DatagramTransportInterface> datagram_transport,
       webrtc::DataChannelTransportInterface* data_channel_transport);
 
@@ -246,34 +239,17 @@
     return data_channel_transport_;
   }
 
-  // Returns media transport, if available.
-  // Note that media transport is owned by jseptransport and the pointer
-  // to media transport will becomes invalid after destruction of jseptransport.
-  webrtc::MediaTransportInterface* media_transport() const {
-    rtc::CritScope scope(&accessor_lock_);
-    return media_transport_.get();
-  }
-
   // Returns datagram transport, if available.
   webrtc::DatagramTransportInterface* datagram_transport() const {
     rtc::CritScope scope(&accessor_lock_);
     return datagram_transport_.get();
   }
 
-  // Returns the latest media transport state.
-  webrtc::MediaTransportState media_transport_state() const {
-    rtc::CritScope scope(&accessor_lock_);
-    return media_transport_state_;
-  }
-
   // This is signaled when RTCP-mux becomes active and
   // |rtcp_dtls_transport_| is destroyed. The JsepTransportController will
   // handle the signal and update the aggregate transport states.
   sigslot::signal<> SignalRtcpMuxActive;
 
-  // This is signaled for changes in |media_transport_| state.
-  sigslot::signal<> SignalMediaTransportStateChanged;
-
   // Signals that a data channel transport was negotiated and may be used to
   // send data.  The first parameter is |this|.  The second parameter is the
   // transport that was negotiated, or null if negotiation rejected the data
@@ -338,9 +314,6 @@
   bool GetTransportStats(DtlsTransportInternal* dtls_transport,
                          TransportStats* stats);
 
-  // Invoked whenever the state of the media transport changes.
-  void OnStateChanged(webrtc::MediaTransportState state) override;
-
   // Deactivates, signals removal, and deletes |composite_rtp_transport_| if the
   // current state of negotiation is sufficient to determine which rtp_transport
   // and data channel transport to use.
@@ -418,10 +391,6 @@
   absl::optional<std::vector<int>> recv_extension_ids_
       RTC_GUARDED_BY(network_thread_);
 
-  // Optional media transport (experimental).
-  std::unique_ptr<webrtc::MediaTransportInterface> media_transport_
-      RTC_GUARDED_BY(accessor_lock_);
-
   // Optional datagram transport (experimental).
   std::unique_ptr<webrtc::DatagramTransportInterface> datagram_transport_
       RTC_GUARDED_BY(accessor_lock_);
@@ -429,9 +398,8 @@
   std::unique_ptr<webrtc::RtpTransportInternal> datagram_rtp_transport_
       RTC_GUARDED_BY(accessor_lock_);
 
-  // Non-SCTP data channel transport.  Set to one of |media_transport_| or
-  // |datagram_transport_| if that transport should be used for data chanels.
-  // Unset if neither should be used for data channels.
+  // Non-SCTP data channel transport.  Set to |datagram_transport_| if that
+  // transport should be used for data chanels.  Unset otherwise.
   webrtc::DataChannelTransportInterface* data_channel_transport_
       RTC_GUARDED_BY(accessor_lock_) = nullptr;
 
@@ -439,15 +407,6 @@
   std::unique_ptr<webrtc::CompositeDataChannelTransport>
       composite_data_channel_transport_ RTC_GUARDED_BY(accessor_lock_);
 
-  // If |media_transport_| is provided, this variable represents the state of
-  // media transport.
-  //
-  // NOTE: datagram transport state is handled by DatagramDtlsAdaptor, because
-  // DatagramDtlsAdaptor owns DatagramTransport. This state only represents
-  // media transport.
-  webrtc::MediaTransportState media_transport_state_
-      RTC_GUARDED_BY(accessor_lock_) = webrtc::MediaTransportState::kPending;
-
   RTC_DISALLOW_COPY_AND_ASSIGN(JsepTransport);
 };
 
diff --git a/pc/jsep_transport_controller.cc b/pc/jsep_transport_controller.cc
index 590aa6b..f62cd87 100644
--- a/pc/jsep_transport_controller.cc
+++ b/pc/jsep_transport_controller.cc
@@ -18,7 +18,6 @@
 #include "api/transport/datagram_transport_interface.h"
 #include "api/transport/media/media_transport_interface.h"
 #include "p2p/base/ice_transport_internal.h"
-#include "p2p/base/no_op_dtls_transport.h"
 #include "p2p/base/port.h"
 #include "pc/datagram_rtp_transport.h"
 #include "pc/srtp_filter.h"
@@ -148,22 +147,12 @@
     return MediaTransportConfig();
   }
 
-  MediaTransportInterface* media_transport = nullptr;
-  if (config_.use_media_transport_for_media) {
-    media_transport = jsep_transport->media_transport();
-  }
-
   DatagramTransportInterface* datagram_transport = nullptr;
   if (config_.use_datagram_transport) {
     datagram_transport = jsep_transport->datagram_transport();
   }
 
-  // Media transport and datagram transports can not be used together.
-  RTC_DCHECK(!media_transport || !datagram_transport);
-
-  if (media_transport) {
-    return MediaTransportConfig(media_transport);
-  } else if (datagram_transport) {
+  if (datagram_transport) {
     return MediaTransportConfig(
         /*rtp_max_packet_size=*/datagram_transport->GetLargestDatagramSize());
   } else {
@@ -180,15 +169,6 @@
   return jsep_transport->data_channel_transport();
 }
 
-MediaTransportState JsepTransportController::GetMediaTransportState(
-    const std::string& mid) const {
-  auto jsep_transport = GetJsepTransportForMid(mid);
-  if (!jsep_transport) {
-    return MediaTransportState::kPending;
-  }
-  return jsep_transport->media_transport_state();
-}
-
 cricket::DtlsTransportInternal* JsepTransportController::GetDtlsTransport(
     const std::string& mid) {
   auto jsep_transport = GetJsepTransportForMid(mid);
@@ -446,26 +426,9 @@
 }
 
 void JsepTransportController::SetMediaTransportSettings(
-    bool use_media_transport_for_media,
-    bool use_media_transport_for_data_channels,
     bool use_datagram_transport,
     bool use_datagram_transport_for_data_channels,
     bool use_datagram_transport_for_data_channels_receive_only) {
-  RTC_DCHECK(use_media_transport_for_media ==
-                 config_.use_media_transport_for_media ||
-             jsep_transports_by_name_.empty())
-      << "You can only change media transport configuration before creating "
-         "the first transport.";
-
-  RTC_DCHECK(use_media_transport_for_data_channels ==
-                 config_.use_media_transport_for_data_channels ||
-             jsep_transports_by_name_.empty())
-      << "You can only change media transport configuration before creating "
-         "the first transport.";
-
-  config_.use_media_transport_for_media = use_media_transport_for_media;
-  config_.use_media_transport_for_data_channels =
-      use_media_transport_for_data_channels;
   config_.use_datagram_transport = use_datagram_transport;
   config_.use_datagram_transport_for_data_channels =
       use_datagram_transport_for_data_channels;
@@ -514,14 +477,6 @@
   if (datagram_transport) {
     RTC_DCHECK(config_.use_datagram_transport ||
                config_.use_datagram_transport_for_data_channels);
-  } else if (config_.media_transport_factory &&
-             config_.use_media_transport_for_media &&
-             config_.use_media_transport_for_data_channels) {
-    // If media transport is used for both media and data channels,
-    // then we don't need to create DTLS.
-    // Otherwise, DTLS is still created.
-    dtls = std::make_unique<cricket::NoOpDtlsTransport>(ice,
-                                                        config_.crypto_options);
   } else if (config_.dtls_transport_factory) {
     dtls = config_.dtls_transport_factory->CreateDtlsTransport(
         ice, config_.crypto_options);
@@ -916,13 +871,12 @@
   mid_to_transport_[mid] = jsep_transport;
   return config_.transport_observer->OnTransportChanged(
       mid, jsep_transport->rtp_transport(), jsep_transport->RtpDtlsTransport(),
-      jsep_transport->media_transport(),
       jsep_transport->data_channel_transport());
 }
 
 void JsepTransportController::RemoveTransportForMid(const std::string& mid) {
-  bool ret = config_.transport_observer->OnTransportChanged(
-      mid, nullptr, nullptr, nullptr, nullptr);
+  bool ret = config_.transport_observer->OnTransportChanged(mid, nullptr,
+                                                            nullptr, nullptr);
   // Calling OnTransportChanged with nullptr should always succeed, since it is
   // only expected to fail when adding media to a transport (not removing).
   RTC_DCHECK(ret);
@@ -1102,76 +1056,6 @@
   return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
 }
 
-std::unique_ptr<webrtc::MediaTransportInterface>
-JsepTransportController::MaybeCreateMediaTransport(
-    const cricket::ContentInfo& content_info,
-    const cricket::SessionDescription& description,
-    bool local) {
-  if (config_.media_transport_factory == nullptr) {
-    return nullptr;
-  }
-
-  if (!config_.use_media_transport_for_media &&
-      !config_.use_media_transport_for_data_channels) {
-    return nullptr;
-  }
-
-  // Caller (offerer) media transport.
-  if (local) {
-    if (offer_media_transport_) {
-      RTC_LOG(LS_INFO) << "Offered media transport has now been activated.";
-      return std::move(offer_media_transport_);
-    } else {
-      RTC_LOG(LS_INFO)
-          << "Not returning media transport. Either SDES wasn't enabled, or "
-             "media transport didn't return an offer earlier.";
-      // Offer wasn't generated. Either because media transport didn't want it,
-      // or because SDES wasn't enabled.
-      return nullptr;
-    }
-  }
-
-  // Remote offer. If no x-mt lines, do not create media transport.
-  if (description.MediaTransportSettings().empty()) {
-    return nullptr;
-  }
-
-  // When bundle is enabled, two JsepTransports are created, and then
-  // the second transport is destroyed (right away).
-  // For media transport, we don't want to create the second
-  // media transport in the first place.
-  RTC_LOG(LS_INFO) << "Returning new, client media transport.";
-
-  RTC_DCHECK(!local)
-      << "If media transport is used, you must call "
-         "GenerateOrGetLastMediaTransportOffer before SetLocalDescription. You "
-         "also "
-         "must use kRtcpMuxPolicyRequire and kBundlePolicyMaxBundle with media "
-         "transport.";
-  MediaTransportSettings settings;
-  settings.is_caller = local;
-  if (config_.use_media_transport_for_media) {
-    settings.event_log = config_.event_log;
-  }
-
-  // Assume there is only one media transport (or if more, use the first one).
-  if (!local && !description.MediaTransportSettings().empty() &&
-      config_.media_transport_factory->GetTransportName() ==
-          description.MediaTransportSettings()[0].transport_name) {
-    settings.remote_transport_parameters =
-        description.MediaTransportSettings()[0].transport_setting;
-  }
-
-  auto media_transport_result =
-      config_.media_transport_factory->CreateMediaTransport(network_thread_,
-                                                            settings);
-
-  // TODO(sukhanov): Proper error handling.
-  RTC_CHECK(media_transport_result.ok());
-
-  return media_transport_result.MoveValue();
-}
-
 // TODO(sukhanov): Refactor to avoid code duplication for Media and Datagram
 // transports setup.
 std::unique_ptr<webrtc::DatagramTransportInterface>
@@ -1259,13 +1143,6 @@
       CreateIceTransport(content_info.name, /*rtcp=*/false);
   RTC_DCHECK(ice);
 
-  std::unique_ptr<MediaTransportInterface> media_transport =
-      MaybeCreateMediaTransport(content_info, description, local);
-  if (media_transport) {
-    media_transport_created_once_ = true;
-    media_transport->Connect(ice->internal());
-  }
-
   std::unique_ptr<DatagramTransportInterface> datagram_transport =
       MaybeCreateDatagramTransport(content_info, description, local);
   if (datagram_transport) {
@@ -1285,7 +1162,6 @@
   if (config_.rtcp_mux_policy !=
           PeerConnectionInterface::kRtcpMuxPolicyRequire &&
       content_info.type == cricket::MediaProtocolType::kRtp) {
-    RTC_DCHECK(media_transport == nullptr);
     RTC_DCHECK(datagram_transport == nullptr);
     rtcp_ice = CreateIceTransport(content_info.name, /*rtcp=*/true);
     rtcp_dtls_transport =
@@ -1335,8 +1211,6 @@
   DataChannelTransportInterface* data_channel_transport = nullptr;
   if (config_.use_datagram_transport_for_data_channels) {
     data_channel_transport = datagram_transport.get();
-  } else if (config_.use_media_transport_for_data_channels) {
-    data_channel_transport = media_transport.get();
   }
 
   std::unique_ptr<cricket::JsepTransport> jsep_transport =
@@ -1345,16 +1219,14 @@
           std::move(unencrypted_rtp_transport), std::move(sdes_transport),
           std::move(dtls_srtp_transport), std::move(datagram_rtp_transport),
           std::move(rtp_dtls_transport), std::move(rtcp_dtls_transport),
-          std::move(sctp_transport), std::move(media_transport),
-          std::move(datagram_transport), data_channel_transport);
+          std::move(sctp_transport), std::move(datagram_transport),
+          data_channel_transport);
 
   jsep_transport->rtp_transport()->SignalRtcpPacketReceived.connect(
       this, &JsepTransportController::OnRtcpPacketReceived_n);
 
   jsep_transport->SignalRtcpMuxActive.connect(
       this, &JsepTransportController::UpdateAggregateStates_n);
-  jsep_transport->SignalMediaTransportStateChanged.connect(
-      this, &JsepTransportController::OnMediaTransportStateChanged_n);
   jsep_transport->SignalDataChannelTransportNegotiated.connect(
       this, &JsepTransportController::OnDataChannelTransportNegotiated_n);
   SetTransportForMid(content_info.name, jsep_transport.get());
@@ -1387,8 +1259,8 @@
   RTC_DCHECK(network_thread_->IsCurrent());
 
   for (const auto& jsep_transport : jsep_transports_by_name_) {
-    config_.transport_observer->OnTransportChanged(
-        jsep_transport.first, nullptr, nullptr, nullptr, nullptr);
+    config_.transport_observer->OnTransportChanged(jsep_transport.first,
+                                                   nullptr, nullptr, nullptr);
   }
 
   jsep_transports_by_name_.clear();
@@ -1559,10 +1431,6 @@
   UpdateAggregateStates_n();
 }
 
-void JsepTransportController::OnMediaTransportStateChanged_n() {
-  UpdateAggregateStates_n();
-}
-
 void JsepTransportController::OnDataChannelTransportNegotiated_n(
     cricket::JsepTransport* transport,
     DataChannelTransportInterface* data_channel_transport) {
@@ -1570,7 +1438,7 @@
     if (it.second == transport) {
       config_.transport_observer->OnTransportChanged(
           it.first, transport->rtp_transport(), transport->RtpDtlsTransport(),
-          transport->media_transport(), data_channel_transport);
+          data_channel_transport);
     }
   }
 }
@@ -1587,10 +1455,6 @@
       PeerConnectionInterface::PeerConnectionState::kNew;
   cricket::IceGatheringState new_gathering_state = cricket::kIceGatheringNew;
   bool any_failed = false;
-
-  // TODO(http://bugs.webrtc.org/9719) If(when) media_transport disables
-  // dtls_transports entirely, the below line will have to be changed to account
-  // for the fact that dtls transports might be absent.
   bool all_connected = !dtls_transports.empty();
   bool all_completed = !dtls_transports.empty();
   bool any_gathering = false;
@@ -1620,35 +1484,6 @@
     ice_state_counts[dtls->ice_transport()->GetIceTransportState()]++;
   }
 
-  // Don't indicate that the call failed or isn't connected due to media
-  // transport state unless the media transport is used for media.  If it's only
-  // used for data channels, it will signal those separately.
-  if (config_.use_media_transport_for_media || config_.use_datagram_transport) {
-    for (auto it = jsep_transports_by_name_.begin();
-         it != jsep_transports_by_name_.end(); ++it) {
-      auto jsep_transport = it->second.get();
-      if (!jsep_transport->media_transport()) {
-        continue;
-      }
-
-      // There is no 'kIceConnectionDisconnected', so we only need to handle
-      // connected and completed.
-      // We treat kClosed as failed, because if it happens before shutting down
-      // media transports it means that there was a failure.
-      // MediaTransportInterface allows to flip back and forth between kWritable
-      // and kPending, but there does not exist an implementation that does
-      // that, and the contract of jsep transport controller doesn't quite
-      // expect that. When this happens, we would go from connected to
-      // connecting state, but this may change in future.
-      any_failed |= jsep_transport->media_transport_state() ==
-                    webrtc::MediaTransportState::kClosed;
-      all_completed &= jsep_transport->media_transport_state() ==
-                       webrtc::MediaTransportState::kWritable;
-      all_connected &= jsep_transport->media_transport_state() ==
-                       webrtc::MediaTransportState::kWritable;
-    }
-  }
-
   if (any_failed) {
     new_connection_state = cricket::kIceConnectionFailed;
   } else if (all_completed) {
@@ -1809,67 +1644,6 @@
   SignalDtlsHandshakeError(error);
 }
 
-absl::optional<cricket::SessionDescription::MediaTransportSetting>
-JsepTransportController::GenerateOrGetLastMediaTransportOffer() {
-  if (media_transport_created_once_) {
-    RTC_LOG(LS_INFO) << "Not regenerating media transport for the new offer in "
-                        "existing session.";
-    return media_transport_offer_settings_;
-  }
-
-  RTC_LOG(LS_INFO) << "Generating media transport offer!";
-
-  absl::optional<std::string> transport_parameters;
-
-  // Check that media transport is supposed to be used.
-  // Note that ICE is not available when media transport is created. It will
-  // only be available in 'Connect'. This may be a potential server config, if
-  // we decide to use this peer connection as a caller, not as a callee.
-  // TODO(sukhanov): Avoid code duplication with CreateMedia/MediaTransport.
-  if (config_.use_media_transport_for_media ||
-      config_.use_media_transport_for_data_channels) {
-    RTC_DCHECK(config_.media_transport_factory != nullptr);
-    RTC_DCHECK(!config_.use_datagram_transport);
-    webrtc::MediaTransportSettings settings;
-    settings.is_caller = true;
-    settings.pre_shared_key = rtc::CreateRandomString(32);
-    if (config_.use_media_transport_for_media) {
-      settings.event_log = config_.event_log;
-    }
-    auto media_transport_or_error =
-        config_.media_transport_factory->CreateMediaTransport(network_thread_,
-                                                              settings);
-
-    if (media_transport_or_error.ok()) {
-      offer_media_transport_ = std::move(media_transport_or_error.value());
-      transport_parameters =
-          offer_media_transport_->GetTransportParametersOffer();
-    } else {
-      RTC_LOG(LS_INFO) << "Unable to create media transport, error="
-                       << media_transport_or_error.error().message();
-    }
-  }
-
-  if (!offer_media_transport_) {
-    RTC_LOG(LS_INFO) << "Media and data transports do not exist";
-    return absl::nullopt;
-  }
-
-  if (!transport_parameters) {
-    RTC_LOG(LS_INFO) << "Media transport didn't generate the offer";
-    // Media transport didn't generate the offer, and is not supposed to be
-    // used. Destroy the temporary media transport.
-    offer_media_transport_ = nullptr;
-    return absl::nullopt;
-  }
-
-  cricket::SessionDescription::MediaTransportSetting setting;
-  setting.transport_name = config_.media_transport_factory->GetTransportName();
-  setting.transport_setting = *transport_parameters;
-  media_transport_offer_settings_ = setting;
-  return setting;
-}
-
 absl::optional<cricket::OpaqueTransportParameters>
 JsepTransportController::GetTransportParameters(const std::string& mid) {
   if (!(config_.use_datagram_transport ||
diff --git a/pc/jsep_transport_controller.h b/pc/jsep_transport_controller.h
index b7121e7..9c3f691 100644
--- a/pc/jsep_transport_controller.h
+++ b/pc/jsep_transport_controller.h
@@ -23,7 +23,6 @@
 #include "api/peer_connection_interface.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/transport/media/media_transport_config.h"
-#include "api/transport/media/media_transport_interface.h"
 #include "media/sctp/sctp_transport_internal.h"
 #include "p2p/base/dtls_transport.h"
 #include "p2p/base/dtls_transport_factory.h"
@@ -72,7 +71,6 @@
         const std::string& mid,
         RtpTransportInternal* rtp_transport,
         rtc::scoped_refptr<DtlsTransport> dtls_transport,
-        MediaTransportInterface* media_transport,
         DataChannelTransportInterface* data_channel_transport) = 0;
   };
 
@@ -106,12 +104,6 @@
     // Factory for SCTP transports.
     cricket::SctpTransportInternalFactory* sctp_factory = nullptr;
 
-    // Whether media transport is used for media.
-    bool use_media_transport_for_media = false;
-
-    // Whether media transport is used for data channels.
-    bool use_media_transport_for_data_channels = false;
-
     // Whether an RtpMediaTransport should be created as default, when no
     // MediaTransportFactory is provided.
     bool use_rtp_media_transport = false;
@@ -128,13 +120,13 @@
     bool use_datagram_transport_for_data_channels_receive_only = false;
 
     // Optional media transport factory (experimental). If provided it will be
-    // used to create media_transport (as long as either
-    // |use_media_transport_for_media| or
-    // |use_media_transport_for_data_channels| is set to true). However, whether
-    // it will be used to send / receive audio and video frames instead of RTP
-    // is determined by |use_media_transport_for_media|. Note that currently
-    // media_transport co-exists with RTP / RTCP transports and may use the same
-    // underlying ICE transport.
+    // used to create datagram_transport (as long as either
+    // |use_datagram_transport| or
+    // |use_datagram_transport_for_data_channels| is set to true). However,
+    // whether it will be used to send / receive audio and video frames instead
+    // of RTP is determined by |use_datagram_transport|. Note that currently
+    // datagram_transport co-exists with RTP / RTCP transports and may use the
+    // same underlying ICE transport.
     MediaTransportFactory* media_transport_factory = nullptr;
   };
 
@@ -174,13 +166,6 @@
   DataChannelTransportInterface* GetDataChannelTransport(
       const std::string& mid) const;
 
-  // TODO(sukhanov): Deprecate, return only config.
-  MediaTransportInterface* GetMediaTransport(const std::string& mid) const {
-    return GetMediaTransportConfig(mid).media_transport;
-  }
-
-  MediaTransportState GetMediaTransportState(const std::string& mid) const;
-
   /*********************
    * ICE-related methods
    ********************/
@@ -235,8 +220,6 @@
   // you did not call 'GetMediaTransport' or 'MaybeCreateJsepTransport'. Once
   // Jsep transport is created, you can't change this setting.
   void SetMediaTransportSettings(
-      bool use_media_transport_for_media,
-      bool use_media_transport_for_data_channels,
       bool use_datagram_transport,
       bool use_datagram_transport_for_data_channels,
       bool use_datagram_transport_for_data_channels_receive_only);
@@ -245,13 +228,6 @@
   // and deletes unused transports, but doesn't consider anything more complex.
   void RollbackTransportForMids(const std::vector<std::string>& mids);
 
-  // If media transport is present enabled and supported,
-  // when this method is called, it creates a media transport and generates its
-  // offer. The new offer is then returned, and the created media transport will
-  // subsequently be used.
-  absl::optional<cricket::SessionDescription::MediaTransportSetting>
-  GenerateOrGetLastMediaTransportOffer();
-
   // Gets the transport parameters for the transport identified by |mid|.
   // If |mid| is bundled, returns the parameters for the bundled transport.
   // If the transport for |mid| has not been created yet, it may be allocated in
@@ -371,16 +347,6 @@
       const cricket::ContentInfo& content_info,
       const cricket::SessionDescription& description);
 
-  // Creates media transport if config wants to use it, and a=x-mt line is
-  // present for the current media transport. Returned MediaTransportInterface
-  // is not connected, and must be connected to ICE. You must call
-  // |GenerateOrGetLastMediaTransportOffer| on the caller before calling
-  // MaybeCreateMediaTransport.
-  std::unique_ptr<webrtc::MediaTransportInterface> MaybeCreateMediaTransport(
-      const cricket::ContentInfo& content_info,
-      const cricket::SessionDescription& description,
-      bool local);
-
   // Creates datagram transport if config wants to use it, and a=x-mt line is
   // present for the current media transport. Returned
   // DatagramTransportInterface is not connected, and must be connected to ICE.
@@ -441,7 +407,6 @@
                                       const cricket::Candidates& candidates);
   void OnTransportRoleConflict_n(cricket::IceTransportInternal* transport);
   void OnTransportStateChanged_n(cricket::IceTransportInternal* transport);
-  void OnMediaTransportStateChanged_n();
   void OnTransportCandidatePairChanged_n(
       const cricket::CandidatePairChangeEvent& event);
   void OnDataChannelTransportNegotiated_n(
@@ -480,21 +445,6 @@
 
   Config config_;
 
-  // Early on in the call we don't know if media transport is going to be used,
-  // but we need to get the server-supported parameters to add to an SDP.
-  // This server media transport will be promoted to the used media transport
-  // after the local description is set, and the ownership will be transferred
-  // to the actual JsepTransport.
-  // This "offer" media transport is not created if it's done on the party that
-  // provides answer. This offer media transport is only created once at the
-  // beginning of the connection, and never again.
-  std::unique_ptr<MediaTransportInterface> offer_media_transport_ = nullptr;
-
-  // Contains the offer of the |offer_media_transport_|, in case if it needs to
-  // be repeated.
-  absl::optional<cricket::SessionDescription::MediaTransportSetting>
-      media_transport_offer_settings_;
-
   // Early on in the call we don't know if datagram transport is going to be
   // used, but we need to get the server-supported parameters to add to an SDP.
   // This server datagram transport will be promoted to the used datagram
@@ -506,24 +456,6 @@
   std::unique_ptr<DatagramTransportInterface> offer_datagram_transport_ =
       nullptr;
 
-  // Contains the offer of the |offer_datagram_transport_|, in case if it needs
-  // to be repeated.
-  absl::optional<cricket::SessionDescription::MediaTransportSetting>
-      datagram_transport_offer_settings_;
-
-  // When the new offer is regenerated (due to upgrade), we don't want to
-  // re-create media transport. New streams might be created; but media
-  // transport stays the same. This flag prevents re-creation of the transport
-  // on the offerer.
-  // The first media transport is created in jsep transport controller as the
-  // |offer_media_transport_|, and then the ownership is moved to the
-  // appropriate JsepTransport, at which point |offer_media_transport_| is
-  // zeroed out. On the callee (answerer), the first media transport is not even
-  // assigned to |offer_media_transport_|. Both offerer and answerer can
-  // recreate the Offer (e.g. after adding streams in Plan B), and so we want to
-  // prevent recreation of the media transport when that happens.
-  bool media_transport_created_once_ = false;
-
   const cricket::SessionDescription* local_desc_ = nullptr;
   const cricket::SessionDescription* remote_desc_ = nullptr;
   absl::optional<bool> initial_offerer_;
diff --git a/pc/jsep_transport_controller_unittest.cc b/pc/jsep_transport_controller_unittest.cc
index b96a999..196be13 100644
--- a/pc/jsep_transport_controller_unittest.cc
+++ b/pc/jsep_transport_controller_unittest.cc
@@ -19,7 +19,6 @@
 #include "p2p/base/dtls_transport_factory.h"
 #include "p2p/base/fake_dtls_transport.h"
 #include "p2p/base/fake_ice_transport.h"
-#include "p2p/base/no_op_dtls_transport.h"
 #include "p2p/base/transport_info.h"
 #include "rtc_base/gunit.h"
 #include "rtc_base/thread.h"
@@ -331,7 +330,6 @@
       const std::string& mid,
       RtpTransportInternal* rtp_transport,
       rtc::scoped_refptr<DtlsTransport> dtls_transport,
-      MediaTransportInterface* media_transport,
       DataChannelTransportInterface* data_channel_transport) override {
     changed_rtp_transport_by_mid_[mid] = rtp_transport;
     if (dtls_transport) {
@@ -339,7 +337,6 @@
     } else {
       changed_dtls_transport_by_mid_[mid] = nullptr;
     }
-    changed_media_transport_by_mid_[mid] = media_transport;
     return true;
   }
 
@@ -373,8 +370,6 @@
   std::map<std::string, RtpTransportInternal*> changed_rtp_transport_by_mid_;
   std::map<std::string, cricket::DtlsTransportInternal*>
       changed_dtls_transport_by_mid_;
-  std::map<std::string, MediaTransportInterface*>
-      changed_media_transport_by_mid_;
 
   // Transport controller needs to be destroyed first, because it may issue
   // callbacks that modify the changed_*_by_mid in the destructor.
@@ -443,46 +438,6 @@
   EXPECT_EQ(nullptr, transport_controller_->GetRtcpDtlsTransport(kAudioMid1));
   EXPECT_NE(nullptr, transport_controller_->GetDtlsTransport(kVideoMid1));
   EXPECT_EQ(nullptr, transport_controller_->GetRtcpDtlsTransport(kVideoMid1));
-  EXPECT_EQ(nullptr, transport_controller_->GetMediaTransport(kAudioMid1));
-}
-
-TEST_F(JsepTransportControllerTest,
-       DtlsIsStillCreatedIfMediaTransportIsOnlyUsedForDataChannels) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetDataChannelTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  // After SetLocalDescription, media transport should be created as caller.
-  EXPECT_TRUE(media_transport->is_caller());
-  EXPECT_TRUE(media_transport->pre_shared_key().has_value());
-
-  // Return nullptr for non-existing mids.
-  EXPECT_EQ(nullptr,
-            transport_controller_->GetDataChannelTransport(kVideoMid2));
-
-  EXPECT_EQ(cricket::ICE_CANDIDATE_COMPONENT_RTP,
-            transport_controller_->GetDtlsTransport(kAudioMid1)->component())
-      << "Media transport for media was not enabled, and so DTLS transport "
-         "should be created.";
 }
 
 TEST_F(JsepTransportControllerTest,
@@ -575,339 +530,6 @@
                    .ok());
 }
 
-TEST_F(JsepTransportControllerTest, GetMediaTransportInCaller) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  // After SetLocalDescription, media transport should be created as caller.
-  EXPECT_TRUE(media_transport->is_caller());
-  // We set the pre-shared key on the caller.
-  EXPECT_TRUE(media_transport->pre_shared_key().has_value());
-  EXPECT_TRUE(media_transport->is_connected());
-
-  // Return nullptr for non-existing mids.
-  EXPECT_EQ(nullptr, transport_controller_->GetMediaTransport(kVideoMid2));
-
-  EXPECT_EQ(cricket::kNoOpDtlsTransportComponent,
-            transport_controller_->GetDtlsTransport(kAudioMid1)->component())
-      << "Because media transport is used, expected no-op DTLS transport.";
-}
-
-TEST_F(JsepTransportControllerTest,
-       GetMediaTransportOfferInTheConfigOnSubsequentCalls) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  WrapperMediaTransportFactory wrapping_factory(&fake_media_transport_factory);
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &wrapping_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-
-  absl::optional<cricket::SessionDescription::MediaTransportSetting> settings =
-      transport_controller_->GenerateOrGetLastMediaTransportOffer();
-  ASSERT_NE(absl::nullopt, settings);
-
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  absl::optional<cricket::SessionDescription::MediaTransportSetting>
-      new_settings =
-          transport_controller_->GenerateOrGetLastMediaTransportOffer();
-  ASSERT_NE(absl::nullopt, new_settings);
-  EXPECT_EQ(settings->transport_name, new_settings->transport_name);
-  EXPECT_EQ(settings->transport_setting, new_settings->transport_setting);
-  EXPECT_EQ(1, wrapping_factory.created_transport_count());
-}
-
-TEST_F(JsepTransportControllerTest, GetMediaTransportInCallee) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  description->AddMediaTransportSetting("fake", "fake-remote-settings");
-  EXPECT_TRUE(transport_controller_
-                  ->SetRemoteDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  // After SetRemoteDescription, media transport should be created as callee.
-  EXPECT_FALSE(media_transport->is_caller());
-  // We do not set pre-shared key on the callee, it comes in media transport
-  // settings.
-  EXPECT_EQ(absl::nullopt, media_transport->settings().pre_shared_key);
-  EXPECT_TRUE(media_transport->is_connected());
-
-  // Return nullptr for non-existing mids.
-  EXPECT_EQ(nullptr, transport_controller_->GetMediaTransport(kVideoMid2));
-
-  EXPECT_EQ(cricket::kNoOpDtlsTransportComponent,
-            transport_controller_->GetDtlsTransport(kAudioMid1)->component())
-      << "Because media transport is used, expected no-op DTLS transport.";
-}
-
-TEST_F(JsepTransportControllerTest, GetMediaTransportInCalleePassesSdp) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  description->AddMediaTransportSetting("fake", "this-is-a-test-setting");
-  EXPECT_TRUE(transport_controller_
-                  ->SetRemoteDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  EXPECT_EQ("this-is-a-test-setting",
-            media_transport->settings().remote_transport_parameters);
-}
-
-// Caller generates the offer if media transport returns empty offer (no
-// parameters).
-TEST_F(JsepTransportControllerTest, MediaTransportGeneratesSessionDescription) {
-  FakeMediaTransportFactory fake_media_transport_factory(
-      /*transport_offer=*/"");
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  absl::optional<cricket::SessionDescription::MediaTransportSetting> settings =
-      transport_controller_->GenerateOrGetLastMediaTransportOffer();
-
-  ASSERT_TRUE(settings.has_value());
-  EXPECT_EQ("fake", settings->transport_name);
-  // Fake media transport returns empty settings (but not nullopt settings!)
-  EXPECT_EQ("", settings->transport_setting);
-}
-
-// Caller generates the offer if media transport returns offer with parameters.
-TEST_F(JsepTransportControllerTest,
-       MediaTransportGeneratesSessionDescriptionWithOfferParams) {
-  FakeMediaTransportFactory fake_media_transport_factory(
-      /*transport_offer=*/"offer-params");
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  absl::optional<cricket::SessionDescription::MediaTransportSetting> settings =
-      transport_controller_->GenerateOrGetLastMediaTransportOffer();
-
-  ASSERT_TRUE(settings.has_value());
-  EXPECT_EQ("fake", settings->transport_name);
-  EXPECT_EQ("offer-params", settings->transport_setting);
-}
-
-// Caller skips the offer if media transport requests it.
-TEST_F(JsepTransportControllerTest,
-       MediaTransportGeneratesSkipsSessionDescription) {
-  FakeMediaTransportFactory fake_media_transport_factory(
-      /*transport_offer=*/absl::nullopt);
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  absl::optional<cricket::SessionDescription::MediaTransportSetting> settings =
-      transport_controller_->GenerateOrGetLastMediaTransportOffer();
-
-  // Fake media transport returns nullopt settings
-  ASSERT_EQ(absl::nullopt, settings);
-}
-
-// Caller ignores its own outgoing parameters.
-TEST_F(JsepTransportControllerTest,
-       GetMediaTransportInCallerIgnoresXmtSection) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  // Remote parameters are nullopt, because we are the offerer (we don't)
-  // have the remote transport parameters, only ours.
-  EXPECT_EQ(absl::nullopt,
-            media_transport->settings().remote_transport_parameters);
-}
-
-TEST_F(JsepTransportControllerTest,
-       GetMediaTransportInCalleeIgnoresDifferentTransport) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  description->AddMediaTransportSetting("not-a-fake-transport",
-                                        "this-is-a-test-setting");
-  EXPECT_TRUE(transport_controller_
-                  ->SetRemoteDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  EXPECT_EQ(absl::nullopt,
-            media_transport->settings().remote_transport_parameters);
-}
-
-TEST_F(JsepTransportControllerTest, GetMediaTransportIsNotSetIfNoSdes) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  EXPECT_TRUE(transport_controller_
-                  ->SetRemoteDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  EXPECT_EQ(nullptr, transport_controller_->GetMediaTransport(kAudioMid1));
-
-  // Even if we set local description with crypto now (after the remote offer
-  // was set), media transport won't be provided.
-  auto description2 = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description2.get());
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kAnswer, description2.get())
-                  .ok());
-
-  EXPECT_EQ(nullptr, transport_controller_->GetMediaTransport(kAudioMid1));
-  EXPECT_EQ(cricket::ICE_CANDIDATE_COMPONENT_RTP,
-            transport_controller_->GetDtlsTransport(kAudioMid1)->component())
-      << "Because media transport is NOT used (fallback to RTP), expected "
-         "actual DTLS transport for RTP";
-}
-
-TEST_F(JsepTransportControllerTest,
-       AfterSettingAnswerTheSameMediaTransportIsReturnedCallee) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  description->AddMediaTransportSetting("fake", "fake-settings");
-  EXPECT_TRUE(transport_controller_
-                  ->SetRemoteDescription(SdpType::kOffer, description.get())
-                  .ok());
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-  EXPECT_NE(nullptr, media_transport);
-  EXPECT_FALSE(media_transport->pre_shared_key().has_value())
-      << "On the callee, preshared key is passed through the media-transport "
-         "settings (x-mt)";
-
-  // Even if we set local description with crypto now (after the remote offer
-  // was set), media transport won't be provided.
-  auto description2 = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description2.get());
-
-  RTCError result = transport_controller_->SetLocalDescription(
-      SdpType::kAnswer, description2.get());
-  EXPECT_TRUE(result.ok()) << result.message();
-
-  // Media transport did not change.
-  EXPECT_EQ(media_transport,
-            transport_controller_->GetMediaTransport(kAudioMid1));
-}
-
 TEST_F(JsepTransportControllerTest, SetIceConfig) {
   CreateJsepTransportController(JsepTransportController::Config());
   auto description = CreateSessionDescriptionWithoutBundle();
@@ -1190,164 +812,6 @@
   EXPECT_EQ(3, combined_connection_state_signal_count_);
 }
 
-TEST_F(JsepTransportControllerTest,
-       SignalConnectionStateConnectedWithMediaTransportAndNoDtlsCaller) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.use_media_transport_for_data_channels = true;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-
-  // Media Transport is only used with bundle.
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  auto fake_audio_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kAudioMid1)->ice_transport());
-  auto fake_video_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kVideoMid1)->ice_transport());
-  EXPECT_EQ(fake_audio_ice, fake_video_ice);
-  fake_audio_ice->SetConnectionCount(2);
-  fake_audio_ice->SetConnectionCount(1);
-  fake_video_ice->SetConnectionCount(2);
-  fake_video_ice->SetConnectionCount(1);
-  fake_audio_ice->SetWritable(true);
-  fake_video_ice->SetWritable(true);
-
-  // Still not connected, because we are waiting for media transport.
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnecting, connection_state_,
-                 kTimeout);
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  media_transport->SetState(webrtc::MediaTransportState::kWritable);
-  // Only one media transport.
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnected, connection_state_, kTimeout);
-}
-
-TEST_F(JsepTransportControllerTest,
-       SignalConnectionStateConnectedWithMediaTransportCaller) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-
-  // Media Transport is only used with bundle.
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
-      transport_controller_->GetDtlsTransport(kAudioMid1));
-  auto fake_video_dtls = static_cast<FakeDtlsTransport*>(
-      transport_controller_->GetDtlsTransport(kVideoMid1));
-
-  auto fake_audio_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kAudioMid1)->ice_transport());
-  auto fake_video_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kVideoMid1)->ice_transport());
-  fake_audio_ice->SetConnectionCount(2);
-  fake_audio_ice->SetConnectionCount(1);
-  fake_video_ice->SetConnectionCount(2);
-  fake_video_ice->SetConnectionCount(1);
-  fake_audio_ice->SetWritable(true);
-  fake_video_ice->SetWritable(true);
-  fake_audio_dtls->SetWritable(true);
-  fake_video_dtls->SetWritable(true);
-
-  // Still not connected, because we are waiting for media transport.
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnecting, connection_state_,
-                 kTimeout);
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-
-  ASSERT_NE(nullptr, media_transport);
-
-  media_transport->SetState(webrtc::MediaTransportState::kWritable);
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnecting, connection_state_,
-                 kTimeout);
-
-  // Still waiting for the second media transport.
-  media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kVideoMid1));
-  media_transport->SetState(webrtc::MediaTransportState::kWritable);
-
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnected, connection_state_, kTimeout);
-}
-
-TEST_F(JsepTransportControllerTest,
-       SignalConnectionStateFailedWhenMediaTransportClosedCaller) {
-  FakeMediaTransportFactory fake_media_transport_factory;
-  JsepTransportController::Config config;
-  config.media_transport_factory = &fake_media_transport_factory;
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  config.use_media_transport_for_media = true;
-  CreateJsepTransportController(config);
-  auto description = CreateSessionDescriptionWithBundleGroup();
-  AddCryptoSettings(description.get());
-  EXPECT_NE(absl::nullopt,
-            transport_controller_->GenerateOrGetLastMediaTransportOffer());
-  EXPECT_TRUE(transport_controller_
-                  ->SetLocalDescription(SdpType::kOffer, description.get())
-                  .ok());
-
-  auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
-      transport_controller_->GetDtlsTransport(kAudioMid1));
-  auto fake_video_dtls = static_cast<FakeDtlsTransport*>(
-      transport_controller_->GetDtlsTransport(kVideoMid1));
-
-  auto fake_audio_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kAudioMid1)->ice_transport());
-  auto fake_video_ice = static_cast<cricket::FakeIceTransport*>(
-      transport_controller_->GetDtlsTransport(kVideoMid1)->ice_transport());
-  fake_audio_ice->SetWritable(true);
-  fake_video_ice->SetWritable(true);
-  // Decreasing connection count from 2 to 1 triggers connection state event.
-  fake_audio_ice->SetConnectionCount(2);
-  fake_audio_ice->SetConnectionCount(1);
-  fake_video_ice->SetConnectionCount(2);
-  fake_video_ice->SetConnectionCount(1);
-
-  fake_audio_dtls->SetWritable(true);
-  fake_video_dtls->SetWritable(true);
-
-  FakeMediaTransport* media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kAudioMid1));
-  ASSERT_NE(nullptr, media_transport);
-  media_transport->SetState(webrtc::MediaTransportState::kWritable);
-
-  media_transport = static_cast<FakeMediaTransport*>(
-      transport_controller_->GetMediaTransport(kVideoMid1));
-  ASSERT_NE(nullptr, media_transport);
-
-  media_transport->SetState(webrtc::MediaTransportState::kWritable);
-
-  EXPECT_EQ_WAIT(cricket::kIceConnectionConnected, connection_state_, kTimeout);
-
-  media_transport->SetState(webrtc::MediaTransportState::kClosed);
-  EXPECT_EQ_WAIT(cricket::kIceConnectionFailed, connection_state_, kTimeout);
-}
-
 TEST_F(JsepTransportControllerTest, SignalConnectionStateComplete) {
   CreateJsepTransportController(JsepTransportController::Config());
   auto description = CreateSessionDescriptionWithoutBundle();
diff --git a/pc/jsep_transport_unittest.cc b/pc/jsep_transport_unittest.cc
index 87d6e87..c4193e5 100644
--- a/pc/jsep_transport_unittest.cc
+++ b/pc/jsep_transport_unittest.cc
@@ -114,11 +114,6 @@
         RTC_NOTREACHED();
     }
 
-    // TODO(sukhanov): Currently there is no media_transport specific
-    // logic in jseptransport, so jseptransport unittests are created with
-    // media_transport = nullptr. In the future we will probably add
-    // more logic that require unit tests. Note that creation of media_transport
-    // is covered in jseptransportcontroller_unittest.
     auto jsep_transport = std::make_unique<JsepTransport>(
         kTransportName, /*local_certificate=*/nullptr, std::move(ice),
         std::move(rtcp_ice), std::move(unencrypted_rtp_transport),
@@ -126,7 +121,6 @@
         /*datagram_rtp_transport=*/nullptr, std::move(rtp_dtls_transport),
         std::move(rtcp_dtls_transport),
         /*sctp_transport=*/nullptr,
-        /*media_transport=*/nullptr,
         /*datagram_transport=*/nullptr,
         /*data_channel_transport=*/nullptr);
 
diff --git a/pc/media_session.cc b/pc/media_session.cc
index 873f27d..59f140f 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -1523,12 +1523,6 @@
 
   offer->set_extmap_allow_mixed(session_options.offer_extmap_allow_mixed);
 
-  if (session_options.media_transport_settings.has_value()) {
-    offer->AddMediaTransportSetting(
-        session_options.media_transport_settings->transport_name,
-        session_options.media_transport_settings->transport_setting);
-  }
-
   return offer;
 }
 
diff --git a/pc/media_session.h b/pc/media_session.h
index f91729a..235945c 100644
--- a/pc/media_session.h
+++ b/pc/media_session.h
@@ -115,11 +115,6 @@
   std::vector<MediaDescriptionOptions> media_description_options;
   std::vector<IceParameters> pooled_ice_credentials;
 
-  // An optional media transport settings.
-  // In the future we may consider using a vector here, to indicate multiple
-  // supported transports.
-  absl::optional<cricket::SessionDescription::MediaTransportSetting>
-      media_transport_settings;
   // Use the draft-ietf-mmusic-sctp-sdp-03 obsolete syntax for SCTP
   // datachannels.
   // Default is true for backwards compatibility with clients that use
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index f5f51c4..c24bd2e 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -1135,7 +1135,6 @@
     const PeerConnectionInterface::RTCConfiguration& configuration,
     PeerConnectionDependencies dependencies) {
   RTC_DCHECK_RUN_ON(signaling_thread());
-  RTC_DCHECK_RUNS_SERIALIZED(&use_media_transport_race_checker_);
   TRACE_EVENT0("webrtc", "PeerConnection::Initialize");
 
   RTCError config_error = ValidateConfiguration(configuration);
@@ -1260,37 +1259,15 @@
   use_datagram_transport_for_data_channels_receive_only_ =
       configuration.use_datagram_transport_for_data_channels_receive_only
           .value_or(datagram_transport_data_channel_config_.receive_only);
-  if (use_datagram_transport_ || use_datagram_transport_for_data_channels_ ||
-      configuration.use_media_transport ||
-      configuration.use_media_transport_for_data_channels) {
+  if (use_datagram_transport_ || use_datagram_transport_for_data_channels_) {
     if (!factory_->media_transport_factory()) {
       RTC_DCHECK(false)
-          << "PeerConnecton is initialized with use_media_transport = true or "
-          << "use_media_transport_for_data_channels = true "
+          << "PeerConnecton is initialized with use_datagram_transport = true "
+             "or use_datagram_transport_for_data_channels = true "
           << "but media transport factory is not set in PeerConnectionFactory";
       return false;
     }
 
-    if (configuration.use_media_transport ||
-        configuration.use_media_transport_for_data_channels) {
-      // TODO(bugs.webrtc.org/9719): This check will eventually go away, when
-      // RTP media transport is introduced. But until then, we require SDES to
-      // be enabled.
-      if (configuration.enable_dtls_srtp.has_value() &&
-          configuration.enable_dtls_srtp.value()) {
-        RTC_LOG(LS_WARNING)
-            << "When media transport is used, SDES must be enabled. Set "
-               "configuration.enable_dtls_srtp to false. use_media_transport="
-            << configuration.use_media_transport
-            << ", use_media_transport_for_data_channels="
-            << configuration.use_media_transport_for_data_channels;
-        return false;
-      }
-    }
-
-    config.use_media_transport_for_media = configuration.use_media_transport;
-    config.use_media_transport_for_data_channels =
-        configuration.use_media_transport_for_data_channels;
     config.use_datagram_transport = use_datagram_transport_;
     config.use_datagram_transport_for_data_channels =
         use_datagram_transport_for_data_channels_;
@@ -1336,14 +1313,6 @@
       data_channel_type_ = cricket::DCT_DATA_CHANNEL_TRANSPORT_SCTP;
       config.sctp_factory = sctp_factory_.get();
     }
-  } else if (configuration.use_media_transport_for_data_channels) {
-    if (configuration.enable_rtp_data_channel) {
-      RTC_LOG(LS_ERROR) << "enable_rtp_data_channel and "
-                           "use_media_transport_for_data_channels are "
-                           "incompatible and cannot both be set to true";
-      return false;
-    }
-    data_channel_type_ = cricket::DCT_MEDIA_TRANSPORT;
   } else if (configuration.enable_rtp_data_channel) {
     // Enable creation of RTP data channels if the kEnableRtpDataChannels is
     // set. It takes precendence over the disable_sctp_data_channels
@@ -1385,7 +1354,6 @@
   stats_collector_ = RTCStatsCollector::Create(this);
 
   configuration_ = configuration;
-  use_media_transport_ = configuration.use_media_transport;
 
   transport_controller_->SetIceConfig(ParseIceConfig(configuration));
 
@@ -3928,7 +3896,6 @@
 RTCError PeerConnection::SetConfiguration(
     const RTCConfiguration& configuration) {
   RTC_DCHECK_RUN_ON(signaling_thread());
-  RTC_DCHECK_RUNS_SERIALIZED(&use_media_transport_race_checker_);
   TRACE_EVENT0("webrtc", "PeerConnection::SetConfiguration");
   if (IsClosed()) {
     LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_STATE,
@@ -3946,36 +3913,6 @@
   }
 
   if (local_description() &&
-      configuration.use_media_transport != configuration_.use_media_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Can't change media_transport after calling "
-                         "SetLocalDescription.");
-  }
-
-  if (remote_description() &&
-      configuration.use_media_transport != configuration_.use_media_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Can't change media_transport after calling "
-                         "SetRemoteDescription.");
-  }
-
-  if (local_description() &&
-      configuration.use_media_transport_for_data_channels !=
-          configuration_.use_media_transport_for_data_channels) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Can't change media_transport_for_data_channels "
-                         "after calling SetLocalDescription.");
-  }
-
-  if (remote_description() &&
-      configuration.use_media_transport_for_data_channels !=
-          configuration_.use_media_transport_for_data_channels) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Can't change media_transport_for_data_channels "
-                         "after calling SetRemoteDescription.");
-  }
-
-  if (local_description() &&
       configuration.crypto_options != configuration_.crypto_options) {
     LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
                          "Can't change crypto_options after calling "
@@ -4034,9 +3971,7 @@
         "after calling SetRemoteDescription.");
   }
 
-  if (configuration.use_media_transport_for_data_channels ||
-      configuration.use_media_transport ||
-      (configuration.use_datagram_transport &&
+  if ((configuration.use_datagram_transport &&
        *configuration.use_datagram_transport) ||
       (configuration.use_datagram_transport_for_data_channels &&
        *configuration.use_datagram_transport_for_data_channels)) {
@@ -4072,9 +4007,6 @@
   modified_config.network_preference = configuration.network_preference;
   modified_config.active_reset_srtp_params =
       configuration.active_reset_srtp_params;
-  modified_config.use_media_transport = configuration.use_media_transport;
-  modified_config.use_media_transport_for_data_channels =
-      configuration.use_media_transport_for_data_channels;
   modified_config.use_datagram_transport = configuration.use_datagram_transport;
   modified_config.use_datagram_transport_for_data_channels =
       configuration.use_datagram_transport_for_data_channels;
@@ -4158,8 +4090,6 @@
       modified_config.use_datagram_transport_for_data_channels_receive_only
           .value_or(datagram_transport_data_channel_config_.receive_only);
   transport_controller_->SetMediaTransportSettings(
-      modified_config.use_media_transport,
-      modified_config.use_media_transport_for_data_channels,
       use_datagram_transport_, use_datagram_transport_for_data_channels_,
       use_datagram_transport_for_data_channels_receive_only_);
 
@@ -4178,7 +4108,6 @@
   }
 
   configuration_ = modified_config;
-  use_media_transport_ = configuration.use_media_transport;
   return RTCError::OK();
 }
 
@@ -4967,12 +4896,6 @@
   session_options->offer_extmap_allow_mixed =
       configuration_.offer_extmap_allow_mixed;
 
-  if (configuration_.use_media_transport ||
-      configuration_.use_media_transport_for_data_channels) {
-    session_options->media_transport_settings =
-        transport_controller_->GenerateOrGetLastMediaTransportOffer();
-  }
-
   // If datagram transport is in use, add opaque transport parameters.
   if (use_datagram_transport_ || use_datagram_transport_for_data_channels_) {
     for (auto& options : session_options->media_description_options) {
@@ -5476,7 +5399,6 @@
       }
       return rtp_data_channel_->content_name();
     case cricket::DCT_SCTP:
-    case cricket::DCT_MEDIA_TRANSPORT:
     case cricket::DCT_DATA_CHANNEL_TRANSPORT:
     case cricket::DCT_DATA_CHANNEL_TRANSPORT_SCTP:
       return sctp_mid_;
@@ -7106,7 +7028,6 @@
     case cricket::DCT_SCTP:
     case cricket::DCT_DATA_CHANNEL_TRANSPORT_SCTP:
     case cricket::DCT_DATA_CHANNEL_TRANSPORT:
-    case cricket::DCT_MEDIA_TRANSPORT:
       if (!network_thread()->Invoke<bool>(
               RTC_FROM_HERE,
               rtc::Bind(&PeerConnection::SetupDataChannelTransport_n, this,
@@ -7777,20 +7698,14 @@
     const std::string& mid,
     RtpTransportInternal* rtp_transport,
     rtc::scoped_refptr<DtlsTransport> dtls_transport,
-    MediaTransportInterface* media_transport,
     DataChannelTransportInterface* data_channel_transport) {
   RTC_DCHECK_RUN_ON(network_thread());
-  RTC_DCHECK_RUNS_SERIALIZED(&use_media_transport_race_checker_);
   bool ret = true;
   auto base_channel = GetChannel(mid);
   if (base_channel) {
     ret = base_channel->SetRtpTransport(rtp_transport);
   }
 
-  if (use_media_transport_) {
-    RTC_LOG(LS_ERROR) << "Media transport isn't supported.";
-  }
-
   if (data_channel_transport_ && mid == sctp_mid_ &&
       data_channel_transport_ != data_channel_transport) {
     // Changed which data channel transport is used for |sctp_mid_| (eg. now
diff --git a/pc/peer_connection.h b/pc/peer_connection.h
index 3126348..9bc6119 100644
--- a/pc/peer_connection.h
+++ b/pc/peer_connection.h
@@ -20,7 +20,6 @@
 
 #include "api/peer_connection_interface.h"
 #include "api/transport/data_channel_transport_interface.h"
-#include "api/transport/media/media_transport_interface.h"
 #include "api/turn_customizer.h"
 #include "pc/ice_server_parsing.h"
 #include "pc/jsep_transport_controller.h"
@@ -1201,7 +1200,6 @@
       const std::string& mid,
       RtpTransportInternal* rtp_transport,
       rtc::scoped_refptr<DtlsTransport> dtls_transport,
-      MediaTransportInterface* media_transport,
       DataChannelTransportInterface* data_channel_transport) override;
 
   // RtpSenderBase::SetStreamsObserver override.
@@ -1289,14 +1287,6 @@
   bool use_datagram_transport_for_data_channels_receive_only_
       RTC_GUARDED_BY(signaling_thread()) = false;
 
-  // Cache configuration_.use_media_transport so that we can access it from
-  // other threads.
-  // TODO(bugs.webrtc.org/9987): Caching just this bool and allowing the data
-  // it's derived from to change is not necessarily sound. Stop doing it.
-  rtc::RaceChecker use_media_transport_race_checker_;
-  bool use_media_transport_ RTC_GUARDED_BY(use_media_transport_race_checker_) =
-      configuration_.use_media_transport;
-
   // TODO(zstein): |async_resolver_factory_| can currently be nullptr if it
   // is not injected. It should be required once chromium supplies it.
   std::unique_ptr<AsyncResolverFactory> async_resolver_factory_
diff --git a/pc/peer_connection_data_channel_unittest.cc b/pc/peer_connection_data_channel_unittest.cc
index a902c76..b063c39 100644
--- a/pc/peer_connection_data_channel_unittest.cc
+++ b/pc/peer_connection_data_channel_unittest.cc
@@ -22,8 +22,6 @@
 #include "api/peer_connection_proxy.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "api/test/fake_media_transport.h"
-#include "api/transport/media/media_transport_interface.h"
 #include "media/base/codec.h"
 #include "media/base/fake_media_engine.h"
 #include "media/base/media_constants.h"
@@ -65,8 +63,7 @@
     rtc::Thread* worker_thread,
     rtc::Thread* signaling_thread,
     std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-    std::unique_ptr<CallFactoryInterface> call_factory,
-    std::unique_ptr<MediaTransportFactory> media_transport_factory) {
+    std::unique_ptr<CallFactoryInterface> call_factory) {
   PeerConnectionFactoryDependencies deps;
   deps.network_thread = network_thread;
   deps.worker_thread = worker_thread;
@@ -74,7 +71,6 @@
   deps.task_queue_factory = CreateDefaultTaskQueueFactory();
   deps.media_engine = std::move(media_engine);
   deps.call_factory = std::move(call_factory);
-  deps.media_transport_factory = std::move(media_transport_factory);
   return deps;
 }
 
@@ -90,8 +86,7 @@
                 rtc::Thread::Current(),
                 rtc::Thread::Current(),
                 std::make_unique<cricket::FakeMediaEngine>(),
-                CreateCallFactory(),
-                std::make_unique<FakeMediaTransportFactory>())) {}
+                CreateCallFactory())) {}
 
   std::unique_ptr<cricket::SctpTransportInternalFactory>
   CreateSctpTransportInternalFactory() {
@@ -385,50 +380,6 @@
   EXPECT_EQ(kNewRecvPort, callee_transport->local_port());
 }
 
-TEST_P(PeerConnectionDataChannelTest,
-       NoSctpTransportCreatedIfMediaTransportDataChannelsEnabled) {
-  RTCConfiguration config;
-  config.use_media_transport_for_data_channels = true;
-  config.enable_dtls_srtp = false;  // SDES is required to use media transport.
-  auto caller = CreatePeerConnectionWithDataChannel(config);
-
-  ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
-  EXPECT_FALSE(caller->sctp_transport_factory()->last_fake_sctp_transport());
-}
-
-TEST_P(PeerConnectionDataChannelTest,
-       MediaTransportDataChannelCreatedEvenIfSctpAvailable) {
-  RTCConfiguration config;
-  config.use_media_transport_for_data_channels = true;
-  config.enable_dtls_srtp = false;  // SDES is required to use media transport.
-  PeerConnectionFactoryInterface::Options options;
-  options.disable_sctp_data_channels = false;
-  auto caller = CreatePeerConnectionWithDataChannel(config, options);
-
-  ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
-  EXPECT_FALSE(caller->sctp_transport_factory()->last_fake_sctp_transport());
-}
-
-TEST_P(PeerConnectionDataChannelTest,
-       CannotEnableBothMediaTransportAndRtpDataChannels) {
-  RTCConfiguration config;
-  config.enable_rtp_data_channel = true;
-  config.use_media_transport_for_data_channels = true;
-  config.enable_dtls_srtp = false;  // SDES is required to use media transport.
-  EXPECT_EQ(CreatePeerConnection(config), nullptr);
-}
-
-// This test now DCHECKs, instead of failing to SetLocalDescription.
-TEST_P(PeerConnectionDataChannelTest, MediaTransportWithoutSdesFails) {
-  RTCConfiguration config;
-  config.use_media_transport_for_data_channels = true;
-  config.enable_dtls_srtp = true;  // Disables SDES for data sections.
-
-  auto caller = CreatePeerConnectionWithDataChannel(config);
-
-  EXPECT_EQ(nullptr, caller);
-}
-
 TEST_P(PeerConnectionDataChannelTest, ModernSdpSyntaxByDefault) {
   PeerConnectionInterface::RTCOfferAnswerOptions options;
   auto caller = CreatePeerConnectionWithDataChannel();
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index e59ce9a..dd06b65 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -4278,331 +4278,6 @@
   ASSERT_TRUE(ExpectNewFrames(media_expectations));
 }
 
-// This test sets up a call between two parties with a media transport data
-// channel.
-TEST_P(PeerConnectionIntegrationTest, MediaTransportDataChannelEndToEnd) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  rtc_config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  rtc_config.use_media_transport_for_data_channels = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Expect that data channel created on caller side will show up for callee as
-  // well.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Caller data channel should already exist (it created one). Callee data
-  // channel may not exist yet, since negotiation happens in-band, not in SDP.
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  callee()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-// Tests that 'zero-rtt' data channel transports (which are ready-to-send as
-// soon as they're created) work correctly.
-TEST_P(PeerConnectionIntegrationTest, MediaTransportDataChannelZeroRtt) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  rtc_config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  rtc_config.use_media_transport_for_data_channels = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Ensure that the callee's media transport is ready-to-send immediately.
-  // Note that only the callee can become writable in zero RTTs.  The caller
-  // must wait for the callee's answer.
-  loopback_media_transports()->SetSecondStateAfterConnect(
-      webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Expect that data channel created on caller side will show up for callee as
-  // well.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  loopback_media_transports()->SetFirstState(
-      webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Caller data channel should already exist (it created one). Callee data
-  // channel may not exist yet, since negotiation happens in-band, not in SDP.
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  callee()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-// Ensure that when the callee closes a media transport data channel, the
-// closing procedure results in the data channel being closed for the caller
-// as well.
-TEST_P(PeerConnectionIntegrationTest, MediaTransportDataChannelCalleeCloses) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.use_media_transport_for_data_channels = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Create a data channel on the caller and signal it to the callee.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Data channels exist and open on both ends of the connection.
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Close the data channel on the callee side, and wait for it to reach the
-  // "closed" state on both sides.
-  callee()->data_channel()->Close();
-  EXPECT_TRUE_WAIT(!caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
-}
-
-TEST_P(PeerConnectionIntegrationTest,
-       MediaTransportDataChannelConfigSentToOtherSide) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.use_media_transport_for_data_channels = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Create a data channel with a non-default configuration and signal it to the
-  // callee.
-  webrtc::DataChannelInit init;
-  init.id = 53;
-  init.maxRetransmits = 52;
-  caller()->CreateDataChannel("data-channel", &init);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Ensure that the data channel exists on the callee with the correct
-  // configuration.
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-  // Since "negotiate" is false, the "id" parameter is ignored.
-  EXPECT_NE(init.id, callee()->data_channel()->id());
-  EXPECT_EQ("data-channel", callee()->data_channel()->label());
-  EXPECT_EQ(init.maxRetransmits, callee()->data_channel()->maxRetransmits());
-  EXPECT_FALSE(callee()->data_channel()->negotiated());
-}
-
-TEST_P(PeerConnectionIntegrationTest, MediaTransportOfferUpgrade) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  rtc_config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  rtc_config.use_media_transport = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Do initial offer/answer with just a video track.
-  caller()->AddVideoTrack();
-  callee()->AddVideoTrack();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Now add an audio track and do another offer/answer.
-  caller()->AddAudioTrack();
-  callee()->AddAudioTrack();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure both audio and video frames are received end-to-end.
-  MediaExpectations media_expectations;
-  media_expectations.ExpectBidirectionalAudioAndVideo();
-  ASSERT_TRUE(ExpectNewFrames(media_expectations));
-
-  // The second offer should not have generated another media transport.
-  // Media transport was kept alive, and was not recreated.
-  EXPECT_EQ(1, loopback_media_transports()->first_factory_transport_count());
-  EXPECT_EQ(1, loopback_media_transports()->second_factory_transport_count());
-}
-
-TEST_P(PeerConnectionIntegrationTest, MediaTransportOfferUpgradeOnTheCallee) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  rtc_config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  rtc_config.use_media_transport = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  // Do initial offer/answer with just a video track.
-  caller()->AddVideoTrack();
-  callee()->AddVideoTrack();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  // Now add an audio track and do another offer/answer.
-  caller()->AddAudioTrack();
-  callee()->AddAudioTrack();
-  callee()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure both audio and video frames are received end-to-end.
-  MediaExpectations media_expectations;
-  media_expectations.ExpectBidirectionalAudioAndVideo();
-  ASSERT_TRUE(ExpectNewFrames(media_expectations));
-
-  // The second offer should not have generated another media transport.
-  // Media transport was kept alive, and was not recreated.
-  EXPECT_EQ(1, loopback_media_transports()->first_factory_transport_count());
-  EXPECT_EQ(1, loopback_media_transports()->second_factory_transport_count());
-}
-
-TEST_P(PeerConnectionIntegrationTest, MediaTransportBidirectionalAudio) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  rtc_config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  rtc_config.use_media_transport = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  caller()->AddAudioTrack();
-  callee()->AddAudioTrack();
-  // Start offer/answer exchange and wait for it to complete.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  MediaExpectations media_expectations;
-  media_expectations.ExpectBidirectionalAudio();
-  ASSERT_TRUE(ExpectNewFrames(media_expectations));
-
-  webrtc::MediaTransportPair::Stats first_stats =
-      loopback_media_transports()->FirstStats();
-  webrtc::MediaTransportPair::Stats second_stats =
-      loopback_media_transports()->SecondStats();
-
-  EXPECT_GT(first_stats.received_audio_frames, 0);
-  EXPECT_GE(second_stats.sent_audio_frames, first_stats.received_audio_frames);
-
-  EXPECT_GT(second_stats.received_audio_frames, 0);
-  EXPECT_GE(first_stats.sent_audio_frames, second_stats.received_audio_frames);
-}
-
-TEST_P(PeerConnectionIntegrationTest, MediaTransportBidirectionalVideo) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.use_media_transport = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  caller()->AddVideoTrack();
-  callee()->AddVideoTrack();
-  // Start offer/answer exchange and wait for it to complete.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Ensure that the media transport is ready.
-  loopback_media_transports()->SetState(webrtc::MediaTransportState::kWritable);
-  loopback_media_transports()->FlushAsyncInvokes();
-
-  MediaExpectations media_expectations;
-  media_expectations.ExpectBidirectionalVideo();
-  ASSERT_TRUE(ExpectNewFrames(media_expectations));
-
-  webrtc::MediaTransportPair::Stats first_stats =
-      loopback_media_transports()->FirstStats();
-  webrtc::MediaTransportPair::Stats second_stats =
-      loopback_media_transports()->SecondStats();
-
-  EXPECT_GT(first_stats.received_video_frames, 0);
-  EXPECT_GE(second_stats.sent_video_frames, first_stats.received_video_frames);
-
-  EXPECT_GT(second_stats.received_video_frames, 0);
-  EXPECT_GE(first_stats.sent_video_frames, second_stats.received_video_frames);
-}
-
-TEST_P(PeerConnectionIntegrationTest,
-       MediaTransportDataChannelUsesRtpBidirectionalVideo) {
-  PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.use_media_transport = false;
-  rtc_config.use_media_transport_for_data_channels = true;
-  rtc_config.enable_dtls_srtp = false;  // SDES is required for media transport.
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfigAndMediaTransportFactory(
-      rtc_config, rtc_config, loopback_media_transports()->first_factory(),
-      loopback_media_transports()->second_factory()));
-  ConnectFakeSignaling();
-
-  caller()->AddVideoTrack();
-  callee()->AddVideoTrack();
-  // Start offer/answer exchange and wait for it to complete.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  MediaExpectations media_expectations;
-  media_expectations.ExpectBidirectionalVideo();
-  ASSERT_TRUE(ExpectNewFrames(media_expectations));
-}
-
 // Test that the ICE connection and gathering states eventually reach
 // "complete".
 TEST_P(PeerConnectionIntegrationTest, IceStatesReachCompletion) {
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index 5a01430..7f42b8c 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -1421,15 +1421,15 @@
 
   PeerConnectionInterface::RTCConfiguration config = pc_->GetConfiguration();
   config.type = PeerConnectionInterface::kRelay;
-  config.use_media_transport = true;
-  config.use_media_transport_for_data_channels = true;
+  config.use_datagram_transport = true;
+  config.use_datagram_transport_for_data_channels = true;
   EXPECT_TRUE(pc_->SetConfiguration(config).ok());
 
   PeerConnectionInterface::RTCConfiguration returned_config =
       pc_->GetConfiguration();
   EXPECT_EQ(PeerConnectionInterface::kRelay, returned_config.type);
-  EXPECT_TRUE(returned_config.use_media_transport);
-  EXPECT_TRUE(returned_config.use_media_transport_for_data_channels);
+  EXPECT_TRUE(returned_config.use_datagram_transport);
+  EXPECT_TRUE(returned_config.use_datagram_transport_for_data_channels);
 }
 
 TEST_P(PeerConnectionInterfaceTest, SetConfigurationFailsAfterClose) {
diff --git a/pc/peer_connection_media_unittest.cc b/pc/peer_connection_media_unittest.cc
index 62368a2..077c4a3 100644
--- a/pc/peer_connection_media_unittest.cc
+++ b/pc/peer_connection_media_unittest.cc
@@ -20,7 +20,6 @@
 #include "api/call/call_factory_interface.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "api/test/fake_media_transport.h"
 #include "media/base/fake_media_engine.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "pc/media_session.h"
@@ -85,8 +84,6 @@
   }
 
   // Creates PeerConnectionFactory and PeerConnection for given configuration.
-  // Note that PeerConnectionFactory is created with MediaTransportFactory,
-  // because some tests pass config.use_media_transport = true.
   WrapperPtr CreatePeerConnection(
       const RTCConfiguration& config,
       std::unique_ptr<FakeMediaEngine> media_engine) {
@@ -103,8 +100,6 @@
     factory_dependencies.event_log_factory =
         std::make_unique<RtcEventLogFactory>(
             factory_dependencies.task_queue_factory.get());
-    factory_dependencies.media_transport_factory =
-        std::make_unique<FakeMediaTransportFactory>();
 
     auto pc_factory =
         CreateModularPeerConnectionFactory(std::move(factory_dependencies));
@@ -1244,128 +1239,6 @@
             audio_options.combined_audio_video_bwe);
 }
 
-TEST_P(PeerConnectionMediaTest, MediaTransportPropagatedToVoiceEngine) {
-  RTCConfiguration config;
-
-  // Setup PeerConnection to use media transport.
-  config.use_media_transport = true;
-
-  // Force SDES.
-  config.enable_dtls_srtp = false;
-
-  auto caller = CreatePeerConnectionWithAudio(config);
-  auto callee = CreatePeerConnectionWithAudio(config);
-
-  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
-  auto answer = callee->CreateAnswer();
-  ASSERT_TRUE(callee->SetLocalDescription(std::move(answer)));
-
-  auto caller_voice = caller->media_engine()->GetVoiceChannel(0);
-  auto callee_voice = callee->media_engine()->GetVoiceChannel(0);
-  ASSERT_TRUE(caller_voice);
-  ASSERT_TRUE(callee_voice);
-
-  // Make sure media transport is propagated to voice channel.
-  FakeMediaTransport* caller_voice_media_transport =
-      static_cast<FakeMediaTransport*>(caller_voice->media_transport());
-  FakeMediaTransport* callee_voice_media_transport =
-      static_cast<FakeMediaTransport*>(callee_voice->media_transport());
-  ASSERT_NE(nullptr, caller_voice_media_transport);
-  ASSERT_NE(nullptr, callee_voice_media_transport);
-
-  // Make sure media transport is created with correct is_caller.
-  EXPECT_TRUE(caller_voice_media_transport->is_caller());
-  EXPECT_FALSE(callee_voice_media_transport->is_caller());
-
-  // TODO(sukhanov): Propagate media transport to video channel.
-  // This test does NOT set up video channels, because currently it causes
-  // us to create two media transports.
-}
-
-TEST_P(PeerConnectionMediaTest, MediaTransportOnlyForDataChannels) {
-  RTCConfiguration config;
-
-  // Setup PeerConnection to use media transport for data channels.
-  config.use_media_transport_for_data_channels = true;
-
-  // Force SDES.
-  config.enable_dtls_srtp = false;
-
-  auto caller = CreatePeerConnectionWithAudio(config);
-  auto callee = CreatePeerConnectionWithAudio(config);
-
-  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
-  ASSERT_TRUE(callee->SetLocalDescription(callee->CreateAnswer()));
-
-  auto caller_voice = caller->media_engine()->GetVoiceChannel(0);
-  auto callee_voice = callee->media_engine()->GetVoiceChannel(0);
-  ASSERT_TRUE(caller_voice);
-  ASSERT_TRUE(callee_voice);
-
-  // Make sure media transport is not propagated to voice channel.
-  EXPECT_EQ(nullptr, caller_voice->media_transport());
-  EXPECT_EQ(nullptr, callee_voice->media_transport());
-}
-
-TEST_P(PeerConnectionMediaTest, MediaTransportForMediaAndDataChannels) {
-  RTCConfiguration config;
-
-  // Setup PeerConnection to use media transport for both media and data
-  // channels.
-  config.use_media_transport = true;
-  config.use_media_transport_for_data_channels = true;
-
-  // Force SDES.
-  config.enable_dtls_srtp = false;
-
-  auto caller = CreatePeerConnectionWithAudio(config);
-  auto callee = CreatePeerConnectionWithAudio(config);
-
-  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
-  ASSERT_TRUE(callee->SetLocalDescription(callee->CreateAnswer()));
-
-  auto caller_voice = caller->media_engine()->GetVoiceChannel(0);
-  auto callee_voice = callee->media_engine()->GetVoiceChannel(0);
-  ASSERT_TRUE(caller_voice);
-  ASSERT_TRUE(callee_voice);
-
-  // Make sure media transport is propagated to voice channel.
-  FakeMediaTransport* caller_voice_media_transport =
-      static_cast<FakeMediaTransport*>(caller_voice->media_transport());
-  FakeMediaTransport* callee_voice_media_transport =
-      static_cast<FakeMediaTransport*>(callee_voice->media_transport());
-  ASSERT_NE(nullptr, caller_voice_media_transport);
-  ASSERT_NE(nullptr, callee_voice_media_transport);
-
-  // Make sure media transport is created with correct is_caller.
-  EXPECT_TRUE(caller_voice_media_transport->is_caller());
-  EXPECT_FALSE(callee_voice_media_transport->is_caller());
-}
-
-TEST_P(PeerConnectionMediaTest, MediaTransportNotPropagatedToVoiceEngine) {
-  auto caller = CreatePeerConnectionWithAudioVideo();
-  auto callee = CreatePeerConnectionWithAudioVideo();
-
-  ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
-  auto answer = callee->CreateAnswer();
-  ASSERT_TRUE(callee->SetLocalDescription(std::move(answer)));
-
-  auto caller_voice = caller->media_engine()->GetVoiceChannel(0);
-  auto callee_voice = callee->media_engine()->GetVoiceChannel(0);
-  ASSERT_TRUE(caller_voice);
-  ASSERT_TRUE(callee_voice);
-
-  // Since we did not setup PeerConnection to use media transport, media
-  // transport should not be created / propagated to the voice engine.
-  ASSERT_EQ(nullptr, caller_voice->media_transport());
-  ASSERT_EQ(nullptr, callee_voice->media_transport());
-
-  auto caller_video = caller->media_engine()->GetVideoChannel(0);
-  auto callee_video = callee->media_engine()->GetVideoChannel(0);
-  ASSERT_EQ(nullptr, caller_video->media_transport());
-  ASSERT_EQ(nullptr, callee_video->media_transport());
-}
-
 template <typename C>
 bool CompareCodecs(const std::vector<webrtc::RtpCodecCapability>& capabilities,
                    const std::vector<C>& codecs) {
diff --git a/pc/session_description.h b/pc/session_description.h
index f5e3635..7546d12 100644
--- a/pc/session_description.h
+++ b/pc/session_description.h
@@ -515,8 +515,6 @@
 
   std::unique_ptr<SessionDescription> Clone() const;
 
-  struct MediaTransportSetting;
-
   // Content accessors.
   const ContentInfos& contents() const { return contents_; }
   ContentInfos& contents() { return contents_; }
@@ -627,32 +625,6 @@
   }
   bool extmap_allow_mixed() const { return extmap_allow_mixed_; }
 
-  // Adds the media transport setting.
-  // Media transport name uniquely identifies the type of media transport.
-  // The name cannot be empty, or repeated in the previously added transport
-  // settings.
-  void AddMediaTransportSetting(const std::string& media_transport_name,
-                                const std::string& media_transport_setting) {
-    RTC_DCHECK(!media_transport_name.empty());
-    for (const auto& setting : media_transport_settings_) {
-      RTC_DCHECK(media_transport_name != setting.transport_name)
-          << "MediaTransportSetting was already registered, transport_name="
-          << setting.transport_name;
-    }
-    media_transport_settings_.push_back(
-        {media_transport_name, media_transport_setting});
-  }
-
-  // Gets the media transport settings, in order of preference.
-  const std::vector<MediaTransportSetting>& MediaTransportSettings() const {
-    return media_transport_settings_;
-  }
-
-  struct MediaTransportSetting {
-    std::string transport_name;
-    std::string transport_setting;
-  };
-
  private:
   SessionDescription(const SessionDescription&);
 
@@ -669,8 +641,6 @@
   // correctly. If it's included in offer to us we will respond that we support
   // it.
   bool extmap_allow_mixed_ = false;
-
-  std::vector<MediaTransportSetting> media_transport_settings_;
 };
 
 // Indicates whether a session description was sent by the local client or
diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc
index 7a42dca..c0e959a 100644
--- a/pc/webrtc_sdp.cc
+++ b/pc/webrtc_sdp.cc
@@ -229,13 +229,6 @@
 
 static const char kDefaultSctpmapProtocol[] = "webrtc-datachannel";
 
-// This is a non-standardized media transport settings.
-// This setting is going to be set in the offer. There may be one or more
-// a=x-mt: settings, and they are in the priority order (the most preferred on
-// top). x-mt setting format depends on the media transport, and is generated by
-// |MediaTransportInterface::GetTransportParametersOffer|.
-static const char kMediaTransportSettingLine[] = "x-mt";
-
 // This is a non-standardized setting for plugin transports.
 static const char kOpaqueTransportParametersLine[] = "x-opaque";
 
@@ -530,17 +523,6 @@
   InitLine(kLineTypeAttributes, attribute, os);
 }
 
-// Writes an x-mt SDP attribute line based on the media transport settings.
-static void AddMediaTransportLine(
-    const cricket::SessionDescription::MediaTransportSetting& setting,
-    std::string* message) {
-  rtc::StringBuilder os;
-  InitAttrLine(kMediaTransportSettingLine, &os);
-  os << kSdpDelimiterColon << setting.transport_name << kSdpDelimiterColon
-     << rtc::Base64::Encode(setting.transport_setting);
-  AddLine(os.str(), message);
-}
-
 // Adds an x-otp SDP attribute line based on opaque transport parameters.
 static void AddOpaqueTransportLine(
     const cricket::OpaqueTransportParameters params,
@@ -902,11 +884,6 @@
   // Time Description.
   AddLine(kTimeDescription, &message);
 
-  for (const cricket::SessionDescription::MediaTransportSetting& settings :
-       desc->MediaTransportSettings()) {
-    AddMediaTransportLine(settings, &message);
-  }
-
   // Group
   if (desc->HasGroup(cricket::GROUP_TYPE_BUNDLE)) {
     std::string group_line = kAttrGroup;
@@ -2122,28 +2099,6 @@
   return true;
 }
 
-bool ParseMediaTransportLine(const std::string& line,
-                             std::string* transport_name,
-                             std::string* transport_setting,
-                             SdpParseError* error) {
-  std::string value;
-  if (!GetValue(line, kMediaTransportSettingLine, &value, error)) {
-    return false;
-  }
-  std::string media_transport_settings_base64;
-  if (!rtc::tokenize_first(value, kSdpDelimiterColonChar, transport_name,
-                           &media_transport_settings_base64)) {
-    return ParseFailedGetValue(line, kMediaTransportSettingLine, error);
-  }
-  if (!rtc::Base64::Decode(media_transport_settings_base64,
-                           rtc::Base64::DO_STRICT, transport_setting,
-                           nullptr)) {
-    return ParseFailedGetValue(line, kMediaTransportSettingLine, error);
-  }
-
-  return true;
-}
-
 bool ParseOpaqueTransportLine(const std::string& line,
                               std::string* protocol,
                               std::string* transport_parameters,
@@ -2327,24 +2282,6 @@
         return false;
       }
       session_extmaps->push_back(extmap);
-    } else if (HasAttribute(line, kMediaTransportSettingLine)) {
-      std::string transport_name;
-      std::string transport_setting;
-      if (!ParseMediaTransportLine(line, &transport_name, &transport_setting,
-                                   error)) {
-        return false;
-      }
-
-      for (const auto& setting : desc->MediaTransportSettings()) {
-        if (setting.transport_name == transport_name) {
-          // Ignore repeated transport names rather than failing to parse so
-          // that in the future the same transport could have multiple configs.
-          RTC_LOG(INFO) << "x-mt line with repeated transport, transport_name="
-                        << transport_name;
-          return true;
-        }
-      }
-      desc->AddMediaTransportSetting(transport_name, transport_setting);
     }
   }
 
diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc
index 5c7e783..e8e937a 100644
--- a/pc/webrtc_sdp_unittest.cc
+++ b/pc/webrtc_sdp_unittest.cc
@@ -4640,121 +4640,6 @@
                           Field("name", &cricket::ContentInfo::name, "")));
 }
 
-// Test that the media transport name and base64-decoded setting is parsed from
-// an a=x-mt line.
-TEST_F(WebRtcSdpTest, ParseMediaTransport) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp += "a=x-mt:rtp:dGVzdDY0\r\n";
-  SdpParseError error;
-
-  ASSERT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error))
-      << error.description;
-  const auto& settings = output.description()->MediaTransportSettings();
-  ASSERT_EQ(1u, settings.size());
-  EXPECT_EQ("rtp", settings[0].transport_name);
-  EXPECT_EQ("test64", settings[0].transport_setting);
-}
-
-// Test that an a=x-mt line fails to parse if its setting is invalid base 64.
-TEST_F(WebRtcSdpTest, ParseMediaTransportInvalidBase64) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp += "a=x-mt:rtp:ThisIsInvalidBase64\r\n";
-  SdpParseError error;
-
-  ASSERT_FALSE(webrtc::SdpDeserialize(sdp, &output, &error));
-}
-
-// Test that multiple a=x-mt lines are parsed in the order of preference (the
-// order of the lines in the SDP).
-TEST_F(WebRtcSdpTest, ParseMediaTransportMultipleLines) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp +=
-      "a=x-mt:rtp:dGVzdDY0\r\n"
-      "a=x-mt:generic:Z2VuZXJpY3NldHRpbmc=\r\n";
-  SdpParseError error;
-
-  ASSERT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error))
-      << error.description;
-  const auto& settings = output.description()->MediaTransportSettings();
-  ASSERT_EQ(2u, settings.size());
-  EXPECT_EQ("rtp", settings[0].transport_name);
-  EXPECT_EQ("test64", settings[0].transport_setting);
-  EXPECT_EQ("generic", settings[1].transport_name);
-  EXPECT_EQ("genericsetting", settings[1].transport_setting);
-}
-
-// Test that only the first a=x-mt line associated with a transport name is
-// parsed and the rest ignored.
-TEST_F(WebRtcSdpTest, ParseMediaTransportSkipRepeatedTransport) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp +=
-      "a=x-mt:rtp:dGVzdDY0\r\n"
-      "a=x-mt:rtp:Z2VuZXJpY3NldHRpbmc=\r\n";
-  SdpParseError error;
-
-  // Repeated 'rtp' transport setting. We still parse the SDP successfully,
-  // but ignore the repeated transport.
-  ASSERT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error));
-  const auto& settings = output.description()->MediaTransportSettings();
-  EXPECT_EQ("test64", settings[0].transport_setting);
-}
-
-// Test that an a=x-mt line fails to parse if it is missing a setting.
-TEST_F(WebRtcSdpTest, ParseMediaTransportMalformedLine) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp += "a=x-mt:rtp\r\n";
-  SdpParseError error;
-
-  ASSERT_FALSE(webrtc::SdpDeserialize(sdp, &output, &error));
-}
-
-// Test that an a=x-mt line fails to parse if its missing a name and setting.
-TEST_F(WebRtcSdpTest, ParseMediaTransportMalformedLine2) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp += "a=x-mt\r\n";
-  SdpParseError error;
-
-  ASSERT_FALSE(webrtc::SdpDeserialize(sdp, &output, &error));
-}
-
-TEST_F(WebRtcSdpTest, ParseMediaTransportIgnoreNonsenseAttributeLines) {
-  JsepSessionDescription output(kDummyType);
-  std::string sdp = kSdpSessionString;
-  sdp += "a=x-nonsense:rtp:dGVzdDY0\r\n";
-  SdpParseError error;
-
-  ASSERT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error))
-      << error.description;
-  EXPECT_TRUE(output.description()->MediaTransportSettings().empty());
-}
-
-TEST_F(WebRtcSdpTest, SerializeMediaTransportSettings) {
-  auto description = std::make_unique<cricket::SessionDescription>();
-
-  JsepSessionDescription output(SdpType::kOffer);
-  // JsepSessionDescription takes ownership of the description.
-  output.Initialize(std::move(description), "session_id", "session_version");
-  output.description()->AddMediaTransportSetting("foo", "bar");
-  std::string serialized_out;
-  output.ToString(&serialized_out);
-  ASSERT_THAT(serialized_out, ::testing::HasSubstr("\r\na=x-mt:foo:YmFy\r\n"));
-}
-
-TEST_F(WebRtcSdpTest, SerializeMediaTransportSettingsTestCopy) {
-  cricket::SessionDescription description;
-  description.AddMediaTransportSetting("name", "setting");
-  std::unique_ptr<cricket::SessionDescription> copy = description.Clone();
-  ASSERT_EQ(1u, copy->MediaTransportSettings().size());
-  EXPECT_EQ("name", copy->MediaTransportSettings()[0].transport_name);
-  EXPECT_EQ("setting", copy->MediaTransportSettings()[0].transport_setting);
-}
-
 TEST_F(WebRtcSdpTest, SerializeWithDefaultSctpProtocol) {
   AddSctpDataChannel(false);  // Don't use sctpmap
   JsepSessionDescription jsep_desc(kDummyType);