blob: 2972b49e0e168b210723b73627d4aacf265eaba6 [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
Steve Anton40d55332019-01-07 10:21:47 -080019#include "absl/memory/memory.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020020#include "api/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:
Niels Möllere0446cb2018-11-30 09:35:52 +010045 explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080046 explicit WrapperMediaTransportFactory(MediaTransportFactory* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080047
48 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
49 rtc::PacketTransportInternal* packet_transport,
50 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010051 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080052
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080053 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
54 rtc::Thread* network_thread,
55 const MediaTransportSettings& settings) override;
56
57 std::string GetTransportName() const override;
58
59 int created_transport_count() const;
60
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080061 private:
62 MediaTransportInterface* wrapped_;
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080063 MediaTransportFactory* wrapped_factory_ = nullptr;
64 int created_transport_count_ = 0;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080065};
66
Niels Möller2e47f7c2018-10-16 10:41:42 +020067// Contains two MediaTransportsInterfaces that are connected to each other.
68// Currently supports audio only.
69class MediaTransportPair {
70 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010071 struct Stats {
72 int sent_audio_frames = 0;
73 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010074 int sent_video_frames = 0;
75 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010076 };
77
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080078 explicit MediaTransportPair(rtc::Thread* thread);
79 ~MediaTransportPair();
Niels Möller2e47f7c2018-10-16 10:41:42 +020080
81 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070082 MediaTransportInterface* first() { return &first_; }
83 MediaTransportInterface* second() { return &second_; }
84
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080085 std::unique_ptr<MediaTransportFactory> first_factory() {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080086 return absl::make_unique<WrapperMediaTransportFactory>(&first_factory_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080087 }
88
89 std::unique_ptr<MediaTransportFactory> second_factory() {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080090 return absl::make_unique<WrapperMediaTransportFactory>(&second_factory_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080091 }
92
93 void SetState(MediaTransportState state) {
94 first_.SetState(state);
95 second_.SetState(state);
96 }
97
Bjorn Mellem273d0292018-11-01 16:42:44 -070098 void FlushAsyncInvokes() {
99 first_.FlushAsyncInvokes();
100 second_.FlushAsyncInvokes();
101 }
Niels Möller2e47f7c2018-10-16 10:41:42 +0200102
Niels Möllerc68d2822018-11-20 14:52:05 +0100103 Stats FirstStats() { return first_.GetStats(); }
104 Stats SecondStats() { return second_.GetStats(); }
105
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800106 int first_factory_transport_count() const {
107 return first_factory_.created_transport_count();
108 }
109
110 int second_factory_transport_count() const {
111 return second_factory_.created_transport_count();
112 }
113
Niels Möller2e47f7c2018-10-16 10:41:42 +0200114 private:
115 class LoopbackMediaTransport : public MediaTransportInterface {
116 public:
Niels Möllere0446cb2018-11-30 09:35:52 +0100117 LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700118
Niels Möllere0446cb2018-11-30 09:35:52 +0100119 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200120
121 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +0100122 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200123
124 RTCError SendVideoFrame(
125 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +0100126 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200127
Niels Möller1c7f5f62018-12-10 11:06:02 +0100128 void SetKeyFrameRequestCallback(
129 MediaTransportKeyFrameRequestCallback* callback) override;
130
Niels Möllere0446cb2018-11-30 09:35:52 +0100131 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200132
Niels Möllere0446cb2018-11-30 09:35:52 +0100133 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200134
Niels Möllere0446cb2018-11-30 09:35:52 +0100135 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200136
Niels Möller46879152019-01-07 15:54:47 +0100137 void AddTargetTransferRateObserver(
138 TargetTransferRateObserver* observer) override;
139
140 void RemoveTargetTransferRateObserver(
141 TargetTransferRateObserver* observer) override;
142
143 void AddRttObserver(MediaTransportRttObserver* observer) override;
144 void RemoveRttObserver(MediaTransportRttObserver* observer) override;
145
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700146 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100147 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700148
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800149 RTCError OpenChannel(int channel_id) override;
150
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700151 RTCError SendData(int channel_id,
152 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100153 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700154
Niels Möllere0446cb2018-11-30 09:35:52 +0100155 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700156
Niels Möllere0446cb2018-11-30 09:35:52 +0100157 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700158
Niels Möllere0446cb2018-11-30 09:35:52 +0100159 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800160
Niels Möllere0446cb2018-11-30 09:35:52 +0100161 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700162
Niels Möllere0446cb2018-11-30 09:35:52 +0100163 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100164
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800165 void SetAllocatedBitrateLimits(
166 const MediaTransportAllocatedBitrateLimits& limits) override;
167
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800168 absl::optional<std::string> GetTransportParametersOffer() const override;
169
Niels Möller2e47f7c2018-10-16 10:41:42 +0200170 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100171 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200172
Niels Möllere0446cb2018-11-30 09:35:52 +0100173 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100174
Bjorn Mellem273d0292018-11-01 16:42:44 -0700175 void OnData(int channel_id,
176 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100177 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700178
Niels Möller1c7f5f62018-12-10 11:06:02 +0100179 void OnKeyFrameRequested(int channel_id);
180
Niels Möllere0446cb2018-11-30 09:35:52 +0100181 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700182
Niels Möllere0446cb2018-11-30 09:35:52 +0100183 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800184
Bjorn Mellem273d0292018-11-01 16:42:44 -0700185 rtc::Thread* const thread_;
186 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100187 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700188
Niels Möllerd5696fb2018-11-28 15:34:37 +0100189 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
190 nullptr;
191 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700192 nullptr;
193 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100194
195 MediaTransportKeyFrameRequestCallback* key_frame_callback_
196 RTC_GUARDED_BY(sink_lock_) = nullptr;
197
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800198 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
199 nullptr;
200
Niels Möller46879152019-01-07 15:54:47 +0100201 std::vector<TargetTransferRateObserver*> target_transfer_rate_observers_
202 RTC_GUARDED_BY(sink_lock_);
203 std::vector<MediaTransportRttObserver*> rtt_observers_
204 RTC_GUARDED_BY(sink_lock_);
205
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800206 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
207 MediaTransportState::kPending;
208
Bjorn Mellem273d0292018-11-01 16:42:44 -0700209 LoopbackMediaTransport* const other_;
210
Niels Möllerc68d2822018-11-20 14:52:05 +0100211 Stats stats_ RTC_GUARDED_BY(stats_lock_);
212
Bjorn Mellem273d0292018-11-01 16:42:44 -0700213 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200214 };
215
Bjorn Mellem273d0292018-11-01 16:42:44 -0700216 LoopbackMediaTransport first_;
217 LoopbackMediaTransport second_;
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800218 WrapperMediaTransportFactory first_factory_;
219 WrapperMediaTransportFactory second_factory_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200220};
221
222} // namespace webrtc
223
224#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_