blob: e1d2246dc35fe126d27108fb8afe87b5b650df37 [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>
16
Steve Anton40d55332019-01-07 10:21:47 -080017#include "absl/memory/memory.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020018#include "api/media_transport_interface.h"
Bjorn Mellem273d0292018-11-01 16:42:44 -070019#include "rtc_base/asyncinvoker.h"
20#include "rtc_base/criticalsection.h"
21#include "rtc_base/thread.h"
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080022#include "rtc_base/thread_checker.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020023
24namespace webrtc {
25
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080026// Wrapper used to hand out unique_ptrs to loopback media transports without
Niels Möllere0446cb2018-11-30 09:35:52 +010027// ownership changes to the underlying transport.
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080028class WrapperMediaTransportFactory : public MediaTransportFactory {
29 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010030 explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080031
32 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
33 rtc::PacketTransportInternal* packet_transport,
34 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010035 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080036
37 private:
38 MediaTransportInterface* wrapped_;
39};
40
Niels Möller2e47f7c2018-10-16 10:41:42 +020041// Contains two MediaTransportsInterfaces that are connected to each other.
42// Currently supports audio only.
43class MediaTransportPair {
44 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010045 struct Stats {
46 int sent_audio_frames = 0;
47 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010048 int sent_video_frames = 0;
49 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010050 };
51
Bjorn Mellem273d0292018-11-01 16:42:44 -070052 explicit MediaTransportPair(rtc::Thread* thread)
53 : first_(thread, &second_), second_(thread, &first_) {}
Niels Möller2e47f7c2018-10-16 10:41:42 +020054
55 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070056 MediaTransportInterface* first() { return &first_; }
57 MediaTransportInterface* second() { return &second_; }
58
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080059 std::unique_ptr<MediaTransportFactory> first_factory() {
60 return absl::make_unique<WrapperMediaTransportFactory>(&first_);
61 }
62
63 std::unique_ptr<MediaTransportFactory> second_factory() {
64 return absl::make_unique<WrapperMediaTransportFactory>(&second_);
65 }
66
67 void SetState(MediaTransportState state) {
68 first_.SetState(state);
69 second_.SetState(state);
70 }
71
Bjorn Mellem273d0292018-11-01 16:42:44 -070072 void FlushAsyncInvokes() {
73 first_.FlushAsyncInvokes();
74 second_.FlushAsyncInvokes();
75 }
Niels Möller2e47f7c2018-10-16 10:41:42 +020076
Niels Möllerc68d2822018-11-20 14:52:05 +010077 Stats FirstStats() { return first_.GetStats(); }
78 Stats SecondStats() { return second_.GetStats(); }
79
Niels Möller2e47f7c2018-10-16 10:41:42 +020080 private:
81 class LoopbackMediaTransport : public MediaTransportInterface {
82 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010083 LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
Bjorn Mellem273d0292018-11-01 16:42:44 -070084
Niels Möllere0446cb2018-11-30 09:35:52 +010085 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020086
87 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010088 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020089
90 RTCError SendVideoFrame(
91 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010092 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020093
Niels Möller1c7f5f62018-12-10 11:06:02 +010094 void SetKeyFrameRequestCallback(
95 MediaTransportKeyFrameRequestCallback* callback) override;
96
Niels Möllere0446cb2018-11-30 09:35:52 +010097 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020098
Niels Möllere0446cb2018-11-30 09:35:52 +010099 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200100
Niels Möllere0446cb2018-11-30 09:35:52 +0100101 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200102
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700103 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100104 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700105
106 RTCError SendData(int channel_id,
107 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100108 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700109
Niels Möllere0446cb2018-11-30 09:35:52 +0100110 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700111
Niels Möllere0446cb2018-11-30 09:35:52 +0100112 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700113
Niels Möllere0446cb2018-11-30 09:35:52 +0100114 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800115
Niels Möllere0446cb2018-11-30 09:35:52 +0100116 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700117
Niels Möllere0446cb2018-11-30 09:35:52 +0100118 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100119
Niels Möller2e47f7c2018-10-16 10:41:42 +0200120 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100121 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200122
Niels Möllere0446cb2018-11-30 09:35:52 +0100123 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100124
Bjorn Mellem273d0292018-11-01 16:42:44 -0700125 void OnData(int channel_id,
126 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100127 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700128
Niels Möller1c7f5f62018-12-10 11:06:02 +0100129 void OnKeyFrameRequested(int channel_id);
130
Niels Möllere0446cb2018-11-30 09:35:52 +0100131 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700132
Niels Möllere0446cb2018-11-30 09:35:52 +0100133 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800134
Bjorn Mellem273d0292018-11-01 16:42:44 -0700135 rtc::Thread* const thread_;
136 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100137 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700138
Niels Möllerd5696fb2018-11-28 15:34:37 +0100139 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
140 nullptr;
141 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700142 nullptr;
143 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Niels Möller1c7f5f62018-12-10 11:06:02 +0100144
145 MediaTransportKeyFrameRequestCallback* key_frame_callback_
146 RTC_GUARDED_BY(sink_lock_) = nullptr;
147
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800148 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
149 nullptr;
150
151 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
152 MediaTransportState::kPending;
153
Bjorn Mellem273d0292018-11-01 16:42:44 -0700154 LoopbackMediaTransport* const other_;
155
Niels Möllerc68d2822018-11-20 14:52:05 +0100156 Stats stats_ RTC_GUARDED_BY(stats_lock_);
157
Bjorn Mellem273d0292018-11-01 16:42:44 -0700158 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200159 };
160
Bjorn Mellem273d0292018-11-01 16:42:44 -0700161 LoopbackMediaTransport first_;
162 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200163};
164
165} // namespace webrtc
166
167#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_