OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 const size_t payload_size, | 214 const size_t payload_size, |
215 const WebRtcRTPHeader* rtp_header) override { | 215 const WebRtcRTPHeader* rtp_header) override { |
216 return 0; | 216 return 0; |
217 } | 217 } |
218 test::RtcpPacketParser parser_; | 218 test::RtcpPacketParser parser_; |
219 }; | 219 }; |
220 | 220 |
221 namespace { | 221 namespace { |
222 static const uint32_t kSenderSsrc = 0x11111111; | 222 static const uint32_t kSenderSsrc = 0x11111111; |
223 static const uint32_t kRemoteSsrc = 0x22222222; | 223 static const uint32_t kRemoteSsrc = 0x22222222; |
| 224 static const uint32_t kStartRtpTimestamp = 0x34567; |
| 225 static const uint32_t kRtpTimestamp = 0x45678; |
224 } | 226 } |
225 | 227 |
226 class RtcpSenderTest : public ::testing::Test { | 228 class RtcpSenderTest : public ::testing::Test { |
227 protected: | 229 protected: |
228 RtcpSenderTest() | 230 RtcpSenderTest() |
229 : clock_(1335900000), | 231 : clock_(1335900000), |
230 receive_statistics_(ReceiveStatistics::Create(&clock_)) { | 232 receive_statistics_(ReceiveStatistics::Create(&clock_)) { |
231 RtpRtcp::Configuration configuration; | 233 RtpRtcp::Configuration configuration; |
232 configuration.audio = false; | 234 configuration.audio = false; |
233 configuration.clock = &clock_; | 235 configuration.clock = &clock_; |
234 configuration.outgoing_transport = &test_transport_; | 236 configuration.outgoing_transport = &test_transport_; |
235 | 237 |
236 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration)); | 238 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration)); |
237 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), | 239 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), |
238 nullptr, nullptr, &test_transport_)); | 240 nullptr, nullptr, &test_transport_)); |
239 rtcp_sender_->SetSSRC(kSenderSsrc); | 241 rtcp_sender_->SetSSRC(kSenderSsrc); |
240 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); | 242 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); |
| 243 rtcp_sender_->SetStartTimestamp(kStartRtpTimestamp); |
| 244 rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds()); |
241 } | 245 } |
242 | 246 |
243 void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) { | 247 void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) { |
244 RTPHeader header; | 248 RTPHeader header; |
245 header.ssrc = remote_ssrc; | 249 header.ssrc = remote_ssrc; |
246 header.sequenceNumber = seq_num; | 250 header.sequenceNumber = seq_num; |
247 header.timestamp = 12345; | 251 header.timestamp = 12345; |
248 header.headerLength = 12; | 252 header.headerLength = 12; |
249 size_t kPacketLength = 100; | 253 size_t kPacketLength = 100; |
250 receive_statistics_->IncomingPacket(header, kPacketLength, false); | 254 receive_statistics_->IncomingPacket(header, kPacketLength, false); |
(...skipping 27 matching lines...) Expand all Loading... |
278 TEST_F(RtcpSenderTest, NoPacketSentIfOff) { | 282 TEST_F(RtcpSenderTest, NoPacketSentIfOff) { |
279 rtcp_sender_->SetRTCPStatus(RtcpMode::kOff); | 283 rtcp_sender_->SetRTCPStatus(RtcpMode::kOff); |
280 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); | 284 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); |
281 } | 285 } |
282 | 286 |
283 TEST_F(RtcpSenderTest, SendSr) { | 287 TEST_F(RtcpSenderTest, SendSr) { |
284 const uint32_t kPacketCount = 0x12345; | 288 const uint32_t kPacketCount = 0x12345; |
285 const uint32_t kOctetCount = 0x23456; | 289 const uint32_t kOctetCount = 0x23456; |
286 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); | 290 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); |
287 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); | 291 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); |
| 292 rtcp_sender_->SetSendingStatus(feedback_state, true); |
288 feedback_state.packets_sent = kPacketCount; | 293 feedback_state.packets_sent = kPacketCount; |
289 feedback_state.media_bytes_sent = kOctetCount; | 294 feedback_state.media_bytes_sent = kOctetCount; |
290 uint32_t ntp_secs; | 295 uint32_t ntp_secs; |
291 uint32_t ntp_frac; | 296 uint32_t ntp_frac; |
292 clock_.CurrentNtp(ntp_secs, ntp_frac); | 297 clock_.CurrentNtp(ntp_secs, ntp_frac); |
293 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr)); | 298 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr)); |
294 EXPECT_EQ(1, parser()->sender_report()->num_packets()); | 299 EXPECT_EQ(1, parser()->sender_report()->num_packets()); |
295 EXPECT_EQ(kSenderSsrc, parser()->sender_report()->Ssrc()); | 300 EXPECT_EQ(kSenderSsrc, parser()->sender_report()->Ssrc()); |
296 EXPECT_EQ(ntp_secs, parser()->sender_report()->NtpSec()); | 301 EXPECT_EQ(ntp_secs, parser()->sender_report()->NtpSec()); |
297 EXPECT_EQ(ntp_frac, parser()->sender_report()->NtpFrac()); | 302 EXPECT_EQ(ntp_frac, parser()->sender_report()->NtpFrac()); |
298 EXPECT_EQ(kPacketCount, parser()->sender_report()->PacketCount()); | 303 EXPECT_EQ(kPacketCount, parser()->sender_report()->PacketCount()); |
299 EXPECT_EQ(kOctetCount, parser()->sender_report()->OctetCount()); | 304 EXPECT_EQ(kOctetCount, parser()->sender_report()->OctetCount()); |
| 305 EXPECT_EQ(kStartRtpTimestamp + kRtpTimestamp, |
| 306 parser()->sender_report()->RtpTimestamp()); |
300 EXPECT_EQ(0, parser()->report_block()->num_packets()); | 307 EXPECT_EQ(0, parser()->report_block()->num_packets()); |
301 } | 308 } |
302 | 309 |
| 310 TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) { |
| 311 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), |
| 312 nullptr, nullptr, &test_transport_)); |
| 313 rtcp_sender_->SetSSRC(kSenderSsrc); |
| 314 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); |
| 315 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); |
| 316 rtcp_sender_->SetSendingStatus(feedback_state(), true); |
| 317 |
| 318 // Sender Report shouldn't be send not as Sr, nor as Report. |
| 319 rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr); |
| 320 EXPECT_EQ(0, parser()->sender_report()->num_packets()); |
| 321 rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport); |
| 322 EXPECT_EQ(0, parser()->sender_report()->num_packets()); |
| 323 // Other packets (e.g. Pli) are allowed, even if useless. |
| 324 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli)); |
| 325 EXPECT_EQ(1, parser()->pli()->num_packets()); |
| 326 } |
| 327 |
| 328 TEST_F(RtcpSenderTest, DoNotSendCompundBeforeRtp) { |
| 329 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), |
| 330 nullptr, nullptr, &test_transport_)); |
| 331 rtcp_sender_->SetSSRC(kSenderSsrc); |
| 332 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); |
| 333 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); |
| 334 rtcp_sender_->SetSendingStatus(feedback_state(), true); |
| 335 |
| 336 // In compound mode no packets are allowed (e.g. Pli) because compound mode |
| 337 // should start with Sender Report. |
| 338 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli)); |
| 339 EXPECT_EQ(0, parser()->pli()->num_packets()); |
| 340 } |
| 341 |
| 342 |
303 TEST_F(RtcpSenderTest, SendRr) { | 343 TEST_F(RtcpSenderTest, SendRr) { |
304 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); | 344 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); |
305 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr)); | 345 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr)); |
306 EXPECT_EQ(1, parser()->receiver_report()->num_packets()); | 346 EXPECT_EQ(1, parser()->receiver_report()->num_packets()); |
307 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->Ssrc()); | 347 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->Ssrc()); |
308 EXPECT_EQ(0, parser()->report_block()->num_packets()); | 348 EXPECT_EQ(0, parser()->report_block()->num_packets()); |
309 } | 349 } |
310 | 350 |
311 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) { | 351 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) { |
312 const uint16_t kSeqNum = 11111; | 352 const uint16_t kSeqNum = 11111; |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport)); | 721 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport)); |
682 EXPECT_EQ(2, parser()->tmmbr()->num_packets()); | 722 EXPECT_EQ(2, parser()->tmmbr()->num_packets()); |
683 EXPECT_EQ(2, parser()->tmmbr_item()->num_packets()); | 723 EXPECT_EQ(2, parser()->tmmbr_item()->num_packets()); |
684 | 724 |
685 rtcp_sender_->SetTMMBRStatus(false); | 725 rtcp_sender_->SetTMMBRStatus(false); |
686 EXPECT_FALSE(rtcp_sender_->TMMBR()); | 726 EXPECT_FALSE(rtcp_sender_->TMMBR()); |
687 } | 727 } |
688 | 728 |
689 TEST_F(RtcpSenderTest, SendTmmbn) { | 729 TEST_F(RtcpSenderTest, SendTmmbn) { |
690 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); | 730 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); |
| 731 rtcp_sender_->SetSendingStatus(feedback_state(), true); |
691 TMMBRSet bounding_set; | 732 TMMBRSet bounding_set; |
692 bounding_set.VerifyAndAllocateSet(1); | 733 bounding_set.VerifyAndAllocateSet(1); |
693 const uint32_t kBitrateKbps = 32768; | 734 const uint32_t kBitrateKbps = 32768; |
694 const uint32_t kPacketOh = 40; | 735 const uint32_t kPacketOh = 40; |
695 const uint32_t kSourceSsrc = 12345; | 736 const uint32_t kSourceSsrc = 12345; |
696 bounding_set.AddEntry(kBitrateKbps, kPacketOh, kSourceSsrc); | 737 bounding_set.AddEntry(kBitrateKbps, kPacketOh, kSourceSsrc); |
697 EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set)); | 738 EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set)); |
698 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); | 739 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); |
699 EXPECT_EQ(1, parser()->sender_report()->num_packets()); | 740 EXPECT_EQ(1, parser()->sender_report()->num_packets()); |
700 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); | 741 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); |
701 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); | 742 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); |
702 EXPECT_EQ(1, parser()->tmmbn_items()->num_packets()); | 743 EXPECT_EQ(1, parser()->tmmbn_items()->num_packets()); |
703 EXPECT_EQ(kBitrateKbps, parser()->tmmbn_items()->BitrateKbps(0)); | 744 EXPECT_EQ(kBitrateKbps, parser()->tmmbn_items()->BitrateKbps(0)); |
704 EXPECT_EQ(kPacketOh, parser()->tmmbn_items()->Overhead(0)); | 745 EXPECT_EQ(kPacketOh, parser()->tmmbn_items()->Overhead(0)); |
705 EXPECT_EQ(kSourceSsrc, parser()->tmmbn_items()->Ssrc(0)); | 746 EXPECT_EQ(kSourceSsrc, parser()->tmmbn_items()->Ssrc(0)); |
706 } | 747 } |
707 | 748 |
708 // This test is written to verify actual behaviour. It does not seem | 749 // This test is written to verify actual behaviour. It does not seem |
709 // to make much sense to send an empty TMMBN, since there is no place | 750 // to make much sense to send an empty TMMBN, since there is no place |
710 // to put an actual limit here. It's just information that no limit | 751 // to put an actual limit here. It's just information that no limit |
711 // is set, which is kind of the starting assumption. | 752 // is set, which is kind of the starting assumption. |
712 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one | 753 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one |
713 // situation where this caused confusion. | 754 // situation where this caused confusion. |
714 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) { | 755 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) { |
715 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); | 756 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); |
| 757 rtcp_sender_->SetSendingStatus(feedback_state(), true); |
716 TMMBRSet bounding_set; | 758 TMMBRSet bounding_set; |
717 EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set)); | 759 EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set)); |
718 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); | 760 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); |
719 EXPECT_EQ(1, parser()->sender_report()->num_packets()); | 761 EXPECT_EQ(1, parser()->sender_report()->num_packets()); |
720 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); | 762 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); |
721 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); | 763 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); |
722 EXPECT_EQ(0, parser()->tmmbn_items()->num_packets()); | 764 EXPECT_EQ(0, parser()->tmmbn_items()->num_packets()); |
723 } | 765 } |
724 | 766 |
725 TEST_F(RtcpSenderTest, SendCompoundPliRemb) { | 767 TEST_F(RtcpSenderTest, SendCompoundPliRemb) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 } | 802 } |
761 | 803 |
762 return true; | 804 return true; |
763 })); | 805 })); |
764 | 806 |
765 // Re-configure rtcp_sender_ with mock_transport_ | 807 // Re-configure rtcp_sender_ with mock_transport_ |
766 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), | 808 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), |
767 nullptr, nullptr, &mock_transport)); | 809 nullptr, nullptr, &mock_transport)); |
768 rtcp_sender_->SetSSRC(kSenderSsrc); | 810 rtcp_sender_->SetSSRC(kSenderSsrc); |
769 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); | 811 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); |
| 812 rtcp_sender_->SetStartTimestamp(kStartRtpTimestamp); |
| 813 rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds()); |
770 | 814 |
771 // Set up XR VoIP metric to be included with BYE | 815 // Set up XR VoIP metric to be included with BYE |
772 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); | 816 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); |
773 RTCPVoIPMetric metric; | 817 RTCPVoIPMetric metric; |
774 EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric)); | 818 EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric)); |
775 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye)); | 819 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye)); |
776 } | 820 } |
777 | 821 |
778 } // namespace webrtc | 822 } // namespace webrtc |
OLD | NEW |