10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef MEDIA_FILTERS_VIDEO_FRAME_SCHEDULER_H_
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define MEDIA_FILTERS_VIDEO_FRAME_SCHEDULER_H_
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/callback.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "media/base/media_export.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace media {
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass VideoFrame;
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Defines an abstract video frame scheduler that is capable of managing the
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// display of video frames at explicit times.
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass MEDIA_EXPORT VideoFrameScheduler {
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VideoFrameScheduler() {}
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~VideoFrameScheduler() {}
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  enum Reason {
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DISPLAYED,  // Frame was displayed.
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DROPPED,    // Frame was dropped.
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  };
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  typedef base::Callback<void(const scoped_refptr<VideoFrame>&, Reason)> DoneCB;
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Schedule |frame| to be displayed at |wall_ticks|, firing |done_cb| when
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // the scheduler has finished with the frame.
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // To avoid reentrancy issues, |done_cb| is run on a separate calling stack.
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void ScheduleVideoFrame(const scoped_refptr<VideoFrame>& frame,
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                  base::TimeTicks wall_ticks,
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                  const DoneCB& done_cb) = 0;
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Causes the scheduler to cancel any previously scheduled frames.
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // There is no guarantee that |done_cb|'s for previously scheduled frames
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // will not be run. Clients should implement callback tracking/cancellation
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // if they are sensitive to old callbacks being run.
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void Reset() = 0;
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace media
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // MEDIA_FILTERS_VIDEO_FRAME_SCHEDULER_H_
49