blob: 370425c5374930f7562e3f23f71277444a43d2e5 [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"
Henrik Kjellander98f53512015-10-28 18:17:40 +010013#include "webrtc/system_wrappers/include/clock.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000014
15namespace webrtc {
16namespace test {
17
minyue20c84cc2017-04-10 16:57:57 -070018DirectTransport::DirectTransport(
19 Call* send_call,
20 const std::map<uint8_t, MediaType>& payload_type_map)
21 : DirectTransport(FakeNetworkPipe::Config(), send_call, payload_type_map) {}
22
23DirectTransport::DirectTransport(
24 const FakeNetworkPipe::Config& config,
25 Call* send_call,
26 const std::map<uint8_t, MediaType>& payload_type_map)
27 : DirectTransport(
28 config,
29 send_call,
30 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {}
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000031
stefanf116bd02015-10-27 08:29:42 -070032DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
minyue20c84cc2017-04-10 16:57:57 -070033 Call* send_call,
34 std::unique_ptr<Demuxer> demuxer)
stefanf116bd02015-10-27 08:29:42 -070035 : send_call_(send_call),
Peter Boström5811a392015-12-10 13:02:50 +010036 packet_event_(false, false),
Peter Boström8c38e8b2015-11-26 17:45:47 +010037 thread_(NetworkProcess, this, "NetworkProcess"),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000038 clock_(Clock::GetRealTimeClock()),
39 shutting_down_(false),
minyue20c84cc2017-04-10 16:57:57 -070040 fake_network_(clock_, config, std::move(demuxer)) {
Peter Boström8c38e8b2015-11-26 17:45:47 +010041 thread_.Start();
Sergey Ulanove2b15012016-11-22 16:08:30 -080042 if (send_call_) {
43 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
44 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
45 }
pbos@webrtc.org96684672013-08-12 12:59:04 +000046}
47
48DirectTransport::~DirectTransport() { StopSending(); }
49
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000050void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
51 fake_network_.SetConfig(config);
52}
53
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000054void DirectTransport::StopSending() {
55 {
Peter Boströmf2f82832015-05-01 13:00:41 +020056 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000057 shutting_down_ = true;
58 }
59
Peter Boström5811a392015-12-10 13:02:50 +010060 packet_event_.Set();
Peter Boström8c38e8b2015-11-26 17:45:47 +010061 thread_.Stop();
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000062}
pbos@webrtc.org96684672013-08-12 12:59:04 +000063
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000064void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000065 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000066}
67
stefan1d8a5062015-10-02 03:39:33 -070068bool DirectTransport::SendRtp(const uint8_t* data,
69 size_t length,
70 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070071 if (send_call_) {
72 rtc::SentPacket sent_packet(options.packet_id,
73 clock_->TimeInMilliseconds());
74 send_call_->OnSentPacket(sent_packet);
75 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000076 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010077 packet_event_.Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000078 return true;
79}
80
pbos@webrtc.org27326b62013-11-20 12:17:04 +000081bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000082 fake_network_.SendPacket(data, length);
Peter Boström5811a392015-12-10 13:02:50 +010083 packet_event_.Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000084 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000085}
86
Stefan Holmerff2a6352016-01-14 10:00:21 +010087int DirectTransport::GetAverageDelayMs() {
88 return fake_network_.AverageDelay();
89}
90
minyue20c84cc2017-04-10 16:57:57 -070091DirectTransport::ForceDemuxer::ForceDemuxer(MediaType media_type)
92 : media_type_(media_type) {}
93
94void DirectTransport::ForceDemuxer::SetReceiver(PacketReceiver* receiver) {
95 packet_receiver_ = receiver;
96}
97
98void DirectTransport::ForceDemuxer::DeliverPacket(
99 const NetworkPacket* packet,
100 const PacketTime& packet_time) {
101 if (!packet_receiver_)
102 return;
103 packet_receiver_->DeliverPacket(media_type_, packet->data(),
104 packet->data_length(), packet_time);
105}
106
pbos@webrtc.org96684672013-08-12 12:59:04 +0000107bool DirectTransport::NetworkProcess(void* transport) {
108 return static_cast<DirectTransport*>(transport)->SendPackets();
109}
110
111bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000112 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +0000113 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000114 if (wait_time_ms > 0) {
Peter Boström5811a392015-12-10 13:02:50 +0100115 packet_event_.Wait(static_cast<int>(wait_time_ms));
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000116 }
Peter Boströmf2f82832015-05-01 13:00:41 +0200117 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +0000118 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +0000119}
120} // namespace test
121} // namespace webrtc