blob: 18d3ee636269ea7b10a90fa15c2a458e664a57a9 [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();
pbos@webrtc.org96684672013-08-12 12:59:04 +000031}
32
33DirectTransport::~DirectTransport() { StopSending(); }
34
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000035void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
36 fake_network_.SetConfig(config);
37}
38
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000039void DirectTransport::StopSending() {
40 {
Peter Boströmf2f82832015-05-01 13:00:41 +020041 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000042 shutting_down_ = true;
43 }
44
Peter Boström5811a392015-12-10 13:02:50 +010045 packet_event_.Set();
Peter Boström8c38e8b2015-11-26 17:45:47 +010046 thread_.Stop();
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000047}
pbos@webrtc.org96684672013-08-12 12:59:04 +000048
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000049void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000050 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000051}
52
stefan1d8a5062015-10-02 03:39:33 -070053bool DirectTransport::SendRtp(const uint8_t* data,
54 size_t length,
55 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070056 if (send_call_) {
57 rtc::SentPacket sent_packet(options.packet_id,
58 clock_->TimeInMilliseconds());
59 send_call_->OnSentPacket(sent_packet);
60 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000061 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010062 packet_event_.Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000063 return true;
64}
65
pbos@webrtc.org27326b62013-11-20 12:17:04 +000066bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000067 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010068 packet_event_.Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000069 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000070}
71
Stefan Holmerff2a6352016-01-14 10:00:21 +010072int DirectTransport::GetAverageDelayMs() {
73 return fake_network_.AverageDelay();
74}
75
pbos@webrtc.org96684672013-08-12 12:59:04 +000076bool DirectTransport::NetworkProcess(void* transport) {
77 return static_cast<DirectTransport*>(transport)->SendPackets();
78}
79
80bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000081 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000082 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000083 if (wait_time_ms > 0) {
Peter Boström5811a392015-12-10 13:02:50 +010084 packet_event_.Wait(static_cast<int>(wait_time_ms));
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000085 }
Peter Boströmf2f82832015-05-01 13:00:41 +020086 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000087 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000088}
89} // namespace test
90} // namespace webrtc