Introduce MediaTransportConfig

Currently we pass media_transport from PeerConnection to media layers. The goal of this change is to replace media_transport with struct MediaTransportCondif, which will enable adding different transports (i.e. we plan to add DatagramTransport) as well as other media-transport related settings without changing 100s of files.

TODO: In the future we should consider also adding rtp_transport in the same config, but it will require a bit more work, so I did not include it in the same change.


Bug: webrtc:9719
Change-Id: Ie31e1faa3ed9e6beefe30a3da208130509ce00cd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/137181
Commit-Queue: Anton Sukhanov <sukhanov@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Bjorn Mellem <mellem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28016}
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index e8360cb..38e89d8 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -89,7 +89,7 @@
   ChannelSend(Clock* clock,
               TaskQueueFactory* task_queue_factory,
               ProcessThread* module_process_thread,
-              MediaTransportInterface* media_transport,
+              const MediaTransportConfig& media_transport_config,
               OverheadObserver* overhead_observer,
               Transport* rtp_transport,
               RtcpRttStats* rtcp_rtt_stats,
@@ -205,7 +205,9 @@
       RTC_RUN_ON(encoder_queue_);
 
   // Return media transport or nullptr if using RTP.
-  MediaTransportInterface* media_transport() { return media_transport_; }
+  MediaTransportInterface* media_transport() {
+    return media_transport_config_.media_transport;
+  }
 
   // Called on the encoder task queue when a new input audio frame is ready
   // for encoding.
@@ -266,7 +268,7 @@
 
   bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
 
-  MediaTransportInterface* const media_transport_;
+  MediaTransportConfig media_transport_config_;
   int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
 
   rtc::CriticalSection media_transport_lock_;
@@ -618,7 +620,7 @@
 ChannelSend::ChannelSend(Clock* clock,
                          TaskQueueFactory* task_queue_factory,
                          ProcessThread* module_process_thread,
-                         MediaTransportInterface* media_transport,
+                         const MediaTransportConfig& media_transport_config,
                          OverheadObserver* overhead_observer,
                          Transport* rtp_transport,
                          RtcpRttStats* rtcp_rtt_stats,
@@ -642,7 +644,7 @@
           new RateLimiter(clock, kMaxRetransmissionWindowMs)),
       use_twcc_plr_for_ana_(
           webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
-      media_transport_(media_transport),
+      media_transport_config_(media_transport_config),
       frame_encryptor_(frame_encryptor),
       crypto_options_(crypto_options),
       encoder_queue_(task_queue_factory->CreateTaskQueue(
@@ -659,7 +661,7 @@
   // transport. All of this logic should be moved to the future
   // RTPMediaTransport. In this case it means that overhead and bandwidth
   // observers should not be called when using media transport.
-  if (!media_transport_) {
+  if (!media_transport_config.media_transport) {
     configuration.overhead_observer = overhead_observer;
     configuration.bandwidth_callback = rtcp_observer_.get();
     configuration.transport_feedback_callback = feedback_observer_proxy_.get();
@@ -689,10 +691,11 @@
 
   // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
   // callbacks after the audio_coding_ is fully initialized.
-  if (media_transport_) {
+  if (media_transport_config.media_transport) {
     RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
-    media_transport_->AddTargetTransferRateObserver(this);
-    media_transport_->SetAudioOverheadObserver(overhead_observer);
+    media_transport_config.media_transport->AddTargetTransferRateObserver(this);
+    media_transport_config.media_transport->SetAudioOverheadObserver(
+        overhead_observer);
   } else {
     RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
   }
@@ -714,9 +717,10 @@
 ChannelSend::~ChannelSend() {
   RTC_DCHECK(construction_thread_.IsCurrent());
 
-  if (media_transport_) {
-    media_transport_->RemoveTargetTransferRateObserver(this);
-    media_transport_->SetAudioOverheadObserver(nullptr);
+  if (media_transport_config_.media_transport) {
+    media_transport_config_.media_transport->RemoveTargetTransferRateObserver(
+        this);
+    media_transport_config_.media_transport->SetAudioOverheadObserver(nullptr);
   }
 
   StopSend();
@@ -779,7 +783,7 @@
                                           encoder->RtpTimestampRateHz(),
                                           encoder->NumChannels(), 0);
 
-  if (media_transport_) {
+  if (media_transport_config_.media_transport) {
     rtc::CritScope cs(&media_transport_lock_);
     media_transport_payload_type_ = payload_type;
     // TODO(nisse): Currently broken for G722, since timestamps passed through
@@ -856,7 +860,7 @@
 
 void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
   // May be called on either worker thread or network thread.
-  if (media_transport_) {
+  if (media_transport_config_.media_transport) {
     // Ignore RTCP packets while media transport is used.
     // Those packets should not arrive, but we are seeing occasional packets.
     return;
@@ -931,7 +935,7 @@
   RTC_DCHECK_RUN_ON(&worker_thread_checker_);
   RTC_DCHECK(!sending_);
 
-  if (media_transport_) {
+  if (media_transport_config_.media_transport) {
     rtc::CritScope cs(&media_transport_lock_);
     media_transport_channel_id_ = ssrc;
   }
@@ -1165,12 +1169,13 @@
 }
 
 int64_t ChannelSend::GetRTT() const {
-  if (media_transport_) {
+  if (media_transport_config_.media_transport) {
     // GetRTT is generally used in the RTCP codepath, where media transport is
     // not present and so it shouldn't be needed. But it's also invoked in
     // 'GetStats' method, and for now returning media transport RTT here gives
     // us "free" rtt stats for media transport.
-    auto target_rate = media_transport_->GetLatestTargetTransferRate();
+    auto target_rate =
+        media_transport_config_.media_transport->GetLatestTargetTransferRate();
     if (target_rate.has_value()) {
       return target_rate.value().network_estimate.round_trip_time.ms();
     }
@@ -1214,7 +1219,7 @@
 // AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
 // makes sense to consolidate all rate (and overhead) calculation there.
 void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
-  RTC_DCHECK(media_transport_);
+  RTC_DCHECK(media_transport_config_.media_transport);
   OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
 }
 
@@ -1230,7 +1235,7 @@
     Clock* clock,
     TaskQueueFactory* task_queue_factory,
     ProcessThread* module_process_thread,
-    MediaTransportInterface* media_transport,
+    const MediaTransportConfig& media_transport_config,
     OverheadObserver* overhead_observer,
     Transport* rtp_transport,
     RtcpRttStats* rtcp_rtt_stats,
@@ -1240,7 +1245,7 @@
     bool extmap_allow_mixed,
     int rtcp_report_interval_ms) {
   return absl::make_unique<ChannelSend>(
-      clock, task_queue_factory, module_process_thread, media_transport,
+      clock, task_queue_factory, module_process_thread, media_transport_config,
       overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
       frame_encryptor, crypto_options, extmap_allow_mixed,
       rtcp_report_interval_ms);