1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
6#define MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "base/synchronization/lock.h"
10#include "media/base/media_export.h"
11#include "media/base/time_source.h"
12
13namespace base {
14class TickClock;
15}
16
17namespace media {
18
19// A time source that uses interpolation based on the system clock.
20class MEDIA_EXPORT WallClockTimeSource : public TimeSource {
21 public:
22  WallClockTimeSource();
23  virtual ~WallClockTimeSource();
24
25  // TimeSource implementation.
26  virtual void StartTicking() OVERRIDE;
27  virtual void StopTicking() OVERRIDE;
28  virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
29  virtual void SetMediaTime(base::TimeDelta time) OVERRIDE;
30  virtual base::TimeDelta CurrentMediaTime() OVERRIDE;
31  virtual base::TimeDelta CurrentMediaTimeForSyncingVideo() OVERRIDE;
32
33  void SetTickClockForTesting(scoped_ptr<base::TickClock> tick_clock);
34
35 private:
36  base::TimeDelta CurrentMediaTime_Locked();
37
38  scoped_ptr<base::TickClock> tick_clock_;
39  bool ticking_;
40
41  // While ticking we can interpolate the current media time by measuring the
42  // delta between our reference ticks and the current system ticks and scaling
43  // that time by the playback rate.
44  float playback_rate_;
45  base::TimeDelta base_time_;
46  base::TimeTicks reference_wall_ticks_;
47
48  // TODO(scherkus): Remove internal locking from this class after access to
49  // Renderer::CurrentMediaTime() is single threaded http://crbug.com/370634
50  base::Lock lock_;
51
52  DISALLOW_COPY_AND_ASSIGN(WallClockTimeSource);
53};
54
55}  // namespace media
56
57#endif  // MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
58