| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 return true; | 118 return true; |
| 119 } | 119 } |
| 120 bool need_rtp_; | 120 bool need_rtp_; |
| 121 bool need_rtcp_; | 121 bool need_rtcp_; |
| 122 rtc::CriticalSection crit_; | 122 rtc::CriticalSection crit_; |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); | 125 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); |
| 126 void ReceivesPliAndRecovers(int rtp_history_ms); | 126 void ReceivesPliAndRecovers(int rtp_history_ms); |
| 127 void RespectsRtcpMode(RtcpMode rtcp_mode); | 127 void RespectsRtcpMode(RtcpMode rtcp_mode); |
| 128 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); | |
| 129 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); | 128 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); |
| 130 void TestRtpStatePreservation(bool use_rtx, bool provoke_rtcpsr_before_rtp); | 129 void TestRtpStatePreservation(bool use_rtx, bool provoke_rtcpsr_before_rtp); |
| 131 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); | 130 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); |
| 132 void VerifyNewVideoSendStreamsRespectNetworkState( | 131 void VerifyNewVideoSendStreamsRespectNetworkState( |
| 133 MediaType network_to_bring_up, | 132 MediaType network_to_bring_up, |
| 134 VideoEncoder* encoder, | 133 VideoEncoder* encoder, |
| 135 Transport* transport); | 134 Transport* transport); |
| 136 void VerifyNewVideoReceiveStreamsRespectNetworkState( | 135 void VerifyNewVideoReceiveStreamsRespectNetworkState( |
| 137 MediaType network_to_bring_up, | 136 MediaType network_to_bring_up, |
| 138 Transport* transport); | 137 Transport* transport); |
| (...skipping 2289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2428 VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare); | 2427 VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare); |
| 2429 } | 2428 } |
| 2430 | 2429 |
| 2431 TEST_P(EndToEndTest, VerifyHistogramStatsWithScreenshare) { | 2430 TEST_P(EndToEndTest, VerifyHistogramStatsWithScreenshare) { |
| 2432 const bool kEnabledRtx = false; | 2431 const bool kEnabledRtx = false; |
| 2433 const bool kEnabledRed = false; | 2432 const bool kEnabledRed = false; |
| 2434 const bool kScreenshare = true; | 2433 const bool kScreenshare = true; |
| 2435 VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare); | 2434 VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare); |
| 2436 } | 2435 } |
| 2437 | 2436 |
| 2438 void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) { | |
| 2439 static const int kNumRtcpReportPacketsToObserve = 5; | |
| 2440 class RtcpXrObserver : public test::EndToEndTest { | |
| 2441 public: | |
| 2442 explicit RtcpXrObserver(bool enable_rrtr) | |
| 2443 : EndToEndTest(kDefaultTimeoutMs), | |
| 2444 enable_rrtr_(enable_rrtr), | |
| 2445 sent_rtcp_sr_(0), | |
| 2446 sent_rtcp_rr_(0), | |
| 2447 sent_rtcp_rrtr_(0), | |
| 2448 sent_rtcp_dlrr_(0) {} | |
| 2449 | |
| 2450 private: | |
| 2451 // Receive stream should send RR packets (and RRTR packets if enabled). | |
| 2452 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | |
| 2453 rtc::CritScope lock(&crit_); | |
| 2454 test::RtcpPacketParser parser; | |
| 2455 EXPECT_TRUE(parser.Parse(packet, length)); | |
| 2456 | |
| 2457 sent_rtcp_rr_ += parser.receiver_report()->num_packets(); | |
| 2458 EXPECT_EQ(0, parser.sender_report()->num_packets()); | |
| 2459 EXPECT_GE(1, parser.xr()->num_packets()); | |
| 2460 if (parser.xr()->num_packets() > 0) { | |
| 2461 if (parser.xr()->rrtr()) | |
| 2462 ++sent_rtcp_rrtr_; | |
| 2463 EXPECT_FALSE(parser.xr()->dlrr()); | |
| 2464 } | |
| 2465 | |
| 2466 return SEND_PACKET; | |
| 2467 } | |
| 2468 // Send stream should send SR packets (and DLRR packets if enabled). | |
| 2469 Action OnSendRtcp(const uint8_t* packet, size_t length) override { | |
| 2470 rtc::CritScope lock(&crit_); | |
| 2471 test::RtcpPacketParser parser; | |
| 2472 EXPECT_TRUE(parser.Parse(packet, length)); | |
| 2473 | |
| 2474 sent_rtcp_sr_ += parser.sender_report()->num_packets(); | |
| 2475 EXPECT_GE(1, parser.xr()->num_packets()); | |
| 2476 if (parser.xr()->num_packets() > 0) { | |
| 2477 EXPECT_FALSE(parser.xr()->rrtr()); | |
| 2478 if (parser.xr()->dlrr()) | |
| 2479 ++sent_rtcp_dlrr_; | |
| 2480 } | |
| 2481 | |
| 2482 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && | |
| 2483 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) { | |
| 2484 if (enable_rrtr_) { | |
| 2485 EXPECT_LT(0, sent_rtcp_rrtr_); | |
| 2486 EXPECT_LT(0, sent_rtcp_dlrr_); | |
| 2487 } else { | |
| 2488 EXPECT_EQ(0, sent_rtcp_rrtr_); | |
| 2489 EXPECT_EQ(0, sent_rtcp_dlrr_); | |
| 2490 } | |
| 2491 observation_complete_.Set(); | |
| 2492 } | |
| 2493 return SEND_PACKET; | |
| 2494 } | |
| 2495 | |
| 2496 void ModifyVideoConfigs( | |
| 2497 VideoSendStream::Config* send_config, | |
| 2498 std::vector<VideoReceiveStream::Config>* receive_configs, | |
| 2499 VideoEncoderConfig* encoder_config) override { | |
| 2500 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; | |
| 2501 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = | |
| 2502 enable_rrtr_; | |
| 2503 } | |
| 2504 | |
| 2505 void PerformTest() override { | |
| 2506 EXPECT_TRUE(Wait()) | |
| 2507 << "Timed out while waiting for RTCP SR/RR packets to be sent."; | |
| 2508 } | |
| 2509 | |
| 2510 rtc::CriticalSection crit_; | |
| 2511 bool enable_rrtr_; | |
| 2512 int sent_rtcp_sr_; | |
| 2513 int sent_rtcp_rr_ GUARDED_BY(&crit_); | |
| 2514 int sent_rtcp_rrtr_ GUARDED_BY(&crit_); | |
| 2515 int sent_rtcp_dlrr_; | |
| 2516 } test(enable_rrtr); | |
| 2517 | |
| 2518 RunBaseTest(&test); | |
| 2519 } | |
| 2520 | |
| 2521 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, | 2437 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, |
| 2522 bool send_single_ssrc_first) { | 2438 bool send_single_ssrc_first) { |
| 2523 class SendsSetSsrcs : public test::EndToEndTest { | 2439 class SendsSetSsrcs : public test::EndToEndTest { |
| 2524 public: | 2440 public: |
| 2525 SendsSetSsrcs(const uint32_t* ssrcs, | 2441 SendsSetSsrcs(const uint32_t* ssrcs, |
| 2526 size_t num_ssrcs, | 2442 size_t num_ssrcs, |
| 2527 bool send_single_ssrc_first) | 2443 bool send_single_ssrc_first) |
| 2528 : EndToEndTest(kDefaultTimeoutMs), | 2444 : EndToEndTest(kDefaultTimeoutMs), |
| 2529 num_ssrcs_(num_ssrcs), | 2445 num_ssrcs_(num_ssrcs), |
| 2530 send_single_ssrc_first_(send_single_ssrc_first), | 2446 send_single_ssrc_first_(send_single_ssrc_first), |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3057 ReceiveStreamRenderer receive_stream_renderer_; | 2973 ReceiveStreamRenderer receive_stream_renderer_; |
| 3058 } test; | 2974 } test; |
| 3059 | 2975 |
| 3060 // TODO(philipel): Implement statistics for the new video jitter buffer. | 2976 // TODO(philipel): Implement statistics for the new video jitter buffer. |
| 3061 if (GetParam() == new_jb_enabled) | 2977 if (GetParam() == new_jb_enabled) |
| 3062 return; | 2978 return; |
| 3063 | 2979 |
| 3064 RunBaseTest(&test); | 2980 RunBaseTest(&test); |
| 3065 } | 2981 } |
| 3066 | 2982 |
| 3067 TEST_P(EndToEndTest, ReceiverReferenceTimeReportEnabled) { | 2983 class RtcpXrObserver : public test::EndToEndTest { |
| 3068 TestXrReceiverReferenceTimeReport(true); | 2984 public: |
| 2985 explicit RtcpXrObserver(bool enable_rrtr) |
| 2986 : EndToEndTest(test::CallTest::kDefaultTimeoutMs), |
| 2987 enable_rrtr_(enable_rrtr), |
| 2988 sent_rtcp_sr_(0), |
| 2989 sent_rtcp_rr_(0), |
| 2990 sent_rtcp_rrtr_(0), |
| 2991 sent_rtcp_target_bitrate_(false), |
| 2992 sent_rtcp_dlrr_(0) {} |
| 2993 |
| 2994 private: |
| 2995 // Receive stream should send RR packets (and RRTR packets if enabled). |
| 2996 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |
| 2997 rtc::CritScope lock(&crit_); |
| 2998 test::RtcpPacketParser parser; |
| 2999 EXPECT_TRUE(parser.Parse(packet, length)); |
| 3000 |
| 3001 sent_rtcp_rr_ += parser.receiver_report()->num_packets(); |
| 3002 EXPECT_EQ(0, parser.sender_report()->num_packets()); |
| 3003 EXPECT_GE(1, parser.xr()->num_packets()); |
| 3004 if (parser.xr()->num_packets() > 0) { |
| 3005 if (parser.xr()->rrtr()) |
| 3006 ++sent_rtcp_rrtr_; |
| 3007 EXPECT_FALSE(parser.xr()->dlrr()); |
| 3008 } |
| 3009 |
| 3010 return SEND_PACKET; |
| 3011 } |
| 3012 // Send stream should send SR packets (and DLRR packets if enabled). |
| 3013 Action OnSendRtcp(const uint8_t* packet, size_t length) override { |
| 3014 rtc::CritScope lock(&crit_); |
| 3015 test::RtcpPacketParser parser; |
| 3016 EXPECT_TRUE(parser.Parse(packet, length)); |
| 3017 |
| 3018 sent_rtcp_sr_ += parser.sender_report()->num_packets(); |
| 3019 EXPECT_LE(parser.xr()->num_packets(), 1); |
| 3020 if (parser.xr()->num_packets() > 0) { |
| 3021 EXPECT_FALSE(parser.xr()->rrtr()); |
| 3022 if (parser.xr()->dlrr()) |
| 3023 ++sent_rtcp_dlrr_; |
| 3024 if (parser.xr()->target_bitrate()) |
| 3025 sent_rtcp_target_bitrate_ = true; |
| 3026 } |
| 3027 |
| 3028 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && |
| 3029 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve && |
| 3030 sent_rtcp_target_bitrate_) { |
| 3031 if (enable_rrtr_) { |
| 3032 EXPECT_GT(sent_rtcp_rrtr_, 0); |
| 3033 EXPECT_GT(sent_rtcp_dlrr_, 0); |
| 3034 } else { |
| 3035 EXPECT_EQ(sent_rtcp_rrtr_, 0); |
| 3036 EXPECT_EQ(sent_rtcp_dlrr_, 0); |
| 3037 } |
| 3038 observation_complete_.Set(); |
| 3039 } |
| 3040 return SEND_PACKET; |
| 3041 } |
| 3042 |
| 3043 void ModifyVideoConfigs( |
| 3044 VideoSendStream::Config* send_config, |
| 3045 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 3046 VideoEncoderConfig* encoder_config) override { |
| 3047 (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize; |
| 3048 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = |
| 3049 enable_rrtr_; |
| 3050 } |
| 3051 |
| 3052 void PerformTest() override { |
| 3053 EXPECT_TRUE(Wait()) |
| 3054 << "Timed out while waiting for RTCP SR/RR packets to be sent."; |
| 3055 } |
| 3056 |
| 3057 static const int kNumRtcpReportPacketsToObserve = 5; |
| 3058 |
| 3059 rtc::CriticalSection crit_; |
| 3060 bool enable_rrtr_; |
| 3061 int sent_rtcp_sr_; |
| 3062 int sent_rtcp_rr_ GUARDED_BY(&crit_); |
| 3063 int sent_rtcp_rrtr_ GUARDED_BY(&crit_); |
| 3064 bool sent_rtcp_target_bitrate_ GUARDED_BY(&crit_); |
| 3065 int sent_rtcp_dlrr_; |
| 3066 }; |
| 3067 |
| 3068 TEST_P(EndToEndTest, TestExtendedReportsWithRrtr) { |
| 3069 RtcpXrObserver test(true); |
| 3070 RunBaseTest(&test); |
| 3069 } | 3071 } |
| 3070 | 3072 |
| 3071 TEST_P(EndToEndTest, ReceiverReferenceTimeReportDisabled) { | 3073 TEST_P(EndToEndTest, TestExtendedReportsWithoutRrtr) { |
| 3072 TestXrReceiverReferenceTimeReport(false); | 3074 RtcpXrObserver test(false); |
| 3075 RunBaseTest(&test); |
| 3073 } | 3076 } |
| 3074 | 3077 |
| 3075 TEST_P(EndToEndTest, TestReceivedRtpPacketStats) { | 3078 TEST_P(EndToEndTest, TestReceivedRtpPacketStats) { |
| 3076 static const size_t kNumRtpPacketsToSend = 5; | 3079 static const size_t kNumRtpPacketsToSend = 5; |
| 3077 class ReceivedRtpStatsObserver : public test::EndToEndTest { | 3080 class ReceivedRtpStatsObserver : public test::EndToEndTest { |
| 3078 public: | 3081 public: |
| 3079 ReceivedRtpStatsObserver() | 3082 ReceivedRtpStatsObserver() |
| 3080 : EndToEndTest(kDefaultTimeoutMs), | 3083 : EndToEndTest(kDefaultTimeoutMs), |
| 3081 receive_stream_(nullptr), | 3084 receive_stream_(nullptr), |
| 3082 sent_rtp_(0) {} | 3085 sent_rtp_(0) {} |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4041 std::unique_ptr<VideoEncoder> encoder_; | 4044 std::unique_ptr<VideoEncoder> encoder_; |
| 4042 std::unique_ptr<VideoDecoder> decoder_; | 4045 std::unique_ptr<VideoDecoder> decoder_; |
| 4043 rtc::CriticalSection crit_; | 4046 rtc::CriticalSection crit_; |
| 4044 int recorded_frames_ GUARDED_BY(crit_); | 4047 int recorded_frames_ GUARDED_BY(crit_); |
| 4045 } test(this); | 4048 } test(this); |
| 4046 | 4049 |
| 4047 RunBaseTest(&test); | 4050 RunBaseTest(&test); |
| 4048 } | 4051 } |
| 4049 | 4052 |
| 4050 } // namespace webrtc | 4053 } // namespace webrtc |
| OLD | NEW |