blob: e341a38876b76ef9502355bc9ddbe845562b9517 [file] [log] [blame]
Niels Möllere0446cb2018-11-30 09:35:52 +01001/*
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#include "api/test/loopback_media_transport.h"
12
Mirko Bonadei317a1f02019-09-17 17:06:18 +020013#include <memory>
14
Steve Antona59dcc32019-03-25 13:53:07 -070015#include "absl/algorithm/container.h"
Steve Anton10542f22019-01-11 09:11:00 -080016#include "rtc_base/time_utils.h"
Niels Möllere0446cb2018-11-30 09:35:52 +010017
18namespace webrtc {
19
20namespace {
21
22// Wrapper used to hand out unique_ptrs to loopback media transports without
23// ownership changes.
24class WrapperMediaTransport : public MediaTransportInterface {
25 public:
26 explicit WrapperMediaTransport(MediaTransportInterface* wrapped)
27 : wrapped_(wrapped) {}
28
29 RTCError SendAudioFrame(uint64_t channel_id,
30 MediaTransportEncodedAudioFrame frame) override {
31 return wrapped_->SendAudioFrame(channel_id, std::move(frame));
32 }
33
34 RTCError SendVideoFrame(
35 uint64_t channel_id,
36 const MediaTransportEncodedVideoFrame& frame) override {
37 return wrapped_->SendVideoFrame(channel_id, frame);
38 }
39
Niels Möller1c7f5f62018-12-10 11:06:02 +010040 void SetKeyFrameRequestCallback(
41 MediaTransportKeyFrameRequestCallback* callback) override {
42 wrapped_->SetKeyFrameRequestCallback(callback);
43 }
44
Niels Möllere0446cb2018-11-30 09:35:52 +010045 RTCError RequestKeyFrame(uint64_t channel_id) override {
46 return wrapped_->RequestKeyFrame(channel_id);
47 }
48
49 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override {
50 wrapped_->SetReceiveAudioSink(sink);
51 }
52
53 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override {
54 wrapped_->SetReceiveVideoSink(sink);
55 }
56
Niels Möller46879152019-01-07 15:54:47 +010057 void AddTargetTransferRateObserver(
58 TargetTransferRateObserver* observer) override {
59 wrapped_->AddTargetTransferRateObserver(observer);
60 }
61
62 void RemoveTargetTransferRateObserver(
63 TargetTransferRateObserver* observer) override {
64 wrapped_->RemoveTargetTransferRateObserver(observer);
65 }
66
Niels Möllere0446cb2018-11-30 09:35:52 +010067 void SetMediaTransportStateCallback(
68 MediaTransportStateCallback* callback) override {
69 wrapped_->SetMediaTransportStateCallback(callback);
70 }
71
Bjorn Mellem9ded4852019-02-28 12:27:11 -080072 RTCError OpenChannel(int channel_id) override {
73 return wrapped_->OpenChannel(channel_id);
74 }
75
Niels Möllere0446cb2018-11-30 09:35:52 +010076 RTCError SendData(int channel_id,
77 const SendDataParams& params,
78 const rtc::CopyOnWriteBuffer& buffer) override {
79 return wrapped_->SendData(channel_id, params, buffer);
80 }
81
82 RTCError CloseChannel(int channel_id) override {
83 return wrapped_->CloseChannel(channel_id);
84 }
85
86 void SetDataSink(DataChannelSink* sink) override {
87 wrapped_->SetDataSink(sink);
88 }
89
Bjorn A Mellemb689af42019-08-21 10:44:59 -070090 bool IsReadyToSend() const override { return wrapped_->IsReadyToSend(); }
91
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -080092 void SetAllocatedBitrateLimits(
93 const MediaTransportAllocatedBitrateLimits& limits) override {}
94
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080095 absl::optional<std::string> GetTransportParametersOffer() const override {
96 return wrapped_->GetTransportParametersOffer();
97 }
98
Niels Möllere0446cb2018-11-30 09:35:52 +010099 private:
100 MediaTransportInterface* wrapped_;
101};
102
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700103class WrapperDatagramTransport : public DatagramTransportInterface {
104 public:
105 explicit WrapperDatagramTransport(DatagramTransportInterface* wrapped)
106 : wrapped_(wrapped) {}
107
108 // Datagram transport overrides.
109 void Connect(rtc::PacketTransportInternal* packet_transport) override {
110 return wrapped_->Connect(packet_transport);
111 }
112
113 CongestionControlInterface* congestion_control() override {
114 return wrapped_->congestion_control();
115 }
116
117 void SetTransportStateCallback(
118 MediaTransportStateCallback* callback) override {
119 return wrapped_->SetTransportStateCallback(callback);
120 }
121
122 RTCError SendDatagram(rtc::ArrayView<const uint8_t> data,
123 DatagramId datagram_id) override {
124 return wrapped_->SendDatagram(data, datagram_id);
125 }
126
127 size_t GetLargestDatagramSize() const override {
128 return wrapped_->GetLargestDatagramSize();
129 }
130
131 void SetDatagramSink(DatagramSinkInterface* sink) override {
132 return wrapped_->SetDatagramSink(sink);
133 }
134
135 std::string GetTransportParameters() const override {
136 return wrapped_->GetTransportParameters();
137 }
138
139 // Data channel overrides.
140 RTCError OpenChannel(int channel_id) override {
141 return wrapped_->OpenChannel(channel_id);
142 }
143
144 RTCError SendData(int channel_id,
145 const SendDataParams& params,
146 const rtc::CopyOnWriteBuffer& buffer) override {
147 return wrapped_->SendData(channel_id, params, buffer);
148 }
149
150 RTCError CloseChannel(int channel_id) override {
151 return wrapped_->CloseChannel(channel_id);
152 }
153
154 void SetDataSink(DataChannelSink* sink) override {
155 wrapped_->SetDataSink(sink);
156 }
157
158 bool IsReadyToSend() const override { return wrapped_->IsReadyToSend(); }
159
160 private:
161 DatagramTransportInterface* wrapped_;
162};
163
Niels Möllere0446cb2018-11-30 09:35:52 +0100164} // namespace
165
166WrapperMediaTransportFactory::WrapperMediaTransportFactory(
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700167 MediaTransportInterface* wrapped_media_transport,
168 DatagramTransportInterface* wrapped_datagram_transport)
169 : wrapped_media_transport_(wrapped_media_transport),
170 wrapped_datagram_transport_(wrapped_datagram_transport) {}
Niels Möllere0446cb2018-11-30 09:35:52 +0100171
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800172WrapperMediaTransportFactory::WrapperMediaTransportFactory(
173 MediaTransportFactory* wrapped)
174 : wrapped_factory_(wrapped) {}
175
Niels Möllere0446cb2018-11-30 09:35:52 +0100176RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
177WrapperMediaTransportFactory::CreateMediaTransport(
178 rtc::PacketTransportInternal* packet_transport,
179 rtc::Thread* network_thread,
180 const MediaTransportSettings& settings) {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800181 created_transport_count_++;
182 if (wrapped_factory_) {
183 return wrapped_factory_->CreateMediaTransport(packet_transport,
184 network_thread, settings);
185 }
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200186 return {std::make_unique<WrapperMediaTransport>(wrapped_media_transport_)};
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700187}
188
189RTCErrorOr<std::unique_ptr<DatagramTransportInterface>>
190WrapperMediaTransportFactory::CreateDatagramTransport(
191 rtc::Thread* network_thread,
192 const MediaTransportSettings& settings) {
193 created_transport_count_++;
194 if (wrapped_factory_) {
195 return wrapped_factory_->CreateDatagramTransport(network_thread, settings);
196 }
197 return {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200198 std::make_unique<WrapperDatagramTransport>(wrapped_datagram_transport_)};
Niels Möllere0446cb2018-11-30 09:35:52 +0100199}
200
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800201std::string WrapperMediaTransportFactory::GetTransportName() const {
202 if (wrapped_factory_) {
203 return wrapped_factory_->GetTransportName();
204 }
205 return "wrapped-transport";
206}
207
208int WrapperMediaTransportFactory::created_transport_count() const {
209 return created_transport_count_;
210}
211
212RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
213WrapperMediaTransportFactory::CreateMediaTransport(
214 rtc::Thread* network_thread,
215 const MediaTransportSettings& settings) {
216 created_transport_count_++;
217 if (wrapped_factory_) {
218 return wrapped_factory_->CreateMediaTransport(network_thread, settings);
219 }
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200220 return {std::make_unique<WrapperMediaTransport>(wrapped_media_transport_)};
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800221}
222
223MediaTransportPair::MediaTransportPair(rtc::Thread* thread)
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700224 : first_(thread),
225 second_(thread),
226 first_datagram_transport_(thread),
227 second_datagram_transport_(thread),
228 first_factory_(&first_, &first_datagram_transport_),
229 second_factory_(&second_, &second_datagram_transport_) {
230 first_.Connect(&second_);
231 second_.Connect(&first_);
232 first_datagram_transport_.Connect(&second_datagram_transport_);
233 second_datagram_transport_.Connect(&first_datagram_transport_);
234}
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800235
236MediaTransportPair::~MediaTransportPair() = default;
237
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700238MediaTransportPair::LoopbackDataChannelTransport::LoopbackDataChannelTransport(
239 rtc::Thread* thread)
240 : thread_(thread) {}
241
242MediaTransportPair::LoopbackDataChannelTransport::
243 ~LoopbackDataChannelTransport() {
244 RTC_CHECK(data_sink_ == nullptr);
245}
246
247void MediaTransportPair::LoopbackDataChannelTransport::Connect(
248 LoopbackDataChannelTransport* other) {
249 other_ = other;
250}
251
Niels Möllere0446cb2018-11-30 09:35:52 +0100252MediaTransportPair::LoopbackMediaTransport::LoopbackMediaTransport(
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700253 rtc::Thread* thread)
254 : dc_transport_(thread), thread_(thread), other_(nullptr) {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800255 RTC_LOG(LS_INFO) << "LoopbackMediaTransport";
256}
Niels Möllere0446cb2018-11-30 09:35:52 +0100257
258MediaTransportPair::LoopbackMediaTransport::~LoopbackMediaTransport() {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800259 RTC_LOG(LS_INFO) << "~LoopbackMediaTransport";
Niels Möllere0446cb2018-11-30 09:35:52 +0100260 rtc::CritScope lock(&sink_lock_);
261 RTC_CHECK(audio_sink_ == nullptr);
262 RTC_CHECK(video_sink_ == nullptr);
Niels Möller46879152019-01-07 15:54:47 +0100263 RTC_CHECK(target_transfer_rate_observers_.empty());
264 RTC_CHECK(rtt_observers_.empty());
Niels Möllere0446cb2018-11-30 09:35:52 +0100265}
266
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700267void MediaTransportPair::LoopbackMediaTransport::Connect(
268 LoopbackMediaTransport* other) {
269 other_ = other;
270 dc_transport_.Connect(&other->dc_transport_);
271}
272
273void MediaTransportPair::LoopbackMediaTransport::Connect(
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700274 rtc::PacketTransportInternal* packet_transport) {
275 if (state_after_connect_) {
276 SetState(*state_after_connect_);
277 }
278}
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700279
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800280absl::optional<std::string>
281MediaTransportPair::LoopbackMediaTransport::GetTransportParametersOffer()
282 const {
283 return "loopback-media-transport-parameters";
284}
285
Niels Möllere0446cb2018-11-30 09:35:52 +0100286RTCError MediaTransportPair::LoopbackMediaTransport::SendAudioFrame(
287 uint64_t channel_id,
288 MediaTransportEncodedAudioFrame frame) {
289 {
290 rtc::CritScope lock(&stats_lock_);
291 ++stats_.sent_audio_frames;
292 }
293 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id, frame] {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100294 other_->OnData(channel_id, frame);
Niels Möllere0446cb2018-11-30 09:35:52 +0100295 });
296 return RTCError::OK();
297}
298
299RTCError MediaTransportPair::LoopbackMediaTransport::SendVideoFrame(
300 uint64_t channel_id,
301 const MediaTransportEncodedVideoFrame& frame) {
302 {
303 rtc::CritScope lock(&stats_lock_);
304 ++stats_.sent_video_frames;
305 }
306 // Ensure that we own the referenced data.
307 MediaTransportEncodedVideoFrame frame_copy = frame;
308 frame_copy.Retain();
309 invoker_.AsyncInvoke<void>(
Mirko Bonadei80a86872019-02-04 15:01:43 +0100310 RTC_FROM_HERE, thread_, [this, channel_id, frame_copy]() mutable {
Niels Möllere0446cb2018-11-30 09:35:52 +0100311 other_->OnData(channel_id, std::move(frame_copy));
312 });
313 return RTCError::OK();
314}
315
Niels Möller1c7f5f62018-12-10 11:06:02 +0100316void MediaTransportPair::LoopbackMediaTransport::SetKeyFrameRequestCallback(
317 MediaTransportKeyFrameRequestCallback* callback) {
318 rtc::CritScope lock(&sink_lock_);
319 if (callback) {
320 RTC_CHECK(key_frame_callback_ == nullptr);
321 }
322 key_frame_callback_ = callback;
323}
324
Niels Möllere0446cb2018-11-30 09:35:52 +0100325RTCError MediaTransportPair::LoopbackMediaTransport::RequestKeyFrame(
326 uint64_t channel_id) {
Niels Möller1c7f5f62018-12-10 11:06:02 +0100327 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
328 other_->OnKeyFrameRequested(channel_id);
329 });
Niels Möllere0446cb2018-11-30 09:35:52 +0100330 return RTCError::OK();
331}
332
333void MediaTransportPair::LoopbackMediaTransport::SetReceiveAudioSink(
334 MediaTransportAudioSinkInterface* sink) {
335 rtc::CritScope lock(&sink_lock_);
336 if (sink) {
337 RTC_CHECK(audio_sink_ == nullptr);
338 }
339 audio_sink_ = sink;
340}
341
342void MediaTransportPair::LoopbackMediaTransport::SetReceiveVideoSink(
343 MediaTransportVideoSinkInterface* sink) {
344 rtc::CritScope lock(&sink_lock_);
345 if (sink) {
346 RTC_CHECK(video_sink_ == nullptr);
347 }
348 video_sink_ = sink;
349}
350
Niels Möller46879152019-01-07 15:54:47 +0100351void MediaTransportPair::LoopbackMediaTransport::AddTargetTransferRateObserver(
352 TargetTransferRateObserver* observer) {
353 RTC_CHECK(observer);
354 {
355 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700356 RTC_CHECK(
357 !absl::c_linear_search(target_transfer_rate_observers_, observer));
Niels Möller46879152019-01-07 15:54:47 +0100358 target_transfer_rate_observers_.push_back(observer);
359 }
360 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
361 RTC_DCHECK_RUN_ON(thread_);
362 const DataRate kBitrate = DataRate::kbps(300);
363 const Timestamp now = Timestamp::us(rtc::TimeMicros());
364
365 TargetTransferRate transfer_rate;
366 transfer_rate.at_time = now;
367 transfer_rate.target_rate = kBitrate;
368 transfer_rate.network_estimate.at_time = now;
369 transfer_rate.network_estimate.round_trip_time = TimeDelta::ms(20);
370 transfer_rate.network_estimate.bwe_period = TimeDelta::seconds(3);
371 transfer_rate.network_estimate.bandwidth = kBitrate;
372
373 rtc::CritScope cs(&sink_lock_);
374
375 for (auto* o : target_transfer_rate_observers_) {
376 o->OnTargetTransferRate(transfer_rate);
377 }
378 });
379}
380
381void MediaTransportPair::LoopbackMediaTransport::
382 RemoveTargetTransferRateObserver(TargetTransferRateObserver* observer) {
383 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700384 auto it = absl::c_find(target_transfer_rate_observers_, observer);
Niels Möller46879152019-01-07 15:54:47 +0100385 if (it == target_transfer_rate_observers_.end()) {
386 RTC_LOG(LS_WARNING)
387 << "Attempt to remove an unknown TargetTransferRate observer";
388 return;
389 }
390 target_transfer_rate_observers_.erase(it);
391}
392
393void MediaTransportPair::LoopbackMediaTransport::AddRttObserver(
394 MediaTransportRttObserver* observer) {
395 RTC_CHECK(observer);
396 {
397 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700398 RTC_CHECK(!absl::c_linear_search(rtt_observers_, observer));
Niels Möller46879152019-01-07 15:54:47 +0100399 rtt_observers_.push_back(observer);
400 }
401 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
402 RTC_DCHECK_RUN_ON(thread_);
403
404 rtc::CritScope cs(&sink_lock_);
405 for (auto* o : rtt_observers_) {
406 o->OnRttUpdated(20);
407 }
408 });
409}
410
411void MediaTransportPair::LoopbackMediaTransport::RemoveRttObserver(
412 MediaTransportRttObserver* observer) {
413 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700414 auto it = absl::c_find(rtt_observers_, observer);
Niels Möller46879152019-01-07 15:54:47 +0100415 if (it == rtt_observers_.end()) {
416 RTC_LOG(LS_WARNING) << "Attempt to remove an unknown RTT observer";
417 return;
418 }
419 rtt_observers_.erase(it);
420}
421
Niels Möllere0446cb2018-11-30 09:35:52 +0100422void MediaTransportPair::LoopbackMediaTransport::SetMediaTransportStateCallback(
423 MediaTransportStateCallback* callback) {
424 rtc::CritScope lock(&sink_lock_);
425 state_callback_ = callback;
426 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
427 RTC_DCHECK_RUN_ON(thread_);
428 OnStateChanged();
429 });
430}
431
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800432RTCError MediaTransportPair::LoopbackMediaTransport::OpenChannel(
433 int channel_id) {
434 // No-op. No need to open channels for the loopback.
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700435 return dc_transport_.OpenChannel(channel_id);
436}
437
438RTCError MediaTransportPair::LoopbackDataChannelTransport::OpenChannel(
439 int channel_id) {
440 // No-op. No need to open channels for the loopback.
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800441 return RTCError::OK();
442}
443
Niels Möllere0446cb2018-11-30 09:35:52 +0100444RTCError MediaTransportPair::LoopbackMediaTransport::SendData(
445 int channel_id,
446 const SendDataParams& params,
447 const rtc::CopyOnWriteBuffer& buffer) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700448 return dc_transport_.SendData(channel_id, params, buffer);
449}
450
451RTCError MediaTransportPair::LoopbackDataChannelTransport::SendData(
452 int channel_id,
453 const SendDataParams& params,
454 const rtc::CopyOnWriteBuffer& buffer) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100455 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_,
456 [this, channel_id, params, buffer] {
457 other_->OnData(channel_id, params.type, buffer);
458 });
459 return RTCError::OK();
460}
461
462RTCError MediaTransportPair::LoopbackMediaTransport::CloseChannel(
463 int channel_id) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700464 return dc_transport_.CloseChannel(channel_id);
465}
466
467RTCError MediaTransportPair::LoopbackDataChannelTransport::CloseChannel(
468 int channel_id) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100469 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
470 other_->OnRemoteCloseChannel(channel_id);
471 rtc::CritScope lock(&sink_lock_);
472 if (data_sink_) {
473 data_sink_->OnChannelClosed(channel_id);
474 }
475 });
476 return RTCError::OK();
477}
478
479void MediaTransportPair::LoopbackMediaTransport::SetDataSink(
480 DataChannelSink* sink) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700481 dc_transport_.SetDataSink(sink);
482}
483
484bool MediaTransportPair::LoopbackMediaTransport::IsReadyToSend() const {
485 return dc_transport_.IsReadyToSend();
486}
487
488void MediaTransportPair::LoopbackDataChannelTransport::SetDataSink(
489 DataChannelSink* sink) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100490 rtc::CritScope lock(&sink_lock_);
491 data_sink_ = sink;
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700492 if (data_sink_ && ready_to_send_) {
493 data_sink_->OnReadyToSend();
494 }
Niels Möllere0446cb2018-11-30 09:35:52 +0100495}
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700496
497bool MediaTransportPair::LoopbackDataChannelTransport::IsReadyToSend() const {
498 rtc::CritScope lock(&sink_lock_);
499 return ready_to_send_;
500}
501
Niels Möllere0446cb2018-11-30 09:35:52 +0100502void MediaTransportPair::LoopbackMediaTransport::SetState(
503 MediaTransportState state) {
504 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, state] {
505 RTC_DCHECK_RUN_ON(thread_);
506 state_ = state;
507 OnStateChanged();
508 });
509}
510
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700511void MediaTransportPair::LoopbackMediaTransport::SetStateAfterConnect(
512 MediaTransportState state) {
513 state_after_connect_ = state;
514}
515
Niels Möllere0446cb2018-11-30 09:35:52 +0100516void MediaTransportPair::LoopbackMediaTransport::FlushAsyncInvokes() {
517 invoker_.Flush(thread_);
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700518 dc_transport_.FlushAsyncInvokes();
519}
520
521void MediaTransportPair::LoopbackDataChannelTransport::FlushAsyncInvokes() {
522 invoker_.Flush(thread_);
Niels Möllere0446cb2018-11-30 09:35:52 +0100523}
524
525MediaTransportPair::Stats
526MediaTransportPair::LoopbackMediaTransport::GetStats() {
527 rtc::CritScope lock(&stats_lock_);
528 return stats_;
529}
530
531void MediaTransportPair::LoopbackMediaTransport::OnData(
532 uint64_t channel_id,
533 MediaTransportEncodedAudioFrame frame) {
534 {
535 rtc::CritScope lock(&sink_lock_);
Sergey Silkine049eba2019-02-18 09:52:26 +0000536 if (audio_sink_) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100537 audio_sink_->OnData(channel_id, frame);
538 }
539 }
540 {
541 rtc::CritScope lock(&stats_lock_);
542 ++stats_.received_audio_frames;
543 }
544}
545
546void MediaTransportPair::LoopbackMediaTransport::OnData(
547 uint64_t channel_id,
548 MediaTransportEncodedVideoFrame frame) {
549 {
550 rtc::CritScope lock(&sink_lock_);
551 if (video_sink_) {
552 video_sink_->OnData(channel_id, frame);
553 }
554 }
555 {
556 rtc::CritScope lock(&stats_lock_);
557 ++stats_.received_video_frames;
558 }
559}
560
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700561void MediaTransportPair::LoopbackDataChannelTransport::OnData(
Niels Möllere0446cb2018-11-30 09:35:52 +0100562 int channel_id,
563 DataMessageType type,
564 const rtc::CopyOnWriteBuffer& buffer) {
565 rtc::CritScope lock(&sink_lock_);
566 if (data_sink_) {
567 data_sink_->OnDataReceived(channel_id, type, buffer);
568 }
569}
570
Niels Möller1c7f5f62018-12-10 11:06:02 +0100571void MediaTransportPair::LoopbackMediaTransport::OnKeyFrameRequested(
572 int channel_id) {
573 rtc::CritScope lock(&sink_lock_);
574 if (key_frame_callback_) {
575 key_frame_callback_->OnKeyFrameRequested(channel_id);
576 }
577}
578
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700579void MediaTransportPair::LoopbackDataChannelTransport::OnRemoteCloseChannel(
Niels Möllere0446cb2018-11-30 09:35:52 +0100580 int channel_id) {
581 rtc::CritScope lock(&sink_lock_);
582 if (data_sink_) {
583 data_sink_->OnChannelClosing(channel_id);
584 data_sink_->OnChannelClosed(channel_id);
585 }
586}
587
588void MediaTransportPair::LoopbackMediaTransport::OnStateChanged() {
589 rtc::CritScope lock(&sink_lock_);
590 if (state_callback_) {
591 state_callback_->OnStateChanged(state_);
592 }
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700593
594 dc_transport_.OnReadyToSend(state_ == MediaTransportState::kWritable);
595}
596
597void MediaTransportPair::LoopbackDataChannelTransport::OnReadyToSend(
598 bool ready_to_send) {
599 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, ready_to_send] {
600 rtc::CritScope lock(&sink_lock_);
601 ready_to_send_ = ready_to_send;
602 // Propagate state to data channel sink, if present.
603 if (data_sink_ && ready_to_send_) {
604 data_sink_->OnReadyToSend();
605 }
606 });
Niels Möllere0446cb2018-11-30 09:35:52 +0100607}
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800608
609void MediaTransportPair::LoopbackMediaTransport::SetAllocatedBitrateLimits(
610 const MediaTransportAllocatedBitrateLimits& limits) {}
611
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700612MediaTransportPair::LoopbackDatagramTransport::LoopbackDatagramTransport(
613 rtc::Thread* thread)
614 : dc_transport_(thread) {}
615
616void MediaTransportPair::LoopbackDatagramTransport::Connect(
617 LoopbackDatagramTransport* other) {
618 dc_transport_.Connect(&other->dc_transport_);
619}
620
621void MediaTransportPair::LoopbackDatagramTransport::Connect(
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700622 rtc::PacketTransportInternal* packet_transport) {
623 if (state_after_connect_) {
624 SetState(*state_after_connect_);
625 }
626}
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700627
628CongestionControlInterface*
629MediaTransportPair::LoopbackDatagramTransport::congestion_control() {
630 return nullptr;
631}
632
633void MediaTransportPair::LoopbackDatagramTransport::SetTransportStateCallback(
634 MediaTransportStateCallback* callback) {}
635
636RTCError MediaTransportPair::LoopbackDatagramTransport::SendDatagram(
637 rtc::ArrayView<const uint8_t> data,
638 DatagramId datagram_id) {
639 return RTCError::OK();
640}
641
642size_t MediaTransportPair::LoopbackDatagramTransport::GetLargestDatagramSize()
643 const {
644 return 0;
645}
646
647void MediaTransportPair::LoopbackDatagramTransport::SetDatagramSink(
648 DatagramSinkInterface* sink) {}
649
650std::string
651MediaTransportPair::LoopbackDatagramTransport::GetTransportParameters() const {
652 return transport_parameters_;
653}
654
655RTCError MediaTransportPair::LoopbackDatagramTransport::OpenChannel(
656 int channel_id) {
657 return dc_transport_.OpenChannel(channel_id);
658}
659
660RTCError MediaTransportPair::LoopbackDatagramTransport::SendData(
661 int channel_id,
662 const SendDataParams& params,
663 const rtc::CopyOnWriteBuffer& buffer) {
664 return dc_transport_.SendData(channel_id, params, buffer);
665}
666
667RTCError MediaTransportPair::LoopbackDatagramTransport::CloseChannel(
668 int channel_id) {
669 return dc_transport_.CloseChannel(channel_id);
670}
671
672void MediaTransportPair::LoopbackDatagramTransport::SetDataSink(
673 DataChannelSink* sink) {
674 dc_transport_.SetDataSink(sink);
675}
676
677bool MediaTransportPair::LoopbackDatagramTransport::IsReadyToSend() const {
678 return dc_transport_.IsReadyToSend();
679}
680
681void MediaTransportPair::LoopbackDatagramTransport::SetState(
682 MediaTransportState state) {
683 dc_transport_.OnReadyToSend(state == MediaTransportState::kWritable);
684}
685
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700686void MediaTransportPair::LoopbackDatagramTransport::SetStateAfterConnect(
687 MediaTransportState state) {
688 state_after_connect_ = state;
689}
690
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700691void MediaTransportPair::LoopbackDatagramTransport::FlushAsyncInvokes() {
692 dc_transport_.FlushAsyncInvokes();
693}
694
Niels Möllere0446cb2018-11-30 09:35:52 +0100695} // namespace webrtc