Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 6201e92220f0291085451ee6bb46bdb98ae8d9fd..a25d1824e1bc360ac36f87015109be059eb68dbb 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -8,6 +8,7 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
#include <algorithm> |
+#include <list> |
#include <map> |
#include <sstream> |
#include <string> |
@@ -2935,7 +2936,6 @@ TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) { |
} |
void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
- static const uint32_t kMaxSequenceNumberGap = 100; |
static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; |
class RtpSequenceObserver : public test::RtpRtcpObserver { |
public: |
@@ -2968,25 +2968,41 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
EXPECT_TRUE(configured_ssrcs_[ssrc]) |
<< "Received SSRC that wasn't configured: " << ssrc; |
- std::map<uint32_t, uint16_t>::iterator it = |
- last_observed_sequence_number_.find(header.ssrc); |
- if (it == last_observed_sequence_number_.end()) { |
- last_observed_sequence_number_[ssrc] = sequence_number; |
- last_observed_timestamp_[ssrc] = timestamp; |
+ static const uint16_t kMaxSequenceNumberGap = 100; |
+ std::list<uint16_t>& seq_numbers = last_observed_seq_numbers_[ssrc]; |
pbos-webrtc
2016/02/03 13:03:27
pointer instead of reference here please.
danilchap
2016/02/03 14:04:48
Done.
|
+ if (seq_numbers.empty()) { |
+ seq_numbers.push_back(sequence_number); |
} else { |
+ // We shouldn't get replays of previous sequence numbers. |
+ for (uint16_t observed : seq_numbers) { |
+ EXPECT_NE(observed, sequence_number) |
+ << "Received sequence number " << sequence_number |
+ << " for SSRC " << ssrc << " 2nd time."; |
+ } |
// Verify sequence numbers are reasonably close. |
pbos-webrtc
2016/02/03 13:03:27
There should be some timediff function that does t
danilchap
2016/02/03 14:04:48
Failed to find it. Thank you for pointing where it
|
- uint32_t extended_sequence_number = sequence_number; |
- // Check for roll-over. |
- if (sequence_number < last_observed_sequence_number_[ssrc]) |
- extended_sequence_number += 0xFFFFu + 1; |
- EXPECT_LE( |
- extended_sequence_number - last_observed_sequence_number_[ssrc], |
- kMaxSequenceNumberGap) |
- << "Gap in sequence numbers (" |
- << last_observed_sequence_number_[ssrc] << " -> " << sequence_number |
- << ") too large for SSRC: " << ssrc << "."; |
- last_observed_sequence_number_[ssrc] = sequence_number; |
+ uint16_t latest_observed = seq_numbers.back(); |
+ uint16_t diff = sequence_number - latest_observed; |
+ uint16_t abs_diff; |
+ if (diff < 0x8000) { // Positive difference. |
+ abs_diff = diff; |
+ } else { // Negative difference. |
+ abs_diff = (0xffff - diff) + 1; |
+ } |
+ EXPECT_LE(abs_diff, kMaxSequenceNumberGap) |
+ << "Gap in sequence numbers (" |
+ << latest_observed << " -> " << sequence_number |
+ << ") too large for SSRC: " << ssrc << "."; |
+ seq_numbers.push_back(sequence_number); |
+ if (seq_numbers.size() >= kMaxSequenceNumberGap) { |
+ seq_numbers.pop_front(); |
+ } |
+ } |
+ std::map<uint32_t, uint32_t>::iterator it = |
+ last_observed_timestamp_.find(ssrc); |
+ if (it == last_observed_timestamp_.end()) { |
+ last_observed_timestamp_[ssrc] = timestamp; |
+ } else { |
// TODO(pbos): Remove this check if we ever have monotonically |
// increasing timestamps. Right now padding packets add a delta which |
// can cause reordering between padding packets and regular packets, |
@@ -3016,7 +3032,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
return SEND_PACKET; |
} |
- std::map<uint32_t, uint16_t> last_observed_sequence_number_; |
+ std::map<uint32_t, std::list<uint16_t>> last_observed_seq_numbers_; |
std::map<uint32_t, uint32_t> last_observed_timestamp_; |
std::map<uint32_t, bool> configured_ssrcs_; |
@@ -3115,7 +3131,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
DestroyStreams(); |
} |
-TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) { |
+TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { |
TestRtpStatePreservation(false); |
} |