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}
This commit is contained in:
@ -193,17 +193,25 @@ int32_t TimeDiff(uint32_t later, uint32_t earlier) {
|
||||
}
|
||||
|
||||
TimestampWrapAroundHandler::TimestampWrapAroundHandler()
|
||||
: last_ts_(0), num_wrap_(0) {}
|
||||
: last_ts_(0), num_wrap_(-1) {}
|
||||
|
||||
int64_t TimestampWrapAroundHandler::Unwrap(uint32_t ts) {
|
||||
if (ts < last_ts_) {
|
||||
if (last_ts_ > 0xf0000000 && ts < 0x0fffffff) {
|
||||
++num_wrap_;
|
||||
}
|
||||
if (num_wrap_ == -1) {
|
||||
last_ts_ = ts;
|
||||
num_wrap_ = 0;
|
||||
return ts;
|
||||
}
|
||||
|
||||
if (ts < last_ts_) {
|
||||
if (last_ts_ >= 0xf0000000 && ts < 0x0fffffff)
|
||||
++num_wrap_;
|
||||
} else if ((ts - last_ts_) > 0xf0000000) {
|
||||
// Backwards wrap. Unwrap with last wrap count and don't update last_ts_.
|
||||
return ts + ((num_wrap_ - 1) << 32);
|
||||
}
|
||||
|
||||
last_ts_ = ts;
|
||||
int64_t unwrapped_ts = ts + (num_wrap_ << 32);
|
||||
return unwrapped_ts;
|
||||
return ts + (num_wrap_ << 32);
|
||||
}
|
||||
|
||||
int64_t TmToSeconds(const std::tm& tm) {
|
||||
|
||||
@ -153,18 +153,48 @@ class TimestampWrapAroundHandlerTest : public testing::Test {
|
||||
};
|
||||
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user