| 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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 bool need_rtp_; | 133 bool need_rtp_; |
| 134 bool need_rtcp_; | 134 bool need_rtcp_; |
| 135 rtc::CriticalSection crit_; | 135 rtc::CriticalSection crit_; |
| 136 }; | 136 }; |
| 137 | 137 |
| 138 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); | 138 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); |
| 139 void ReceivesPliAndRecovers(int rtp_history_ms); | 139 void ReceivesPliAndRecovers(int rtp_history_ms); |
| 140 void RespectsRtcpMode(RtcpMode rtcp_mode); | 140 void RespectsRtcpMode(RtcpMode rtcp_mode); |
| 141 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); | 141 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); |
| 142 void TestRtpStatePreservation(bool use_rtx, bool provoke_rtcpsr_before_rtp); | 142 void TestRtpStatePreservation(bool use_rtx, bool provoke_rtcpsr_before_rtp); |
| 143 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); | 143 void VerifyHistogramStats(bool use_rtx, bool use_fec, bool screenshare); |
| 144 void VerifyNewVideoSendStreamsRespectNetworkState( | 144 void VerifyNewVideoSendStreamsRespectNetworkState( |
| 145 MediaType network_to_bring_up, | 145 MediaType network_to_bring_up, |
| 146 VideoEncoder* encoder, | 146 VideoEncoder* encoder, |
| 147 Transport* transport); | 147 Transport* transport); |
| 148 void VerifyNewVideoReceiveStreamsRespectNetworkState( | 148 void VerifyNewVideoReceiveStreamsRespectNetworkState( |
| 149 MediaType network_to_bring_up, | 149 MediaType network_to_bring_up, |
| 150 Transport* transport); | 150 Transport* transport); |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { | 153 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 send_config->encoder_settings.payload_type = kVideoSendPayloadType; | 689 send_config->encoder_settings.payload_type = kVideoSendPayloadType; |
| 690 VideoReceiveStream::Decoder decoder = | 690 VideoReceiveStream::Decoder decoder = |
| 691 test::CreateMatchingDecoder(send_config->encoder_settings); | 691 test::CreateMatchingDecoder(send_config->encoder_settings); |
| 692 decoder_.reset(decoder.decoder); | 692 decoder_.reset(decoder.decoder); |
| 693 (*receive_configs)[0].decoders.clear(); | 693 (*receive_configs)[0].decoders.clear(); |
| 694 (*receive_configs)[0].decoders.push_back(decoder); | 694 (*receive_configs)[0].decoders.push_back(decoder); |
| 695 | 695 |
| 696 // Enable ULPFEC over RED. | 696 // Enable ULPFEC over RED. |
| 697 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 697 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 698 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 698 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 699 (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 699 (*receive_configs)[0].rtp.red_payload_type = kRedPayloadType; |
| 700 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 700 (*receive_configs)[0].rtp.ulpfec_payload_type = kUlpfecPayloadType; |
| 701 | 701 |
| 702 (*receive_configs)[0].renderer = this; | 702 (*receive_configs)[0].renderer = this; |
| 703 } | 703 } |
| 704 | 704 |
| 705 void PerformTest() override { | 705 void PerformTest() override { |
| 706 EXPECT_TRUE(Wait()) | 706 EXPECT_TRUE(Wait()) |
| 707 << "Timed out waiting for dropped frames to be rendered."; | 707 << "Timed out waiting for dropped frames to be rendered."; |
| 708 } | 708 } |
| 709 | 709 |
| 710 rtc::CriticalSection crit_; | 710 rtc::CriticalSection crit_; |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 | 846 |
| 847 void ModifyVideoConfigs( | 847 void ModifyVideoConfigs( |
| 848 VideoSendStream::Config* send_config, | 848 VideoSendStream::Config* send_config, |
| 849 std::vector<VideoReceiveStream::Config>* receive_configs, | 849 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 850 VideoEncoderConfig* encoder_config) override { | 850 VideoEncoderConfig* encoder_config) override { |
| 851 (*receive_configs)[0].rtp.local_ssrc = kVideoLocalSsrc; | 851 (*receive_configs)[0].rtp.local_ssrc = kVideoLocalSsrc; |
| 852 (*receive_configs)[0].renderer = this; | 852 (*receive_configs)[0].renderer = this; |
| 853 | 853 |
| 854 if (enable_nack_) { | 854 if (enable_nack_) { |
| 855 send_config->rtp.nack.rtp_history_ms = test::CallTest::kNackRtpHistoryMs; | 855 send_config->rtp.nack.rtp_history_ms = test::CallTest::kNackRtpHistoryMs; |
| 856 send_config->rtp.ulpfec.red_rtx_payload_type = | |
| 857 test::CallTest::kRtxRedPayloadType; | |
| 858 send_config->rtp.rtx.ssrcs.push_back(test::CallTest::kSendRtxSsrcs[0]); | 856 send_config->rtp.rtx.ssrcs.push_back(test::CallTest::kSendRtxSsrcs[0]); |
| 859 send_config->rtp.rtx.payload_type = test::CallTest::kSendRtxPayloadType; | 857 send_config->rtp.rtx.payload_type = test::CallTest::kSendRtxPayloadType; |
| 860 | 858 |
| 861 (*receive_configs)[0].rtp.nack.rtp_history_ms = | 859 (*receive_configs)[0].rtp.nack.rtp_history_ms = |
| 862 test::CallTest::kNackRtpHistoryMs; | 860 test::CallTest::kNackRtpHistoryMs; |
| 863 (*receive_configs)[0].rtp.ulpfec.red_rtx_payload_type = | |
| 864 test::CallTest::kRtxRedPayloadType; | |
| 865 | |
| 866 (*receive_configs)[0].rtp.rtx_ssrc = test::CallTest::kSendRtxSsrcs[0]; | 861 (*receive_configs)[0].rtp.rtx_ssrc = test::CallTest::kSendRtxSsrcs[0]; |
| 867 (*receive_configs)[0] | 862 (*receive_configs)[0] |
| 868 .rtp | 863 .rtp |
| 869 .rtx_associated_payload_types[test::CallTest::kSendRtxPayloadType] = | 864 .rtx_associated_payload_types[test::CallTest::kSendRtxPayloadType] = |
| 870 test::CallTest::kVideoSendPayloadType; | 865 test::CallTest::kVideoSendPayloadType; |
| 871 } | 866 } |
| 872 } | 867 } |
| 873 | 868 |
| 874 void OnFrameGeneratorCapturerCreated( | 869 void OnFrameGeneratorCapturerCreated( |
| 875 test::FrameGeneratorCapturer* frame_generator_capturer) override { | 870 test::FrameGeneratorCapturer* frame_generator_capturer) override { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 // Configure hybrid NACK/FEC. | 1031 // Configure hybrid NACK/FEC. |
| 1037 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1032 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 1038 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 1033 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 1039 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1034 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 1040 // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled. | 1035 // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled. |
| 1041 send_config->encoder_settings.encoder = encoder_.get(); | 1036 send_config->encoder_settings.encoder = encoder_.get(); |
| 1042 send_config->encoder_settings.payload_name = "VP8"; | 1037 send_config->encoder_settings.payload_name = "VP8"; |
| 1043 send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType; | 1038 send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType; |
| 1044 | 1039 |
| 1045 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1040 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 1046 (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 1041 (*receive_configs)[0].rtp.red_payload_type = kRedPayloadType; |
| 1047 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1042 (*receive_configs)[0].rtp.ulpfec_payload_type = kUlpfecPayloadType; |
| 1048 | 1043 |
| 1049 (*receive_configs)[0].decoders.resize(1); | 1044 (*receive_configs)[0].decoders.resize(1); |
| 1050 (*receive_configs)[0].decoders[0].payload_type = | 1045 (*receive_configs)[0].decoders[0].payload_type = |
| 1051 send_config->encoder_settings.payload_type; | 1046 send_config->encoder_settings.payload_type; |
| 1052 (*receive_configs)[0].decoders[0].payload_name = | 1047 (*receive_configs)[0].decoders[0].payload_name = |
| 1053 send_config->encoder_settings.payload_name; | 1048 send_config->encoder_settings.payload_name; |
| 1054 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); | 1049 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
| 1055 } | 1050 } |
| 1056 | 1051 |
| 1057 void PerformTest() override { | 1052 void PerformTest() override { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 (*receive_configs)[0].disable_prerenderer_smoothing = true; | 1159 (*receive_configs)[0].disable_prerenderer_smoothing = true; |
| 1165 (*receive_configs)[0].renderer = this; | 1160 (*receive_configs)[0].renderer = this; |
| 1166 | 1161 |
| 1167 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1162 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 1168 | 1163 |
| 1169 if (payload_type_ == kRedPayloadType) { | 1164 if (payload_type_ == kRedPayloadType) { |
| 1170 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1165 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 1171 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 1166 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 1172 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) | 1167 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) |
| 1173 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; | 1168 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; |
| 1174 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 1169 (*receive_configs)[0].rtp.ulpfec_payload_type = |
| 1175 send_config->rtp.ulpfec.ulpfec_payload_type; | 1170 send_config->rtp.ulpfec.ulpfec_payload_type; |
| 1176 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 1171 (*receive_configs)[0].rtp.red_payload_type = |
| 1177 send_config->rtp.ulpfec.red_payload_type; | 1172 send_config->rtp.ulpfec.red_payload_type; |
| 1178 (*receive_configs)[0].rtp.ulpfec.red_rtx_payload_type = | |
| 1179 send_config->rtp.ulpfec.red_rtx_payload_type; | |
| 1180 } | 1173 } |
| 1181 | 1174 |
| 1182 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { | 1175 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { |
| 1183 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 1176 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
| 1184 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 1177 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
| 1185 (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; | 1178 (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; |
| 1186 (*receive_configs)[0] | 1179 (*receive_configs)[0] |
| 1187 .rtp.rtx_associated_payload_types[(payload_type_ == kRedPayloadType) | 1180 .rtp.rtx_associated_payload_types[(payload_type_ == kRedPayloadType) |
| 1188 ? kRtxRedPayloadType | 1181 ? kRtxRedPayloadType |
| 1189 : kSendRtxPayloadType] = | 1182 : kSendRtxPayloadType] = |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1200 void OnFrameGeneratorCapturerCreated( | 1193 void OnFrameGeneratorCapturerCreated( |
| 1201 test::FrameGeneratorCapturer* frame_generator_capturer) override { | 1194 test::FrameGeneratorCapturer* frame_generator_capturer) override { |
| 1202 frame_generator_capturer->SetFakeRotation(kVideoRotation_90); | 1195 frame_generator_capturer->SetFakeRotation(kVideoRotation_90); |
| 1203 } | 1196 } |
| 1204 | 1197 |
| 1205 void PerformTest() override { | 1198 void PerformTest() override { |
| 1206 EXPECT_TRUE(Wait()) | 1199 EXPECT_TRUE(Wait()) |
| 1207 << "Timed out while waiting for retransmission to render."; | 1200 << "Timed out while waiting for retransmission to render."; |
| 1208 } | 1201 } |
| 1209 | 1202 |
| 1210 int GetPayloadType(bool use_rtx, bool use_red) { | 1203 int GetPayloadType(bool use_rtx, bool use_fec) { |
| 1211 if (use_red) { | 1204 if (use_fec) { |
| 1212 if (use_rtx) | 1205 if (use_rtx) |
| 1213 return kRtxRedPayloadType; | 1206 return kRtxRedPayloadType; |
| 1214 return kRedPayloadType; | 1207 return kRedPayloadType; |
| 1215 } | 1208 } |
| 1216 if (use_rtx) | 1209 if (use_rtx) |
| 1217 return kSendRtxPayloadType; | 1210 return kSendRtxPayloadType; |
| 1218 return kFakeVideoSendPayloadType; | 1211 return kFakeVideoSendPayloadType; |
| 1219 } | 1212 } |
| 1220 | 1213 |
| 1221 rtc::CriticalSection crit_; | 1214 rtc::CriticalSection crit_; |
| (...skipping 1471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2693 RunBaseTest(&test); | 2686 RunBaseTest(&test); |
| 2694 | 2687 |
| 2695 EXPECT_EQ( | 2688 EXPECT_EQ( |
| 2696 1, metrics::NumSamples("WebRTC.Video.UniqueNackRequestsSentInPercent")); | 2689 1, metrics::NumSamples("WebRTC.Video.UniqueNackRequestsSentInPercent")); |
| 2697 EXPECT_EQ(1, metrics::NumSamples( | 2690 EXPECT_EQ(1, metrics::NumSamples( |
| 2698 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); | 2691 "WebRTC.Video.UniqueNackRequestsReceivedInPercent")); |
| 2699 EXPECT_GT(metrics::MinSample("WebRTC.Video.NackPacketsSentPerMinute"), 0); | 2692 EXPECT_GT(metrics::MinSample("WebRTC.Video.NackPacketsSentPerMinute"), 0); |
| 2700 } | 2693 } |
| 2701 | 2694 |
| 2702 void EndToEndTest::VerifyHistogramStats(bool use_rtx, | 2695 void EndToEndTest::VerifyHistogramStats(bool use_rtx, |
| 2703 bool use_red, | 2696 bool use_fec, |
| 2704 bool screenshare) { | 2697 bool screenshare) { |
| 2705 class StatsObserver : public test::EndToEndTest, | 2698 class StatsObserver : public test::EndToEndTest, |
| 2706 public rtc::VideoSinkInterface<VideoFrame> { | 2699 public rtc::VideoSinkInterface<VideoFrame> { |
| 2707 public: | 2700 public: |
| 2708 StatsObserver(bool use_rtx, bool use_red, bool screenshare) | 2701 StatsObserver(bool use_rtx, bool use_fec, bool screenshare) |
| 2709 : EndToEndTest(kLongTimeoutMs), | 2702 : EndToEndTest(kLongTimeoutMs), |
| 2710 use_rtx_(use_rtx), | 2703 use_rtx_(use_rtx), |
| 2711 use_red_(use_red), | 2704 use_fec_(use_fec), |
| 2712 screenshare_(screenshare), | 2705 screenshare_(screenshare), |
| 2713 // This test uses NACK, so to send FEC we can't use a fake encoder. | 2706 // This test uses NACK, so to send FEC we can't use a fake encoder. |
| 2714 vp8_encoder_(use_red ? VP8Encoder::Create() : nullptr), | 2707 vp8_encoder_(use_fec ? VP8Encoder::Create() : nullptr), |
| 2715 sender_call_(nullptr), | 2708 sender_call_(nullptr), |
| 2716 receiver_call_(nullptr), | 2709 receiver_call_(nullptr), |
| 2717 start_runtime_ms_(-1), | 2710 start_runtime_ms_(-1), |
| 2718 num_frames_received_(0) {} | 2711 num_frames_received_(0) {} |
| 2719 | 2712 |
| 2720 private: | 2713 private: |
| 2721 void OnFrame(const VideoFrame& video_frame) override { | 2714 void OnFrame(const VideoFrame& video_frame) override { |
| 2722 // The RTT is needed to estimate |ntp_time_ms| which is used by | 2715 // The RTT is needed to estimate |ntp_time_ms| which is used by |
| 2723 // end-to-end delay stats. Therefore, start counting received frames once | 2716 // end-to-end delay stats. Therefore, start counting received frames once |
| 2724 // |ntp_time_ms| is valid. | 2717 // |ntp_time_ms| is valid. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2755 | 2748 |
| 2756 void ModifyVideoConfigs( | 2749 void ModifyVideoConfigs( |
| 2757 VideoSendStream::Config* send_config, | 2750 VideoSendStream::Config* send_config, |
| 2758 std::vector<VideoReceiveStream::Config>* receive_configs, | 2751 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 2759 VideoEncoderConfig* encoder_config) override { | 2752 VideoEncoderConfig* encoder_config) override { |
| 2760 // NACK | 2753 // NACK |
| 2761 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2754 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 2762 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2755 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 2763 (*receive_configs)[0].renderer = this; | 2756 (*receive_configs)[0].renderer = this; |
| 2764 // FEC | 2757 // FEC |
| 2765 if (use_red_) { | 2758 if (use_fec_) { |
| 2766 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 2759 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 2767 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 2760 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 2768 send_config->encoder_settings.encoder = vp8_encoder_.get(); | 2761 send_config->encoder_settings.encoder = vp8_encoder_.get(); |
| 2769 send_config->encoder_settings.payload_name = "VP8"; | 2762 send_config->encoder_settings.payload_name = "VP8"; |
| 2770 (*receive_configs)[0].decoders[0].payload_name = "VP8"; | 2763 (*receive_configs)[0].decoders[0].payload_name = "VP8"; |
| 2771 (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 2764 (*receive_configs)[0].rtp.red_payload_type = kRedPayloadType; |
| 2772 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 2765 (*receive_configs)[0].rtp.ulpfec_payload_type = kUlpfecPayloadType; |
| 2773 kUlpfecPayloadType; | |
| 2774 } | 2766 } |
| 2775 // RTX | 2767 // RTX |
| 2776 if (use_rtx_) { | 2768 if (use_rtx_) { |
| 2777 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | 2769 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
| 2778 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 2770 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
| 2779 (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; | 2771 (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; |
| 2780 (*receive_configs)[0] | 2772 (*receive_configs)[0] |
| 2781 .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = | 2773 .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = |
| 2782 kFakeVideoSendPayloadType; | 2774 kFakeVideoSendPayloadType; |
| 2775 if (use_fec_) { |
| 2776 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; |
| 2777 (*receive_configs)[0] |
| 2778 .rtp.rtx_associated_payload_types[kRtxRedPayloadType] = |
| 2779 kSendRtxPayloadType; |
| 2780 } |
| 2783 } | 2781 } |
| 2784 // RTT needed for RemoteNtpTimeEstimator for the receive stream. | 2782 // RTT needed for RemoteNtpTimeEstimator for the receive stream. |
| 2785 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true; | 2783 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true; |
| 2786 encoder_config->content_type = | 2784 encoder_config->content_type = |
| 2787 screenshare_ ? VideoEncoderConfig::ContentType::kScreen | 2785 screenshare_ ? VideoEncoderConfig::ContentType::kScreen |
| 2788 : VideoEncoderConfig::ContentType::kRealtimeVideo; | 2786 : VideoEncoderConfig::ContentType::kRealtimeVideo; |
| 2789 } | 2787 } |
| 2790 | 2788 |
| 2791 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | 2789 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
| 2792 sender_call_ = sender_call; | 2790 sender_call_ = sender_call; |
| 2793 receiver_call_ = receiver_call; | 2791 receiver_call_ = receiver_call; |
| 2794 } | 2792 } |
| 2795 | 2793 |
| 2796 void PerformTest() override { | 2794 void PerformTest() override { |
| 2797 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; | 2795 EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed."; |
| 2798 } | 2796 } |
| 2799 | 2797 |
| 2800 rtc::CriticalSection crit_; | 2798 rtc::CriticalSection crit_; |
| 2801 const bool use_rtx_; | 2799 const bool use_rtx_; |
| 2802 const bool use_red_; | 2800 const bool use_fec_; |
| 2803 const bool screenshare_; | 2801 const bool screenshare_; |
| 2804 const std::unique_ptr<VideoEncoder> vp8_encoder_; | 2802 const std::unique_ptr<VideoEncoder> vp8_encoder_; |
| 2805 Call* sender_call_; | 2803 Call* sender_call_; |
| 2806 Call* receiver_call_; | 2804 Call* receiver_call_; |
| 2807 int64_t start_runtime_ms_; | 2805 int64_t start_runtime_ms_; |
| 2808 int num_frames_received_ RTC_GUARDED_BY(&crit_); | 2806 int num_frames_received_ RTC_GUARDED_BY(&crit_); |
| 2809 } test(use_rtx, use_red, screenshare); | 2807 } test(use_rtx, use_fec, screenshare); |
| 2810 | 2808 |
| 2811 metrics::Reset(); | 2809 metrics::Reset(); |
| 2812 RunBaseTest(&test); | 2810 RunBaseTest(&test); |
| 2813 | 2811 |
| 2814 std::string video_prefix = | 2812 std::string video_prefix = |
| 2815 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video."; | 2813 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video."; |
| 2816 // The content type extension is disabled in non screenshare test, | 2814 // The content type extension is disabled in non screenshare test, |
| 2817 // therefore no slicing on simulcast id should be present. | 2815 // therefore no slicing on simulcast id should be present. |
| 2818 std::string video_suffix = screenshare ? ".S0" : ""; | 2816 std::string video_suffix = screenshare ? ".S0" : ""; |
| 2819 // Verify that stats have been updated once. | 2817 // Verify that stats have been updated once. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2909 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendDelayInMs")); | 2907 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendDelayInMs")); |
| 2910 EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayInMs")); | 2908 EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayInMs")); |
| 2911 EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayMaxInMs")); | 2909 EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayMaxInMs")); |
| 2912 | 2910 |
| 2913 int num_rtx_samples = use_rtx ? 1 : 0; | 2911 int num_rtx_samples = use_rtx ? 1 : 0; |
| 2914 EXPECT_EQ(num_rtx_samples, | 2912 EXPECT_EQ(num_rtx_samples, |
| 2915 metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps")); | 2913 metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps")); |
| 2916 EXPECT_EQ(num_rtx_samples, | 2914 EXPECT_EQ(num_rtx_samples, |
| 2917 metrics::NumSamples("WebRTC.Video.RtxBitrateReceivedInKbps")); | 2915 metrics::NumSamples("WebRTC.Video.RtxBitrateReceivedInKbps")); |
| 2918 | 2916 |
| 2919 int num_red_samples = use_red ? 1 : 0; | 2917 int num_red_samples = use_fec ? 1 : 0; |
| 2920 EXPECT_EQ(num_red_samples, | 2918 EXPECT_EQ(num_red_samples, |
| 2921 metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps")); | 2919 metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps")); |
| 2922 EXPECT_EQ(num_red_samples, | 2920 EXPECT_EQ(num_red_samples, |
| 2923 metrics::NumSamples("WebRTC.Video.FecBitrateReceivedInKbps")); | 2921 metrics::NumSamples("WebRTC.Video.FecBitrateReceivedInKbps")); |
| 2924 EXPECT_EQ(num_red_samples, | 2922 EXPECT_EQ(num_red_samples, |
| 2925 metrics::NumSamples("WebRTC.Video.ReceivedFecPacketsInPercent")); | 2923 metrics::NumSamples("WebRTC.Video.ReceivedFecPacketsInPercent")); |
| 2926 } | 2924 } |
| 2927 | 2925 |
| 2928 #if defined(WEBRTC_WIN) | 2926 #if defined(WEBRTC_WIN) |
| 2929 // Disabled due to flakiness on Windows (bugs.webrtc.org/7483). | 2927 // Disabled due to flakiness on Windows (bugs.webrtc.org/7483). |
| (...skipping 1901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4831 default_receive_config.rtp.rtcp_xr.receiver_reference_time_report) | 4829 default_receive_config.rtp.rtcp_xr.receiver_reference_time_report) |
| 4832 << "RTCP XR settings require rtcp-xr to be negotiated."; | 4830 << "RTCP XR settings require rtcp-xr to be negotiated."; |
| 4833 EXPECT_EQ(0U, default_receive_config.rtp.rtx_ssrc) | 4831 EXPECT_EQ(0U, default_receive_config.rtp.rtx_ssrc) |
| 4834 << "Enabling RTX requires ssrc-group: FID negotiation"; | 4832 << "Enabling RTX requires ssrc-group: FID negotiation"; |
| 4835 EXPECT_TRUE(default_receive_config.rtp.rtx_associated_payload_types.empty()) | 4833 EXPECT_TRUE(default_receive_config.rtp.rtx_associated_payload_types.empty()) |
| 4836 << "Enabling RTX requires rtpmap: rtx negotiation."; | 4834 << "Enabling RTX requires rtpmap: rtx negotiation."; |
| 4837 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 4835 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
| 4838 << "Enabling RTP extensions require negotiation."; | 4836 << "Enabling RTP extensions require negotiation."; |
| 4839 | 4837 |
| 4840 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 4838 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
| 4841 VerifyEmptyUlpfecConfig(default_receive_config.rtp.ulpfec); | 4839 EXPECT_EQ(-1, default_receive_config.rtp.ulpfec_payload_type) |
| 4840 << "Enabling ULPFEC requires rtpmap: ulpfec negotiation."; |
| 4841 EXPECT_EQ(-1, default_receive_config.rtp.red_payload_type) |
| 4842 << "Enabling ULPFEC requires rtpmap: red negotiation."; |
| 4842 } | 4843 } |
| 4843 | 4844 |
| 4844 TEST_F(EndToEndTest, VerifyDefaultFlexfecReceiveConfigParameters) { | 4845 TEST_F(EndToEndTest, VerifyDefaultFlexfecReceiveConfigParameters) { |
| 4845 test::NullTransport rtcp_send_transport; | 4846 test::NullTransport rtcp_send_transport; |
| 4846 FlexfecReceiveStream::Config default_receive_config(&rtcp_send_transport); | 4847 FlexfecReceiveStream::Config default_receive_config(&rtcp_send_transport); |
| 4847 EXPECT_EQ(-1, default_receive_config.payload_type) | 4848 EXPECT_EQ(-1, default_receive_config.payload_type) |
| 4848 << "Enabling FlexFEC requires rtpmap: flexfec negotiation."; | 4849 << "Enabling FlexFEC requires rtpmap: flexfec negotiation."; |
| 4849 EXPECT_EQ(0U, default_receive_config.remote_ssrc) | 4850 EXPECT_EQ(0U, default_receive_config.remote_ssrc) |
| 4850 << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation."; | 4851 << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation."; |
| 4851 EXPECT_TRUE(default_receive_config.protected_media_ssrcs.empty()) | 4852 EXPECT_TRUE(default_receive_config.protected_media_ssrcs.empty()) |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5019 std::unique_ptr<VideoEncoder> encoder_; | 5020 std::unique_ptr<VideoEncoder> encoder_; |
| 5020 std::unique_ptr<VideoDecoder> decoder_; | 5021 std::unique_ptr<VideoDecoder> decoder_; |
| 5021 rtc::CriticalSection crit_; | 5022 rtc::CriticalSection crit_; |
| 5022 int recorded_frames_ RTC_GUARDED_BY(crit_); | 5023 int recorded_frames_ RTC_GUARDED_BY(crit_); |
| 5023 } test(this); | 5024 } test(this); |
| 5024 | 5025 |
| 5025 RunBaseTest(&test); | 5026 RunBaseTest(&test); |
| 5026 } | 5027 } |
| 5027 | 5028 |
| 5028 } // namespace webrtc | 5029 } // namespace webrtc |
| OLD | NEW |