blob: bd2630577ecf5785e13831dfbc1cdf30d2af966f [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"
Bjorn Mellem273d0292018-11-01 16:42:44 -070020#include "rtc_base/asyncinvoker.h"
21#include "rtc_base/criticalsection.h"
22#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
Niels Möller2e47f7c2018-10-16 10:41:42 +0200130 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100131 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200132
Niels Möllere0446cb2018-11-30 09:35:52 +0100133 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100134
Bjorn Mellem273d0292018-11-01 16:42:44 -0700135 void OnData(int channel_id,
136 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100137 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700138
Niels Möller1c7f5f62018-12-10 11:06:02 +0100139 void OnKeyFrameRequested(int channel_id);
140
Niels Möllere0446cb2018-11-30 09:35:52 +0100141 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700142
Niels Möllere0446cb2018-11-30 09:35:52 +0100143 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800144
Bjorn Mellem273d0292018-11-01 16:42:44 -0700145 rtc::Thread* const thread_;
146 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100147 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700148
Niels Möllerd5696fb2018-11-28 15:34:37 +0100149 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
150 nullptr;
151 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700152 nullptr;
153 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100154
155 MediaTransportKeyFrameRequestCallback* key_frame_callback_
156 RTC_GUARDED_BY(sink_lock_) = nullptr;
157
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800158 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
159 nullptr;
160
Niels Möller46879152019-01-07 15:54:47 +0100161 std::vector<TargetTransferRateObserver*> target_transfer_rate_observers_
162 RTC_GUARDED_BY(sink_lock_);
163 std::vector<MediaTransportRttObserver*> rtt_observers_
164 RTC_GUARDED_BY(sink_lock_);
165
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800166 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
167 MediaTransportState::kPending;
168
Bjorn Mellem273d0292018-11-01 16:42:44 -0700169 LoopbackMediaTransport* const other_;
170
Niels Möllerc68d2822018-11-20 14:52:05 +0100171 Stats stats_ RTC_GUARDED_BY(stats_lock_);
172
Bjorn Mellem273d0292018-11-01 16:42:44 -0700173 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200174 };
175
Bjorn Mellem273d0292018-11-01 16:42:44 -0700176 LoopbackMediaTransport first_;
177 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200178};
179
180} // namespace webrtc
181
182#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_