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 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 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 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |