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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 enable_rtx, bool enable_red); | 79 void DecodesRetransmittedFrame(bool use_rtx, bool use_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 Loading... |
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 enable_rtx, bool enable_red) { | 704 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_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 RetransmissionObserver(bool enable_rtx, bool enable_red) | 711 explicit RetransmissionObserver(bool use_rtx, bool use_red) |
712 : EndToEndTest(kDefaultTimeoutMs), | 712 : EndToEndTest(kDefaultTimeoutMs), |
713 payload_type_(GetPayloadType(false, enable_red)), | 713 payload_type_(GetPayloadType(false, use_red)), |
714 retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0] | 714 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kVideoSendSsrcs[0]), |
715 : kVideoSendSsrcs[0]), | 715 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), |
716 retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)), | |
717 encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)), | |
718 marker_bits_observed_(0), | 716 marker_bits_observed_(0), |
719 num_packets_observed_(0), | 717 num_packets_observed_(0), |
720 retransmitted_timestamp_(0), | 718 retransmitted_timestamp_(0), |
721 frame_retransmitted_(false) {} | 719 frame_retransmitted_(false) {} |
722 | 720 |
723 private: | 721 private: |
724 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 722 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
725 rtc::CritScope lock(&crit_); | 723 rtc::CritScope lock(&crit_); |
726 RTPHeader header; | 724 RTPHeader header; |
727 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 725 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 send_config->rtp.fec.red_rtx_payload_type; | 783 send_config->rtp.fec.red_rtx_payload_type; |
786 } | 784 } |
787 | 785 |
788 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { | 786 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { |
789 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 787 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
790 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 788 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
791 (*receive_configs)[0].rtp.rtx[payload_type_].ssrc = kSendRtxSsrcs[0]; | 789 (*receive_configs)[0].rtp.rtx[payload_type_].ssrc = kSendRtxSsrcs[0]; |
792 (*receive_configs)[0].rtp.rtx[payload_type_].payload_type = | 790 (*receive_configs)[0].rtp.rtx[payload_type_].payload_type = |
793 kSendRtxPayloadType; | 791 kSendRtxPayloadType; |
794 } | 792 } |
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"; | |
801 } | 793 } |
802 | 794 |
803 void PerformTest() override { | 795 void PerformTest() override { |
804 EXPECT_TRUE(Wait()) | 796 EXPECT_TRUE(Wait()) |
805 << "Timed out while waiting for retransmission to render."; | 797 << "Timed out while waiting for retransmission to render."; |
806 } | 798 } |
807 | 799 |
808 int GetPayloadType(bool use_rtx, bool use_red) { | 800 int GetPayloadType(bool use_rtx, bool use_red) { |
809 if (use_red) { | 801 if (use_red) { |
810 if (use_rtx) | 802 if (use_rtx) |
811 return kRtxRedPayloadType; | 803 return kRtxRedPayloadType; |
812 return kRedPayloadType; | 804 return kRedPayloadType; |
813 } | 805 } |
814 if (use_rtx) | 806 if (use_rtx) |
815 return kSendRtxPayloadType; | 807 return kSendRtxPayloadType; |
816 return kFakeVideoSendPayloadType; | 808 return kFakeVideoSendPayloadType; |
817 } | 809 } |
818 | 810 |
819 rtc::CriticalSection crit_; | 811 rtc::CriticalSection crit_; |
820 const int payload_type_; | 812 const int payload_type_; |
821 const uint32_t retransmission_ssrc_; | 813 const uint32_t retransmission_ssrc_; |
822 const int retransmission_payload_type_; | 814 const int retransmission_payload_type_; |
823 rtc::scoped_ptr<VideoEncoder> encoder_; | |
824 const std::string payload_name_; | |
825 int marker_bits_observed_; | 815 int marker_bits_observed_; |
826 int num_packets_observed_; | 816 int num_packets_observed_; |
827 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); | 817 uint32_t retransmitted_timestamp_ GUARDED_BY(&crit_); |
828 bool frame_retransmitted_; | 818 bool frame_retransmitted_; |
829 } test(enable_rtx, enable_red); | 819 } test(use_rtx, use_red); |
830 | 820 |
831 RunBaseTest(&test); | 821 RunBaseTest(&test); |
832 } | 822 } |
833 | 823 |
834 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { | 824 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { |
835 DecodesRetransmittedFrame(false, false); | 825 DecodesRetransmittedFrame(false, false); |
836 } | 826 } |
837 | 827 |
838 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { | 828 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { |
839 DecodesRetransmittedFrame(true, false); | 829 DecodesRetransmittedFrame(true, false); |
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2091 void EndToEndTest::VerifyHistogramStats(bool use_rtx, | 2081 void EndToEndTest::VerifyHistogramStats(bool use_rtx, |
2092 bool use_red, | 2082 bool use_red, |
2093 bool screenshare) { | 2083 bool screenshare) { |
2094 class StatsObserver : public test::EndToEndTest { | 2084 class StatsObserver : public test::EndToEndTest { |
2095 public: | 2085 public: |
2096 StatsObserver(bool use_rtx, bool use_red, bool screenshare) | 2086 StatsObserver(bool use_rtx, bool use_red, bool screenshare) |
2097 : EndToEndTest(kLongTimeoutMs), | 2087 : EndToEndTest(kLongTimeoutMs), |
2098 use_rtx_(use_rtx), | 2088 use_rtx_(use_rtx), |
2099 use_red_(use_red), | 2089 use_red_(use_red), |
2100 screenshare_(screenshare), | 2090 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), | |
2105 sender_call_(nullptr), | 2091 sender_call_(nullptr), |
2106 receiver_call_(nullptr), | 2092 receiver_call_(nullptr), |
2107 start_runtime_ms_(-1) {} | 2093 start_runtime_ms_(-1) {} |
2108 | 2094 |
2109 private: | 2095 private: |
2110 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 2096 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
2111 if (MinMetricRunTimePassed()) | 2097 if (MinMetricRunTimePassed()) |
2112 observation_complete_.Set(); | 2098 observation_complete_.Set(); |
2113 | 2099 |
2114 // GetStats calls GetSendChannelRtcpStatistics | 2100 // GetStats calls GetSendChannelRtcpStatistics |
(...skipping 19 matching lines...) Expand all Loading... |
2134 VideoSendStream::Config* send_config, | 2120 VideoSendStream::Config* send_config, |
2135 std::vector<VideoReceiveStream::Config>* receive_configs, | 2121 std::vector<VideoReceiveStream::Config>* receive_configs, |
2136 VideoEncoderConfig* encoder_config) override { | 2122 VideoEncoderConfig* encoder_config) override { |
2137 // NACK | 2123 // NACK |
2138 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2124 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
2139 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2125 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
2140 // FEC | 2126 // FEC |
2141 if (use_red_) { | 2127 if (use_red_) { |
2142 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 2128 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
2143 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 2129 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"; | |
2147 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 2130 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
2148 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 2131 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
2149 } | 2132 } |
2150 // RTX | 2133 // RTX |
2151 if (use_rtx_) { | 2134 if (use_rtx_) { |
2152 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 2135 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
2153 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 2136 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
2154 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = | 2137 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
2155 kSendRtxSsrcs[0]; | 2138 kSendRtxSsrcs[0]; |
2156 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = | 2139 (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
2157 kSendRtxPayloadType; | 2140 kSendRtxPayloadType; |
2158 } | 2141 } |
2159 encoder_config->content_type = | 2142 encoder_config->content_type = |
2160 screenshare_ ? VideoEncoderConfig::ContentType::kScreen | 2143 screenshare_ ? VideoEncoderConfig::ContentType::kScreen |
2161 : VideoEncoderConfig::ContentType::kRealtimeVideo; | 2144 : VideoEncoderConfig::ContentType::kRealtimeVideo; |
2162 } | 2145 } |
2163 | 2146 |
2164 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 2147 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
2165 sender_call_ = sender_call; | 2148 sender_call_ = sender_call; |
2166 receiver_call_ = receiver_call; | 2149 receiver_call_ = receiver_call; |
2167 } | 2150 } |
2168 | 2151 |
2169 void PerformTest() override { | 2152 void PerformTest() override { |
2170 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; | 2153 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; |
2171 } | 2154 } |
2172 | 2155 |
2173 const bool use_rtx_; | 2156 const bool use_rtx_; |
2174 const bool use_red_; | 2157 const bool use_red_; |
2175 const bool screenshare_; | 2158 const bool screenshare_; |
2176 const rtc::scoped_ptr<VideoEncoder> vp8_encoder_; | |
2177 Call* sender_call_; | 2159 Call* sender_call_; |
2178 Call* receiver_call_; | 2160 Call* receiver_call_; |
2179 int64_t start_runtime_ms_; | 2161 int64_t start_runtime_ms_; |
2180 } test(use_rtx, use_red, screenshare); | 2162 } test(use_rtx, use_red, screenshare); |
2181 | 2163 |
2182 test::ClearHistograms(); | 2164 test::ClearHistograms(); |
2183 RunBaseTest(&test); | 2165 RunBaseTest(&test); |
2184 | 2166 |
2185 // Delete the call for Call stats to be reported. | 2167 // Delete the call for Call stats to be reported. |
2186 sender_call_.reset(); | 2168 sender_call_.reset(); |
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3537 private: | 3519 private: |
3538 bool video_observed_; | 3520 bool video_observed_; |
3539 bool audio_observed_; | 3521 bool audio_observed_; |
3540 SequenceNumberUnwrapper unwrapper_; | 3522 SequenceNumberUnwrapper unwrapper_; |
3541 std::set<int64_t> received_packet_ids_; | 3523 std::set<int64_t> received_packet_ids_; |
3542 } test; | 3524 } test; |
3543 | 3525 |
3544 RunBaseTest(&test); | 3526 RunBaseTest(&test); |
3545 } | 3527 } |
3546 } // namespace webrtc | 3528 } // namespace webrtc |
OLD | NEW |