Index: webrtc/modules/remote_bitrate_estimator/inter_arrival_unittest.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/inter_arrival_unittest.cc b/webrtc/modules/remote_bitrate_estimator/inter_arrival_unittest.cc |
index 3b4151b3b7948eaf9facb8fa1274b76b72ae4772..f255285b63fb2a6f3750b31cb885ba211137cf41 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/inter_arrival_unittest.cc |
+++ b/webrtc/modules/remote_bitrate_estimator/inter_arrival_unittest.cc |
@@ -34,6 +34,8 @@ const double kAstToMs = 1000.0 / static_cast<double>(1 << kInterArrivalShift); |
class InterArrivalTest : public ::testing::Test { |
protected: |
virtual void SetUp() { |
+ inter_arrival_.reset( |
+ new InterArrival(kTimestampGroupLengthUs / 1000, 1.0, true)); |
inter_arrival_rtp_.reset(new InterArrival( |
MakeRtpTimestamp(kTimestampGroupLengthUs), |
kRtpTimestampToMs, |
@@ -149,6 +151,8 @@ class InterArrivalTest : public ::testing::Test { |
timestamp_near); |
} |
+ std::unique_ptr<InterArrival> inter_arrival_; |
+ |
private: |
static uint32_t MakeRtpTimestamp(int64_t us) { |
return static_cast<uint32_t>(static_cast<uint64_t>(us * 90 + 500) / 1000); |
@@ -166,12 +170,9 @@ class InterArrivalTest : public ::testing::Test { |
uint32_t dummy_timestamp = 101; |
int64_t dummy_arrival_time_ms = 303; |
int dummy_packet_size = 909; |
- bool computed = inter_arrival->ComputeDeltas(timestamp, |
- arrival_time_ms, |
- packet_size, |
- &dummy_timestamp, |
- &dummy_arrival_time_ms, |
- &dummy_packet_size); |
+ bool computed = inter_arrival->ComputeDeltas( |
+ timestamp, arrival_time_ms, arrival_time_ms, packet_size, |
+ &dummy_timestamp, &dummy_arrival_time_ms, &dummy_packet_size); |
EXPECT_EQ(computed, false); |
EXPECT_EQ(101ul, dummy_timestamp); |
EXPECT_EQ(303, dummy_arrival_time_ms); |
@@ -188,12 +189,9 @@ class InterArrivalTest : public ::testing::Test { |
uint32_t delta_timestamp = 101; |
int64_t delta_arrival_time_ms = 303; |
int delta_packet_size = 909; |
- bool computed = inter_arrival->ComputeDeltas(timestamp, |
- arrival_time_ms, |
- packet_size, |
- &delta_timestamp, |
- &delta_arrival_time_ms, |
- &delta_packet_size); |
+ bool computed = inter_arrival->ComputeDeltas( |
+ timestamp, arrival_time_ms, arrival_time_ms, packet_size, |
+ &delta_timestamp, &delta_arrival_time_ms, &delta_packet_size); |
EXPECT_EQ(true, computed); |
EXPECT_NEAR(expected_timestamp_delta, delta_timestamp, timestamp_near); |
EXPECT_EQ(expected_arrival_time_delta_ms, delta_arrival_time_ms); |
@@ -419,5 +417,121 @@ TEST_F(InterArrivalTest, RtpTimestampWrapOutOfOrderWithinGroup) { |
TEST_F(InterArrivalTest, AbsSendTimeWrapOutOfOrderWithinGroup) { |
WrapTestHelper(kStartAbsSendTimeWrapUs, 1, true); |
} |
+ |
+TEST_F(InterArrivalTest, PositiveArrivalTimeJump) { |
+ const size_t kPacketSize = 1000; |
+ uint32_t send_time_ms = 10000; |
+ int64_t arrival_time_ms = 20000; |
+ int64_t system_time_ms = 30000; |
+ |
+ uint32_t send_delta; |
+ int64_t arrival_delta; |
+ int size_delta; |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ |
+ const int kTimeDeltaMs = 30; |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs + InterArrival::kArrivalTimeOffsetThresholdMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_TRUE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, arrival_delta); |
+ EXPECT_EQ(size_delta, 0); |
+ |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ // The previous arrival time jump should now be detected and cause a reset. |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ |
+ // The two next packets will not give a valid delta since we're in the initial |
+ // state. |
+ for (int i = 0; i < 2; ++i) { |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ } |
+ |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_TRUE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, arrival_delta); |
+ EXPECT_EQ(size_delta, 0); |
+} |
+ |
+TEST_F(InterArrivalTest, NegativeArrivalTimeJump) { |
+ const size_t kPacketSize = 1000; |
+ uint32_t send_time_ms = 10000; |
+ int64_t arrival_time_ms = 20000; |
+ int64_t system_time_ms = 30000; |
+ |
+ uint32_t send_delta; |
+ int64_t arrival_delta; |
+ int size_delta; |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ |
+ const int kTimeDeltaMs = 30; |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_TRUE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, arrival_delta); |
+ EXPECT_EQ(size_delta, 0); |
+ |
+ // Three out of order will fail, after that we will be reset and two more will |
+ // fail before we get our first valid delta after the reset. |
+ arrival_time_ms -= 1000; |
+ for (int i = 0; i < InterArrival::kReorderedResetThreshold + 3; ++i) { |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ // The previous arrival time jump should now be detected and cause a reset. |
+ EXPECT_FALSE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ } |
+ |
+ send_time_ms += kTimeDeltaMs; |
+ arrival_time_ms += kTimeDeltaMs; |
+ system_time_ms += kTimeDeltaMs; |
+ EXPECT_TRUE(inter_arrival_->ComputeDeltas( |
+ send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta, |
+ &arrival_delta, &size_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta)); |
+ EXPECT_EQ(kTimeDeltaMs, arrival_delta); |
+ EXPECT_EQ(size_delta, 0); |
+} |
} // namespace testing |
} // namespace webrtc |