Remove Transport implementation from ChannelSend

Avoids taking a lock for each outgoing packet.

Bug: none
Change-Id: I54defbf07097ea8032b556b6900ca58c7486c3d9
Reviewed-on: https://webrtc-review.googlesource.com/c/112123
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Fredrik Solenberg <solenberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26038}
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index 7c7db79..fa21141 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -78,7 +78,6 @@
 
 class ChannelSend
     : public ChannelSendInterface,
-      public Transport,
       public OverheadObserver,
       public AudioPacketizationCallback,  // receive encoded packets from the
                                           // ACM
@@ -186,12 +185,6 @@
                    size_t payloadSize,
                    const RTPFragmentationHeader* fragmentation) override;
 
-  // From Transport (called by the RTP/RTCP module)
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& packet_options) override;
-  bool SendRtcp(const uint8_t* data, size_t len) override;
-
   // From OverheadObserver in the RTP/RTCP module
   void OnOverheadChanged(size_t overhead_bytes_per_packet) override;
 
@@ -238,7 +231,6 @@
   // audio thread to another, but access is still sequential.
   rtc::RaceChecker audio_thread_race_checker_;
 
-  rtc::CriticalSection _callbackCritSect;
   rtc::CriticalSection volume_settings_critsect_;
 
   bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
@@ -254,7 +246,6 @@
 
   // uses
   ProcessThread* const _moduleProcessThreadPtr;
-  Transport* const _transportPtr;  // WebRtc socket or external transport
   RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
   bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
   bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
@@ -641,45 +632,6 @@
   return 0;
 }
 
-bool ChannelSend::SendRtp(const uint8_t* data,
-                          size_t len,
-                          const PacketOptions& options) {
-  // We should not be sending RTP packets if media transport is available.
-  RTC_CHECK(!media_transport());
-
-  rtc::CritScope cs(&_callbackCritSect);
-
-  if (_transportPtr == NULL) {
-    RTC_DLOG(LS_ERROR)
-        << "ChannelSend::SendPacket() failed to send RTP packet due to"
-        << " invalid transport object";
-    return false;
-  }
-
-  if (!_transportPtr->SendRtp(data, len, options)) {
-    RTC_DLOG(LS_ERROR) << "ChannelSend::SendPacket() RTP transmission failed";
-    return false;
-  }
-  return true;
-}
-
-bool ChannelSend::SendRtcp(const uint8_t* data, size_t len) {
-  rtc::CritScope cs(&_callbackCritSect);
-  if (_transportPtr == NULL) {
-    RTC_DLOG(LS_ERROR)
-        << "ChannelSend::SendRtcp() failed to send RTCP packet due to"
-        << " invalid transport object";
-    return false;
-  }
-
-  int n = _transportPtr->SendRtcp(data, len);
-  if (n < 0) {
-    RTC_DLOG(LS_ERROR) << "ChannelSend::SendRtcp() transmission failed";
-    return false;
-  }
-  return true;
-}
-
 ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
                          ProcessThread* module_process_thread,
                          MediaTransportInterface* media_transport,
@@ -695,7 +647,6 @@
                       // random offset
       send_sequence_number_(0),
       _moduleProcessThreadPtr(module_process_thread),
-      _transportPtr(rtp_transport),
       input_mute_(false),
       previous_frame_muted_(false),
       _includeAudioLevelIndication(false),
@@ -732,7 +683,7 @@
   }
 
   configuration.audio = true;
-  configuration.outgoing_transport = this;
+  configuration.outgoing_transport = rtp_transport;
 
   configuration.paced_sender = rtp_packet_sender_proxy_.get();
   configuration.transport_sequence_number_allocator =
diff --git a/call/call_unittest.cc b/call/call_unittest.cc
index 770f255..1739036 100644
--- a/call/call_unittest.cc
+++ b/call/call_unittest.cc
@@ -63,7 +63,8 @@
 
 TEST(CallTest, CreateDestroy_AudioSendStream) {
   CallHelper call;
-  AudioSendStream::Config config(/*send_transport=*/nullptr,
+  MockTransport send_transport;
+  AudioSendStream::Config config(&send_transport,
                                  /*media_transport=*/nullptr);
   config.rtp.ssrc = 42;
   AudioSendStream* stream = call->CreateAudioSendStream(config);
@@ -86,7 +87,8 @@
 
 TEST(CallTest, CreateDestroy_AudioSendStreams) {
   CallHelper call;
-  AudioSendStream::Config config(/*send_transport=*/nullptr,
+  MockTransport send_transport;
+  AudioSendStream::Config config(&send_transport,
                                  /*media_transport=*/nullptr);
   std::list<AudioSendStream*> streams;
   for (int i = 0; i < 2; ++i) {
@@ -145,7 +147,8 @@
   AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
   EXPECT_NE(recv_stream, nullptr);
 
-  AudioSendStream::Config send_config(/*send_transport=*/nullptr,
+  MockTransport send_transport;
+  AudioSendStream::Config send_config(&send_transport,
                                       /*media_transport=*/nullptr);
   send_config.rtp.ssrc = 777;
   AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
@@ -164,7 +167,8 @@
 
 TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
   CallHelper call;
-  AudioSendStream::Config send_config(/*send_transport=*/nullptr,
+  MockTransport send_transport;
+  AudioSendStream::Config send_config(&send_transport,
                                       /*media_transport=*/nullptr);
   send_config.rtp.ssrc = 777;
   AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
@@ -268,7 +272,8 @@
   CallHelper call;
 
   auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
-    AudioSendStream::Config config(/*send_transport=*/nullptr,
+    MockTransport send_transport;
+    AudioSendStream::Config config(&send_transport,
                                    /*media_transport=*/nullptr);
     config.rtp.ssrc = ssrc;
     AudioSendStream* stream = call->CreateAudioSendStream(config);
@@ -296,7 +301,10 @@
   webrtc::FakeMediaTransport fake_media_transport(settings);
 
   EXPECT_EQ(0, fake_media_transport.target_rate_observers_size());
-  AudioSendStream::Config config(/*send_transport=*/nullptr,
+  // TODO(solenberg): This test shouldn't require a Transport, but currently
+  //                  RTCPSender requires one.
+  MockTransport send_transport;
+  AudioSendStream::Config config(&send_transport,
                                  /*media_transport=*/&fake_media_transport);
 
   call->MediaTransportChange(&fake_media_transport);