| 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 |