diff options
Diffstat (limited to 'chromium/media/base/simple_watch_timer.cc')
-rw-r--r-- | chromium/media/base/simple_watch_timer.cc | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/chromium/media/base/simple_watch_timer.cc b/chromium/media/base/simple_watch_timer.cc new file mode 100644 index 00000000000..83668dfd7a2 --- /dev/null +++ b/chromium/media/base/simple_watch_timer.cc @@ -0,0 +1,66 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/base/simple_watch_timer.h" + +#include "base/location.h" +#include "media/base/timestamp_constants.h" + +namespace media { + +namespace { + +constexpr base::TimeDelta kQueryInterval = + base::TimeDelta::FromMilliseconds(750); + +} // namespace + +SimpleWatchTimer::SimpleWatchTimer(TickCB tick_cb, + GetCurrentTimeCB get_current_time_cb) + : tick_cb_(std::move(tick_cb)), + get_current_time_cb_(std::move(get_current_time_cb)) { + DCHECK(!tick_cb_.is_null()); + DCHECK(!get_current_time_cb_.is_null()); +} + +SimpleWatchTimer::~SimpleWatchTimer() {} + +void SimpleWatchTimer::Start() { + if (timer_.IsRunning()) + return; + + last_current_time_ = get_current_time_cb_.Run(); + timer_.Start(FROM_HERE, kQueryInterval, this, &SimpleWatchTimer::Tick); +} + +void SimpleWatchTimer::Stop() { + if (!timer_.IsRunning()) + return; + + timer_.Stop(); + Tick(); +} + +void SimpleWatchTimer::Tick() { + base::TimeDelta current_time = get_current_time_cb_.Run(); + base::TimeDelta duration; + if (last_current_time_ != kNoTimestamp && + last_current_time_ != kInfiniteDuration) { + duration = current_time - last_current_time_; + } + last_current_time_ = current_time; + + // Accumulate watch time if the duration is reasonable. + if (duration > base::TimeDelta() && duration < kQueryInterval * 2) { + unreported_ms_ += duration.InMilliseconds(); + } + + // Tick if the accumulated time is about a second. + if (unreported_ms_ >= 500) { + unreported_ms_ -= 1000; + tick_cb_.Run(); + } +} + +} // namespace media |