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 <algorithm> | 10 #include <algorithm> |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 public: | 562 public: |
563 explicit FecNackObserver() | 563 explicit FecNackObserver() |
564 : EndToEndTest(kDefaultTimeoutMs), | 564 : EndToEndTest(kDefaultTimeoutMs), |
565 state_(kFirstPacket), | 565 state_(kFirstPacket), |
566 fec_sequence_number_(0), | 566 fec_sequence_number_(0), |
567 has_last_sequence_number_(false), | 567 has_last_sequence_number_(false), |
568 last_sequence_number_(0) {} | 568 last_sequence_number_(0) {} |
569 | 569 |
570 private: | 570 private: |
571 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 571 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 572 rtc::CritScope lock_(&crit_); |
572 RTPHeader header; | 573 RTPHeader header; |
573 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 574 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
574 | 575 |
575 int encapsulated_payload_type = -1; | 576 int encapsulated_payload_type = -1; |
576 if (header.payloadType == kRedPayloadType) { | 577 if (header.payloadType == kRedPayloadType) { |
577 encapsulated_payload_type = | 578 encapsulated_payload_type = |
578 static_cast<int>(packet[header.headerLength]); | 579 static_cast<int>(packet[header.headerLength]); |
579 if (encapsulated_payload_type != kFakeSendPayloadType) | 580 if (encapsulated_payload_type != kFakeSendPayloadType) |
580 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | 581 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
581 } else { | 582 } else { |
(...skipping 30 matching lines...) Expand all Loading... |
612 case kVerifyFecPacketNotInNackList: | 613 case kVerifyFecPacketNotInNackList: |
613 // Continue to drop packets. Make sure no frame can be decoded. | 614 // Continue to drop packets. Make sure no frame can be decoded. |
614 if (fec_packet || header.sequenceNumber % 2 == 0) | 615 if (fec_packet || header.sequenceNumber % 2 == 0) |
615 return DROP_PACKET; | 616 return DROP_PACKET; |
616 break; | 617 break; |
617 } | 618 } |
618 return SEND_PACKET; | 619 return SEND_PACKET; |
619 } | 620 } |
620 | 621 |
621 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 622 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 623 rtc::CritScope lock_(&crit_); |
622 if (state_ == kVerifyFecPacketNotInNackList) { | 624 if (state_ == kVerifyFecPacketNotInNackList) { |
623 test::RtcpPacketParser rtcp_parser; | 625 test::RtcpPacketParser rtcp_parser; |
624 rtcp_parser.Parse(packet, length); | 626 rtcp_parser.Parse(packet, length); |
625 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); | 627 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); |
626 if (!nacks.empty() && | 628 if (!nacks.empty() && |
627 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { | 629 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { |
628 EXPECT_TRUE(std::find( | 630 EXPECT_TRUE(std::find( |
629 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end()); | 631 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end()); |
630 observation_complete_->Set(); | 632 observation_complete_->Set(); |
631 } | 633 } |
(...skipping 27 matching lines...) Expand all Loading... |
659 << "Timed out while waiting for FEC packets to be received."; | 661 << "Timed out while waiting for FEC packets to be received."; |
660 } | 662 } |
661 | 663 |
662 enum { | 664 enum { |
663 kFirstPacket, | 665 kFirstPacket, |
664 kDropEveryOtherPacketUntilFec, | 666 kDropEveryOtherPacketUntilFec, |
665 kDropAllMediaPacketsUntilFec, | 667 kDropAllMediaPacketsUntilFec, |
666 kVerifyFecPacketNotInNackList, | 668 kVerifyFecPacketNotInNackList, |
667 } state_; | 669 } state_; |
668 | 670 |
669 uint16_t fec_sequence_number_; | 671 rtc::CriticalSection crit_; |
| 672 uint16_t fec_sequence_number_ GUARDED_BY(&crit_); |
670 bool has_last_sequence_number_; | 673 bool has_last_sequence_number_; |
671 uint16_t last_sequence_number_; | 674 uint16_t last_sequence_number_; |
672 } test; | 675 } test; |
673 | 676 |
674 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | 677 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |
675 // Configure some network delay. | 678 // Configure some network delay. |
676 const int kNetworkDelayMs = 50; | 679 const int kNetworkDelayMs = 50; |
677 FakeNetworkPipe::Config config; | 680 FakeNetworkPipe::Config config; |
678 config.queue_delay_ms = kNetworkDelayMs; | 681 config.queue_delay_ms = kNetworkDelayMs; |
679 RunBaseTest(&test, config); | 682 RunBaseTest(&test, config); |
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1755 NackObserver() | 1758 NackObserver() |
1756 : EndToEndTest(kLongTimeoutMs), | 1759 : EndToEndTest(kLongTimeoutMs), |
1757 sent_rtp_packets_(0), | 1760 sent_rtp_packets_(0), |
1758 dropped_rtp_packet_(0), | 1761 dropped_rtp_packet_(0), |
1759 dropped_rtp_packet_requested_(false), | 1762 dropped_rtp_packet_requested_(false), |
1760 send_stream_(nullptr), | 1763 send_stream_(nullptr), |
1761 start_runtime_ms_(-1) {} | 1764 start_runtime_ms_(-1) {} |
1762 | 1765 |
1763 private: | 1766 private: |
1764 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 1767 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 1768 rtc::CritScope lock(&crit_); |
1765 if (++sent_rtp_packets_ == kPacketNumberToDrop) { | 1769 if (++sent_rtp_packets_ == kPacketNumberToDrop) { |
1766 rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 1770 rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
1767 RTPHeader header; | 1771 RTPHeader header; |
1768 EXPECT_TRUE(parser->Parse(packet, length, &header)); | 1772 EXPECT_TRUE(parser->Parse(packet, length, &header)); |
1769 dropped_rtp_packet_ = header.sequenceNumber; | 1773 dropped_rtp_packet_ = header.sequenceNumber; |
1770 return DROP_PACKET; | 1774 return DROP_PACKET; |
1771 } | 1775 } |
1772 VerifyStats(); | 1776 VerifyStats(); |
1773 return SEND_PACKET; | 1777 return SEND_PACKET; |
1774 } | 1778 } |
1775 | 1779 |
1776 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 1780 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 1781 rtc::CritScope lock(&crit_); |
1777 test::RtcpPacketParser rtcp_parser; | 1782 test::RtcpPacketParser rtcp_parser; |
1778 rtcp_parser.Parse(packet, length); | 1783 rtcp_parser.Parse(packet, length); |
1779 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); | 1784 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); |
1780 if (!nacks.empty() && std::find( | 1785 if (!nacks.empty() && std::find( |
1781 nacks.begin(), nacks.end(), dropped_rtp_packet_) != nacks.end()) { | 1786 nacks.begin(), nacks.end(), dropped_rtp_packet_) != nacks.end()) { |
1782 dropped_rtp_packet_requested_ = true; | 1787 dropped_rtp_packet_requested_ = true; |
1783 } | 1788 } |
1784 return SEND_PACKET; | 1789 return SEND_PACKET; |
1785 } | 1790 } |
1786 | 1791 |
1787 void VerifyStats() { | 1792 void VerifyStats() EXCLUSIVE_LOCKS_REQUIRED(&crit_) { |
1788 if (!dropped_rtp_packet_requested_) | 1793 if (!dropped_rtp_packet_requested_) |
1789 return; | 1794 return; |
1790 int send_stream_nack_packets = 0; | 1795 int send_stream_nack_packets = 0; |
1791 int receive_stream_nack_packets = 0; | 1796 int receive_stream_nack_packets = 0; |
1792 VideoSendStream::Stats stats = send_stream_->GetStats(); | 1797 VideoSendStream::Stats stats = send_stream_->GetStats(); |
1793 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it = | 1798 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it = |
1794 stats.substreams.begin(); it != stats.substreams.end(); ++it) { | 1799 stats.substreams.begin(); it != stats.substreams.end(); ++it) { |
1795 const VideoSendStream::StreamStats& stream_stats = it->second; | 1800 const VideoSendStream::StreamStats& stream_stats = it->second; |
1796 send_stream_nack_packets += | 1801 send_stream_nack_packets += |
1797 stream_stats.rtcp_packet_type_counts.nack_packets; | 1802 stream_stats.rtcp_packet_type_counts.nack_packets; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1830 const std::vector<VideoReceiveStream*>& receive_streams) override { | 1835 const std::vector<VideoReceiveStream*>& receive_streams) override { |
1831 send_stream_ = send_stream; | 1836 send_stream_ = send_stream; |
1832 receive_streams_ = receive_streams; | 1837 receive_streams_ = receive_streams; |
1833 } | 1838 } |
1834 | 1839 |
1835 void PerformTest() override { | 1840 void PerformTest() override { |
1836 EXPECT_EQ(kEventSignaled, Wait()) | 1841 EXPECT_EQ(kEventSignaled, Wait()) |
1837 << "Timed out waiting for packet to be NACKed."; | 1842 << "Timed out waiting for packet to be NACKed."; |
1838 } | 1843 } |
1839 | 1844 |
| 1845 rtc::CriticalSection crit_; |
1840 uint64_t sent_rtp_packets_; | 1846 uint64_t sent_rtp_packets_; |
1841 uint16_t dropped_rtp_packet_; | 1847 uint16_t dropped_rtp_packet_ GUARDED_BY(&crit_); |
1842 bool dropped_rtp_packet_requested_; | 1848 bool dropped_rtp_packet_requested_ GUARDED_BY(&crit_); |
1843 std::vector<VideoReceiveStream*> receive_streams_; | 1849 std::vector<VideoReceiveStream*> receive_streams_; |
1844 VideoSendStream* send_stream_; | 1850 VideoSendStream* send_stream_; |
1845 int64_t start_runtime_ms_; | 1851 int64_t start_runtime_ms_; |
1846 } test; | 1852 } test; |
1847 | 1853 |
1848 test::ClearHistograms(); | 1854 test::ClearHistograms(); |
1849 RunBaseTest(&test, FakeNetworkPipe::Config()); | 1855 RunBaseTest(&test, FakeNetworkPipe::Config()); |
1850 | 1856 |
1851 EXPECT_EQ(1, test::NumHistogramSamples( | 1857 EXPECT_EQ(1, test::NumHistogramSamples( |
1852 "WebRTC.Video.UniqueNackRequestsSentInPercent")); | 1858 "WebRTC.Video.UniqueNackRequestsSentInPercent")); |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2043 : EndToEndTest(kDefaultTimeoutMs), | 2049 : EndToEndTest(kDefaultTimeoutMs), |
2044 enable_rrtr_(enable_rrtr), | 2050 enable_rrtr_(enable_rrtr), |
2045 sent_rtcp_sr_(0), | 2051 sent_rtcp_sr_(0), |
2046 sent_rtcp_rr_(0), | 2052 sent_rtcp_rr_(0), |
2047 sent_rtcp_rrtr_(0), | 2053 sent_rtcp_rrtr_(0), |
2048 sent_rtcp_dlrr_(0) {} | 2054 sent_rtcp_dlrr_(0) {} |
2049 | 2055 |
2050 private: | 2056 private: |
2051 // Receive stream should send RR packets (and RRTR packets if enabled). | 2057 // Receive stream should send RR packets (and RRTR packets if enabled). |
2052 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 2058 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 2059 rtc::CritScope lock(&crit_); |
2053 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 2060 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
2054 EXPECT_TRUE(parser.IsValid()); | 2061 EXPECT_TRUE(parser.IsValid()); |
2055 | 2062 |
2056 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 2063 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
2057 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { | 2064 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
2058 if (packet_type == RTCPUtility::RTCPPacketTypes::kRr) { | 2065 if (packet_type == RTCPUtility::RTCPPacketTypes::kRr) { |
2059 ++sent_rtcp_rr_; | 2066 ++sent_rtcp_rr_; |
2060 } else if (packet_type == | 2067 } else if (packet_type == |
2061 RTCPUtility::RTCPPacketTypes::kXrReceiverReferenceTime) { | 2068 RTCPUtility::RTCPPacketTypes::kXrReceiverReferenceTime) { |
2062 ++sent_rtcp_rrtr_; | 2069 ++sent_rtcp_rrtr_; |
2063 } | 2070 } |
2064 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kSr); | 2071 EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kSr); |
2065 EXPECT_NE(packet_type, | 2072 EXPECT_NE(packet_type, |
2066 RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem); | 2073 RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem); |
2067 packet_type = parser.Iterate(); | 2074 packet_type = parser.Iterate(); |
2068 } | 2075 } |
2069 return SEND_PACKET; | 2076 return SEND_PACKET; |
2070 } | 2077 } |
2071 // Send stream should send SR packets (and DLRR packets if enabled). | 2078 // Send stream should send SR packets (and DLRR packets if enabled). |
2072 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) { | 2079 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) { |
| 2080 rtc::CritScope lock(&crit_); |
2073 RTCPUtility::RTCPParserV2 parser(packet, length, true); | 2081 RTCPUtility::RTCPParserV2 parser(packet, length, true); |
2074 EXPECT_TRUE(parser.IsValid()); | 2082 EXPECT_TRUE(parser.IsValid()); |
2075 | 2083 |
2076 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); | 2084 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
2077 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { | 2085 while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
2078 if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) { | 2086 if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) { |
2079 ++sent_rtcp_sr_; | 2087 ++sent_rtcp_sr_; |
2080 } else if (packet_type == | 2088 } else if (packet_type == |
2081 RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem) { | 2089 RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem) { |
2082 ++sent_rtcp_dlrr_; | 2090 ++sent_rtcp_dlrr_; |
(...skipping 22 matching lines...) Expand all Loading... |
2105 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; | 2113 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; |
2106 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = | 2114 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = |
2107 enable_rrtr_; | 2115 enable_rrtr_; |
2108 } | 2116 } |
2109 | 2117 |
2110 void PerformTest() override { | 2118 void PerformTest() override { |
2111 EXPECT_EQ(kEventSignaled, Wait()) | 2119 EXPECT_EQ(kEventSignaled, Wait()) |
2112 << "Timed out while waiting for RTCP SR/RR packets to be sent."; | 2120 << "Timed out while waiting for RTCP SR/RR packets to be sent."; |
2113 } | 2121 } |
2114 | 2122 |
| 2123 rtc::CriticalSection crit_; |
2115 bool enable_rrtr_; | 2124 bool enable_rrtr_; |
2116 int sent_rtcp_sr_; | 2125 int sent_rtcp_sr_; |
2117 int sent_rtcp_rr_; | 2126 int sent_rtcp_rr_ GUARDED_BY(&crit_); |
2118 int sent_rtcp_rrtr_; | 2127 int sent_rtcp_rrtr_ GUARDED_BY(&crit_); |
2119 int sent_rtcp_dlrr_; | 2128 int sent_rtcp_dlrr_; |
2120 } test(enable_rrtr); | 2129 } test(enable_rrtr); |
2121 | 2130 |
2122 RunBaseTest(&test, FakeNetworkPipe::Config()); | 2131 RunBaseTest(&test, FakeNetworkPipe::Config()); |
2123 } | 2132 } |
2124 | 2133 |
2125 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, | 2134 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, |
2126 bool send_single_ssrc_first) { | 2135 bool send_single_ssrc_first) { |
2127 class SendsSetSsrcs : public test::EndToEndTest { | 2136 class SendsSetSsrcs : public test::EndToEndTest { |
2128 public: | 2137 public: |
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3162 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) | 3171 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) |
3163 << "Enabling RTX requires rtpmap: rtx negotiation."; | 3172 << "Enabling RTX requires rtpmap: rtx negotiation."; |
3164 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 3173 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
3165 << "Enabling RTP extensions require negotiation."; | 3174 << "Enabling RTP extensions require negotiation."; |
3166 | 3175 |
3167 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 3176 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
3168 VerifyEmptyFecConfig(default_receive_config.rtp.fec); | 3177 VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
3169 } | 3178 } |
3170 | 3179 |
3171 } // namespace webrtc | 3180 } // namespace webrtc |
OLD | NEW |