blob: 81f3b697102bd3201bd7a6316ff4277f627cde85 [file] [log] [blame]
pbos@webrtc.org96684672013-08-12 12:59:04 +00001/*
2 * Copyright (c) 2013 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 */
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000010#include "webrtc/test/direct_transport.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000011
ossuf515ab82016-12-07 04:52:58 -080012#include "webrtc/call/call.h"
eladalon413ee9a2017-08-22 04:02:52 -070013#include "webrtc/rtc_base/ptr_util.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010014#include "webrtc/system_wrappers/include/clock.h"
eladalon413ee9a2017-08-22 04:02:52 -070015#include "webrtc/test/single_threaded_task_queue.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000016
17namespace webrtc {
18namespace test {
19
minyue20c84cc2017-04-10 16:57:57 -070020DirectTransport::DirectTransport(
21 Call* send_call,
22 const std::map<uint8_t, MediaType>& payload_type_map)
23 : DirectTransport(FakeNetworkPipe::Config(), send_call, payload_type_map) {}
24
25DirectTransport::DirectTransport(
26 const FakeNetworkPipe::Config& config,
27 Call* send_call,
28 const std::map<uint8_t, MediaType>& payload_type_map)
29 : DirectTransport(
30 config,
31 send_call,
32 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {}
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000033
stefanf116bd02015-10-27 08:29:42 -070034DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
minyue20c84cc2017-04-10 16:57:57 -070035 Call* send_call,
36 std::unique_ptr<Demuxer> demuxer)
eladalon413ee9a2017-08-22 04:02:52 -070037 : DirectTransport(nullptr, config, send_call, std::move(demuxer)) {}
38
39DirectTransport::DirectTransport(
40 SingleThreadedTaskQueueForTesting* task_queue,
41 Call* send_call,
42 const std::map<uint8_t, MediaType>& payload_type_map)
43 : DirectTransport(task_queue,
44 FakeNetworkPipe::Config(),
45 send_call,
46 payload_type_map) {
47}
48
49DirectTransport::DirectTransport(
50 SingleThreadedTaskQueueForTesting* task_queue,
51 const FakeNetworkPipe::Config& config,
52 Call* send_call,
53 const std::map<uint8_t, MediaType>& payload_type_map)
54 : DirectTransport(
55 task_queue,
56 config,
57 send_call,
58 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {
59}
60
61DirectTransport::DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
62 const FakeNetworkPipe::Config& config,
63 Call* send_call,
64 std::unique_ptr<Demuxer> demuxer)
stefanf116bd02015-10-27 08:29:42 -070065 : send_call_(send_call),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000066 clock_(Clock::GetRealTimeClock()),
eladalon413ee9a2017-08-22 04:02:52 -070067 task_queue_(task_queue),
minyue20c84cc2017-04-10 16:57:57 -070068 fake_network_(clock_, config, std::move(demuxer)) {
eladalon413ee9a2017-08-22 04:02:52 -070069 // TODO(eladalon): When the deprecated ctors are removed, this check
70 // can be restored. https://bugs.chromium.org/p/webrtc/issues/detail?id=8125
71 // RTC_DCHECK(task_queue);
72 if (!task_queue) {
73 deprecated_task_queue_ =
74 rtc::MakeUnique<SingleThreadedTaskQueueForTesting>("deprecated_queue");
75 task_queue_ = deprecated_task_queue_.get();
76 }
77
Sergey Ulanove2b15012016-11-22 16:08:30 -080078 if (send_call_) {
79 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
80 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
81 }
eladalon413ee9a2017-08-22 04:02:52 -070082 SendPackets();
pbos@webrtc.org96684672013-08-12 12:59:04 +000083}
84
eladalon413ee9a2017-08-22 04:02:52 -070085DirectTransport::~DirectTransport() {
86 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
87 // Constructor updates |next_scheduled_task_|, so it's guaranteed to
88 // be initialized.
89 task_queue_->CancelTask(next_scheduled_task_);
90}
pbos@webrtc.org96684672013-08-12 12:59:04 +000091
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000092void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
93 fake_network_.SetConfig(config);
94}
95
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000096void DirectTransport::StopSending() {
eladalon413ee9a2017-08-22 04:02:52 -070097 task_queue_->CancelTask(next_scheduled_task_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000098}
pbos@webrtc.org96684672013-08-12 12:59:04 +000099
pbos@webrtc.org74fa4892013-08-23 09:19:30 +0000100void DirectTransport::SetReceiver(PacketReceiver* receiver) {
eladalon413ee9a2017-08-22 04:02:52 -0700101 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000102 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000103}
104
stefan1d8a5062015-10-02 03:39:33 -0700105bool DirectTransport::SendRtp(const uint8_t* data,
106 size_t length,
107 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -0700108 if (send_call_) {
109 rtc::SentPacket sent_packet(options.packet_id,
110 clock_->TimeInMilliseconds());
111 send_call_->OnSentPacket(sent_packet);
112 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000113 fake_network_.SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000114 return true;
115}
116
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000117bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000118 fake_network_.SendPacket(data, length);
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000119 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +0000120}
121
Stefan Holmerff2a6352016-01-14 10:00:21 +0100122int DirectTransport::GetAverageDelayMs() {
123 return fake_network_.AverageDelay();
124}
125
minyue20c84cc2017-04-10 16:57:57 -0700126DirectTransport::ForceDemuxer::ForceDemuxer(MediaType media_type)
127 : media_type_(media_type) {}
128
129void DirectTransport::ForceDemuxer::SetReceiver(PacketReceiver* receiver) {
130 packet_receiver_ = receiver;
131}
132
133void DirectTransport::ForceDemuxer::DeliverPacket(
134 const NetworkPacket* packet,
135 const PacketTime& packet_time) {
136 if (!packet_receiver_)
137 return;
138 packet_receiver_->DeliverPacket(media_type_, packet->data(),
139 packet->data_length(), packet_time);
140}
141
eladalon413ee9a2017-08-22 04:02:52 -0700142void DirectTransport::SendPackets() {
143 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000144
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000145 fake_network_.Process();
eladalon413ee9a2017-08-22 04:02:52 -0700146
147 int64_t delay_ms = fake_network_.TimeUntilNextProcess();
148 next_scheduled_task_ = task_queue_->PostDelayedTask([this]() {
149 SendPackets();
150 }, delay_ms);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000151}
152} // namespace test
153} // namespace webrtc