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