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

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

Issue 1687303002: Don't send FEC for H.264 with NACK enabled. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: feedback Created 4 years, 10 months 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 | webrtc/video/video_send_stream.cc » ('j') | webrtc/video/vie_channel.cc » ('J')
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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 ADD_FAILURE() << "Unexpected RTP sent."; 69 ADD_FAILURE() << "Unexpected RTP sent.";
70 return false; 70 return false;
71 } 71 }
72 72
73 bool SendRtcp(const uint8_t* packet, size_t length) override { 73 bool SendRtcp(const uint8_t* packet, size_t length) override {
74 ADD_FAILURE() << "Unexpected RTCP sent."; 74 ADD_FAILURE() << "Unexpected RTCP sent.";
75 return false; 75 return false;
76 } 76 }
77 }; 77 };
78 78
79 void DecodesRetransmittedFrame(bool use_rtx, bool use_red); 79 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red);
80 void ReceivesPliAndRecovers(int rtp_history_ms); 80 void ReceivesPliAndRecovers(int rtp_history_ms);
81 void RespectsRtcpMode(RtcpMode rtcp_mode); 81 void RespectsRtcpMode(RtcpMode rtcp_mode);
82 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); 82 void TestXrReceiverReferenceTimeReport(bool enable_rrtr);
83 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); 83 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first);
84 void TestRtpStatePreservation(bool use_rtx); 84 void TestRtpStatePreservation(bool use_rtx);
85 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); 85 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare);
86 }; 86 };
87 87
88 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { 88 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) {
89 CreateCalls(Call::Config(), Call::Config()); 89 CreateCalls(Call::Config(), Call::Config());
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 uint16_t fec_sequence_number_ GUARDED_BY(&crit_); 694 uint16_t fec_sequence_number_ GUARDED_BY(&crit_);
695 bool has_last_sequence_number_; 695 bool has_last_sequence_number_;
696 uint16_t last_sequence_number_; 696 uint16_t last_sequence_number_;
697 } test; 697 } test;
698 698
699 RunBaseTest(&test); 699 RunBaseTest(&test);
700 } 700 }
701 701
702 // This test drops second RTP packet with a marker bit set, makes sure it's 702 // This test drops second RTP packet with a marker bit set, makes sure it's
703 // retransmitted and renders. Retransmission SSRCs are also checked. 703 // retransmitted and renders. Retransmission SSRCs are also checked.
704 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { 704 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
705 // Must be set high enough to allow the bitrate probing to finish. 705 // Must be set high enough to allow the bitrate probing to finish.
706 static const int kMinProbePackets = 30; 706 static const int kMinProbePackets = 30;
707 static const int kDroppedFrameNumber = kMinProbePackets + 1; 707 static const int kDroppedFrameNumber = kMinProbePackets + 1;
708 class RetransmissionObserver : public test::EndToEndTest, 708 class RetransmissionObserver : public test::EndToEndTest,
709 public I420FrameCallback { 709 public I420FrameCallback {
710 public: 710 public:
711 explicit RetransmissionObserver(bool use_rtx, bool use_red) 711 RetransmissionObserver(bool enable_rtx, bool enable_red)
712 : EndToEndTest(kDefaultTimeoutMs), 712 : EndToEndTest(kDefaultTimeoutMs),
713 payload_type_(GetPayloadType(false, use_red)), 713 payload_type_(GetPayloadType(false, enable_red)),
714 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kVideoSendSsrcs[0]), 714 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0]
715 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), 715 : kVideoSendSsrcs[0]),
716 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)),
717 encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)),
716 marker_bits_observed_(0), 718 marker_bits_observed_(0),
717 num_packets_observed_(0), 719 num_packets_observed_(0),
718 retransmitted_timestamp_(0), 720 retransmitted_timestamp_(0),
719 frame_retransmitted_(false) {} 721 frame_retransmitted_(false) {}
720 722
721 private: 723 private:
722 Action OnSendRtp(const uint8_t* packet, size_t length) override { 724 Action OnSendRtp(const uint8_t* packet, size_t length) override {
723 rtc::CritScope lock(&crit_); 725 rtc::CritScope lock(&crit_);
724 RTPHeader header; 726 RTPHeader header;
725 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 727 EXPECT_TRUE(parser_->Parse(packet, length, &header));
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 send_config->rtp.fec.red_rtx_payload_type; 785 send_config->rtp.fec.red_rtx_payload_type;
784 } 786 }
785 787
786 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { 788 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) {
787 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); 789 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
788 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; 790 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
789 (*receive_configs)[0].rtp.rtx[payload_type_].ssrc = kSendRtxSsrcs[0]; 791 (*receive_configs)[0].rtp.rtx[payload_type_].ssrc = kSendRtxSsrcs[0];
790 (*receive_configs)[0].rtp.rtx[payload_type_].payload_type = 792 (*receive_configs)[0].rtp.rtx[payload_type_].payload_type =
791 kSendRtxPayloadType; 793 kSendRtxPayloadType;
792 } 794 }
795 // Configure encoding and decoding with VP8, since generic packetization
796 // doesn't support FEC with NACK.
797 RTC_DCHECK_EQ(1u, (*receive_configs)[0].decoders.size());
798 send_config->encoder_settings.encoder = encoder_.get();
799 send_config->encoder_settings.payload_name = "VP8";
800 (*receive_configs)[0].decoders[0].payload_name = "VP8";
793 } 801 }
794 802
795 void PerformTest() override { 803 void PerformTest() override {
796 EXPECT_TRUE(Wait()) 804 EXPECT_TRUE(Wait())
797 << "Timed out while waiting for retransmission to render."; 805 << "Timed out while waiting for retransmission to render.";
798 } 806 }
799 807
800 int GetPayloadType(bool use_rtx, bool use_red) { 808 int GetPayloadType(bool use_rtx, bool use_red) {
801 if (use_red) { 809 if (use_red) {
802 if (use_rtx) 810 if (use_rtx)
803 return kRtxRedPayloadType; 811 return kRtxRedPayloadType;
804 return kRedPayloadType; 812 return kRedPayloadType;
805 } 813 }
806 if (use_rtx) 814 if (use_rtx)
807 return kSendRtxPayloadType; 815 return kSendRtxPayloadType;
808 return kFakeVideoSendPayloadType; 816 return kFakeVideoSendPayloadType;
809 } 817 }
810 818
811 rtc::CriticalSection crit_; 819 rtc::CriticalSection crit_;
812 const int payload_type_; 820 const int payload_type_;
813 const uint32_t retransmission_ssrc_; 821 const uint32_t retransmission_ssrc_;
814 const int retransmission_payload_type_; 822 const int retransmission_payload_type_;
823 rtc::scoped_ptr<VideoEncoder> encoder_;
824 const std::string payload_name_;
815 int marker_bits_observed_; 825 int marker_bits_observed_;
816 int num_packets_observed_; 826 int num_packets_observed_;
817 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); 827 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_);
818 bool frame_retransmitted_; 828 bool frame_retransmitted_;
819 } test(use_rtx, use_red); 829 } test(enable_rtx, enable_red);
820 830
821 RunBaseTest(&test); 831 RunBaseTest(&test);
822 } 832 }
823 833
824 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { 834 TEST_F(EndToEndTest, DecodesRetransmittedFrame) {
825 DecodesRetransmittedFrame(false, false); 835 DecodesRetransmittedFrame(false, false);
826 } 836 }
827 837
828 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { 838 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) {
829 DecodesRetransmittedFrame(true, false); 839 DecodesRetransmittedFrame(true, false);
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 void EndToEndTest::VerifyHistogramStats(bool use_rtx, 2091 void EndToEndTest::VerifyHistogramStats(bool use_rtx,
2082 bool use_red, 2092 bool use_red,
2083 bool screenshare) { 2093 bool screenshare) {
2084 class StatsObserver : public test::EndToEndTest { 2094 class StatsObserver : public test::EndToEndTest {
2085 public: 2095 public:
2086 StatsObserver(bool use_rtx, bool use_red, bool screenshare) 2096 StatsObserver(bool use_rtx, bool use_red, bool screenshare)
2087 : EndToEndTest(kLongTimeoutMs), 2097 : EndToEndTest(kLongTimeoutMs),
2088 use_rtx_(use_rtx), 2098 use_rtx_(use_rtx),
2089 use_red_(use_red), 2099 use_red_(use_red),
2090 screenshare_(screenshare), 2100 screenshare_(screenshare),
2101 // This test uses NACK, so to send FEC we can't use a fake encoder.
2102 vp8_encoder_(
2103 use_red ? VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)
2104 : nullptr),
2091 sender_call_(nullptr), 2105 sender_call_(nullptr),
2092 receiver_call_(nullptr), 2106 receiver_call_(nullptr),
2093 start_runtime_ms_(-1) {} 2107 start_runtime_ms_(-1) {}
2094 2108
2095 private: 2109 private:
2096 Action OnSendRtp(const uint8_t* packet, size_t length) override { 2110 Action OnSendRtp(const uint8_t* packet, size_t length) override {
2097 if (MinMetricRunTimePassed()) 2111 if (MinMetricRunTimePassed())
2098 observation_complete_.Set(); 2112 observation_complete_.Set();
2099 2113
2100 // GetStats calls GetSendChannelRtcpStatistics 2114 // GetStats calls GetSendChannelRtcpStatistics
(...skipping 19 matching lines...) Expand all
2120 VideoSendStream::Config* send_config, 2134 VideoSendStream::Config* send_config,
2121 std::vector<VideoReceiveStream::Config>* receive_configs, 2135 std::vector<VideoReceiveStream::Config>* receive_configs,
2122 VideoEncoderConfig* encoder_config) override { 2136 VideoEncoderConfig* encoder_config) override {
2123 // NACK 2137 // NACK
2124 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 2138 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
2125 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 2139 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
2126 // FEC 2140 // FEC
2127 if (use_red_) { 2141 if (use_red_) {
2128 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 2142 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
2129 send_config->rtp.fec.red_payload_type = kRedPayloadType; 2143 send_config->rtp.fec.red_payload_type = kRedPayloadType;
2144 send_config->encoder_settings.encoder = vp8_encoder_.get();
2145 send_config->encoder_settings.payload_name = "VP8";
2146 (*receive_configs)[0].decoders[0].payload_name = "VP8";
2130 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; 2147 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType;
2131 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 2148 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
2132 } 2149 }
2133 // RTX 2150 // RTX
2134 if (use_rtx_) { 2151 if (use_rtx_) {
2135 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); 2152 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
2136 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; 2153 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
2137 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = 2154 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc =
2138 kSendRtxSsrcs[0]; 2155 kSendRtxSsrcs[0];
2139 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = 2156 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type =
2140 kSendRtxPayloadType; 2157 kSendRtxPayloadType;
2141 } 2158 }
2142 encoder_config->content_type = 2159 encoder_config->content_type =
2143 screenshare_ ? VideoEncoderConfig::ContentType::kScreen 2160 screenshare_ ? VideoEncoderConfig::ContentType::kScreen
2144 : VideoEncoderConfig::ContentType::kRealtimeVideo; 2161 : VideoEncoderConfig::ContentType::kRealtimeVideo;
2145 } 2162 }
2146 2163
2147 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { 2164 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
2148 sender_call_ = sender_call; 2165 sender_call_ = sender_call;
2149 receiver_call_ = receiver_call; 2166 receiver_call_ = receiver_call;
2150 } 2167 }
2151 2168
2152 void PerformTest() override { 2169 void PerformTest() override {
2153 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; 2170 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed.";
2154 } 2171 }
2155 2172
2156 const bool use_rtx_; 2173 const bool use_rtx_;
2157 const bool use_red_; 2174 const bool use_red_;
2158 const bool screenshare_; 2175 const bool screenshare_;
2176 const rtc::scoped_ptr<VideoEncoder> vp8_encoder_;
2159 Call* sender_call_; 2177 Call* sender_call_;
2160 Call* receiver_call_; 2178 Call* receiver_call_;
2161 int64_t start_runtime_ms_; 2179 int64_t start_runtime_ms_;
2162 } test(use_rtx, use_red, screenshare); 2180 } test(use_rtx, use_red, screenshare);
2163 2181
2164 test::ClearHistograms(); 2182 test::ClearHistograms();
2165 RunBaseTest(&test); 2183 RunBaseTest(&test);
2166 2184
2167 // Delete the call for Call stats to be reported. 2185 // Delete the call for Call stats to be reported.
2168 sender_call_.reset(); 2186 sender_call_.reset();
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after
3519 private: 3537 private:
3520 bool video_observed_; 3538 bool video_observed_;
3521 bool audio_observed_; 3539 bool audio_observed_;
3522 SequenceNumberUnwrapper unwrapper_; 3540 SequenceNumberUnwrapper unwrapper_;
3523 std::set<int64_t> received_packet_ids_; 3541 std::set<int64_t> received_packet_ids_;
3524 } test; 3542 } test;
3525 3543
3526 RunBaseTest(&test); 3544 RunBaseTest(&test);
3527 } 3545 }
3528 } // namespace webrtc 3546 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/video/video_send_stream.cc » ('j') | webrtc/video/vie_channel.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698