blob: bcfdb63fd57091b741e7369f34206cf07b82f578 [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>
Niels Möller46879152019-01-07 15:54:47 +010016#include <vector>
Niels Möller2e47f7c2018-10-16 10:41:42 +020017
Steve Anton40d55332019-01-07 10:21:47 -080018#include "absl/memory/memory.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020019#include "api/media_transport_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "rtc_base/async_invoker.h"
21#include "rtc_base/critical_section.h"
Bjorn Mellem273d0292018-11-01 16:42:44 -070022#include "rtc_base/thread.h"
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080023#include "rtc_base/thread_checker.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020024
25namespace webrtc {
26
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080027// Wrapper used to hand out unique_ptrs to loopback media transports without
Niels Möllere0446cb2018-11-30 09:35:52 +010028// ownership changes to the underlying transport.
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080029class WrapperMediaTransportFactory : public MediaTransportFactory {
30 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010031 explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080032
33 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
34 rtc::PacketTransportInternal* packet_transport,
35 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010036 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080037
38 private:
39 MediaTransportInterface* wrapped_;
40};
41
Niels Möller2e47f7c2018-10-16 10:41:42 +020042// Contains two MediaTransportsInterfaces that are connected to each other.
43// Currently supports audio only.
44class MediaTransportPair {
45 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010046 struct Stats {
47 int sent_audio_frames = 0;
48 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010049 int sent_video_frames = 0;
50 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010051 };
52
Bjorn Mellem273d0292018-11-01 16:42:44 -070053 explicit MediaTransportPair(rtc::Thread* thread)
54 : first_(thread, &second_), second_(thread, &first_) {}
Niels Möller2e47f7c2018-10-16 10:41:42 +020055
56 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070057 MediaTransportInterface* first() { return &first_; }
58 MediaTransportInterface* second() { return &second_; }
59
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080060 std::unique_ptr<MediaTransportFactory> first_factory() {
61 return absl::make_unique<WrapperMediaTransportFactory>(&first_);
62 }
63
64 std::unique_ptr<MediaTransportFactory> second_factory() {
65 return absl::make_unique<WrapperMediaTransportFactory>(&second_);
66 }
67
68 void SetState(MediaTransportState state) {
69 first_.SetState(state);
70 second_.SetState(state);
71 }
72
Bjorn Mellem273d0292018-11-01 16:42:44 -070073 void FlushAsyncInvokes() {
74 first_.FlushAsyncInvokes();
75 second_.FlushAsyncInvokes();
76 }
Niels Möller2e47f7c2018-10-16 10:41:42 +020077
Niels Möllerc68d2822018-11-20 14:52:05 +010078 Stats FirstStats() { return first_.GetStats(); }
79 Stats SecondStats() { return second_.GetStats(); }
80
Niels Möller2e47f7c2018-10-16 10:41:42 +020081 private:
82 class LoopbackMediaTransport : public MediaTransportInterface {
83 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010084 LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
Bjorn Mellem273d0292018-11-01 16:42:44 -070085
Niels Möllere0446cb2018-11-30 09:35:52 +010086 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020087
88 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010089 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020090
91 RTCError SendVideoFrame(
92 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010093 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020094
Niels Möller1c7f5f62018-12-10 11:06:02 +010095 void SetKeyFrameRequestCallback(
96 MediaTransportKeyFrameRequestCallback* callback) override;
97
Niels Möllere0446cb2018-11-30 09:35:52 +010098 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020099
Niels Möllere0446cb2018-11-30 09:35:52 +0100100 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200101
Niels Möllere0446cb2018-11-30 09:35:52 +0100102 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200103
Niels Möller46879152019-01-07 15:54:47 +0100104 void AddTargetTransferRateObserver(
105 TargetTransferRateObserver* observer) override;
106
107 void RemoveTargetTransferRateObserver(
108 TargetTransferRateObserver* observer) override;
109
110 void AddRttObserver(MediaTransportRttObserver* observer) override;
111 void RemoveRttObserver(MediaTransportRttObserver* observer) override;
112
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700113 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100114 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700115
116 RTCError SendData(int channel_id,
117 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100118 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700119
Niels Möllere0446cb2018-11-30 09:35:52 +0100120 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700121
Niels Möllere0446cb2018-11-30 09:35:52 +0100122 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700123
Niels Möllere0446cb2018-11-30 09:35:52 +0100124 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800125
Niels Möllere0446cb2018-11-30 09:35:52 +0100126 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700127
Niels Möllere0446cb2018-11-30 09:35:52 +0100128 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100129
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800130 void SetAllocatedBitrateLimits(
131 const MediaTransportAllocatedBitrateLimits& limits) override;
132
Niels Möller2e47f7c2018-10-16 10:41:42 +0200133 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100134 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200135
Niels Möllere0446cb2018-11-30 09:35:52 +0100136 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100137
Bjorn Mellem273d0292018-11-01 16:42:44 -0700138 void OnData(int channel_id,
139 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100140 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700141
Niels Möller1c7f5f62018-12-10 11:06:02 +0100142 void OnKeyFrameRequested(int channel_id);
143
Niels Möllere0446cb2018-11-30 09:35:52 +0100144 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700145
Niels Möllere0446cb2018-11-30 09:35:52 +0100146 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800147
Bjorn Mellem273d0292018-11-01 16:42:44 -0700148 rtc::Thread* const thread_;
149 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100150 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700151
Niels Möllerd5696fb2018-11-28 15:34:37 +0100152 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
153 nullptr;
154 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700155 nullptr;
156 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100157
158 MediaTransportKeyFrameRequestCallback* key_frame_callback_
159 RTC_GUARDED_BY(sink_lock_) = nullptr;
160
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800161 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
162 nullptr;
163
Niels Möller46879152019-01-07 15:54:47 +0100164 std::vector<TargetTransferRateObserver*> target_transfer_rate_observers_
165 RTC_GUARDED_BY(sink_lock_);
166 std::vector<MediaTransportRttObserver*> rtt_observers_
167 RTC_GUARDED_BY(sink_lock_);
168
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800169 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
170 MediaTransportState::kPending;
171
Bjorn Mellem273d0292018-11-01 16:42:44 -0700172 LoopbackMediaTransport* const other_;
173
Niels Möllerc68d2822018-11-20 14:52:05 +0100174 Stats stats_ RTC_GUARDED_BY(stats_lock_);
175
Bjorn Mellem273d0292018-11-01 16:42:44 -0700176 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200177 };
178
Bjorn Mellem273d0292018-11-01 16:42:44 -0700179 LoopbackMediaTransport first_;
180 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200181};
182
183} // namespace webrtc
184
185#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_