| // 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. |
| |
| #ifndef MEDIA_BASE_SIMPLE_WATCH_TIMER_H_ |
| #define MEDIA_BASE_SIMPLE_WATCH_TIMER_H_ |
| |
| #include "base/callback_forward.h" |
| #include "base/macros.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| #include "media/base/media_export.h" |
| |
| namespace media { |
| |
| // SimpleWatchTimer aids in recording UMA counts that accumulate media watch |
| // time in seconds. It will fire its callback about once per second during |
| // active playback. |
| // |
| // Active playback is a duration after Start() and before Stop() in |
| // which current time progresses. Large jumps in current time are not considered |
| // to be progress; they are assumed to be seeks or media errors. |
| // |
| // Start() and Stop() may be called repeatedly. It is recommended to call Stop() |
| // before destructing a SimpleWatchTimer so that |tick_cb| can be fired at an |
| // opportune time. |
| // |
| // Note: SimpleWatchTimer does not understand playbackRate and will discard |
| // durations with high rates. |
| class MEDIA_EXPORT SimpleWatchTimer { |
| public: |
| using TickCB = base::RepeatingClosure; |
| using GetCurrentTimeCB = base::RepeatingCallback<base::TimeDelta()>; |
| |
| SimpleWatchTimer(TickCB tick_cb, GetCurrentTimeCB get_current_time_cb); |
| |
| SimpleWatchTimer(const SimpleWatchTimer&) = delete; |
| SimpleWatchTimer& operator=(const SimpleWatchTimer&) = delete; |
| |
| ~SimpleWatchTimer(); |
| |
| void Start(); |
| void Stop(); |
| |
| private: |
| void Tick(); |
| |
| TickCB tick_cb_; |
| GetCurrentTimeCB get_current_time_cb_; |
| |
| int unreported_ms_ = 0; |
| base::TimeDelta last_current_time_; |
| base::RepeatingTimer timer_; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_BASE_SIMPLE_WATCH_TIMER_H_ |