Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 1413543007: Add locks and thread annotations for ReceiverReferenceTimeReportEnabled. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: . Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698