blob: 1087d9a85767062e3e350d1856e9c09d37ff9032 [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>
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080015#include <string>
Niels Möller2e47f7c2018-10-16 10:41:42 +020016#include <utility>
Niels Möller46879152019-01-07 15:54:47 +010017#include <vector>
Niels Möller2e47f7c2018-10-16 10:41:42 +020018
Niels Möller65f17ca2019-09-12 13:59:36 +020019#include "api/transport/datagram_transport_interface.h"
20#include "api/transport/media/media_transport_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "rtc_base/async_invoker.h"
22#include "rtc_base/critical_section.h"
Bjorn Mellem273d0292018-11-01 16:42:44 -070023#include "rtc_base/thread.h"
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080024#include "rtc_base/thread_checker.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020025
26namespace webrtc {
27
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080028// Wrapper used to hand out unique_ptrs to loopback media
29// transport without ownership changes to the underlying
30// transport.
31// It works in two modes:
32// It can either wrap a factory, or it can wrap an existing interface.
33// In the former mode, it delegates the work to the wrapped factory.
34// In the latter mode, it always returns static instance of the transport
35// interface.
36//
37// Example use:
38// Factory wrap_static_interface = Wrapper(media_transport_interface);
39// Factory wrap_factory = Wrapper(wrap_static_interface);
40// The second factory may be created multiple times, and ownership may be passed
41// to the client. The first factory counts the number of invocations of
42// CreateMediaTransport();
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080043class WrapperMediaTransportFactory : public MediaTransportFactory {
44 public:
Bjorn A Mellemb689af42019-08-21 10:44:59 -070045 WrapperMediaTransportFactory(
46 MediaTransportInterface* wrapped_media_transport,
47 DatagramTransportInterface* wrapped_datagram_transport);
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080048 explicit WrapperMediaTransportFactory(MediaTransportFactory* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080049
50 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
51 rtc::PacketTransportInternal* packet_transport,
52 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010053 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080054
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080055 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
56 rtc::Thread* network_thread,
57 const MediaTransportSettings& settings) override;
58
Bjorn A Mellemb689af42019-08-21 10:44:59 -070059 RTCErrorOr<std::unique_ptr<DatagramTransportInterface>>
60 CreateDatagramTransport(rtc::Thread* network_thread,
61 const MediaTransportSettings& settings) override;
62
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080063 std::string GetTransportName() const override;
64
65 int created_transport_count() const;
66
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080067 private:
Bjorn A Mellemb689af42019-08-21 10:44:59 -070068 MediaTransportInterface* wrapped_media_transport_ = nullptr;
69 DatagramTransportInterface* wrapped_datagram_transport_ = nullptr;
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080070 MediaTransportFactory* wrapped_factory_ = nullptr;
71 int created_transport_count_ = 0;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080072};
73
Niels Möller2e47f7c2018-10-16 10:41:42 +020074// Contains two MediaTransportsInterfaces that are connected to each other.
75// Currently supports audio only.
76class MediaTransportPair {
77 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010078 struct Stats {
79 int sent_audio_frames = 0;
80 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010081 int sent_video_frames = 0;
82 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010083 };
84
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080085 explicit MediaTransportPair(rtc::Thread* thread);
86 ~MediaTransportPair();
Niels Möller2e47f7c2018-10-16 10:41:42 +020087
88 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070089 MediaTransportInterface* first() { return &first_; }
90 MediaTransportInterface* second() { return &second_; }
91
Bjorn A Mellemb689af42019-08-21 10:44:59 -070092 DatagramTransportInterface* first_datagram_transport() {
93 return &first_datagram_transport_;
94 }
95 DatagramTransportInterface* second_datagram_transport() {
96 return &second_datagram_transport_;
97 }
98
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080099 std::unique_ptr<MediaTransportFactory> first_factory() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200100 return std::make_unique<WrapperMediaTransportFactory>(&first_factory_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800101 }
102
103 std::unique_ptr<MediaTransportFactory> second_factory() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200104 return std::make_unique<WrapperMediaTransportFactory>(&second_factory_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800105 }
106
107 void SetState(MediaTransportState state) {
108 first_.SetState(state);
109 second_.SetState(state);
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700110 first_datagram_transport_.SetState(state);
111 second_datagram_transport_.SetState(state);
112 }
113
114 void SetFirstDatagramTransportParameters(const std::string& params) {
115 first_datagram_transport_.set_transport_parameters(params);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800116 }
117
Bjorn Mellem273d0292018-11-01 16:42:44 -0700118 void FlushAsyncInvokes() {
119 first_.FlushAsyncInvokes();
120 second_.FlushAsyncInvokes();
121 }
Niels Möller2e47f7c2018-10-16 10:41:42 +0200122
Niels Möllerc68d2822018-11-20 14:52:05 +0100123 Stats FirstStats() { return first_.GetStats(); }
124 Stats SecondStats() { return second_.GetStats(); }
125
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800126 int first_factory_transport_count() const {
127 return first_factory_.created_transport_count();
128 }
129
130 int second_factory_transport_count() const {
131 return second_factory_.created_transport_count();
132 }
133
Niels Möller2e47f7c2018-10-16 10:41:42 +0200134 private:
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700135 class LoopbackDataChannelTransport : public DataChannelTransportInterface {
136 public:
137 explicit LoopbackDataChannelTransport(rtc::Thread* thread);
138 ~LoopbackDataChannelTransport() override;
139
140 void Connect(LoopbackDataChannelTransport* other);
141
142 RTCError OpenChannel(int channel_id) override;
143
144 RTCError SendData(int channel_id,
145 const SendDataParams& params,
146 const rtc::CopyOnWriteBuffer& buffer) override;
147
148 RTCError CloseChannel(int channel_id) override;
149
150 bool IsReadyToSend() const override;
151
152 void SetDataSink(DataChannelSink* sink) override;
153
154 void OnReadyToSend(bool ready_to_send);
155
156 void FlushAsyncInvokes();
157
158 private:
159 void OnData(int channel_id,
160 DataMessageType type,
161 const rtc::CopyOnWriteBuffer& buffer);
162
163 void OnRemoteCloseChannel(int channel_id);
164
165 rtc::Thread* const thread_;
166 rtc::CriticalSection sink_lock_;
167 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
168
169 bool ready_to_send_ RTC_GUARDED_BY(sink_lock_) = false;
170
171 LoopbackDataChannelTransport* other_;
172
173 rtc::AsyncInvoker invoker_;
174 };
175
Niels Möller2e47f7c2018-10-16 10:41:42 +0200176 class LoopbackMediaTransport : public MediaTransportInterface {
177 public:
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700178 explicit LoopbackMediaTransport(rtc::Thread* thread);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700179
Niels Möllere0446cb2018-11-30 09:35:52 +0100180 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200181
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700182 // Connects this loopback transport to another loopback transport.
183 void Connect(LoopbackMediaTransport* other);
184
185 void Connect(rtc::PacketTransportInternal* transport) override;
186
Niels Möller2e47f7c2018-10-16 10:41:42 +0200187 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +0100188 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200189
190 RTCError SendVideoFrame(
191 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +0100192 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200193
Niels Möller1c7f5f62018-12-10 11:06:02 +0100194 void SetKeyFrameRequestCallback(
195 MediaTransportKeyFrameRequestCallback* callback) override;
196
Niels Möllere0446cb2018-11-30 09:35:52 +0100197 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200198
Niels Möllere0446cb2018-11-30 09:35:52 +0100199 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200200
Niels Möllere0446cb2018-11-30 09:35:52 +0100201 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200202
Niels Möller46879152019-01-07 15:54:47 +0100203 void AddTargetTransferRateObserver(
204 TargetTransferRateObserver* observer) override;
205
206 void RemoveTargetTransferRateObserver(
207 TargetTransferRateObserver* observer) override;
208
209 void AddRttObserver(MediaTransportRttObserver* observer) override;
210 void RemoveRttObserver(MediaTransportRttObserver* observer) override;
211
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700212 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100213 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700214
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700215 void SetState(MediaTransportState state);
216
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800217 RTCError OpenChannel(int channel_id) override;
218
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700219 RTCError SendData(int channel_id,
220 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100221 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700222
Niels Möllere0446cb2018-11-30 09:35:52 +0100223 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700224
Niels Möllere0446cb2018-11-30 09:35:52 +0100225 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700226
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700227 bool IsReadyToSend() const override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800228
Niels Möllere0446cb2018-11-30 09:35:52 +0100229 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700230
Niels Möllere0446cb2018-11-30 09:35:52 +0100231 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100232
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800233 void SetAllocatedBitrateLimits(
234 const MediaTransportAllocatedBitrateLimits& limits) override;
235
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800236 absl::optional<std::string> GetTransportParametersOffer() const override;
237
Niels Möller2e47f7c2018-10-16 10:41:42 +0200238 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100239 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200240
Niels Möllere0446cb2018-11-30 09:35:52 +0100241 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100242
Niels Möller1c7f5f62018-12-10 11:06:02 +0100243 void OnKeyFrameRequested(int channel_id);
244
Niels Möllere0446cb2018-11-30 09:35:52 +0100245 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800246
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700247 // Implementation of the data channel transport.
248 LoopbackDataChannelTransport dc_transport_;
249
Bjorn Mellem273d0292018-11-01 16:42:44 -0700250 rtc::Thread* const thread_;
251 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100252 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700253
Niels Möllerd5696fb2018-11-28 15:34:37 +0100254 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
255 nullptr;
256 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700257 nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100258
259 MediaTransportKeyFrameRequestCallback* key_frame_callback_
260 RTC_GUARDED_BY(sink_lock_) = nullptr;
261
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800262 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
263 nullptr;
264
Niels Möller46879152019-01-07 15:54:47 +0100265 std::vector<TargetTransferRateObserver*> target_transfer_rate_observers_
266 RTC_GUARDED_BY(sink_lock_);
267 std::vector<MediaTransportRttObserver*> rtt_observers_
268 RTC_GUARDED_BY(sink_lock_);
269
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800270 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
271 MediaTransportState::kPending;
272
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700273 LoopbackMediaTransport* other_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700274
Niels Möllerc68d2822018-11-20 14:52:05 +0100275 Stats stats_ RTC_GUARDED_BY(stats_lock_);
276
Bjorn Mellem273d0292018-11-01 16:42:44 -0700277 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200278 };
279
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700280 class LoopbackDatagramTransport : public DatagramTransportInterface {
281 public:
282 explicit LoopbackDatagramTransport(rtc::Thread* thread);
283
284 void Connect(LoopbackDatagramTransport* other);
285
286 // Datagram transport overrides.
287 // TODO(mellem): Implement these when tests actually need to use them.
288 void Connect(rtc::PacketTransportInternal* packet_transport) override;
289 CongestionControlInterface* congestion_control() override;
290 void SetTransportStateCallback(
291 MediaTransportStateCallback* callback) override;
292 RTCError SendDatagram(rtc::ArrayView<const uint8_t> data,
293 DatagramId datagram_id) override;
294 size_t GetLargestDatagramSize() const override;
295 void SetDatagramSink(DatagramSinkInterface* sink) override;
296 std::string GetTransportParameters() const override;
297
298 // Data channel overrides.
299 RTCError OpenChannel(int channel_id) override;
300 RTCError SendData(int channel_id,
301 const SendDataParams& params,
302 const rtc::CopyOnWriteBuffer& buffer) override;
303 RTCError CloseChannel(int channel_id) override;
304 void SetDataSink(DataChannelSink* sink) override;
305 bool IsReadyToSend() const override;
306
307 // Loopback-specific functionality.
308 void SetState(MediaTransportState state);
309 void FlushAsyncInvokes();
310
311 void set_transport_parameters(const std::string& value) {
312 transport_parameters_ = value;
313 }
314
315 private:
316 LoopbackDataChannelTransport dc_transport_;
317
318 std::string transport_parameters_;
319 };
320
Bjorn Mellem273d0292018-11-01 16:42:44 -0700321 LoopbackMediaTransport first_;
322 LoopbackMediaTransport second_;
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700323 LoopbackDatagramTransport first_datagram_transport_;
324 LoopbackDatagramTransport second_datagram_transport_;
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800325 WrapperMediaTransportFactory first_factory_;
326 WrapperMediaTransportFactory second_factory_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200327};
328
329} // namespace webrtc
330
331#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_