blob: 280dc9aaa99485fa83be5c5d8ca2cc4377a30649 [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
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800116 RTCError OpenChannel(int channel_id) override;
117
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700118 RTCError SendData(int channel_id,
119 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100120 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700121
Niels Möllere0446cb2018-11-30 09:35:52 +0100122 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700123
Niels Möllere0446cb2018-11-30 09:35:52 +0100124 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700125
Niels Möllere0446cb2018-11-30 09:35:52 +0100126 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800127
Niels Möllere0446cb2018-11-30 09:35:52 +0100128 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700129
Niels Möllere0446cb2018-11-30 09:35:52 +0100130 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100131
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800132 void SetAllocatedBitrateLimits(
133 const MediaTransportAllocatedBitrateLimits& limits) override;
134
Niels Möller2e47f7c2018-10-16 10:41:42 +0200135 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100136 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200137
Niels Möllere0446cb2018-11-30 09:35:52 +0100138 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100139
Bjorn Mellem273d0292018-11-01 16:42:44 -0700140 void OnData(int channel_id,
141 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100142 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700143
Niels Möller1c7f5f62018-12-10 11:06:02 +0100144 void OnKeyFrameRequested(int channel_id);
145
Niels Möllere0446cb2018-11-30 09:35:52 +0100146 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700147
Niels Möllere0446cb2018-11-30 09:35:52 +0100148 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800149
Bjorn Mellem273d0292018-11-01 16:42:44 -0700150 rtc::Thread* const thread_;
151 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100152 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700153
Niels Möllerd5696fb2018-11-28 15:34:37 +0100154 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
155 nullptr;
156 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700157 nullptr;
158 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100159
160 MediaTransportKeyFrameRequestCallback* key_frame_callback_
161 RTC_GUARDED_BY(sink_lock_) = nullptr;
162
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800163 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
164 nullptr;
165
Niels Möller46879152019-01-07 15:54:47 +0100166 std::vector<TargetTransferRateObserver*> target_transfer_rate_observers_
167 RTC_GUARDED_BY(sink_lock_);
168 std::vector<MediaTransportRttObserver*> rtt_observers_
169 RTC_GUARDED_BY(sink_lock_);
170
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800171 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
172 MediaTransportState::kPending;
173
Bjorn Mellem273d0292018-11-01 16:42:44 -0700174 LoopbackMediaTransport* const other_;
175
Niels Möllerc68d2822018-11-20 14:52:05 +0100176 Stats stats_ RTC_GUARDED_BY(stats_lock_);
177
Bjorn Mellem273d0292018-11-01 16:42:44 -0700178 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200179 };
180
Bjorn Mellem273d0292018-11-01 16:42:44 -0700181 LoopbackMediaTransport first_;
182 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200183};
184
185} // namespace webrtc
186
187#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_