blob: b26aadd0544ea9a9ff802285d4a1eea25e47b05b [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
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000012#include "webrtc/call.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010013#include "webrtc/system_wrappers/include/clock.h"
kwibergac9f8762016-09-30 22:29:43 -070014#include "webrtc/test/gtest.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000015
16namespace webrtc {
17namespace test {
18
stefanf116bd02015-10-27 08:29:42 -070019DirectTransport::DirectTransport(Call* send_call)
Peter Boström8c38e8b2015-11-26 17:45:47 +010020 : DirectTransport(FakeNetworkPipe::Config(), send_call) {}
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000021
stefanf116bd02015-10-27 08:29:42 -070022DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
23 Call* send_call)
24 : send_call_(send_call),
Peter Boström5811a392015-12-10 13:02:50 +010025 packet_event_(false, false),
Peter Boström8c38e8b2015-11-26 17:45:47 +010026 thread_(NetworkProcess, this, "NetworkProcess"),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000027 clock_(Clock::GetRealTimeClock()),
28 shutting_down_(false),
Peter Boströmd3c94472015-12-09 11:20:58 +010029 fake_network_(clock_, config) {
Peter Boström8c38e8b2015-11-26 17:45:47 +010030 thread_.Start();
Sergey Ulanove2b15012016-11-22 16:08:30 -080031 if (send_call_) {
32 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
33 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
34 }
pbos@webrtc.org96684672013-08-12 12:59:04 +000035}
36
37DirectTransport::~DirectTransport() { StopSending(); }
38
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000039void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
40 fake_network_.SetConfig(config);
41}
42
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000043void DirectTransport::StopSending() {
44 {
Peter Boströmf2f82832015-05-01 13:00:41 +020045 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000046 shutting_down_ = true;
47 }
48
Peter Boström5811a392015-12-10 13:02:50 +010049 packet_event_.Set();
Peter Boström8c38e8b2015-11-26 17:45:47 +010050 thread_.Stop();
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000051}
pbos@webrtc.org96684672013-08-12 12:59:04 +000052
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000053void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000054 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000055}
56
stefan1d8a5062015-10-02 03:39:33 -070057bool DirectTransport::SendRtp(const uint8_t* data,
58 size_t length,
59 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070060 if (send_call_) {
61 rtc::SentPacket sent_packet(options.packet_id,
62 clock_->TimeInMilliseconds());
63 send_call_->OnSentPacket(sent_packet);
64 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000065 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010066 packet_event_.Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000067 return true;
68}
69
pbos@webrtc.org27326b62013-11-20 12:17:04 +000070bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000071 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010072 packet_event_.Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000073 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000074}
75
Stefan Holmerff2a6352016-01-14 10:00:21 +010076int DirectTransport::GetAverageDelayMs() {
77 return fake_network_.AverageDelay();
78}
79
pbos@webrtc.org96684672013-08-12 12:59:04 +000080bool DirectTransport::NetworkProcess(void* transport) {
81 return static_cast<DirectTransport*>(transport)->SendPackets();
82}
83
84bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000085 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000086 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000087 if (wait_time_ms > 0) {
Peter Boström5811a392015-12-10 13:02:50 +010088 packet_event_.Wait(static_cast<int>(wait_time_ms));
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000089 }
Peter Boströmf2f82832015-05-01 13:00:41 +020090 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000091 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000092}
93} // namespace test
94} // namespace webrtc