blob: 35f3f92bfc51b1a139b24d5592dea851db05f663 [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(
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),
minyue20c84cc2017-04-10 16:57:57 -070049 fake_network_(clock_, config, std::move(demuxer)) {
eladalon0860bee2017-08-24 06:56:15 -070050 RTC_DCHECK(task_queue);
Sergey Ulanove2b15012016-11-22 16:08:30 -080051 if (send_call_) {
52 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
53 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
54 }
eladalon413ee9a2017-08-22 04:02:52 -070055 SendPackets();
pbos@webrtc.org96684672013-08-12 12:59:04 +000056}
57
eladalon413ee9a2017-08-22 04:02:52 -070058DirectTransport::~DirectTransport() {
59 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
60 // Constructor updates |next_scheduled_task_|, so it's guaranteed to
61 // be initialized.
62 task_queue_->CancelTask(next_scheduled_task_);
63}
pbos@webrtc.org96684672013-08-12 12:59:04 +000064
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000065void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
66 fake_network_.SetConfig(config);
67}
68
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000069void DirectTransport::StopSending() {
eladaloncff98dc2017-08-24 05:04:56 -070070 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
eladalon413ee9a2017-08-22 04:02:52 -070071 task_queue_->CancelTask(next_scheduled_task_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000072}
pbos@webrtc.org96684672013-08-12 12:59:04 +000073
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000074void DirectTransport::SetReceiver(PacketReceiver* receiver) {
eladalon413ee9a2017-08-22 04:02:52 -070075 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000076 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000077}
78
stefan1d8a5062015-10-02 03:39:33 -070079bool DirectTransport::SendRtp(const uint8_t* data,
80 size_t length,
81 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070082 if (send_call_) {
83 rtc::SentPacket sent_packet(options.packet_id,
84 clock_->TimeInMilliseconds());
85 send_call_->OnSentPacket(sent_packet);
86 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000087 fake_network_.SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:04 +000088 return true;
89}
90
pbos@webrtc.org27326b62013-11-20 12:17:04 +000091bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000092 fake_network_.SendPacket(data, length);
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000093 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000094}
95
Stefan Holmerff2a6352016-01-14 10:00:21 +010096int DirectTransport::GetAverageDelayMs() {
97 return fake_network_.AverageDelay();
98}
99
eladalon413ee9a2017-08-22 04:02:52 -0700100void DirectTransport::SendPackets() {
101 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000102
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000103 fake_network_.Process();
eladalon413ee9a2017-08-22 04:02:52 -0700104
105 int64_t delay_ms = fake_network_.TimeUntilNextProcess();
106 next_scheduled_task_ = task_queue_->PostDelayedTask([this]() {
107 SendPackets();
108 }, delay_ms);
pbos@webrtc.org96684672013-08-12 12:59:04 +0000109}
110} // namespace test
111} // namespace webrtc