blob: d520c20fc4730907783e80ebc9e7a53a1bef3436 [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
17#include "api/media_transport_interface.h"
Bjorn Mellem273d0292018-11-01 16:42:44 -070018#include "rtc_base/asyncinvoker.h"
19#include "rtc_base/criticalsection.h"
20#include "rtc_base/thread.h"
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080021#include "rtc_base/thread_checker.h"
Niels Möller2e47f7c2018-10-16 10:41:42 +020022
23namespace webrtc {
24
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080025// Wrapper used to hand out unique_ptrs to loopback media transports without
Niels Möllere0446cb2018-11-30 09:35:52 +010026// ownership changes to the underlying transport.
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080027class WrapperMediaTransportFactory : public MediaTransportFactory {
28 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010029 explicit WrapperMediaTransportFactory(MediaTransportInterface* wrapped);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080030
31 RTCErrorOr<std::unique_ptr<MediaTransportInterface>> CreateMediaTransport(
32 rtc::PacketTransportInternal* packet_transport,
33 rtc::Thread* network_thread,
Niels Möllere0446cb2018-11-30 09:35:52 +010034 const MediaTransportSettings& settings) override;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080035
36 private:
37 MediaTransportInterface* wrapped_;
38};
39
Niels Möller2e47f7c2018-10-16 10:41:42 +020040// Contains two MediaTransportsInterfaces that are connected to each other.
41// Currently supports audio only.
42class MediaTransportPair {
43 public:
Niels Möllerc68d2822018-11-20 14:52:05 +010044 struct Stats {
45 int sent_audio_frames = 0;
46 int received_audio_frames = 0;
Niels Möllerd5696fb2018-11-28 15:34:37 +010047 int sent_video_frames = 0;
48 int received_video_frames = 0;
Niels Möllerc68d2822018-11-20 14:52:05 +010049 };
50
Bjorn Mellem273d0292018-11-01 16:42:44 -070051 explicit MediaTransportPair(rtc::Thread* thread)
52 : first_(thread, &second_), second_(thread, &first_) {}
Niels Möller2e47f7c2018-10-16 10:41:42 +020053
54 // Ownership stays with MediaTransportPair
Bjorn Mellem273d0292018-11-01 16:42:44 -070055 MediaTransportInterface* first() { return &first_; }
56 MediaTransportInterface* second() { return &second_; }
57
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080058 std::unique_ptr<MediaTransportFactory> first_factory() {
59 return absl::make_unique<WrapperMediaTransportFactory>(&first_);
60 }
61
62 std::unique_ptr<MediaTransportFactory> second_factory() {
63 return absl::make_unique<WrapperMediaTransportFactory>(&second_);
64 }
65
66 void SetState(MediaTransportState state) {
67 first_.SetState(state);
68 second_.SetState(state);
69 }
70
Bjorn Mellem273d0292018-11-01 16:42:44 -070071 void FlushAsyncInvokes() {
72 first_.FlushAsyncInvokes();
73 second_.FlushAsyncInvokes();
74 }
Niels Möller2e47f7c2018-10-16 10:41:42 +020075
Niels Möllerc68d2822018-11-20 14:52:05 +010076 Stats FirstStats() { return first_.GetStats(); }
77 Stats SecondStats() { return second_.GetStats(); }
78
Niels Möller2e47f7c2018-10-16 10:41:42 +020079 private:
80 class LoopbackMediaTransport : public MediaTransportInterface {
81 public:
Niels Möllere0446cb2018-11-30 09:35:52 +010082 LoopbackMediaTransport(rtc::Thread* thread, LoopbackMediaTransport* other);
Bjorn Mellem273d0292018-11-01 16:42:44 -070083
Niels Möllere0446cb2018-11-30 09:35:52 +010084 ~LoopbackMediaTransport() override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020085
86 RTCError SendAudioFrame(uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010087 MediaTransportEncodedAudioFrame frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020088
89 RTCError SendVideoFrame(
90 uint64_t channel_id,
Niels Möllere0446cb2018-11-30 09:35:52 +010091 const MediaTransportEncodedVideoFrame& frame) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020092
Niels Möllere0446cb2018-11-30 09:35:52 +010093 RTCError RequestKeyFrame(uint64_t channel_id) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020094
Niels Möllere0446cb2018-11-30 09:35:52 +010095 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020096
Niels Möllere0446cb2018-11-30 09:35:52 +010097 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override;
Niels Möller2e47f7c2018-10-16 10:41:42 +020098
Bjorn Mellemeb2c6412018-10-31 15:25:32 -070099 void SetMediaTransportStateCallback(
Niels Möllere0446cb2018-11-30 09:35:52 +0100100 MediaTransportStateCallback* callback) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700101
102 RTCError SendData(int channel_id,
103 const SendDataParams& params,
Niels Möllere0446cb2018-11-30 09:35:52 +0100104 const rtc::CopyOnWriteBuffer& buffer) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700105
Niels Möllere0446cb2018-11-30 09:35:52 +0100106 RTCError CloseChannel(int channel_id) override;
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700107
Niels Möllere0446cb2018-11-30 09:35:52 +0100108 void SetDataSink(DataChannelSink* sink) override;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700109
Niels Möllere0446cb2018-11-30 09:35:52 +0100110 void SetState(MediaTransportState state);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800111
Niels Möllere0446cb2018-11-30 09:35:52 +0100112 void FlushAsyncInvokes();
Bjorn Mellemeb2c6412018-10-31 15:25:32 -0700113
Niels Möllere0446cb2018-11-30 09:35:52 +0100114 Stats GetStats();
Niels Möllerc68d2822018-11-20 14:52:05 +0100115
Niels Möller2e47f7c2018-10-16 10:41:42 +0200116 private:
Niels Möllere0446cb2018-11-30 09:35:52 +0100117 void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame);
Niels Möller2e47f7c2018-10-16 10:41:42 +0200118
Niels Möllere0446cb2018-11-30 09:35:52 +0100119 void OnData(uint64_t channel_id, MediaTransportEncodedVideoFrame frame);
Niels Möllerd5696fb2018-11-28 15:34:37 +0100120
Bjorn Mellem273d0292018-11-01 16:42:44 -0700121 void OnData(int channel_id,
122 DataMessageType type,
Niels Möllere0446cb2018-11-30 09:35:52 +0100123 const rtc::CopyOnWriteBuffer& buffer);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700124
Niels Möllere0446cb2018-11-30 09:35:52 +0100125 void OnRemoteCloseChannel(int channel_id);
Bjorn Mellem273d0292018-11-01 16:42:44 -0700126
Niels Möllere0446cb2018-11-30 09:35:52 +0100127 void OnStateChanged() RTC_RUN_ON(thread_);
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800128
Bjorn Mellem273d0292018-11-01 16:42:44 -0700129 rtc::Thread* const thread_;
130 rtc::CriticalSection sink_lock_;
Niels Möllerc68d2822018-11-20 14:52:05 +0100131 rtc::CriticalSection stats_lock_;
Bjorn Mellem273d0292018-11-01 16:42:44 -0700132
Niels Möllerd5696fb2018-11-28 15:34:37 +0100133 MediaTransportAudioSinkInterface* audio_sink_ RTC_GUARDED_BY(sink_lock_) =
134 nullptr;
135 MediaTransportVideoSinkInterface* video_sink_ RTC_GUARDED_BY(sink_lock_) =
Bjorn Mellem273d0292018-11-01 16:42:44 -0700136 nullptr;
137 DataChannelSink* data_sink_ RTC_GUARDED_BY(sink_lock_) = nullptr;
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800138 MediaTransportStateCallback* state_callback_ RTC_GUARDED_BY(sink_lock_) =
139 nullptr;
140
141 MediaTransportState state_ RTC_GUARDED_BY(thread_) =
142 MediaTransportState::kPending;
143
Bjorn Mellem273d0292018-11-01 16:42:44 -0700144 LoopbackMediaTransport* const other_;
145
Niels Möllerc68d2822018-11-20 14:52:05 +0100146 Stats stats_ RTC_GUARDED_BY(stats_lock_);
147
Bjorn Mellem273d0292018-11-01 16:42:44 -0700148 rtc::AsyncInvoker invoker_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200149 };
150
Bjorn Mellem273d0292018-11-01 16:42:44 -0700151 LoopbackMediaTransport first_;
152 LoopbackMediaTransport second_;
Niels Möller2e47f7c2018-10-16 10:41:42 +0200153};
154
155} // namespace webrtc
156
157#endif // API_TEST_LOOPBACK_MEDIA_TRANSPORT_H_