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 3044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3055 } | 3055 } |
3056 | 3056 |
3057 void EndToEndTest::TestRtpStatePreservation(bool use_rtx, | 3057 void EndToEndTest::TestRtpStatePreservation(bool use_rtx, |
3058 bool provoke_rtcpsr_before_rtp) { | 3058 bool provoke_rtcpsr_before_rtp) { |
3059 class RtpSequenceObserver : public test::RtpRtcpObserver { | 3059 class RtpSequenceObserver : public test::RtpRtcpObserver { |
3060 public: | 3060 public: |
3061 explicit RtpSequenceObserver(bool use_rtx) | 3061 explicit RtpSequenceObserver(bool use_rtx) |
3062 : test::RtpRtcpObserver(kDefaultTimeoutMs), | 3062 : test::RtpRtcpObserver(kDefaultTimeoutMs), |
3063 ssrcs_to_observe_(kNumSsrcs) { | 3063 ssrcs_to_observe_(kNumSsrcs) { |
3064 for (size_t i = 0; i < kNumSsrcs; ++i) { | 3064 for (size_t i = 0; i < kNumSsrcs; ++i) { |
3065 configured_ssrcs_[kVideoSendSsrcs[i]] = true; | 3065 ssrc_is_rtx_[kVideoSendSsrcs[i]] = false; |
3066 if (use_rtx) | 3066 if (use_rtx) |
3067 configured_ssrcs_[kSendRtxSsrcs[i]] = true; | 3067 ssrc_is_rtx_[kSendRtxSsrcs[i]] = true; |
3068 } | 3068 } |
3069 } | 3069 } |
3070 | 3070 |
3071 void ResetExpectedSsrcs(size_t num_expected_ssrcs) { | 3071 void ResetExpectedSsrcs(size_t num_expected_ssrcs) { |
3072 rtc::CritScope lock(&crit_); | 3072 rtc::CritScope lock(&crit_); |
3073 ssrc_observed_.clear(); | 3073 ssrc_observed_.clear(); |
3074 ssrcs_to_observe_ = num_expected_ssrcs; | 3074 ssrcs_to_observe_ = num_expected_ssrcs; |
3075 } | 3075 } |
3076 | 3076 |
3077 private: | 3077 private: |
(...skipping 22 matching lines...) Expand all Loading... |
3100 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 3100 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
3101 RTPHeader header; | 3101 RTPHeader header; |
3102 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 3102 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
3103 const uint32_t ssrc = header.ssrc; | 3103 const uint32_t ssrc = header.ssrc; |
3104 const int64_t sequence_number = | 3104 const int64_t sequence_number = |
3105 seq_numbers_unwrapper_.Unwrap(header.sequenceNumber); | 3105 seq_numbers_unwrapper_.Unwrap(header.sequenceNumber); |
3106 const uint32_t timestamp = header.timestamp; | 3106 const uint32_t timestamp = header.timestamp; |
3107 const bool only_padding = | 3107 const bool only_padding = |
3108 header.headerLength + header.paddingLength == length; | 3108 header.headerLength + header.paddingLength == length; |
3109 | 3109 |
3110 EXPECT_TRUE(configured_ssrcs_[ssrc]) | 3110 EXPECT_TRUE(ssrc_is_rtx_.find(ssrc) != ssrc_is_rtx_.end()) |
3111 << "Received SSRC that wasn't configured: " << ssrc; | 3111 << "Received SSRC that wasn't configured: " << ssrc; |
3112 | 3112 |
3113 static const int64_t kMaxSequenceNumberGap = 100; | 3113 static const int64_t kMaxSequenceNumberGap = 100; |
3114 std::list<int64_t>* seq_numbers = &last_observed_seq_numbers_[ssrc]; | 3114 std::list<int64_t>* seq_numbers = &last_observed_seq_numbers_[ssrc]; |
3115 if (seq_numbers->empty()) { | 3115 if (seq_numbers->empty()) { |
3116 seq_numbers->push_back(sequence_number); | 3116 seq_numbers->push_back(sequence_number); |
3117 } else { | 3117 } else { |
3118 // We shouldn't get replays of previous sequence numbers. | 3118 // We shouldn't get replays of previous sequence numbers. |
3119 for (int64_t observed : *seq_numbers) { | 3119 for (int64_t observed : *seq_numbers) { |
3120 EXPECT_NE(observed, sequence_number) | 3120 EXPECT_NE(observed, sequence_number) |
3121 << "Received sequence number " << sequence_number | 3121 << "Received sequence number " << sequence_number |
3122 << " for SSRC " << ssrc << " 2nd time."; | 3122 << " for SSRC " << ssrc << " 2nd time."; |
3123 } | 3123 } |
3124 // Verify sequence numbers are reasonably close. | 3124 // Verify sequence numbers are reasonably close. |
3125 int64_t latest_observed = seq_numbers->back(); | 3125 int64_t latest_observed = seq_numbers->back(); |
3126 int64_t sequence_number_gap = sequence_number - latest_observed; | 3126 int64_t sequence_number_gap = sequence_number - latest_observed; |
3127 EXPECT_LE(std::abs(sequence_number_gap), kMaxSequenceNumberGap) | 3127 EXPECT_LE(std::abs(sequence_number_gap), kMaxSequenceNumberGap) |
3128 << "Gap in sequence numbers (" << latest_observed << " -> " | 3128 << "Gap in sequence numbers (" << latest_observed << " -> " |
3129 << sequence_number << ") too large for SSRC: " << ssrc << "."; | 3129 << sequence_number << ") too large for SSRC: " << ssrc << "."; |
3130 seq_numbers->push_back(sequence_number); | 3130 seq_numbers->push_back(sequence_number); |
3131 if (seq_numbers->size() >= kMaxSequenceNumberGap) { | 3131 if (seq_numbers->size() >= kMaxSequenceNumberGap) { |
3132 seq_numbers->pop_front(); | 3132 seq_numbers->pop_front(); |
3133 } | 3133 } |
3134 } | 3134 } |
3135 | 3135 |
3136 rtc::CritScope lock(&crit_); | 3136 if (!ssrc_is_rtx_[ssrc]) { |
3137 ValidateTimestampGap(ssrc, timestamp, only_padding); | 3137 rtc::CritScope lock(&crit_); |
| 3138 ValidateTimestampGap(ssrc, timestamp, only_padding); |
3138 | 3139 |
3139 // Wait for media packets on all ssrcs. | 3140 // Wait for media packets on all ssrcs. |
3140 if (!ssrc_observed_[ssrc] && !only_padding) { | 3141 if (!ssrc_observed_[ssrc] && !only_padding) { |
3141 ssrc_observed_[ssrc] = true; | 3142 ssrc_observed_[ssrc] = true; |
3142 if (--ssrcs_to_observe_ == 0) | 3143 if (--ssrcs_to_observe_ == 0) |
3143 observation_complete_.Set(); | 3144 observation_complete_.Set(); |
| 3145 } |
3144 } | 3146 } |
3145 | 3147 |
3146 return SEND_PACKET; | 3148 return SEND_PACKET; |
3147 } | 3149 } |
3148 | 3150 |
3149 Action OnSendRtcp(const uint8_t* packet, size_t length) override { | 3151 Action OnSendRtcp(const uint8_t* packet, size_t length) override { |
3150 test::RtcpPacketParser rtcp_parser; | 3152 test::RtcpPacketParser rtcp_parser; |
3151 rtcp_parser.Parse(packet, length); | 3153 rtcp_parser.Parse(packet, length); |
3152 if (rtcp_parser.sender_report()->num_packets() > 0) { | 3154 if (rtcp_parser.sender_report()->num_packets() > 0) { |
3153 uint32_t ssrc = rtcp_parser.sender_report()->Ssrc(); | 3155 uint32_t ssrc = rtcp_parser.sender_report()->Ssrc(); |
3154 uint32_t rtcp_timestamp = rtcp_parser.sender_report()->RtpTimestamp(); | 3156 uint32_t rtcp_timestamp = rtcp_parser.sender_report()->RtpTimestamp(); |
3155 | 3157 |
3156 rtc::CritScope lock(&crit_); | 3158 rtc::CritScope lock(&crit_); |
3157 ValidateTimestampGap(ssrc, rtcp_timestamp, false); | 3159 ValidateTimestampGap(ssrc, rtcp_timestamp, false); |
3158 } | 3160 } |
3159 return SEND_PACKET; | 3161 return SEND_PACKET; |
3160 } | 3162 } |
3161 | 3163 |
3162 SequenceNumberUnwrapper seq_numbers_unwrapper_; | 3164 SequenceNumberUnwrapper seq_numbers_unwrapper_; |
3163 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_; | 3165 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_; |
3164 std::map<uint32_t, uint32_t> last_observed_timestamp_; | 3166 std::map<uint32_t, uint32_t> last_observed_timestamp_; |
3165 std::map<uint32_t, bool> configured_ssrcs_; | 3167 std::map<uint32_t, bool> ssrc_is_rtx_; |
3166 | 3168 |
3167 rtc::CriticalSection crit_; | 3169 rtc::CriticalSection crit_; |
3168 size_t ssrcs_to_observe_ GUARDED_BY(crit_); | 3170 size_t ssrcs_to_observe_ GUARDED_BY(crit_); |
3169 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); | 3171 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); |
3170 } observer(use_rtx); | 3172 } observer(use_rtx); |
3171 | 3173 |
3172 CreateCalls(Call::Config(), Call::Config()); | 3174 CreateCalls(Call::Config(), Call::Config()); |
3173 | 3175 |
3174 test::PacketTransport send_transport(sender_call_.get(), &observer, | 3176 test::PacketTransport send_transport(sender_call_.get(), &observer, |
3175 test::PacketTransport::kSender, | 3177 test::PacketTransport::kSender, |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3265 receive_transport.StopSending(); | 3267 receive_transport.StopSending(); |
3266 | 3268 |
3267 Stop(); | 3269 Stop(); |
3268 DestroyStreams(); | 3270 DestroyStreams(); |
3269 } | 3271 } |
3270 | 3272 |
3271 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { | 3273 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { |
3272 TestRtpStatePreservation(false, false); | 3274 TestRtpStatePreservation(false, false); |
3273 } | 3275 } |
3274 | 3276 |
3275 // These tests are flaky. See: | 3277 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { |
3276 // https://bugs.chromium.org/p/webrtc/issues/detail?id=4332 | |
3277 TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpStatesWithRtx) { | |
3278 TestRtpStatePreservation(true, false); | 3278 TestRtpStatePreservation(true, false); |
3279 } | 3279 } |
3280 | 3280 |
3281 TEST_F(EndToEndTest, | 3281 TEST_F(EndToEndTest, RestartingSendStreamKeepsRtpAndRtcpTimestampsSynced) { |
3282 DISABLED_RestartingSendStreamKeepsRtpAndRtcpTimestampsSynced) { | |
3283 TestRtpStatePreservation(true, true); | 3282 TestRtpStatePreservation(true, true); |
3284 } | 3283 } |
3285 | 3284 |
3286 TEST_F(EndToEndTest, RespectsNetworkState) { | 3285 TEST_F(EndToEndTest, RespectsNetworkState) { |
3287 // TODO(pbos): Remove accepted downtime packets etc. when signaling network | 3286 // TODO(pbos): Remove accepted downtime packets etc. when signaling network |
3288 // down blocks until no more packets will be sent. | 3287 // down blocks until no more packets will be sent. |
3289 | 3288 |
3290 // Pacer will send from its packet list and then send required padding before | 3289 // Pacer will send from its packet list and then send required padding before |
3291 // checking paused_ again. This should be enough for one round of pacing, | 3290 // checking paused_ again. This should be enough for one round of pacing, |
3292 // otherwise increase. | 3291 // otherwise increase. |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3732 private: | 3731 private: |
3733 bool video_observed_; | 3732 bool video_observed_; |
3734 bool audio_observed_; | 3733 bool audio_observed_; |
3735 SequenceNumberUnwrapper unwrapper_; | 3734 SequenceNumberUnwrapper unwrapper_; |
3736 std::set<int64_t> received_packet_ids_; | 3735 std::set<int64_t> received_packet_ids_; |
3737 } test; | 3736 } test; |
3738 | 3737 |
3739 RunBaseTest(&test); | 3738 RunBaseTest(&test); |
3740 } | 3739 } |
3741 } // namespace webrtc | 3740 } // namespace webrtc |
OLD | NEW |