blob: 8c7f240ee43b5858cc01ca6e903b3ed02627572b [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
Steve Antona59dcc32019-03-25 13:53:07 -070013#include "absl/algorithm/container.h"
Niels Möllere0446cb2018-11-30 09:35:52 +010014#include "absl/memory/memory.h"
Steve Anton10542f22019-01-11 09:11:00 -080015#include "rtc_base/time_utils.h"
Niels Möllere0446cb2018-11-30 09:35:52 +010016
17namespace webrtc {
18
19namespace {
20
21// Wrapper used to hand out unique_ptrs to loopback media transports without
22// ownership changes.
23class WrapperMediaTransport : public MediaTransportInterface {
24 public:
25 explicit WrapperMediaTransport(MediaTransportInterface* wrapped)
26 : wrapped_(wrapped) {}
27
28 RTCError SendAudioFrame(uint64_t channel_id,
29 MediaTransportEncodedAudioFrame frame) override {
30 return wrapped_->SendAudioFrame(channel_id, std::move(frame));
31 }
32
33 RTCError SendVideoFrame(
34 uint64_t channel_id,
35 const MediaTransportEncodedVideoFrame& frame) override {
36 return wrapped_->SendVideoFrame(channel_id, frame);
37 }
38
Niels Möller1c7f5f62018-12-10 11:06:02 +010039 void SetKeyFrameRequestCallback(
40 MediaTransportKeyFrameRequestCallback* callback) override {
41 wrapped_->SetKeyFrameRequestCallback(callback);
42 }
43
Niels Möllere0446cb2018-11-30 09:35:52 +010044 RTCError RequestKeyFrame(uint64_t channel_id) override {
45 return wrapped_->RequestKeyFrame(channel_id);
46 }
47
48 void SetReceiveAudioSink(MediaTransportAudioSinkInterface* sink) override {
49 wrapped_->SetReceiveAudioSink(sink);
50 }
51
52 void SetReceiveVideoSink(MediaTransportVideoSinkInterface* sink) override {
53 wrapped_->SetReceiveVideoSink(sink);
54 }
55
Niels Möller46879152019-01-07 15:54:47 +010056 void AddTargetTransferRateObserver(
57 TargetTransferRateObserver* observer) override {
58 wrapped_->AddTargetTransferRateObserver(observer);
59 }
60
61 void RemoveTargetTransferRateObserver(
62 TargetTransferRateObserver* observer) override {
63 wrapped_->RemoveTargetTransferRateObserver(observer);
64 }
65
Niels Möllere0446cb2018-11-30 09:35:52 +010066 void SetMediaTransportStateCallback(
67 MediaTransportStateCallback* callback) override {
68 wrapped_->SetMediaTransportStateCallback(callback);
69 }
70
Bjorn Mellem9ded4852019-02-28 12:27:11 -080071 RTCError OpenChannel(int channel_id) override {
72 return wrapped_->OpenChannel(channel_id);
73 }
74
Niels Möllere0446cb2018-11-30 09:35:52 +010075 RTCError SendData(int channel_id,
76 const SendDataParams& params,
77 const rtc::CopyOnWriteBuffer& buffer) override {
78 return wrapped_->SendData(channel_id, params, buffer);
79 }
80
81 RTCError CloseChannel(int channel_id) override {
82 return wrapped_->CloseChannel(channel_id);
83 }
84
85 void SetDataSink(DataChannelSink* sink) override {
86 wrapped_->SetDataSink(sink);
87 }
88
Bjorn A Mellemb689af42019-08-21 10:44:59 -070089 bool IsReadyToSend() const override { return wrapped_->IsReadyToSend(); }
90
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -080091 void SetAllocatedBitrateLimits(
92 const MediaTransportAllocatedBitrateLimits& limits) override {}
93
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -080094 absl::optional<std::string> GetTransportParametersOffer() const override {
95 return wrapped_->GetTransportParametersOffer();
96 }
97
Niels Möllere0446cb2018-11-30 09:35:52 +010098 private:
99 MediaTransportInterface* wrapped_;
100};
101
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700102class WrapperDatagramTransport : public DatagramTransportInterface {
103 public:
104 explicit WrapperDatagramTransport(DatagramTransportInterface* wrapped)
105 : wrapped_(wrapped) {}
106
107 // Datagram transport overrides.
108 void Connect(rtc::PacketTransportInternal* packet_transport) override {
109 return wrapped_->Connect(packet_transport);
110 }
111
112 CongestionControlInterface* congestion_control() override {
113 return wrapped_->congestion_control();
114 }
115
116 void SetTransportStateCallback(
117 MediaTransportStateCallback* callback) override {
118 return wrapped_->SetTransportStateCallback(callback);
119 }
120
121 RTCError SendDatagram(rtc::ArrayView<const uint8_t> data,
122 DatagramId datagram_id) override {
123 return wrapped_->SendDatagram(data, datagram_id);
124 }
125
126 size_t GetLargestDatagramSize() const override {
127 return wrapped_->GetLargestDatagramSize();
128 }
129
130 void SetDatagramSink(DatagramSinkInterface* sink) override {
131 return wrapped_->SetDatagramSink(sink);
132 }
133
134 std::string GetTransportParameters() const override {
135 return wrapped_->GetTransportParameters();
136 }
137
138 // Data channel overrides.
139 RTCError OpenChannel(int channel_id) override {
140 return wrapped_->OpenChannel(channel_id);
141 }
142
143 RTCError SendData(int channel_id,
144 const SendDataParams& params,
145 const rtc::CopyOnWriteBuffer& buffer) override {
146 return wrapped_->SendData(channel_id, params, buffer);
147 }
148
149 RTCError CloseChannel(int channel_id) override {
150 return wrapped_->CloseChannel(channel_id);
151 }
152
153 void SetDataSink(DataChannelSink* sink) override {
154 wrapped_->SetDataSink(sink);
155 }
156
157 bool IsReadyToSend() const override { return wrapped_->IsReadyToSend(); }
158
159 private:
160 DatagramTransportInterface* wrapped_;
161};
162
Niels Möllere0446cb2018-11-30 09:35:52 +0100163} // namespace
164
165WrapperMediaTransportFactory::WrapperMediaTransportFactory(
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700166 MediaTransportInterface* wrapped_media_transport,
167 DatagramTransportInterface* wrapped_datagram_transport)
168 : wrapped_media_transport_(wrapped_media_transport),
169 wrapped_datagram_transport_(wrapped_datagram_transport) {}
Niels Möllere0446cb2018-11-30 09:35:52 +0100170
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800171WrapperMediaTransportFactory::WrapperMediaTransportFactory(
172 MediaTransportFactory* wrapped)
173 : wrapped_factory_(wrapped) {}
174
Niels Möllere0446cb2018-11-30 09:35:52 +0100175RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
176WrapperMediaTransportFactory::CreateMediaTransport(
177 rtc::PacketTransportInternal* packet_transport,
178 rtc::Thread* network_thread,
179 const MediaTransportSettings& settings) {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800180 created_transport_count_++;
181 if (wrapped_factory_) {
182 return wrapped_factory_->CreateMediaTransport(packet_transport,
183 network_thread, settings);
184 }
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700185 return {absl::make_unique<WrapperMediaTransport>(wrapped_media_transport_)};
186}
187
188RTCErrorOr<std::unique_ptr<DatagramTransportInterface>>
189WrapperMediaTransportFactory::CreateDatagramTransport(
190 rtc::Thread* network_thread,
191 const MediaTransportSettings& settings) {
192 created_transport_count_++;
193 if (wrapped_factory_) {
194 return wrapped_factory_->CreateDatagramTransport(network_thread, settings);
195 }
196 return {
197 absl::make_unique<WrapperDatagramTransport>(wrapped_datagram_transport_)};
Niels Möllere0446cb2018-11-30 09:35:52 +0100198}
199
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800200std::string WrapperMediaTransportFactory::GetTransportName() const {
201 if (wrapped_factory_) {
202 return wrapped_factory_->GetTransportName();
203 }
204 return "wrapped-transport";
205}
206
207int WrapperMediaTransportFactory::created_transport_count() const {
208 return created_transport_count_;
209}
210
211RTCErrorOr<std::unique_ptr<MediaTransportInterface>>
212WrapperMediaTransportFactory::CreateMediaTransport(
213 rtc::Thread* network_thread,
214 const MediaTransportSettings& settings) {
215 created_transport_count_++;
216 if (wrapped_factory_) {
217 return wrapped_factory_->CreateMediaTransport(network_thread, settings);
218 }
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700219 return {absl::make_unique<WrapperMediaTransport>(wrapped_media_transport_)};
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800220}
221
222MediaTransportPair::MediaTransportPair(rtc::Thread* thread)
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700223 : first_(thread),
224 second_(thread),
225 first_datagram_transport_(thread),
226 second_datagram_transport_(thread),
227 first_factory_(&first_, &first_datagram_transport_),
228 second_factory_(&second_, &second_datagram_transport_) {
229 first_.Connect(&second_);
230 second_.Connect(&first_);
231 first_datagram_transport_.Connect(&second_datagram_transport_);
232 second_datagram_transport_.Connect(&first_datagram_transport_);
233}
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800234
235MediaTransportPair::~MediaTransportPair() = default;
236
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700237MediaTransportPair::LoopbackDataChannelTransport::LoopbackDataChannelTransport(
238 rtc::Thread* thread)
239 : thread_(thread) {}
240
241MediaTransportPair::LoopbackDataChannelTransport::
242 ~LoopbackDataChannelTransport() {
243 RTC_CHECK(data_sink_ == nullptr);
244}
245
246void MediaTransportPair::LoopbackDataChannelTransport::Connect(
247 LoopbackDataChannelTransport* other) {
248 other_ = other;
249}
250
Niels Möllere0446cb2018-11-30 09:35:52 +0100251MediaTransportPair::LoopbackMediaTransport::LoopbackMediaTransport(
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700252 rtc::Thread* thread)
253 : dc_transport_(thread), thread_(thread), other_(nullptr) {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800254 RTC_LOG(LS_INFO) << "LoopbackMediaTransport";
255}
Niels Möllere0446cb2018-11-30 09:35:52 +0100256
257MediaTransportPair::LoopbackMediaTransport::~LoopbackMediaTransport() {
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800258 RTC_LOG(LS_INFO) << "~LoopbackMediaTransport";
Niels Möllere0446cb2018-11-30 09:35:52 +0100259 rtc::CritScope lock(&sink_lock_);
260 RTC_CHECK(audio_sink_ == nullptr);
261 RTC_CHECK(video_sink_ == nullptr);
Niels Möller46879152019-01-07 15:54:47 +0100262 RTC_CHECK(target_transfer_rate_observers_.empty());
263 RTC_CHECK(rtt_observers_.empty());
Niels Möllere0446cb2018-11-30 09:35:52 +0100264}
265
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700266void MediaTransportPair::LoopbackMediaTransport::Connect(
267 LoopbackMediaTransport* other) {
268 other_ = other;
269 dc_transport_.Connect(&other->dc_transport_);
270}
271
272void MediaTransportPair::LoopbackMediaTransport::Connect(
273 rtc::PacketTransportInternal* packet_transport) {}
274
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800275absl::optional<std::string>
276MediaTransportPair::LoopbackMediaTransport::GetTransportParametersOffer()
277 const {
278 return "loopback-media-transport-parameters";
279}
280
Niels Möllere0446cb2018-11-30 09:35:52 +0100281RTCError MediaTransportPair::LoopbackMediaTransport::SendAudioFrame(
282 uint64_t channel_id,
283 MediaTransportEncodedAudioFrame frame) {
284 {
285 rtc::CritScope lock(&stats_lock_);
286 ++stats_.sent_audio_frames;
287 }
288 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id, frame] {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100289 other_->OnData(channel_id, frame);
Niels Möllere0446cb2018-11-30 09:35:52 +0100290 });
291 return RTCError::OK();
292}
293
294RTCError MediaTransportPair::LoopbackMediaTransport::SendVideoFrame(
295 uint64_t channel_id,
296 const MediaTransportEncodedVideoFrame& frame) {
297 {
298 rtc::CritScope lock(&stats_lock_);
299 ++stats_.sent_video_frames;
300 }
301 // Ensure that we own the referenced data.
302 MediaTransportEncodedVideoFrame frame_copy = frame;
303 frame_copy.Retain();
304 invoker_.AsyncInvoke<void>(
Mirko Bonadei80a86872019-02-04 15:01:43 +0100305 RTC_FROM_HERE, thread_, [this, channel_id, frame_copy]() mutable {
Niels Möllere0446cb2018-11-30 09:35:52 +0100306 other_->OnData(channel_id, std::move(frame_copy));
307 });
308 return RTCError::OK();
309}
310
Niels Möller1c7f5f62018-12-10 11:06:02 +0100311void MediaTransportPair::LoopbackMediaTransport::SetKeyFrameRequestCallback(
312 MediaTransportKeyFrameRequestCallback* callback) {
313 rtc::CritScope lock(&sink_lock_);
314 if (callback) {
315 RTC_CHECK(key_frame_callback_ == nullptr);
316 }
317 key_frame_callback_ = callback;
318}
319
Niels Möllere0446cb2018-11-30 09:35:52 +0100320RTCError MediaTransportPair::LoopbackMediaTransport::RequestKeyFrame(
321 uint64_t channel_id) {
Niels Möller1c7f5f62018-12-10 11:06:02 +0100322 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
323 other_->OnKeyFrameRequested(channel_id);
324 });
Niels Möllere0446cb2018-11-30 09:35:52 +0100325 return RTCError::OK();
326}
327
328void MediaTransportPair::LoopbackMediaTransport::SetReceiveAudioSink(
329 MediaTransportAudioSinkInterface* sink) {
330 rtc::CritScope lock(&sink_lock_);
331 if (sink) {
332 RTC_CHECK(audio_sink_ == nullptr);
333 }
334 audio_sink_ = sink;
335}
336
337void MediaTransportPair::LoopbackMediaTransport::SetReceiveVideoSink(
338 MediaTransportVideoSinkInterface* sink) {
339 rtc::CritScope lock(&sink_lock_);
340 if (sink) {
341 RTC_CHECK(video_sink_ == nullptr);
342 }
343 video_sink_ = sink;
344}
345
Niels Möller46879152019-01-07 15:54:47 +0100346void MediaTransportPair::LoopbackMediaTransport::AddTargetTransferRateObserver(
347 TargetTransferRateObserver* observer) {
348 RTC_CHECK(observer);
349 {
350 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700351 RTC_CHECK(
352 !absl::c_linear_search(target_transfer_rate_observers_, observer));
Niels Möller46879152019-01-07 15:54:47 +0100353 target_transfer_rate_observers_.push_back(observer);
354 }
355 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
356 RTC_DCHECK_RUN_ON(thread_);
357 const DataRate kBitrate = DataRate::kbps(300);
358 const Timestamp now = Timestamp::us(rtc::TimeMicros());
359
360 TargetTransferRate transfer_rate;
361 transfer_rate.at_time = now;
362 transfer_rate.target_rate = kBitrate;
363 transfer_rate.network_estimate.at_time = now;
364 transfer_rate.network_estimate.round_trip_time = TimeDelta::ms(20);
365 transfer_rate.network_estimate.bwe_period = TimeDelta::seconds(3);
366 transfer_rate.network_estimate.bandwidth = kBitrate;
367
368 rtc::CritScope cs(&sink_lock_);
369
370 for (auto* o : target_transfer_rate_observers_) {
371 o->OnTargetTransferRate(transfer_rate);
372 }
373 });
374}
375
376void MediaTransportPair::LoopbackMediaTransport::
377 RemoveTargetTransferRateObserver(TargetTransferRateObserver* observer) {
378 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700379 auto it = absl::c_find(target_transfer_rate_observers_, observer);
Niels Möller46879152019-01-07 15:54:47 +0100380 if (it == target_transfer_rate_observers_.end()) {
381 RTC_LOG(LS_WARNING)
382 << "Attempt to remove an unknown TargetTransferRate observer";
383 return;
384 }
385 target_transfer_rate_observers_.erase(it);
386}
387
388void MediaTransportPair::LoopbackMediaTransport::AddRttObserver(
389 MediaTransportRttObserver* observer) {
390 RTC_CHECK(observer);
391 {
392 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700393 RTC_CHECK(!absl::c_linear_search(rtt_observers_, observer));
Niels Möller46879152019-01-07 15:54:47 +0100394 rtt_observers_.push_back(observer);
395 }
396 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
397 RTC_DCHECK_RUN_ON(thread_);
398
399 rtc::CritScope cs(&sink_lock_);
400 for (auto* o : rtt_observers_) {
401 o->OnRttUpdated(20);
402 }
403 });
404}
405
406void MediaTransportPair::LoopbackMediaTransport::RemoveRttObserver(
407 MediaTransportRttObserver* observer) {
408 rtc::CritScope cs(&sink_lock_);
Steve Antona59dcc32019-03-25 13:53:07 -0700409 auto it = absl::c_find(rtt_observers_, observer);
Niels Möller46879152019-01-07 15:54:47 +0100410 if (it == rtt_observers_.end()) {
411 RTC_LOG(LS_WARNING) << "Attempt to remove an unknown RTT observer";
412 return;
413 }
414 rtt_observers_.erase(it);
415}
416
Niels Möllere0446cb2018-11-30 09:35:52 +0100417void MediaTransportPair::LoopbackMediaTransport::SetMediaTransportStateCallback(
418 MediaTransportStateCallback* callback) {
419 rtc::CritScope lock(&sink_lock_);
420 state_callback_ = callback;
421 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this] {
422 RTC_DCHECK_RUN_ON(thread_);
423 OnStateChanged();
424 });
425}
426
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800427RTCError MediaTransportPair::LoopbackMediaTransport::OpenChannel(
428 int channel_id) {
429 // No-op. No need to open channels for the loopback.
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700430 return dc_transport_.OpenChannel(channel_id);
431}
432
433RTCError MediaTransportPair::LoopbackDataChannelTransport::OpenChannel(
434 int channel_id) {
435 // No-op. No need to open channels for the loopback.
Bjorn Mellem9ded4852019-02-28 12:27:11 -0800436 return RTCError::OK();
437}
438
Niels Möllere0446cb2018-11-30 09:35:52 +0100439RTCError MediaTransportPair::LoopbackMediaTransport::SendData(
440 int channel_id,
441 const SendDataParams& params,
442 const rtc::CopyOnWriteBuffer& buffer) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700443 return dc_transport_.SendData(channel_id, params, buffer);
444}
445
446RTCError MediaTransportPair::LoopbackDataChannelTransport::SendData(
447 int channel_id,
448 const SendDataParams& params,
449 const rtc::CopyOnWriteBuffer& buffer) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100450 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_,
451 [this, channel_id, params, buffer] {
452 other_->OnData(channel_id, params.type, buffer);
453 });
454 return RTCError::OK();
455}
456
457RTCError MediaTransportPair::LoopbackMediaTransport::CloseChannel(
458 int channel_id) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700459 return dc_transport_.CloseChannel(channel_id);
460}
461
462RTCError MediaTransportPair::LoopbackDataChannelTransport::CloseChannel(
463 int channel_id) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100464 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, channel_id] {
465 other_->OnRemoteCloseChannel(channel_id);
466 rtc::CritScope lock(&sink_lock_);
467 if (data_sink_) {
468 data_sink_->OnChannelClosed(channel_id);
469 }
470 });
471 return RTCError::OK();
472}
473
474void MediaTransportPair::LoopbackMediaTransport::SetDataSink(
475 DataChannelSink* sink) {
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700476 dc_transport_.SetDataSink(sink);
477}
478
479bool MediaTransportPair::LoopbackMediaTransport::IsReadyToSend() const {
480 return dc_transport_.IsReadyToSend();
481}
482
483void MediaTransportPair::LoopbackDataChannelTransport::SetDataSink(
484 DataChannelSink* sink) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100485 rtc::CritScope lock(&sink_lock_);
486 data_sink_ = sink;
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700487 if (data_sink_ && ready_to_send_) {
488 data_sink_->OnReadyToSend();
489 }
Niels Möllere0446cb2018-11-30 09:35:52 +0100490}
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700491
492bool MediaTransportPair::LoopbackDataChannelTransport::IsReadyToSend() const {
493 rtc::CritScope lock(&sink_lock_);
494 return ready_to_send_;
495}
496
Niels Möllere0446cb2018-11-30 09:35:52 +0100497void MediaTransportPair::LoopbackMediaTransport::SetState(
498 MediaTransportState state) {
499 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, state] {
500 RTC_DCHECK_RUN_ON(thread_);
501 state_ = state;
502 OnStateChanged();
503 });
504}
505
506void MediaTransportPair::LoopbackMediaTransport::FlushAsyncInvokes() {
507 invoker_.Flush(thread_);
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700508 dc_transport_.FlushAsyncInvokes();
509}
510
511void MediaTransportPair::LoopbackDataChannelTransport::FlushAsyncInvokes() {
512 invoker_.Flush(thread_);
Niels Möllere0446cb2018-11-30 09:35:52 +0100513}
514
515MediaTransportPair::Stats
516MediaTransportPair::LoopbackMediaTransport::GetStats() {
517 rtc::CritScope lock(&stats_lock_);
518 return stats_;
519}
520
521void MediaTransportPair::LoopbackMediaTransport::OnData(
522 uint64_t channel_id,
523 MediaTransportEncodedAudioFrame frame) {
524 {
525 rtc::CritScope lock(&sink_lock_);
Sergey Silkine049eba2019-02-18 09:52:26 +0000526 if (audio_sink_) {
Niels Möllere0446cb2018-11-30 09:35:52 +0100527 audio_sink_->OnData(channel_id, frame);
528 }
529 }
530 {
531 rtc::CritScope lock(&stats_lock_);
532 ++stats_.received_audio_frames;
533 }
534}
535
536void MediaTransportPair::LoopbackMediaTransport::OnData(
537 uint64_t channel_id,
538 MediaTransportEncodedVideoFrame frame) {
539 {
540 rtc::CritScope lock(&sink_lock_);
541 if (video_sink_) {
542 video_sink_->OnData(channel_id, frame);
543 }
544 }
545 {
546 rtc::CritScope lock(&stats_lock_);
547 ++stats_.received_video_frames;
548 }
549}
550
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700551void MediaTransportPair::LoopbackDataChannelTransport::OnData(
Niels Möllere0446cb2018-11-30 09:35:52 +0100552 int channel_id,
553 DataMessageType type,
554 const rtc::CopyOnWriteBuffer& buffer) {
555 rtc::CritScope lock(&sink_lock_);
556 if (data_sink_) {
557 data_sink_->OnDataReceived(channel_id, type, buffer);
558 }
559}
560
Niels Möller1c7f5f62018-12-10 11:06:02 +0100561void MediaTransportPair::LoopbackMediaTransport::OnKeyFrameRequested(
562 int channel_id) {
563 rtc::CritScope lock(&sink_lock_);
564 if (key_frame_callback_) {
565 key_frame_callback_->OnKeyFrameRequested(channel_id);
566 }
567}
568
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700569void MediaTransportPair::LoopbackDataChannelTransport::OnRemoteCloseChannel(
Niels Möllere0446cb2018-11-30 09:35:52 +0100570 int channel_id) {
571 rtc::CritScope lock(&sink_lock_);
572 if (data_sink_) {
573 data_sink_->OnChannelClosing(channel_id);
574 data_sink_->OnChannelClosed(channel_id);
575 }
576}
577
578void MediaTransportPair::LoopbackMediaTransport::OnStateChanged() {
579 rtc::CritScope lock(&sink_lock_);
580 if (state_callback_) {
581 state_callback_->OnStateChanged(state_);
582 }
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700583
584 dc_transport_.OnReadyToSend(state_ == MediaTransportState::kWritable);
585}
586
587void MediaTransportPair::LoopbackDataChannelTransport::OnReadyToSend(
588 bool ready_to_send) {
589 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, thread_, [this, ready_to_send] {
590 rtc::CritScope lock(&sink_lock_);
591 ready_to_send_ = ready_to_send;
592 // Propagate state to data channel sink, if present.
593 if (data_sink_ && ready_to_send_) {
594 data_sink_->OnReadyToSend();
595 }
596 });
Niels Möllere0446cb2018-11-30 09:35:52 +0100597}
Piotr (Peter) Slatala48c54932019-01-28 06:50:38 -0800598
599void MediaTransportPair::LoopbackMediaTransport::SetAllocatedBitrateLimits(
600 const MediaTransportAllocatedBitrateLimits& limits) {}
601
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700602MediaTransportPair::LoopbackDatagramTransport::LoopbackDatagramTransport(
603 rtc::Thread* thread)
604 : dc_transport_(thread) {}
605
606void MediaTransportPair::LoopbackDatagramTransport::Connect(
607 LoopbackDatagramTransport* other) {
608 dc_transport_.Connect(&other->dc_transport_);
609}
610
611void MediaTransportPair::LoopbackDatagramTransport::Connect(
612 rtc::PacketTransportInternal* packet_transport) {}
613
614CongestionControlInterface*
615MediaTransportPair::LoopbackDatagramTransport::congestion_control() {
616 return nullptr;
617}
618
619void MediaTransportPair::LoopbackDatagramTransport::SetTransportStateCallback(
620 MediaTransportStateCallback* callback) {}
621
622RTCError MediaTransportPair::LoopbackDatagramTransport::SendDatagram(
623 rtc::ArrayView<const uint8_t> data,
624 DatagramId datagram_id) {
625 return RTCError::OK();
626}
627
628size_t MediaTransportPair::LoopbackDatagramTransport::GetLargestDatagramSize()
629 const {
630 return 0;
631}
632
633void MediaTransportPair::LoopbackDatagramTransport::SetDatagramSink(
634 DatagramSinkInterface* sink) {}
635
636std::string
637MediaTransportPair::LoopbackDatagramTransport::GetTransportParameters() const {
638 return transport_parameters_;
639}
640
641RTCError MediaTransportPair::LoopbackDatagramTransport::OpenChannel(
642 int channel_id) {
643 return dc_transport_.OpenChannel(channel_id);
644}
645
646RTCError MediaTransportPair::LoopbackDatagramTransport::SendData(
647 int channel_id,
648 const SendDataParams& params,
649 const rtc::CopyOnWriteBuffer& buffer) {
650 return dc_transport_.SendData(channel_id, params, buffer);
651}
652
653RTCError MediaTransportPair::LoopbackDatagramTransport::CloseChannel(
654 int channel_id) {
655 return dc_transport_.CloseChannel(channel_id);
656}
657
658void MediaTransportPair::LoopbackDatagramTransport::SetDataSink(
659 DataChannelSink* sink) {
660 dc_transport_.SetDataSink(sink);
661}
662
663bool MediaTransportPair::LoopbackDatagramTransport::IsReadyToSend() const {
664 return dc_transport_.IsReadyToSend();
665}
666
667void MediaTransportPair::LoopbackDatagramTransport::SetState(
668 MediaTransportState state) {
669 dc_transport_.OnReadyToSend(state == MediaTransportState::kWritable);
670}
671
672void MediaTransportPair::LoopbackDatagramTransport::FlushAsyncInvokes() {
673 dc_transport_.FlushAsyncInvokes();
674}
675
Niels Möllere0446cb2018-11-30 09:35:52 +0100676} // namespace webrtc