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