render_widget_host_view_frame_subscriber.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1// Copyright (c) 2012 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 CONTENT_PORT_BROWSER_RENDER_WIDGET_HOST_VIEW_FRAME_SUBSCRIBER_H_
6#define CONTENT_PORT_BROWSER_RENDER_WIDGET_HOST_VIEW_FRAME_SUBSCRIBER_H_
7
8#include "base/callback.h"
9#include "base/time/time.h"
10
11namespace gfx {
12class Rect;
13class Size;
14}  // namespace gfx
15
16namespace media {
17class VideoFrame;
18}  // namespace media
19
20namespace content {
21
22// Defines an interface for listening to events of frame presentation and to
23// instruct the platform layer (i.e. RenderWidgetHostView) to copy a frame.
24//
25// Further processing is possible (e.g. scale and color space conversion)
26// through this interface. See ShouldCaptureFrame() for details.
27//
28// It is platform dependent which thread this object lives on, but it is
29// guaranteed to be used on a single thread.
30class RenderWidgetHostViewFrameSubscriber {
31 public:
32  virtual ~RenderWidgetHostViewFrameSubscriber() {}
33
34  // Called when a captured frame is available or the frame is no longer
35  // needed by the platform layer.
36  //
37  // If |frame_captured| is true then frame provided contains valid content and
38  // |timestamp| is the time when the frame was painted.
39  //
40  // If |frame_captured| is false then the content in frame provided is
41  // invalid. There was an error during the process of frame capture or the
42  // platform layer is shutting down. |timestamp| is also invalid in this case.
43  typedef base::Callback<void(base::TimeTicks /* timestamp */,
44                              bool /* frame_captured */)> DeliverFrameCallback;
45
46  // Called when a new frame is going to be presented at time
47  // |present_time| with |damage_rect| being the region of the frame that has
48  // changed since the last frame. The implementation decides whether the
49  // current frame should be captured or not.
50  //
51  // Return true if the current frame should be captured. If so, |storage|
52  // will be set to hold an appropriately sized and allocated buffer into which
53  // to copy the frame. The platform presenter will perform scaling and color
54  // space conversion to fit into the output frame.
55  //
56  // Destination format is determined by |storage|, currently only
57  // media::VideoFrame::YV12 is supported. Platform layer will perform color
58  // space conversion if needed.
59  //
60  // When the frame is available |callback| will be called. It is up to the
61  // platform layer to decide when to deliver a captured frame.
62  //
63  // Return false if the current frame should not be captured.
64  virtual bool ShouldCaptureFrame(const gfx::Rect& damage_rect,
65                                  base::TimeTicks present_time,
66                                  scoped_refptr<media::VideoFrame>* storage,
67                                  DeliverFrameCallback* callback) = 0;
68};
69
70}  // namespace content
71
72#endif  // CONTENT_PORT_BROWSER_RENDER_WIDGET_HOST_VIEW_FRAME_SUBSCRIBER_H_
73