blob: 591e154b1406b3dc4fe088bb4aa9d006dd54f13a [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
12#include "testing/gtest/include/gtest/gtest.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000013
14#include "webrtc/call.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010015#include "webrtc/system_wrappers/include/clock.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000016
17namespace webrtc {
18namespace test {
19
stefanf116bd02015-10-27 08:29:42 -070020DirectTransport::DirectTransport(Call* send_call)
Peter Boström8c38e8b2015-11-26 17:45:47 +010021 : DirectTransport(FakeNetworkPipe::Config(), send_call) {}
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000022
stefanf116bd02015-10-27 08:29:42 -070023DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
24 Call* send_call)
25 : send_call_(send_call),
Peter Boström5811a392015-12-10 13:02:50 +010026 packet_event_(false, false),
Peter Boström8c38e8b2015-11-26 17:45:47 +010027 thread_(NetworkProcess, this, "NetworkProcess"),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000028 clock_(Clock::GetRealTimeClock()),
29 shutting_down_(false),
Peter Boströmd3c94472015-12-09 11:20:58 +010030 fake_network_(clock_, config) {
Peter Boström8c38e8b2015-11-26 17:45:47 +010031 thread_.Start();
pbos@webrtc.org96684672013-08-12 12:59:04 +000032}
33
34DirectTransport::~DirectTransport() { StopSending(); }
35
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000036void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
37 fake_network_.SetConfig(config);
38}
39
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000040void DirectTransport::StopSending() {
41 {
Peter Boströmf2f82832015-05-01 13:00:41 +020042 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000043 shutting_down_ = true;
44 }
45
Peter Boström5811a392015-12-10 13:02:50 +010046 packet_event_.Set();
Peter Boström8c38e8b2015-11-26 17:45:47 +010047 thread_.Stop();
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000048}
pbos@webrtc.org96684672013-08-12 12:59:04 +000049
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000050void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000051 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000052}
53
stefan1d8a5062015-10-02 03:39:33 -070054bool DirectTransport::SendRtp(const uint8_t* data,
55 size_t length,
56 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070057 if (send_call_) {
58 rtc::SentPacket sent_packet(options.packet_id,
59 clock_->TimeInMilliseconds());
60 send_call_->OnSentPacket(sent_packet);
61 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000062 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010063 packet_event_.Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000064 return true;
65}
66
pbos@webrtc.org27326b62013-11-20 12:17:04 +000067bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000068 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010069 packet_event_.Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000070 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000071}
72
Stefan Holmerff2a6352016-01-14 10:00:21 +010073int DirectTransport::GetAverageDelayMs() {
74 return fake_network_.AverageDelay();
75}
76
pbos@webrtc.org96684672013-08-12 12:59:04 +000077bool DirectTransport::NetworkProcess(void* transport) {
78 return static_cast<DirectTransport*>(transport)->SendPackets();
79}
80
81bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000082 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000083 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000084 if (wait_time_ms > 0) {
Peter Boström5811a392015-12-10 13:02:50 +010085 packet_event_.Wait(static_cast<int>(wait_time_ms));
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000086 }
Peter Boströmf2f82832015-05-01 13:00:41 +020087 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000088 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000089}
90} // namespace test
91} // namespace webrtc