Create 'MaybeCreateMediaTransport' function

JsepTransportController got a bit ugly with one super long method.
Splitting it to two, so that MediaTransport creation is separated.

Bug: webrtc:9719
Change-Id: I0b5aead2f96d79d6fc369a16810be58c8a661e71
Reviewed-on: https://webrtc-review.googlesource.com/c/111288
Reviewed-by: Anton Sukhanov <sukhanov@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Peter Slatala <psla@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25732}
diff --git a/pc/jseptransportcontroller.cc b/pc/jseptransportcontroller.cc
index 74a9ab6..78ecaf3 100644
--- a/pc/jseptransportcontroller.cc
+++ b/pc/jseptransportcontroller.cc
@@ -922,39 +922,11 @@
   return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
 }
 
-RTCError JsepTransportController::MaybeCreateJsepTransport(
+std::unique_ptr<webrtc::MediaTransportInterface>
+JsepTransportController::MaybeCreateMediaTransport(
+    const cricket::ContentInfo& content_info,
     bool local,
-    const cricket::ContentInfo& content_info) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  cricket::JsepTransport* transport = GetJsepTransportByName(content_info.name);
-  if (transport) {
-    return RTCError::OK();
-  }
-
-  const cricket::MediaContentDescription* content_desc =
-      static_cast<const cricket::MediaContentDescription*>(
-          content_info.description);
-  if (certificate_ && !content_desc->cryptos().empty()) {
-    return RTCError(RTCErrorType::INVALID_PARAMETER,
-                    "SDES and DTLS-SRTP cannot be enabled at the same time.");
-  }
-
-  std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport =
-      CreateDtlsTransport(content_info.name, /*rtcp =*/false);
-
-  std::unique_ptr<cricket::DtlsTransportInternal> rtcp_dtls_transport;
-  std::unique_ptr<RtpTransport> unencrypted_rtp_transport;
-  std::unique_ptr<SrtpTransport> sdes_transport;
-  std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport;
-  std::unique_ptr<MediaTransportInterface> media_transport;
-
-  if (config_.rtcp_mux_policy !=
-          PeerConnectionInterface::kRtcpMuxPolicyRequire &&
-      content_info.type == cricket::MediaProtocolType::kRtp) {
-    rtcp_dtls_transport =
-        CreateDtlsTransport(content_info.name, /*rtcp =*/true);
-  }
-
+    cricket::IceTransportInternal* ice_transport) {
   absl::optional<cricket::CryptoParams> selected_crypto_for_media_transport;
   if (content_info.media_description() &&
       !content_info.media_description()->cryptos().empty()) {
@@ -1024,16 +996,53 @@
                       key.value().size());
       auto media_transport_result =
           config_.media_transport_factory->CreateMediaTransport(
-              rtp_dtls_transport->ice_transport(), network_thread_, settings);
+              ice_transport, network_thread_, settings);
 
       // TODO(sukhanov): Proper error handling.
       RTC_CHECK(media_transport_result.ok());
 
-      RTC_DCHECK(media_transport == nullptr);
-      media_transport = std::move(media_transport_result.value());
+      return media_transport_result.MoveValue();
     }
   }
 
+  return nullptr;
+}
+
+RTCError JsepTransportController::MaybeCreateJsepTransport(
+    bool local,
+    const cricket::ContentInfo& content_info) {
+  RTC_DCHECK(network_thread_->IsCurrent());
+  cricket::JsepTransport* transport = GetJsepTransportByName(content_info.name);
+  if (transport) {
+    return RTCError::OK();
+  }
+
+  const cricket::MediaContentDescription* content_desc =
+      static_cast<const cricket::MediaContentDescription*>(
+          content_info.description);
+  if (certificate_ && !content_desc->cryptos().empty()) {
+    return RTCError(RTCErrorType::INVALID_PARAMETER,
+                    "SDES and DTLS-SRTP cannot be enabled at the same time.");
+  }
+
+  std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport =
+      CreateDtlsTransport(content_info.name, /*rtcp =*/false);
+
+  std::unique_ptr<cricket::DtlsTransportInternal> rtcp_dtls_transport;
+  std::unique_ptr<RtpTransport> unencrypted_rtp_transport;
+  std::unique_ptr<SrtpTransport> sdes_transport;
+  std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport;
+  std::unique_ptr<MediaTransportInterface> media_transport;
+
+  if (config_.rtcp_mux_policy !=
+          PeerConnectionInterface::kRtcpMuxPolicyRequire &&
+      content_info.type == cricket::MediaProtocolType::kRtp) {
+    rtcp_dtls_transport =
+        CreateDtlsTransport(content_info.name, /*rtcp =*/true);
+  }
+  media_transport = MaybeCreateMediaTransport(
+      content_info, local, rtp_dtls_transport->ice_transport());
+
   // TODO(sukhanov): Do not create RTP/RTCP transports if media transport is
   // used.
   if (config_.disable_encryption) {
diff --git a/pc/jseptransportcontroller.h b/pc/jseptransportcontroller.h
index 42b28c2..3ed7f5f 100644
--- a/pc/jseptransportcontroller.h
+++ b/pc/jseptransportcontroller.h
@@ -272,6 +272,14 @@
   // differentiate initiator (caller) from answerer (callee).
   RTCError MaybeCreateJsepTransport(bool local,
                                     const cricket::ContentInfo& content_info);
+
+  // Creates media transport if config wants to use it, and pre-shared key is
+  // provided in content info. It modifies the config to disable media transport
+  // if pre-shared key is not provided.
+  std::unique_ptr<webrtc::MediaTransportInterface> MaybeCreateMediaTransport(
+      const cricket::ContentInfo& content_info,
+      bool local,
+      cricket::IceTransportInternal* ice_transport);
   void MaybeDestroyJsepTransport(const std::string& mid);
   void DestroyAllJsepTransports_n();