15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/synchronization/lock.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/media_export.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/time_source.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace base {
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TickClock;
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace media {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A time source that uses interpolation based on the system clock.
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MEDIA_EXPORT WallClockTimeSource : public TimeSource {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WallClockTimeSource();
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~WallClockTimeSource();
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TimeSource implementation.
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void StartTicking() OVERRIDE;
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void StopTicking() OVERRIDE;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetMediaTime(base::TimeDelta time) OVERRIDE;
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual base::TimeDelta CurrentMediaTime() OVERRIDE;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TimeDelta CurrentMediaTimeForSyncingVideo() OVERRIDE;
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetTickClockForTesting(scoped_ptr<base::TickClock> tick_clock);
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta CurrentMediaTime_Locked();
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::TickClock> tick_clock_;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool ticking_;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // While ticking we can interpolate the current media time by measuring the
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // delta between our reference ticks and the current system ticks and scaling
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // that time by the playback rate.
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  float playback_rate_;
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta base_time_;
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks reference_wall_ticks_;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(scherkus): Remove internal locking from this class after access to
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Renderer::CurrentMediaTime() is single threaded http://crbug.com/370634
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Lock lock_;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WallClockTimeSource);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace media
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
58