OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include "webrtc/test/direct_transport.h" | 10 #include "webrtc/test/direct_transport.h" |
11 | 11 |
12 #include "webrtc/call/call.h" | 12 #include "webrtc/call/call.h" |
13 #include "webrtc/rtc_base/ptr_util.h" | 13 #include "webrtc/rtc_base/ptr_util.h" |
14 #include "webrtc/system_wrappers/include/clock.h" | 14 #include "webrtc/system_wrappers/include/clock.h" |
15 #include "webrtc/test/single_threaded_task_queue.h" | 15 #include "webrtc/test/single_threaded_task_queue.h" |
16 | 16 |
17 namespace webrtc { | 17 namespace webrtc { |
18 namespace test { | 18 namespace test { |
19 | 19 |
20 DirectTransport::DirectTransport( | 20 DirectTransport::DirectTransport( |
21 SingleThreadedTaskQueueForTesting* task_queue, | 21 SingleThreadedTaskQueueForTesting* task_queue, |
22 Call* send_call, | 22 Call* send_call, |
23 const std::map<uint8_t, MediaType>& payload_type_map) | 23 const std::map<uint8_t, MediaType>& payload_type_map) |
24 : DirectTransport(task_queue, | 24 : DirectTransport(task_queue, |
25 FakeNetworkPipe::Config(), | 25 FakeNetworkPipe::Config(), |
26 send_call, | 26 send_call, |
27 payload_type_map) { | 27 payload_type_map, |
28 } | 28 std::unique_ptr<test::RtpFileWriter>()) {} |
29 | 29 |
30 DirectTransport::DirectTransport( | 30 DirectTransport::DirectTransport( |
31 SingleThreadedTaskQueueForTesting* task_queue, | 31 SingleThreadedTaskQueueForTesting* task_queue, |
32 const FakeNetworkPipe::Config& config, | 32 const FakeNetworkPipe::Config& config, |
33 Call* send_call, | 33 Call* send_call, |
34 const std::map<uint8_t, MediaType>& payload_type_map) | 34 const std::map<uint8_t, MediaType>& payload_type_map, |
| 35 std::unique_ptr<test::RtpFileWriter> rtp_file_writer) |
35 : DirectTransport( | 36 : DirectTransport( |
36 task_queue, | 37 task_queue, |
37 config, | 38 config, |
38 send_call, | 39 send_call, |
39 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) { | 40 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map)), |
40 } | 41 std::move(rtp_file_writer)) {} |
41 | 42 |
42 DirectTransport::DirectTransport(SingleThreadedTaskQueueForTesting* task_queue, | 43 DirectTransport::DirectTransport( |
43 const FakeNetworkPipe::Config& config, | 44 SingleThreadedTaskQueueForTesting* task_queue, |
44 Call* send_call, | 45 const FakeNetworkPipe::Config& config, |
45 std::unique_ptr<Demuxer> demuxer) | 46 Call* send_call, |
| 47 std::unique_ptr<Demuxer> demuxer, |
| 48 std::unique_ptr<test::RtpFileWriter> rtp_file_writer) |
46 : send_call_(send_call), | 49 : send_call_(send_call), |
47 clock_(Clock::GetRealTimeClock()), | 50 clock_(Clock::GetRealTimeClock()), |
48 task_queue_(task_queue), | 51 task_queue_(task_queue), |
49 fake_network_(clock_, config, std::move(demuxer)) { | 52 fake_network_(clock_, config, std::move(demuxer)), |
| 53 receiver_(nullptr), |
| 54 start_ms_(rtc::TimeMillis()), |
| 55 rtp_file_writer_(std::move(rtp_file_writer)) { |
50 RTC_DCHECK(task_queue); | 56 RTC_DCHECK(task_queue); |
| 57 |
| 58 if (rtp_file_writer_.get()) { |
| 59 // Set us up as proxy receiver so that we can dump rtp packets. |
| 60 fake_network_.SetReceiver(this); |
| 61 } |
| 62 |
51 if (send_call_) { | 63 if (send_call_) { |
52 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); | 64 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
53 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | 65 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
54 } | 66 } |
55 SendPackets(); | 67 SendPackets(); |
56 } | 68 } |
57 | 69 |
58 DirectTransport::~DirectTransport() { | 70 DirectTransport::~DirectTransport() { |
59 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 71 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
60 // Constructor updates |next_scheduled_task_|, so it's guaranteed to | 72 // Constructor updates |next_scheduled_task_|, so it's guaranteed to |
61 // be initialized. | 73 // be initialized. |
62 task_queue_->CancelTask(next_scheduled_task_); | 74 task_queue_->CancelTask(next_scheduled_task_); |
63 } | 75 } |
64 | 76 |
65 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) { | 77 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) { |
66 fake_network_.SetConfig(config); | 78 fake_network_.SetConfig(config); |
67 } | 79 } |
68 | 80 |
69 void DirectTransport::StopSending() { | 81 void DirectTransport::StopSending() { |
70 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 82 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
71 task_queue_->CancelTask(next_scheduled_task_); | 83 task_queue_->CancelTask(next_scheduled_task_); |
72 } | 84 } |
73 | 85 |
74 void DirectTransport::SetReceiver(PacketReceiver* receiver) { | 86 void DirectTransport::SetReceiver(PacketReceiver* receiver) { |
75 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 87 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
76 fake_network_.SetReceiver(receiver); | 88 if (rtp_file_writer_.get()) { |
| 89 // Will be called from DeliverPacket() in this instance instead. |
| 90 receiver_ = receiver; |
| 91 } else { |
| 92 fake_network_.SetReceiver(receiver_); |
| 93 } |
77 } | 94 } |
78 | 95 |
79 bool DirectTransport::SendRtp(const uint8_t* data, | 96 bool DirectTransport::SendRtp(const uint8_t* data, |
80 size_t length, | 97 size_t length, |
81 const PacketOptions& options) { | 98 const PacketOptions& options) { |
82 if (send_call_) { | 99 if (send_call_) { |
83 rtc::SentPacket sent_packet(options.packet_id, | 100 rtc::SentPacket sent_packet(options.packet_id, |
84 clock_->TimeInMilliseconds()); | 101 clock_->TimeInMilliseconds()); |
85 send_call_->OnSentPacket(sent_packet); | 102 send_call_->OnSentPacket(sent_packet); |
86 } | 103 } |
87 fake_network_.SendPacket(data, length); | 104 fake_network_.SendPacket(data, length); |
88 return true; | 105 return true; |
89 } | 106 } |
90 | 107 |
91 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) { | 108 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) { |
92 fake_network_.SendPacket(data, length); | 109 fake_network_.SendPacket(data, length); |
93 return true; | 110 return true; |
94 } | 111 } |
95 | 112 |
96 int DirectTransport::GetAverageDelayMs() { | 113 int DirectTransport::GetAverageDelayMs() { |
97 return fake_network_.AverageDelay(); | 114 return fake_network_.AverageDelay(); |
98 } | 115 } |
99 | 116 |
| 117 PacketReceiver::DeliveryStatus DirectTransport::DeliverPacket( |
| 118 MediaType media_type, |
| 119 const uint8_t* packet, |
| 120 size_t length, |
| 121 const PacketTime& packet_time) { |
| 122 if (rtp_file_writer_.get()) { |
| 123 RtpPacket rtp_packet; |
| 124 memcpy(rtp_packet.data, packet, length); |
| 125 rtp_packet.length = length; |
| 126 rtp_packet.original_length = length; |
| 127 rtp_packet.time_ms = rtc::TimeMillis() - start_ms_; |
| 128 rtp_file_writer_->WritePacket(&rtp_packet); |
| 129 } |
| 130 |
| 131 if (!receiver_) |
| 132 return PacketReceiver::DELIVERY_PACKET_ERROR; |
| 133 return receiver_->DeliverPacket(media_type, packet, length, packet_time); |
| 134 } |
| 135 |
100 void DirectTransport::SendPackets() { | 136 void DirectTransport::SendPackets() { |
101 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 137 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
102 | 138 |
103 fake_network_.Process(); | 139 fake_network_.Process(); |
104 | 140 |
105 int64_t delay_ms = fake_network_.TimeUntilNextProcess(); | 141 int64_t delay_ms = fake_network_.TimeUntilNextProcess(); |
106 next_scheduled_task_ = task_queue_->PostDelayedTask([this]() { | 142 next_scheduled_task_ = task_queue_->PostDelayedTask([this]() { |
107 SendPackets(); | 143 SendPackets(); |
108 }, delay_ms); | 144 }, delay_ms); |
109 } | 145 } |
110 } // namespace test | 146 } // namespace test |
111 } // namespace webrtc | 147 } // namespace webrtc |
OLD | NEW |