1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/base/media_export.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace base {
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TickClock;
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace base
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace media {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Interpolates between two TimeDeltas based on the passage of wall clock time
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// and the current playback rate.
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TimeDeltaInterpolator is not thread-safe and must be externally locked.
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MEDIA_EXPORT TimeDeltaInterpolator {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Constructs an interpolator initialized to zero with a rate of 1.0.
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |tick_clock| is used for sampling wall clock time for interpolating.
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit TimeDeltaInterpolator(base::TickClock* tick_clock);
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~TimeDeltaInterpolator();
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool interpolating() { return interpolating_; }
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Starts returning interpolated TimeDelta values.
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |tick_clock| will be queried for a new reference time value.
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta StartInterpolating();
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Stops returning interpolated TimeDelta values.
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |tick_clock| will be queried for a new reference time value.
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta StopInterpolating();
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sets a new rate at which to interpolate.
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |tick_clock| will be queried for a new reference time value.
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetPlaybackRate(float playback_rate);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sets the two timestamps to interpolate between at |playback_rate_|.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |upper_bound| must be greater or equal to |lower_bound|.
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |upper_bound| is typically the media timestamp of the last audio frame
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // buffered by the audio hardware.
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetBounds(base::TimeDelta lower_bound, base::TimeDelta upper_bound);
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sets the upper bound used for interpolation. Note that if |upper_bound| is
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // less than what was previously set via SetTime(), then all future calls
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to GetInterpolatedTime() will return |upper_bound|.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetUpperBound(base::TimeDelta upper_bound);
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Computes an interpolated time based on SetTime().
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta GetInterpolatedTime();
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TickClock* const tick_clock_;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool interpolating_;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The range of time to interpolate between.
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta lower_bound_;
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta upper_bound_;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The monotonic system clock time used for interpolating between
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |lower_bound_| and |upper_bound_|.
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeTicks reference_;
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  float playback_rate_;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TimeDeltaInterpolator);
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace media
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
83