Home | History | Annotate | Download | only in browser
      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 
     11 namespace gfx {
     12 class Rect;
     13 class Size;
     14 }  // namespace gfx
     15 
     16 namespace media {
     17 class VideoFrame;
     18 }  // namespace media
     19 
     20 namespace 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.
     30 class 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