blob: dddbe589092f068fd4d9e9777c50542991425e40 [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 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#include "test/direct_transport.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000011
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "call/call.h"
13#include "rtc_base/ptr_util.h"
14#include "system_wrappers/include/clock.h"
15#include "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(
eladalon413ee9a2017-08-22 04:02:52 -070021 SingleThreadedTaskQueueForTesting* task_queue,
22 Call* send_call,
23 const std::map<uint8_t, MediaType>& payload_type_map)
24 : DirectTransport(task_queue,
25 FakeNetworkPipe::Config(),
26 send_call,
27 payload_type_map) {
28}
29
30DirectTransport::DirectTransport(
31 SingleThreadedTaskQueueForTesting* task_queue,
32 const FakeNetworkPipe::Config& config,
33 Call* send_call,
34 const std::map<uint8_t, MediaType>& payload_type_map)
35 : DirectTransport(
36 task_queue,
37 config,
38 send_call,
39 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {
40}
41
42DirectTransport::DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
43 const FakeNetworkPipe::Config& config,
44 Call* send_call,
45 std::unique_ptr<Demuxer> demuxer)
stefanf116bd02015-10-27 08:29:42 -070046 : send_call_(send_call),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000047 clock_(Clock::GetRealTimeClock()),
eladalon413ee9a2017-08-22 04:02:52 -070048 task_queue_(task_queue),
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020049 fake_network_(rtc::MakeUnique<FakeNetworkPipe>(clock_, config,
50 std::move(demuxer))) {
51 Start();
52}
53
54DirectTransport::DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
55 std::unique_ptr<FakeNetworkPipe> pipe,
56 Call* send_call)
57 : send_call_(send_call),
58 clock_(Clock::GetRealTimeClock()),
59 task_queue_(task_queue),
60 fake_network_(std::move(pipe)) {
61 Start();
pbos@webrtc.org96684672013-08-12 12:59:04 +000062}
63
eladalon413ee9a2017-08-22 04:02:52 -070064DirectTransport::~DirectTransport() {
65 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
66 // Constructor updates |next_scheduled_task_|, so it's guaranteed to
67 // be initialized.
68 task_queue_->CancelTask(next_scheduled_task_);
69}
pbos@webrtc.org96684672013-08-12 12:59:04 +000070
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000071void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020072 fake_network_->SetConfig(config);
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000073}
74
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000075void DirectTransport::StopSending() {
eladaloncff98dc2017-08-24 05:04:56 -070076 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
eladalon413ee9a2017-08-22 04:02:52 -070077 task_queue_->CancelTask(next_scheduled_task_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000078}
pbos@webrtc.org96684672013-08-12 12:59:04 +000079
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000080void DirectTransport::SetReceiver(PacketReceiver* receiver) {
eladalon413ee9a2017-08-22 04:02:52 -070081 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020082 fake_network_->SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000083}
84
stefan1d8a5062015-10-02 03:39:33 -070085bool DirectTransport::SendRtp(const uint8_t* data,
86 size_t length,
87 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070088 if (send_call_) {
89 rtc::SentPacket sent_packet(options.packet_id,
90 clock_->TimeInMilliseconds());
91 send_call_->OnSentPacket(sent_packet);
92 }
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020093 fake_network_->SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:04 +000094 return true;
95}
96
pbos@webrtc.org27326b62013-11-20 12:17:04 +000097bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020098 fake_network_->SendPacket(data, length);
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000099 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +0000100}
101
Stefan Holmerff2a6352016-01-14 10:00:21 +0100102int DirectTransport::GetAverageDelayMs() {
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200103 return fake_network_->AverageDelay();
104}
105
106void DirectTransport::Start() {
107 RTC_DCHECK(task_queue_);
108 if (send_call_) {
109 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
110 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
111 }
112 SendPackets();
Stefan Holmerff2a6352016-01-14 10:00:21 +0100113}
114
eladalon413ee9a2017-08-22 04:02:52 -0700115void DirectTransport::SendPackets() {
116 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000117
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200118 fake_network_->Process();
eladalon413ee9a2017-08-22 04:02:52 -0700119
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200120 int64_t delay_ms = fake_network_->TimeUntilNextProcess();
eladalon413ee9a2017-08-22 04:02:52 -0700121 next_scheduled_task_ = task_queue_->PostDelayedTask([this]() {
122 SendPackets();
123 }, delay_ms);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000124}
125} // namespace test
126} // namespace webrtc