blob: e0f784ed26202b188bd7ecb39d66a12f898d458b [file] [log] [blame]
Niels Möller2e47f7c2018-10-16 10:41:42 +02001/*
2 * Copyright 2018 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_
12#define API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_
13
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080014#include <memory>
Niels Möller2e47f7c2018-10-16 10:41:42 +020015#include <utility>
16
17#include "api/media_transport_interface.h"
Bjorn Mellem273d0292018-11-01 16:42:44 -070018#include "rtc_base/asyncinvoker.h"
19#include "rtc_base/criticalsection.h"
20#include "rtc_base/thread.h"
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080021#include "rtc_base/thread_checker.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020022
23namespace webrtc {
24
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080025// Wrapper used to hand out unique_ptrs to loopback media transports without
Niels Möllere0446cb2018-11-30 09:35:52 +010026// ownership changes to the underlying transport.
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080027class WrapperMediaTransportFactory : public MediaTransportFactory {
28 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010029 explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080030
31 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
32 rtc::PacketTransportInternal* packet_transport,
33 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010034 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080035
36 private:
37 MediaTransportInterface* wrapped_;
38};
39
Niels Möller2e47f7c2018-10-16 10:41:42 +020040// Contains two MediaTransportsInterfaces that are connected to each other.
41// Currently supports audio only.
42class MediaTransportPair {
43 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010044 struct Stats {
45 int sent_audio_frames = 0;
46 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010047 int sent_video_frames = 0;
48 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010049 };
50
Bjorn Mellem273d0292018-11-01 16:42:44 -070051 explicit MediaTransportPair(rtc::Thread* thread)
52 : first_(thread, &second_), second_(thread, &first_) {}
Niels Möller2e47f7c2018-10-16 10:41:42 +020053
54 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070055 MediaTransportInterface* first() { return &first_; }
56 MediaTransportInterface* second() { return &second_; }
57
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080058 std::unique_ptr<MediaTransportFactory> first_factory() {
59 return absl::make_unique<WrapperMediaTransportFactory>(&first_);
60 }
61
62 std::unique_ptr<MediaTransportFactory> second_factory() {
63 return absl::make_unique<WrapperMediaTransportFactory>(&second_);
64 }
65
66 void SetState(MediaTransportState state) {
67 first_.SetState(state);
68 second_.SetState(state);
69 }
70
Bjorn Mellem273d0292018-11-01 16:42:44 -070071 void FlushAsyncInvokes() {
72 first_.FlushAsyncInvokes();
73 second_.FlushAsyncInvokes();
74 }
Niels Möller2e47f7c2018-10-16 10:41:42 +020075
Niels Möllerc68d2822018-11-20 14:52:05 +010076 Stats FirstStats() { return first_.GetStats(); }
77 Stats SecondStats() { return second_.GetStats(); }
78
Niels Möller2e47f7c2018-10-16 10:41:42 +020079 private:
80 class LoopbackMediaTransport : public MediaTransportInterface {
81 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010082 LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
Bjorn Mellem273d0292018-11-01 16:42:44 -070083
Niels Möllere0446cb2018-11-30 09:35:52 +010084 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020085
86 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010087 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020088
89 RTCError SendVideoFrame(
90 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010091 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020092
Niels Möller1c7f5f62018-12-10 11:06:02 +010093 void SetKeyFrameRequestCallback(
94 MediaTransportKeyFrameRequestCallback* callback) override;
95
Niels Möllere0446cb2018-11-30 09:35:52 +010096 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020097
Niels Möllere0446cb2018-11-30 09:35:52 +010098 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020099
Niels Möllere0446cb2018-11-30 09:35:52 +0100100 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200101
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700102 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100103 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700104
105 RTCError SendData(int channel_id,
106 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100107 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700108
Niels Möllere0446cb2018-11-30 09:35:52 +0100109 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700110
Niels Möllere0446cb2018-11-30 09:35:52 +0100111 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700112
Niels Möllere0446cb2018-11-30 09:35:52 +0100113 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800114
Niels Möllere0446cb2018-11-30 09:35:52 +0100115 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700116
Niels Möllere0446cb2018-11-30 09:35:52 +0100117 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100118
Niels Möller2e47f7c2018-10-16 10:41:42 +0200119 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100120 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200121
Niels Möllere0446cb2018-11-30 09:35:52 +0100122 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100123
Bjorn Mellem273d0292018-11-01 16:42:44 -0700124 void OnData(int channel_id,
125 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100126 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700127
Niels Möller1c7f5f62018-12-10 11:06:02 +0100128 void OnKeyFrameRequested(int channel_id);
129
Niels Möllere0446cb2018-11-30 09:35:52 +0100130 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700131
Niels Möllere0446cb2018-11-30 09:35:52 +0100132 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800133
Bjorn Mellem273d0292018-11-01 16:42:44 -0700134 rtc::Thread* const thread_;
135 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100136 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700137
Niels Möllerd5696fb2018-11-28 15:34:37 +0100138 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
139 nullptr;
140 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700141 nullptr;
142 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100143
144 MediaTransportKeyFrameRequestCallback* key_frame_callback_
145 RTC_GUARDED_BY(sink_lock_) = nullptr;
146
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800147 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
148 nullptr;
149
150 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
151 MediaTransportState::kPending;
152
Bjorn Mellem273d0292018-11-01 16:42:44 -0700153 LoopbackMediaTransport* const other_;
154
Niels Möllerc68d2822018-11-20 14:52:05 +0100155 Stats stats_ RTC_GUARDED_BY(stats_lock_);
156
Bjorn Mellem273d0292018-11-01 16:42:44 -0700157 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200158 };
159
Bjorn Mellem273d0292018-11-01 16:42:44 -0700160 LoopbackMediaTransport first_;
161 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200162};
163
164} // namespace webrtc
165
166#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_