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 | 10 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
46 | 46 |
47 void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; } | 47 void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; } |
48 int64_t LastProcessedRtt() const override { return rtt_ms_; } | 48 int64_t LastProcessedRtt() const override { return rtt_ms_; } |
49 int64_t rtt_ms_; | 49 int64_t rtt_ms_; |
50 }; | 50 }; |
51 | 51 |
52 class SendTransport : public Transport, | 52 class SendTransport : public Transport, |
53 public RtpData { | 53 public RtpData { |
54 public: | 54 public: |
55 SendTransport() | 55 SendTransport() |
56 : receiver_(NULL), | 56 : receiver_(nullptr), |
57 clock_(NULL), | 57 clock_(nullptr), |
58 delay_ms_(0), | 58 delay_ms_(0), |
59 rtp_packets_sent_(0) { | 59 rtp_packets_sent_(0), |
60 } | 60 keepalive_payload_type_(0), |
61 num_keepalive_sent_(0) {} | |
61 | 62 |
62 void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { | 63 void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { |
63 receiver_ = receiver; | 64 receiver_ = receiver; |
64 } | 65 } |
65 void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) { | 66 void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) { |
66 clock_ = clock; | 67 clock_ = clock; |
67 delay_ms_ = delay_ms; | 68 delay_ms_ = delay_ms; |
68 } | 69 } |
69 bool SendRtp(const uint8_t* data, | 70 bool SendRtp(const uint8_t* data, |
70 size_t len, | 71 size_t len, |
71 const PacketOptions& options) override { | 72 const PacketOptions& options) override { |
72 RTPHeader header; | 73 RTPHeader header; |
73 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 74 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
74 EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header)); | 75 EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header)); |
75 ++rtp_packets_sent_; | 76 ++rtp_packets_sent_; |
77 if (header.payloadType == keepalive_payload_type_) | |
78 ++num_keepalive_sent_; | |
76 last_rtp_header_ = header; | 79 last_rtp_header_ = header; |
77 return true; | 80 return true; |
78 } | 81 } |
79 bool SendRtcp(const uint8_t* data, size_t len) override { | 82 bool SendRtcp(const uint8_t* data, size_t len) override { |
80 test::RtcpPacketParser parser; | 83 test::RtcpPacketParser parser; |
81 parser.Parse(data, len); | 84 parser.Parse(data, len); |
82 last_nack_list_ = parser.nack()->packet_ids(); | 85 last_nack_list_ = parser.nack()->packet_ids(); |
83 | 86 |
84 if (clock_) { | 87 if (clock_) { |
85 clock_->AdvanceTimeMilliseconds(delay_ms_); | 88 clock_->AdvanceTimeMilliseconds(delay_ms_); |
86 } | 89 } |
87 EXPECT_TRUE(receiver_); | 90 EXPECT_TRUE(receiver_); |
88 EXPECT_EQ(0, receiver_->IncomingRtcpPacket(data, len)); | 91 EXPECT_EQ(0, receiver_->IncomingRtcpPacket(data, len)); |
89 return true; | 92 return true; |
90 } | 93 } |
91 int32_t OnReceivedPayloadData(const uint8_t* payload_data, | 94 int32_t OnReceivedPayloadData(const uint8_t* payload_data, |
92 size_t payload_size, | 95 size_t payload_size, |
93 const WebRtcRTPHeader* rtp_header) override { | 96 const WebRtcRTPHeader* rtp_header) override { |
94 return 0; | 97 return 0; |
95 } | 98 } |
99 void SetKeepalivePayloadType(uint8_t payload_type) { | |
100 keepalive_payload_type_ = payload_type; | |
101 } | |
102 size_t NumKeepaliveSent() { return num_keepalive_sent_; } | |
96 ModuleRtpRtcpImpl* receiver_; | 103 ModuleRtpRtcpImpl* receiver_; |
97 SimulatedClock* clock_; | 104 SimulatedClock* clock_; |
98 int64_t delay_ms_; | 105 int64_t delay_ms_; |
99 int rtp_packets_sent_; | 106 int rtp_packets_sent_; |
100 RTPHeader last_rtp_header_; | 107 RTPHeader last_rtp_header_; |
101 std::vector<uint16_t> last_nack_list_; | 108 std::vector<uint16_t> last_nack_list_; |
109 uint8_t keepalive_payload_type_; | |
110 size_t num_keepalive_sent_; | |
102 }; | 111 }; |
103 | 112 |
104 class RtpRtcpModule : public RtcpPacketTypeCounterObserver { | 113 class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
105 public: | 114 public: |
106 explicit RtpRtcpModule(SimulatedClock* clock) | 115 explicit RtpRtcpModule(SimulatedClock* clock) |
107 : receive_statistics_(ReceiveStatistics::Create(clock)), | 116 : receive_statistics_(ReceiveStatistics::Create(clock)), |
108 remote_ssrc_(0), | 117 remote_ssrc_(0), |
109 retransmission_rate_limiter_(clock, kMaxRttMs) { | 118 retransmission_rate_limiter_(clock, kMaxRttMs), |
110 RtpRtcp::Configuration config; | 119 clock_(clock) { |
111 config.audio = false; | 120 CreateModuleImpl(); |
112 config.clock = clock; | |
113 config.outgoing_transport = &transport_; | |
114 config.receive_statistics = receive_statistics_.get(); | |
115 config.rtcp_packet_type_counter_observer = this; | |
116 config.rtt_stats = &rtt_stats_; | |
117 config.retransmission_rate_limiter = &retransmission_rate_limiter_; | |
118 | |
119 impl_.reset(new ModuleRtpRtcpImpl(config)); | |
120 impl_->SetRTCPStatus(RtcpMode::kCompound); | |
121 | |
122 transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock); | 121 transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock); |
123 } | 122 } |
124 | 123 |
125 RtcpPacketTypeCounter packets_sent_; | 124 RtcpPacketTypeCounter packets_sent_; |
126 RtcpPacketTypeCounter packets_received_; | 125 RtcpPacketTypeCounter packets_received_; |
127 std::unique_ptr<ReceiveStatistics> receive_statistics_; | 126 std::unique_ptr<ReceiveStatistics> receive_statistics_; |
128 SendTransport transport_; | 127 SendTransport transport_; |
129 RtcpRttStatsTestImpl rtt_stats_; | 128 RtcpRttStatsTestImpl rtt_stats_; |
130 std::unique_ptr<ModuleRtpRtcpImpl> impl_; | 129 std::unique_ptr<ModuleRtpRtcpImpl> impl_; |
131 uint32_t remote_ssrc_; | 130 uint32_t remote_ssrc_; |
132 RateLimiter retransmission_rate_limiter_; | 131 RateLimiter retransmission_rate_limiter_; |
132 VideoSendStream::Config::Rtp::KeepAlive keepalive_config_; | |
133 | 133 |
134 void SetRemoteSsrc(uint32_t ssrc) { | 134 void SetRemoteSsrc(uint32_t ssrc) { |
135 remote_ssrc_ = ssrc; | 135 remote_ssrc_ = ssrc; |
136 impl_->SetRemoteSSRC(ssrc); | 136 impl_->SetRemoteSSRC(ssrc); |
137 } | 137 } |
138 | 138 |
139 void RtcpPacketTypesCounterUpdated( | 139 void RtcpPacketTypesCounterUpdated( |
140 uint32_t ssrc, | 140 uint32_t ssrc, |
141 const RtcpPacketTypeCounter& packet_counter) override { | 141 const RtcpPacketTypeCounter& packet_counter) override { |
142 counter_map_[ssrc] = packet_counter; | 142 counter_map_[ssrc] = packet_counter; |
(...skipping 10 matching lines...) Expand all Loading... | |
153 } | 153 } |
154 int RtpSent() { | 154 int RtpSent() { |
155 return transport_.rtp_packets_sent_; | 155 return transport_.rtp_packets_sent_; |
156 } | 156 } |
157 uint16_t LastRtpSequenceNumber() { | 157 uint16_t LastRtpSequenceNumber() { |
158 return transport_.last_rtp_header_.sequenceNumber; | 158 return transport_.last_rtp_header_.sequenceNumber; |
159 } | 159 } |
160 std::vector<uint16_t> LastNackListSent() { | 160 std::vector<uint16_t> LastNackListSent() { |
161 return transport_.last_nack_list_; | 161 return transport_.last_nack_list_; |
162 } | 162 } |
163 void SetKeepaliveConfigAndReset( | |
164 const VideoSendStream::Config::Rtp::KeepAlive& config) { | |
165 keepalive_config_ = config; | |
166 // Need to create a new module impl, since it's configured at creation. | |
167 CreateModuleImpl(); | |
168 } | |
163 | 169 |
164 private: | 170 private: |
171 void CreateModuleImpl() { | |
172 RtpRtcp::Configuration config; | |
173 config.audio = false; | |
174 config.clock = clock_; | |
175 config.outgoing_transport = &transport_; | |
176 config.receive_statistics = receive_statistics_.get(); | |
177 config.rtcp_packet_type_counter_observer = this; | |
178 config.rtt_stats = &rtt_stats_; | |
179 config.retransmission_rate_limiter = &retransmission_rate_limiter_; | |
180 config.keepalive_config = keepalive_config_; | |
181 | |
182 impl_.reset(new ModuleRtpRtcpImpl(config)); | |
183 impl_->SetRTCPStatus(RtcpMode::kCompound); | |
184 } | |
185 | |
186 SimulatedClock* const clock_; | |
165 std::map<uint32_t, RtcpPacketTypeCounter> counter_map_; | 187 std::map<uint32_t, RtcpPacketTypeCounter> counter_map_; |
166 }; | 188 }; |
167 } // namespace | 189 } // namespace |
168 | 190 |
169 class RtpRtcpImplTest : public ::testing::Test { | 191 class RtpRtcpImplTest : public ::testing::Test { |
170 protected: | 192 protected: |
171 RtpRtcpImplTest() | 193 RtpRtcpImplTest() |
172 : clock_(133590000000000), | 194 : clock_(133590000000000), sender_(&clock_), receiver_(&clock_) {} |
173 sender_(&clock_), | 195 |
174 receiver_(&clock_) { | 196 void SetUp() override { |
175 // Send module. | 197 // Send module. |
176 sender_.impl_->SetSSRC(kSenderSsrc); | 198 sender_.impl_->SetSSRC(kSenderSsrc); |
177 EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true)); | 199 EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true)); |
178 sender_.impl_->SetSendingMediaStatus(true); | 200 sender_.impl_->SetSendingMediaStatus(true); |
179 sender_.SetRemoteSsrc(kReceiverSsrc); | 201 sender_.SetRemoteSsrc(kReceiverSsrc); |
180 sender_.impl_->SetSequenceNumber(kSequenceNumber); | 202 sender_.impl_->SetSequenceNumber(kSequenceNumber); |
181 sender_.impl_->SetStorePacketsStatus(true, 100); | 203 sender_.impl_->SetStorePacketsStatus(true, 100); |
182 | 204 |
183 memset(&codec_, 0, sizeof(VideoCodec)); | 205 memset(&codec_, 0, sizeof(VideoCodec)); |
184 codec_.plType = 100; | 206 codec_.plType = 100; |
185 strncpy(codec_.plName, "VP8", 3); | 207 strncpy(codec_.plName, "VP8", 3); |
186 codec_.width = 320; | 208 codec_.width = 320; |
187 codec_.height = 180; | 209 codec_.height = 180; |
188 EXPECT_EQ(0, sender_.impl_->RegisterSendPayload(codec_)); | 210 EXPECT_EQ(0, sender_.impl_->RegisterSendPayload(codec_)); |
189 | 211 |
190 // Receive module. | 212 // Receive module. |
191 EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false)); | 213 EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false)); |
192 receiver_.impl_->SetSendingMediaStatus(false); | 214 receiver_.impl_->SetSendingMediaStatus(false); |
193 receiver_.impl_->SetSSRC(kReceiverSsrc); | 215 receiver_.impl_->SetSSRC(kReceiverSsrc); |
194 receiver_.SetRemoteSsrc(kSenderSsrc); | 216 receiver_.SetRemoteSsrc(kSenderSsrc); |
195 // Transport settings. | 217 // Transport settings. |
196 sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get()); | 218 sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get()); |
197 receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get()); | 219 receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get()); |
198 } | 220 } |
221 | |
199 SimulatedClock clock_; | 222 SimulatedClock clock_; |
200 RtpRtcpModule sender_; | 223 RtpRtcpModule sender_; |
201 RtpRtcpModule receiver_; | 224 RtpRtcpModule receiver_; |
202 VideoCodec codec_; | 225 VideoCodec codec_; |
203 | 226 |
204 void SendFrame(const RtpRtcpModule* module, uint8_t tid) { | 227 void SendFrame(const RtpRtcpModule* module, uint8_t tid) { |
205 RTPVideoHeaderVP8 vp8_header = {}; | 228 RTPVideoHeaderVP8 vp8_header = {}; |
206 vp8_header.temporalIdx = tid; | 229 vp8_header.temporalIdx = tid; |
207 RTPVideoHeader rtp_video_header; | 230 RTPVideoHeader rtp_video_header; |
208 rtp_video_header.width = codec_.width; | 231 rtp_video_header.width = codec_.width; |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
560 EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests); | 583 EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests); |
561 EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests); | 584 EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests); |
562 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21)); | 585 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21)); |
563 | 586 |
564 // Send module receives the request. | 587 // Send module receives the request. |
565 EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets); | 588 EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets); |
566 EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests); | 589 EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests); |
567 EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests); | 590 EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests); |
568 EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent()); | 591 EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent()); |
569 } | 592 } |
593 | |
594 TEST_F(RtpRtcpImplTest, SendsKeepaliveAfterTimout) { | |
595 const int kTimeout = 1500; | |
åsapersson
2017/06/30 15:09:13
kTimeoutMs
sprang_webrtc
2017/06/30 16:20:59
Done.
| |
596 | |
597 VideoSendStream::Config::Rtp::KeepAlive config; | |
598 config.timeout_interval_ms = kTimeout; | |
599 | |
600 // Recreate sender impl with new configuration, and redo setup. | |
601 sender_.SetKeepaliveConfigAndReset(config); | |
602 SetUp(); | |
603 | |
604 // Initial process call. | |
605 sender_.impl_->Process(); | |
606 EXPECT_EQ(0U, sender_.transport_.NumKeepaliveSent()); | |
607 | |
608 // After one time, a single keep-alive packet should be sent. | |
609 clock_.AdvanceTimeMilliseconds(kTimeout); | |
610 sender_.impl_->Process(); | |
611 EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); | |
612 | |
613 // Process for the same timestamp again, no new packet shold be sent. | |
åsapersson
2017/06/30 15:09:13
should
sprang_webrtc
2017/06/30 16:21:00
Done.
| |
614 sender_.impl_->Process(); | |
615 EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); | |
616 | |
617 // Move ahead to the last ms before a keep-alive is expected, no action. | |
618 clock_.AdvanceTimeMilliseconds(kTimeout - 1); | |
619 sender_.impl_->Process(); | |
620 EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); | |
621 | |
622 // Move the final ms, timeout relative last KA. Should create new keep-alive. | |
623 clock_.AdvanceTimeMilliseconds(1); | |
624 sender_.impl_->Process(); | |
625 EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); | |
626 | |
627 // Move ahead to the last ms before Christmas. | |
628 clock_.AdvanceTimeMilliseconds(kTimeout - 1); | |
629 sender_.impl_->Process(); | |
630 EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); | |
631 | |
632 // Send actual payload data, no keep-alive expected. | |
633 SendFrame(&sender_, 0); | |
634 sender_.impl_->Process(); | |
635 EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); | |
636 | |
637 // Move ahead as far as possible again, timeout now relative payload. No KA. | |
638 clock_.AdvanceTimeMilliseconds(kTimeout - 1); | |
639 sender_.impl_->Process(); | |
640 EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); | |
641 | |
642 // Timeout relative payload, send new keep-alive. | |
643 clock_.AdvanceTimeMilliseconds(1); | |
644 sender_.impl_->Process(); | |
645 EXPECT_EQ(3U, sender_.transport_.NumKeepaliveSent()); | |
646 } | |
570 } // namespace webrtc | 647 } // namespace webrtc |
OLD | NEW |