Make rtc::TimestampWrapAroundHandler handle backwards wrapping
Also fix a timestamp issue in video analyzer test.
BUG=webrtc:5637, webrtc:5537
Review URL: https://codereview.webrtc.org/1779773002
Cr-Commit-Position: refs/heads/master@{#11938}
diff --git a/webrtc/base/timeutils_unittest.cc b/webrtc/base/timeutils_unittest.cc
index 688658b..7e342d0 100644
--- a/webrtc/base/timeutils_unittest.cc
+++ b/webrtc/base/timeutils_unittest.cc
@@ -153,18 +153,48 @@
};
TEST_F(TimestampWrapAroundHandlerTest, Unwrap) {
- uint32_t ts = 0xfffffff2;
- int64_t unwrapped_ts = ts;
- EXPECT_EQ(ts, wraparound_handler_.Unwrap(ts));
+ // Start value.
+ int64_t ts = 2;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+
+ // Wrap backwards.
+ ts = -2;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+
+ // Forward to 2 again.
ts = 2;
- unwrapped_ts += 0x10;
- EXPECT_EQ(unwrapped_ts, wraparound_handler_.Unwrap(ts));
- ts = 0xfffffff2;
- unwrapped_ts += 0xfffffff0;
- EXPECT_EQ(unwrapped_ts, wraparound_handler_.Unwrap(ts));
- ts = 0;
- unwrapped_ts += 0xe;
- EXPECT_EQ(unwrapped_ts, wraparound_handler_.Unwrap(ts));
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+
+ // Max positive skip ahead, until max value (0xffffffff).
+ for (uint32_t i = 0; i <= 0xf; ++i) {
+ ts = (i << 28) + 0x0fffffff;
+ EXPECT_EQ(
+ ts, wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+ }
+
+ // Wrap around.
+ ts += 2;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+
+ // Max wrap backward...
+ ts -= 0x0fffffff;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+
+ // ...and back again.
+ ts += 0x0fffffff;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
+}
+
+TEST_F(TimestampWrapAroundHandlerTest, NoNegativeStart) {
+ int64_t ts = 0xfffffff0;
+ EXPECT_EQ(ts,
+ wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
}
class TmToSeconds : public testing::Test {