1 /*
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 */
10 #include "webrtc/test/direct_transport.h"
11
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 #include "webrtc/call.h"
15 #include "webrtc/system_wrappers/include/clock.h"
16
17 namespace webrtc {
18 namespace test {
19
DirectTransport(Call * send_call)20 DirectTransport::DirectTransport(Call* send_call)
21 : DirectTransport(FakeNetworkPipe::Config(), send_call) {}
22
DirectTransport(const FakeNetworkPipe::Config & config,Call * send_call)23 DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
24 Call* send_call)
25 : send_call_(send_call),
26 packet_event_(false, false),
27 thread_(NetworkProcess, this, "NetworkProcess"),
28 clock_(Clock::GetRealTimeClock()),
29 shutting_down_(false),
30 fake_network_(clock_, config) {
31 thread_.Start();
32 }
33
~DirectTransport()34 DirectTransport::~DirectTransport() { StopSending(); }
35
SetConfig(const FakeNetworkPipe::Config & config)36 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
37 fake_network_.SetConfig(config);
38 }
39
StopSending()40 void DirectTransport::StopSending() {
41 {
42 rtc::CritScope crit(&lock_);
43 shutting_down_ = true;
44 }
45
46 packet_event_.Set();
47 thread_.Stop();
48 }
49
SetReceiver(PacketReceiver * receiver)50 void DirectTransport::SetReceiver(PacketReceiver* receiver) {
51 fake_network_.SetReceiver(receiver);
52 }
53
SendRtp(const uint8_t * data,size_t length,const PacketOptions & options)54 bool DirectTransport::SendRtp(const uint8_t* data,
55 size_t length,
56 const PacketOptions& options) {
57 if (send_call_) {
58 rtc::SentPacket sent_packet(options.packet_id,
59 clock_->TimeInMilliseconds());
60 send_call_->OnSentPacket(sent_packet);
61 }
62 fake_network_.SendPacket(data, length);
63 packet_event_.Set();
64 return true;
65 }
66
SendRtcp(const uint8_t * data,size_t length)67 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
68 fake_network_.SendPacket(data, length);
69 packet_event_.Set();
70 return true;
71 }
72
GetAverageDelayMs()73 int DirectTransport::GetAverageDelayMs() {
74 return fake_network_.AverageDelay();
75 }
76
NetworkProcess(void * transport)77 bool DirectTransport::NetworkProcess(void* transport) {
78 return static_cast<DirectTransport*>(transport)->SendPackets();
79 }
80
SendPackets()81 bool DirectTransport::SendPackets() {
82 fake_network_.Process();
83 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
84 if (wait_time_ms > 0) {
85 packet_event_.Wait(static_cast<int>(wait_time_ms));
86 }
87 rtc::CritScope crit(&lock_);
88 return shutting_down_ ? false : true;
89 }
90 } // namespace test
91 } // namespace webrtc
92