| 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 18 matching lines...) Expand all Loading... |
| 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
| 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" |
| 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" | 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" |
| 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
| 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" | 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" |
| 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" | 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" |
| 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
| 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" | 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" |
| 37 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" | 37 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" |
| 38 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" | 38 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" |
| 39 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 39 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
| 40 #include "webrtc/system_wrappers/include/ntp_time.h" |
| 40 | 41 |
| 41 namespace webrtc { | 42 namespace webrtc { |
| 42 | 43 |
| 43 namespace { // Anonymous namespace; hide utility functions and classes. | 44 namespace { // Anonymous namespace; hide utility functions and classes. |
| 44 | 45 |
| 45 // This test transport verifies that no functions get called. | 46 // This test transport verifies that no functions get called. |
| 46 class TestTransport : public Transport, | 47 class TestTransport : public Transport, |
| 47 public NullRtpData { | 48 public NullRtpData { |
| 48 public: | 49 public: |
| 49 explicit TestTransport() : rtcp_receiver_(nullptr) {} | 50 explicit TestTransport() : rtcp_receiver_(nullptr) {} |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 const uint32_t kSenderSsrc = 0x10203; | 173 const uint32_t kSenderSsrc = 0x10203; |
| 173 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); | 174 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); |
| 174 rtcp::SenderReport sr; | 175 rtcp::SenderReport sr; |
| 175 sr.From(kSenderSsrc); | 176 sr.From(kSenderSsrc); |
| 176 rtc::Buffer packet = sr.Build(); | 177 rtc::Buffer packet = sr.Build(); |
| 177 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 178 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 178 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); | 179 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); |
| 179 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); | 180 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); |
| 180 } | 181 } |
| 181 | 182 |
| 183 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { |
| 184 Random r(0x0123456789abcdef); |
| 185 const uint32_t kSenderSsrc = r.Rand(0x00000001u, 0xfffffffeu); |
| 186 const uint32_t kRemoteSsrc = r.Rand(0x00000001u, 0xfffffffeu); |
| 187 const int64_t kRttMs = r.Rand(1, 18 * 3600 * 1000); |
| 188 const uint32_t kDelayNtp = r.Rand<uint32_t>(); |
| 189 const uint32_t kDelayMs = CompactNtpIntervalToMs(kDelayNtp); |
| 190 |
| 191 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); |
| 192 std::set<uint32_t> ssrcs; |
| 193 ssrcs.insert(kRemoteSsrc); |
| 194 rtcp_receiver_->SetSsrcs(kRemoteSsrc, ssrcs); |
| 195 |
| 196 int64_t rtt_ms = 0; |
| 197 EXPECT_EQ( |
| 198 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); |
| 199 |
| 200 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); |
| 201 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); |
| 202 |
| 203 rtcp::SenderReport sr; |
| 204 sr.From(kSenderSsrc); |
| 205 rtcp::ReportBlock block; |
| 206 block.To(kRemoteSsrc); |
| 207 block.WithLastSr(sent_ntp); |
| 208 block.WithDelayLastSr(kDelayNtp); |
| 209 sr.WithReportBlock(block); |
| 210 |
| 211 rtc::Buffer packet = sr.Build(); |
| 212 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 213 |
| 214 EXPECT_EQ( |
| 215 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); |
| 216 EXPECT_NEAR(kRttMs, rtt_ms, 1); |
| 217 } |
| 218 |
| 182 TEST_F(RtcpReceiverTest, InjectRrPacket) { | 219 TEST_F(RtcpReceiverTest, InjectRrPacket) { |
| 183 const uint32_t kSenderSsrc = 0x10203; | 220 const uint32_t kSenderSsrc = 0x10203; |
| 184 rtcp::ReceiverReport rr; | 221 rtcp::ReceiverReport rr; |
| 185 rr.From(kSenderSsrc); | 222 rr.From(kSenderSsrc); |
| 186 rtc::Buffer packet = rr.Build(); | 223 rtc::Buffer packet = rr.Build(); |
| 187 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 224 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 188 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); | 225 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); |
| 189 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); | 226 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); |
| 190 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); | 227 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); |
| 191 } | 228 } |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 ssrcs.insert(kSourceSsrc); | 698 ssrcs.insert(kSourceSsrc); |
| 662 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); | 699 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); |
| 663 | 700 |
| 664 rtcp::Dlrr dlrr; | 701 rtcp::Dlrr dlrr; |
| 665 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); | 702 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); |
| 666 rtcp::ExtendedReports xr; | 703 rtcp::ExtendedReports xr; |
| 667 xr.From(0x2345); | 704 xr.From(0x2345); |
| 668 xr.WithDlrr(dlrr); | 705 xr.WithDlrr(dlrr); |
| 669 rtc::Buffer packet = xr.Build(); | 706 rtc::Buffer packet = xr.Build(); |
| 670 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 707 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 671 // The parser should note the DLRR report block item, but not flag the packet | 708 // The parser should note the DLRR report block item. |
| 672 // since the RTT is not estimated. | |
| 673 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); | 709 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); |
| 674 } | 710 } |
| 675 | 711 |
| 676 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { | 712 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { |
| 677 const uint32_t kSourceSsrc = 0x123456; | 713 const uint32_t kSourceSsrc = 0x123456; |
| 678 std::set<uint32_t> ssrcs; | 714 std::set<uint32_t> ssrcs; |
| 679 ssrcs.insert(kSourceSsrc); | 715 ssrcs.insert(kSourceSsrc); |
| 680 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); | 716 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); |
| 681 | 717 |
| 682 rtcp::Dlrr dlrr; | 718 rtcp::Dlrr dlrr; |
| 683 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); | 719 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); |
| 684 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); | 720 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); |
| 685 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); | 721 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); |
| 686 rtcp::ExtendedReports xr; | 722 rtcp::ExtendedReports xr; |
| 687 xr.From(0x2345); | 723 xr.From(0x2345); |
| 688 xr.WithDlrr(dlrr); | 724 xr.WithDlrr(dlrr); |
| 689 rtc::Buffer packet = xr.Build(); | 725 rtc::Buffer packet = xr.Build(); |
| 690 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 726 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 691 // The parser should note the DLRR report block item, but not flag the packet | 727 // The parser should note the DLRR report block item. |
| 692 // since the RTT is not estimated. | |
| 693 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); | 728 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); |
| 694 } | 729 } |
| 695 | 730 |
| 696 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { | 731 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { |
| 697 const uint32_t kSourceSsrc = 0x123456; | 732 const uint32_t kSourceSsrc = 0x123456; |
| 698 std::set<uint32_t> ssrcs; | 733 std::set<uint32_t> ssrcs; |
| 699 ssrcs.insert(kSourceSsrc); | 734 ssrcs.insert(kSourceSsrc); |
| 700 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); | 735 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); |
| 701 | 736 |
| 702 rtcp::Rrtr rrtr; | 737 rtcp::Rrtr rrtr; |
| 703 rtcp::Dlrr dlrr; | 738 rtcp::Dlrr dlrr; |
| 704 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); | 739 dlrr.WithDlrrItem(kSourceSsrc, 0, 0x67890); |
| 705 rtcp::VoipMetric metric; | 740 rtcp::VoipMetric metric; |
| 706 metric.To(kSourceSsrc); | 741 metric.To(kSourceSsrc); |
| 707 rtcp::ExtendedReports xr; | 742 rtcp::ExtendedReports xr; |
| 708 xr.From(0x2345); | 743 xr.From(0x2345); |
| 709 xr.WithRrtr(rrtr); | 744 xr.WithRrtr(rrtr); |
| 710 xr.WithDlrr(dlrr); | 745 xr.WithDlrr(dlrr); |
| 711 xr.WithVoipMetric(metric); | 746 xr.WithVoipMetric(metric); |
| 712 rtc::Buffer packet = xr.Build(); | 747 rtc::Buffer packet = xr.Build(); |
| 713 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 748 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 749 // The parser should not flag the packet since the RTT is not estimated. |
| 714 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + | 750 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + |
| 715 kRtcpXrVoipMetric), | 751 kRtcpXrVoipMetric), |
| 716 rtcp_packet_info_.rtcpPacketTypeFlags); | 752 rtcp_packet_info_.rtcpPacketTypeFlags); |
| 717 // The parser should note the DLRR report block item, but not flag the packet | 753 // The parser should note the DLRR report block item. |
| 718 // since the RTT is not estimated. | |
| 719 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); | 754 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); |
| 720 } | 755 } |
| 721 | 756 |
| 722 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { | 757 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { |
| 723 const uint32_t kSourceSsrc = 0x123456; | 758 const uint32_t kSourceSsrc = 0x123456; |
| 724 std::set<uint32_t> ssrcs; | 759 std::set<uint32_t> ssrcs; |
| 725 ssrcs.insert(kSourceSsrc); | 760 ssrcs.insert(kSourceSsrc); |
| 726 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); | 761 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); |
| 727 std::vector<uint32_t> remote_ssrcs; | 762 std::vector<uint32_t> remote_ssrcs; |
| 728 remote_ssrcs.push_back(kSourceSsrc); | 763 remote_ssrcs.push_back(kSourceSsrc); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 748 kRtcpXrVoipMetric), | 783 kRtcpXrVoipMetric), |
| 749 rtcp_packet_info_.rtcpPacketTypeFlags); | 784 rtcp_packet_info_.rtcpPacketTypeFlags); |
| 750 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); | 785 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); |
| 751 } | 786 } |
| 752 | 787 |
| 753 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { | 788 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { |
| 754 int64_t rtt_ms; | 789 int64_t rtt_ms; |
| 755 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); | 790 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); |
| 756 } | 791 } |
| 757 | 792 |
| 793 TEST_F(RtcpReceiverTest, RttCalculatedAfterXrDlrr) { |
| 794 Random rand(0x0123456789abcdef); |
| 795 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu); |
| 796 const uint32_t kRttMs = rand.Rand(1, 18 * 3600 * 1000); |
| 797 const uint32_t kDelayNtp = rand.Rand<uint32_t>(); |
| 798 const uint32_t kDelayMs = CompactNtpIntervalToMs(kDelayNtp); |
| 799 std::set<uint32_t> ssrcs; |
| 800 ssrcs.insert(kSourceSsrc); |
| 801 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); |
| 802 NtpTime now(system_clock_); |
| 803 uint32_t sent_ntp = CompactNtp(now); |
| 804 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); |
| 805 |
| 806 rtcp::Dlrr dlrr; |
| 807 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); |
| 808 rtcp::ExtendedReports xr; |
| 809 xr.From(0x2345); |
| 810 xr.WithDlrr(dlrr); |
| 811 rtc::Buffer packet = xr.Build(); |
| 812 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 813 |
| 814 int64_t rtt_ms = 0; |
| 815 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); |
| 816 EXPECT_NEAR(kRttMs, rtt_ms, 1); |
| 817 } |
| 818 |
| 758 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { | 819 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { |
| 759 RtcpReceiveTimeInfo info; | 820 RtcpReceiveTimeInfo info; |
| 760 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); | 821 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); |
| 761 } | 822 } |
| 762 | 823 |
| 763 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) { | 824 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) { |
| 764 const uint32_t kSenderSsrc = 0x123456; | 825 const uint32_t kSenderSsrc = 0x123456; |
| 765 const NtpTime kNtp(0x10203, 0x40506); | 826 const NtpTime kNtp(0x10203, 0x40506); |
| 766 const uint32_t kNtpMid = | 827 const uint32_t kNtpMid = CompactNtp(kNtp); |
| 767 RTCPUtility::MidNtp(kNtp.seconds(), kNtp.fractions()); | |
| 768 | 828 |
| 769 rtcp::Rrtr rrtr; | 829 rtcp::Rrtr rrtr; |
| 770 rrtr.WithNtp(kNtp); | 830 rrtr.WithNtp(kNtp); |
| 771 rtcp::ExtendedReports xr; | 831 rtcp::ExtendedReports xr; |
| 772 xr.From(kSenderSsrc); | 832 xr.From(kSenderSsrc); |
| 773 xr.WithRrtr(rrtr); | 833 xr.WithRrtr(rrtr); |
| 774 rtc::Buffer packet = xr.Build(); | 834 rtc::Buffer packet = xr.Build(); |
| 775 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 835 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
| 776 EXPECT_EQ(kRtcpXrReceiverReferenceTime, | 836 EXPECT_EQ(kRtcpXrReceiverReferenceTime, |
| 777 rtcp_packet_info_.rtcpPacketTypeFlags); | 837 rtcp_packet_info_.rtcpPacketTypeFlags); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1091 | 1151 |
| 1092 // Transport feedback should be ignored, but next packet should work. | 1152 // Transport feedback should be ignored, but next packet should work. |
| 1093 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); | 1153 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); |
| 1094 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); | 1154 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); |
| 1095 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate); | 1155 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate); |
| 1096 } | 1156 } |
| 1097 | 1157 |
| 1098 } // Anonymous namespace | 1158 } // Anonymous namespace |
| 1099 | 1159 |
| 1100 } // namespace webrtc | 1160 } // namespace webrtc |
| OLD | NEW |