Move implementation of LoopbackMediaTransport to .cc file

Needed for coming cls to be able to use rtc_base/timeutils.h, which
shouldn't be included by api/ headers.

Bug: webrtc:9719
Change-Id: Ia36c0a9218ad505e1eb4f2d9c26d44d5673c2632
Reviewed-on: https://webrtc-review.googlesource.com/c/112580
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25855}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index f3038db..5f13009 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -648,6 +648,7 @@
     testonly = true
 
     sources = [
+      "test/loopback_media_transport.cc",
       "test/loopback_media_transport.h",
     ]
 
@@ -655,6 +656,7 @@
       ":libjingle_peerconnection_api",
       "../rtc_base:checks",
       "../rtc_base:rtc_base",
+      "//third_party/abseil-cpp/absl/memory",
     ]
   }
 
diff --git a/api/media_transport_interface.cc b/api/media_transport_interface.cc
index 8999e08..d4c925e 100644
--- a/api/media_transport_interface.cc
+++ b/api/media_transport_interface.cc
@@ -124,6 +124,7 @@
 }
 
 SendDataParams::SendDataParams() = default;
+SendDataParams::SendDataParams(const SendDataParams&) = default;
 
 RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
 MediaTransportFactory::CreateMediaTransport(
diff --git a/api/media_transport_interface.h b/api/media_transport_interface.h
index 9dee4f9..feebd88 100644
--- a/api/media_transport_interface.h
+++ b/api/media_transport_interface.h
@@ -268,6 +268,7 @@
 // unreliable delivery.
 struct SendDataParams {
   SendDataParams();
+  SendDataParams(const SendDataParams&);
 
   DataMessageType type = DataMessageType::kText;
 
diff --git a/api/test/loopback_media_transport.cc b/api/test/loopback_media_transport.cc
new file mode 100644
index 0000000..6094813
--- /dev/null
+++ b/api/test/loopback_media_transport.cc
@@ -0,0 +1,263 @@
+/*
+ *  Copyright 2018 The WebRTC Project Authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/test/loopback_media_transport.h"
+
+#include "absl/memory/memory.h"
+
+namespace webrtc {
+
+namespace {
+
+// Wrapper used to hand out unique_ptrs to loopback media transports without
+// ownership changes.
+class WrapperMediaTransport : public MediaTransportInterface {
+ public:
+  explicit WrapperMediaTransport(MediaTransportInterface* wrapped)
+      : wrapped_(wrapped) {}
+
+  RTCError SendAudioFrame(uint64_t channel_id,
+                          MediaTransportEncodedAudioFrame frame) override {
+    return wrapped_->SendAudioFrame(channel_id, std::move(frame));
+  }
+
+  RTCError SendVideoFrame(
+      uint64_t channel_id,
+      const MediaTransportEncodedVideoFrame& frame) override {
+    return wrapped_->SendVideoFrame(channel_id, frame);
+  }
+
+  RTCError RequestKeyFrame(uint64_t channel_id) override {
+    return wrapped_->RequestKeyFrame(channel_id);
+  }
+
+  void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override {
+    wrapped_->SetReceiveAudioSink(sink);
+  }
+
+  void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override {
+    wrapped_->SetReceiveVideoSink(sink);
+  }
+
+  void SetMediaTransportStateCallback(
+      MediaTransportStateCallback* callback) override {
+    wrapped_->SetMediaTransportStateCallback(callback);
+  }
+
+  RTCError SendData(int channel_id,
+                    const SendDataParams& params,
+                    const rtc::CopyOnWriteBuffer& buffer) override {
+    return wrapped_->SendData(channel_id, params, buffer);
+  }
+
+  RTCError CloseChannel(int channel_id) override {
+    return wrapped_->CloseChannel(channel_id);
+  }
+
+  void SetDataSink(DataChannelSink* sink) override {
+    wrapped_->SetDataSink(sink);
+  }
+
+ private:
+  MediaTransportInterface* wrapped_;
+};
+
+}  // namespace
+
+WrapperMediaTransportFactory::WrapperMediaTransportFactory(
+    MediaTransportInterface* wrapped)
+    : wrapped_(wrapped) {}
+
+RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
+WrapperMediaTransportFactory::CreateMediaTransport(
+    rtc::PacketTransportInternal* packet_transport,
+    rtc::Thread* network_thread,
+    const MediaTransportSettings& settings) {
+  return {absl::make_unique<WrapperMediaTransport>(wrapped_)};
+}
+
+MediaTransportPair::LoopbackMediaTransport::LoopbackMediaTransport(
+    rtc::Thread* thread,
+    LoopbackMediaTransport* other)
+    : thread_(thread), other_(other) {}
+
+MediaTransportPair::LoopbackMediaTransport::~LoopbackMediaTransport() {
+  rtc::CritScope lock(&sink_lock_);
+  RTC_CHECK(audio_sink_ == nullptr);
+  RTC_CHECK(video_sink_ == nullptr);
+  RTC_CHECK(data_sink_ == nullptr);
+}
+
+RTCError MediaTransportPair::LoopbackMediaTransport::SendAudioFrame(
+    uint64_t channel_id,
+    MediaTransportEncodedAudioFrame frame) {
+  {
+    rtc::CritScope lock(&stats_lock_);
+    ++stats_.sent_audio_frames;
+  }
+  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id, frame] {
+    other_->OnData(channel_id, std::move(frame));
+  });
+  return RTCError::OK();
+}
+
+RTCError MediaTransportPair::LoopbackMediaTransport::SendVideoFrame(
+    uint64_t channel_id,
+    const MediaTransportEncodedVideoFrame& frame) {
+  {
+    rtc::CritScope lock(&stats_lock_);
+    ++stats_.sent_video_frames;
+  }
+  // Ensure that we own the referenced data.
+  MediaTransportEncodedVideoFrame frame_copy = frame;
+  frame_copy.Retain();
+  invoker_.AsyncInvoke<void>(
+      RTC_FROM_HERE, thread_, [this, channel_id, frame_copy] {
+        other_->OnData(channel_id, std::move(frame_copy));
+      });
+  return RTCError::OK();
+}
+
+RTCError MediaTransportPair::LoopbackMediaTransport::RequestKeyFrame(
+    uint64_t channel_id) {
+  return RTCError::OK();
+}
+
+void MediaTransportPair::LoopbackMediaTransport::SetReceiveAudioSink(
+    MediaTransportAudioSinkInterface* sink) {
+  rtc::CritScope lock(&sink_lock_);
+  if (sink) {
+    RTC_CHECK(audio_sink_ == nullptr);
+  }
+  audio_sink_ = sink;
+}
+
+void MediaTransportPair::LoopbackMediaTransport::SetReceiveVideoSink(
+    MediaTransportVideoSinkInterface* sink) {
+  rtc::CritScope lock(&sink_lock_);
+  if (sink) {
+    RTC_CHECK(video_sink_ == nullptr);
+  }
+  video_sink_ = sink;
+}
+
+void MediaTransportPair::LoopbackMediaTransport::SetMediaTransportStateCallback(
+    MediaTransportStateCallback* callback) {
+  rtc::CritScope lock(&sink_lock_);
+  state_callback_ = callback;
+  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
+    RTC_DCHECK_RUN_ON(thread_);
+    OnStateChanged();
+  });
+}
+
+RTCError MediaTransportPair::LoopbackMediaTransport::SendData(
+    int channel_id,
+    const SendDataParams& params,
+    const rtc::CopyOnWriteBuffer& buffer) {
+  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_,
+                             [this, channel_id, params, buffer] {
+                               other_->OnData(channel_id, params.type, buffer);
+                             });
+  return RTCError::OK();
+}
+
+RTCError MediaTransportPair::LoopbackMediaTransport::CloseChannel(
+    int channel_id) {
+  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
+    other_->OnRemoteCloseChannel(channel_id);
+    rtc::CritScope lock(&sink_lock_);
+    if (data_sink_) {
+      data_sink_->OnChannelClosed(channel_id);
+    }
+  });
+  return RTCError::OK();
+}
+
+void MediaTransportPair::LoopbackMediaTransport::SetDataSink(
+    DataChannelSink* sink) {
+  rtc::CritScope lock(&sink_lock_);
+  data_sink_ = sink;
+}
+void MediaTransportPair::LoopbackMediaTransport::SetState(
+    MediaTransportState state) {
+  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, state] {
+    RTC_DCHECK_RUN_ON(thread_);
+    state_ = state;
+    OnStateChanged();
+  });
+}
+
+void MediaTransportPair::LoopbackMediaTransport::FlushAsyncInvokes() {
+  invoker_.Flush(thread_);
+}
+
+MediaTransportPair::Stats
+MediaTransportPair::LoopbackMediaTransport::GetStats() {
+  rtc::CritScope lock(&stats_lock_);
+  return stats_;
+}
+
+void MediaTransportPair::LoopbackMediaTransport::OnData(
+    uint64_t channel_id,
+    MediaTransportEncodedAudioFrame frame) {
+  {
+    rtc::CritScope lock(&sink_lock_);
+    if (audio_sink_) {
+      audio_sink_->OnData(channel_id, frame);
+    }
+  }
+  {
+    rtc::CritScope lock(&stats_lock_);
+    ++stats_.received_audio_frames;
+  }
+}
+
+void MediaTransportPair::LoopbackMediaTransport::OnData(
+    uint64_t channel_id,
+    MediaTransportEncodedVideoFrame frame) {
+  {
+    rtc::CritScope lock(&sink_lock_);
+    if (video_sink_) {
+      video_sink_->OnData(channel_id, frame);
+    }
+  }
+  {
+    rtc::CritScope lock(&stats_lock_);
+    ++stats_.received_video_frames;
+  }
+}
+
+void MediaTransportPair::LoopbackMediaTransport::OnData(
+    int channel_id,
+    DataMessageType type,
+    const rtc::CopyOnWriteBuffer& buffer) {
+  rtc::CritScope lock(&sink_lock_);
+  if (data_sink_) {
+    data_sink_->OnDataReceived(channel_id, type, buffer);
+  }
+}
+
+void MediaTransportPair::LoopbackMediaTransport::OnRemoteCloseChannel(
+    int channel_id) {
+  rtc::CritScope lock(&sink_lock_);
+  if (data_sink_) {
+    data_sink_->OnChannelClosing(channel_id);
+    data_sink_->OnChannelClosed(channel_id);
+  }
+}
+
+void MediaTransportPair::LoopbackMediaTransport::OnStateChanged() {
+  rtc::CritScope lock(&sink_lock_);
+  if (state_callback_) {
+    state_callback_->OnStateChanged(state_);
+  }
+}
+}  // namespace webrtc
diff --git a/api/test/loopback_media_transport.h b/api/test/loopback_media_transport.h
index 2620789..d520c20 100644
--- a/api/test/loopback_media_transport.h
+++ b/api/test/loopback_media_transport.h
@@ -23,69 +23,15 @@
 namespace webrtc {
 
 // Wrapper used to hand out unique_ptrs to loopback media transports without
-// ownership changes.
-class WrapperMediaTransport : public MediaTransportInterface {
- public:
-  explicit WrapperMediaTransport(MediaTransportInterface* wrapped)
-      : wrapped_(wrapped) {}
-
-  RTCError SendAudioFrame(uint64_t channel_id,
-                          MediaTransportEncodedAudioFrame frame) override {
-    return wrapped_->SendAudioFrame(channel_id, std::move(frame));
-  }
-
-  RTCError SendVideoFrame(
-      uint64_t channel_id,
-      const MediaTransportEncodedVideoFrame& frame) override {
-    return wrapped_->SendVideoFrame(channel_id, frame);
-  }
-
-  RTCError RequestKeyFrame(uint64_t channel_id) override {
-    return wrapped_->RequestKeyFrame(channel_id);
-  }
-
-  void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override {
-    wrapped_->SetReceiveAudioSink(sink);
-  }
-
-  void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override {
-    wrapped_->SetReceiveVideoSink(sink);
-  }
-
-  void SetMediaTransportStateCallback(
-      MediaTransportStateCallback* callback) override {
-    wrapped_->SetMediaTransportStateCallback(callback);
-  }
-
-  RTCError SendData(int channel_id,
-                    const SendDataParams& params,
-                    const rtc::CopyOnWriteBuffer& buffer) override {
-    return wrapped_->SendData(channel_id, params, buffer);
-  }
-
-  RTCError CloseChannel(int channel_id) override {
-    return wrapped_->CloseChannel(channel_id);
-  }
-
-  void SetDataSink(DataChannelSink* sink) override {
-    wrapped_->SetDataSink(sink);
-  }
-
- private:
-  MediaTransportInterface* wrapped_;
-};
-
+// ownership changes to the underlying transport.
 class WrapperMediaTransportFactory : public MediaTransportFactory {
  public:
-  explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped)
-      : wrapped_(wrapped) {}
+  explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
 
   RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
       rtc::PacketTransportInternal* packet_transport,
       rtc::Thread* network_thread,
-      const MediaTransportSettings& settings) override {
-    return {absl::make_unique<WrapperMediaTransport>(wrapped_)};
-  }
+      const MediaTransportSettings& settings) override;
 
  private:
   MediaTransportInterface* wrapped_;
@@ -133,167 +79,52 @@
  private:
   class LoopbackMediaTransport : public MediaTransportInterface {
    public:
-    LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other)
-        : thread_(thread), other_(other) {}
+    LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
 
-    ~LoopbackMediaTransport() {
-      rtc::CritScope lock(&sink_lock_);
-      RTC_CHECK(audio_sink_ == nullptr);
-      RTC_CHECK(video_sink_ == nullptr);
-      RTC_CHECK(data_sink_ == nullptr);
-    }
+    ~LoopbackMediaTransport() override;
 
     RTCError SendAudioFrame(uint64_t channel_id,
-                            MediaTransportEncodedAudioFrame frame) override {
-      {
-        rtc::CritScope lock(&stats_lock_);
-        ++stats_.sent_audio_frames;
-      }
-      invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_,
-                                 [this, channel_id, frame] {
-                                   other_->OnData(channel_id, std::move(frame));
-                                 });
-      return RTCError::OK();
-    };
+                            MediaTransportEncodedAudioFrame frame) override;
 
     RTCError SendVideoFrame(
         uint64_t channel_id,
-        const MediaTransportEncodedVideoFrame& frame) override {
-      {
-        rtc::CritScope lock(&stats_lock_);
-        ++stats_.sent_video_frames;
-      }
-      // Ensure that we own the referenced data.
-      MediaTransportEncodedVideoFrame frame_copy = frame;
-      frame_copy.Retain();
-      invoker_.AsyncInvoke<void>(
-          RTC_FROM_HERE, thread_, [this, channel_id, frame_copy] {
-            other_->OnData(channel_id, std::move(frame_copy));
-          });
-      return RTCError::OK();
-    }
+        const MediaTransportEncodedVideoFrame& frame) override;
 
-    RTCError RequestKeyFrame(uint64_t channel_id) override {
-      return RTCError::OK();
-    }
+    RTCError RequestKeyFrame(uint64_t channel_id) override;
 
-    void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override {
-      rtc::CritScope lock(&sink_lock_);
-      if (sink) {
-        RTC_CHECK(audio_sink_ == nullptr);
-      }
-      audio_sink_ = sink;
-    }
+    void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
 
-    void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override {
-      rtc::CritScope lock(&sink_lock_);
-      if (sink) {
-        RTC_CHECK(video_sink_ == nullptr);
-      }
-      video_sink_ = sink;
-    }
+    void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
 
     void SetMediaTransportStateCallback(
-        MediaTransportStateCallback* callback) override {
-      rtc::CritScope lock(&sink_lock_);
-      state_callback_ = callback;
-      invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
-        RTC_DCHECK_RUN_ON(thread_);
-        OnStateChanged();
-      });
-    }
+        MediaTransportStateCallback* callback) override;
 
     RTCError SendData(int channel_id,
                       const SendDataParams& params,
-                      const rtc::CopyOnWriteBuffer& buffer) override {
-      invoker_.AsyncInvoke<void>(
-          RTC_FROM_HERE, thread_, [this, channel_id, params, buffer] {
-            other_->OnData(channel_id, params.type, buffer);
-          });
-      return RTCError::OK();
-    }
+                      const rtc::CopyOnWriteBuffer& buffer) override;
 
-    RTCError CloseChannel(int channel_id) override {
-      invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
-        other_->OnRemoteCloseChannel(channel_id);
-        rtc::CritScope lock(&sink_lock_);
-        if (data_sink_) {
-          data_sink_->OnChannelClosed(channel_id);
-        }
-      });
-      return RTCError::OK();
-    }
+    RTCError CloseChannel(int channel_id) override;
 
-    void SetDataSink(DataChannelSink* sink) override {
-      rtc::CritScope lock(&sink_lock_);
-      data_sink_ = sink;
-    }
+    void SetDataSink(DataChannelSink* sink) override;
 
-    void SetState(MediaTransportState state) {
-      invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, state] {
-        RTC_DCHECK_RUN_ON(thread_);
-        state_ = state;
-        OnStateChanged();
-      });
-    }
+    void SetState(MediaTransportState state);
 
-    void FlushAsyncInvokes() { invoker_.Flush(thread_); }
+    void FlushAsyncInvokes();
 
-    Stats GetStats() {
-      rtc::CritScope lock(&stats_lock_);
-      return stats_;
-    }
+    Stats GetStats();
 
    private:
-    void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame) {
-      {
-        rtc::CritScope lock(&sink_lock_);
-        if (audio_sink_) {
-          audio_sink_->OnData(channel_id, frame);
-        }
-      }
-      {
-        rtc::CritScope lock(&stats_lock_);
-        ++stats_.received_audio_frames;
-      }
-    }
+    void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
 
-    void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame) {
-      {
-        rtc::CritScope lock(&sink_lock_);
-        if (video_sink_) {
-          video_sink_->OnData(channel_id, frame);
-        }
-      }
-      {
-        rtc::CritScope lock(&stats_lock_);
-        ++stats_.received_video_frames;
-      }
-    }
+    void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
 
     void OnData(int channel_id,
                 DataMessageType type,
-                const rtc::CopyOnWriteBuffer& buffer) {
-      rtc::CritScope lock(&sink_lock_);
-      if (data_sink_) {
-        data_sink_->OnDataReceived(channel_id, type, buffer);
-      }
-    }
+                const rtc::CopyOnWriteBuffer& buffer);
 
-    void OnRemoteCloseChannel(int channel_id) {
-      rtc::CritScope lock(&sink_lock_);
-      if (data_sink_) {
-        data_sink_->OnChannelClosing(channel_id);
-        data_sink_->OnChannelClosed(channel_id);
-      }
-    }
+    void OnRemoteCloseChannel(int channel_id);
 
-    void OnStateChanged() RTC_RUN_ON(thread_) {
-      rtc::CritScope lock(&sink_lock_);
-      if (state_callback_) {
-        state_callback_->OnStateChanged(state_);
-      }
-    }
+    void OnStateChanged() RTC_RUN_ON(thread_);
 
     rtc::Thread* const thread_;
     rtc::CriticalSection sink_lock_;