blob: 7e9c5aefeb838af6b1b9023d5f785daef8e75e0a [file] [log] [blame]
pbos@webrtc.org96684672013-08-12 12:59:041/*
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 */
Mirko Bonadei92ea95e2017-09-15 04:47:3110#include "test/direct_transport.h"
pbos@webrtc.org96684672013-08-12 12:59:0411
Karl Wiberg918f50c2018-07-05 09:40:3312#include "absl/memory/memory.h"
Danil Chapovalovba2ba592019-09-27 09:10:4513#include "api/task_queue/task_queue_base.h"
14#include "api/units/time_delta.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3115#include "call/call.h"
Artem Titov46c4e602018-08-17 12:26:5416#include "call/fake_network_pipe.h"
Danil Chapovalov00ca0042021-07-05 17:06:1717#include "modules/rtp_rtcp/source/rtp_util.h"
Danil Chapovalovba2ba592019-09-27 09:10:4518#include "rtc_base/task_utils/repeating_task.h"
Sebastian Jansson11c012a2019-03-29 13:17:2619#include "rtc_base/time_utils.h"
pbos@webrtc.org96684672013-08-12 12:59:0420
21namespace webrtc {
22namespace test {
23
Sebastian Jansson09408112018-04-24 12:41:2224Demuxer::Demuxer(const std::map<uint8_t, MediaType>& payload_type_map)
25 : payload_type_map_(payload_type_map) {}
26
27MediaType Demuxer::GetMediaType(const uint8_t* packet_data,
28 const size_t packet_length) const {
Danil Chapovalov00ca0042021-07-05 17:06:1729 if (IsRtpPacket(rtc::MakeArrayView(packet_data, packet_length))) {
Sebastian Jansson09408112018-04-24 12:41:2230 RTC_CHECK_GE(packet_length, 2);
31 const uint8_t payload_type = packet_data[1] & 0x7f;
32 std::map<uint8_t, MediaType>::const_iterator it =
33 payload_type_map_.find(payload_type);
34 RTC_CHECK(it != payload_type_map_.end())
35 << "payload type " << static_cast<int>(payload_type) << " unknown.";
36 return it->second;
37 }
38 return MediaType::ANY;
39}
40
minyue20c84cc2017-04-10 23:57:5741DirectTransport::DirectTransport(
Danil Chapovalovba2ba592019-09-27 09:10:4542 TaskQueueBase* task_queue,
Artem Titov46c4e602018-08-17 12:26:5443 std::unique_ptr<SimulatedPacketReceiverInterface> pipe,
Sebastian Jansson09408112018-04-24 12:41:2244 Call* send_call,
45 const std::map<uint8_t, MediaType>& payload_type_map)
Christoffer Rodbrod2817d82017-10-24 14:26:4946 : send_call_(send_call),
Christoffer Rodbrod2817d82017-10-24 14:26:4947 task_queue_(task_queue),
Sebastian Jansson09408112018-04-24 12:41:2248 demuxer_(payload_type_map),
Christoffer Rodbrod2817d82017-10-24 14:26:4949 fake_network_(std::move(pipe)) {
50 Start();
pbos@webrtc.org96684672013-08-12 12:59:0451}
52
eladalon413ee9a2017-08-22 11:02:5253DirectTransport::~DirectTransport() {
Danil Chapovalovba2ba592019-09-27 09:10:4554 next_process_task_.Stop();
pbos@webrtc.org468e19a2013-08-12 14:28:0055}
pbos@webrtc.org96684672013-08-12 12:59:0456
pbos@webrtc.org74fa4892013-08-23 09:19:3057void DirectTransport::SetReceiver(PacketReceiver* receiver) {
Christoffer Rodbrod2817d82017-10-24 14:26:4958 fake_network_->SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:0459}
60
stefan1d8a5062015-10-02 10:39:3361bool DirectTransport::SendRtp(const uint8_t* data,
62 size_t length,
63 const PacketOptions& options) {
stefanf116bd02015-10-27 15:29:4264 if (send_call_) {
Sebastian Jansson11c012a2019-03-29 13:17:2665 rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
Sebastian Jansson03789972018-10-09 16:27:5766 sent_packet.info.included_in_feedback = options.included_in_feedback;
67 sent_packet.info.included_in_allocation = options.included_in_allocation;
Sebastian Jansson156d11d2018-09-28 15:21:3468 sent_packet.info.packet_size_bytes = length;
69 sent_packet.info.packet_type = rtc::PacketType::kData;
stefanf116bd02015-10-27 15:29:4270 send_call_->OnSentPacket(sent_packet);
71 }
Sebastian Jansson09408112018-04-24 12:41:2272 SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:0473 return true;
74}
75
pbos@webrtc.org27326b62013-11-20 12:17:0476bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
Sebastian Jansson09408112018-04-24 12:41:2277 SendPacket(data, length);
stefan@webrtc.orgfaada6e2013-12-18 20:28:2578 return true;
pbos@webrtc.org96684672013-08-12 12:59:0479}
80
Sebastian Jansson09408112018-04-24 12:41:2281void DirectTransport::SendPacket(const uint8_t* data, size_t length) {
82 MediaType media_type = demuxer_.GetMediaType(data, length);
Sebastian Jansson11c012a2019-03-29 13:17:2683 int64_t send_time_us = rtc::TimeMicros();
Sebastian Jansson09408112018-04-24 12:41:2284 fake_network_->DeliverPacket(media_type, rtc::CopyOnWriteBuffer(data, length),
Sebastian Jansson11c012a2019-03-29 13:17:2685 send_time_us);
Markus Handella5a4be12020-07-08 14:09:2186 MutexLock lock(&process_lock_);
Danil Chapovalovba2ba592019-09-27 09:10:4587 if (!next_process_task_.Running())
Sebastian Jansson836fee12019-02-08 15:08:1088 ProcessPackets();
Sebastian Jansson09408112018-04-24 12:41:2289}
90
Stefan Holmerff2a6352016-01-14 09:00:2191int DirectTransport::GetAverageDelayMs() {
Christoffer Rodbrod2817d82017-10-24 14:26:4992 return fake_network_->AverageDelay();
93}
94
95void DirectTransport::Start() {
96 RTC_DCHECK(task_queue_);
97 if (send_call_) {
98 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
99 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
100 }
Stefan Holmerff2a6352016-01-14 09:00:21101}
102
Sebastian Jansson836fee12019-02-08 15:08:10103void DirectTransport::ProcessPackets() {
Danil Chapovalovba2ba592019-09-27 09:10:45104 absl::optional<int64_t> initial_delay_ms =
105 fake_network_->TimeUntilNextProcess();
106 if (initial_delay_ms == absl::nullopt)
107 return;
108
109 next_process_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov0c626af2020-02-10 10:16:00110 task_queue_, TimeDelta::Millis(*initial_delay_ms), [this] {
Danil Chapovalovba2ba592019-09-27 09:10:45111 fake_network_->Process();
112 if (auto delay_ms = fake_network_->TimeUntilNextProcess())
Danil Chapovalov0c626af2020-02-10 10:16:00113 return TimeDelta::Millis(*delay_ms);
Danil Chapovalovba2ba592019-09-27 09:10:45114 // Otherwise stop the task.
Markus Handella5a4be12020-07-08 14:09:21115 MutexLock lock(&process_lock_);
Danil Chapovalovba2ba592019-09-27 09:10:45116 next_process_task_.Stop();
117 // Since this task is stopped, return value doesn't matter.
118 return TimeDelta::Zero();
119 });
pbos@webrtc.org96684672013-08-12 12:59:04120}
121} // namespace test
122} // namespace webrtc