| Index: remoting/host/capturer.h
|
| ===================================================================
|
| --- remoting/host/capturer.h (revision 55264)
|
| +++ remoting/host/capturer.h (working copy)
|
| @@ -10,16 +10,33 @@
|
| #include "base/lock.h"
|
| #include "base/task.h"
|
| #include "remoting/base/capture_data.h"
|
| +#include "remoting/base/types.h"
|
|
|
| namespace remoting {
|
|
|
| // A class to perform the task of capturing the image of a window.
|
| // The capture action is asynchronous to allow maximum throughput.
|
| //
|
| -// Implementation has to ensure the following gurantees:
|
| +// The full capture process is as follows:
|
| +//
|
| +// (1) InvalidateRects
|
| +// This is an optional step where regions of the screen are marked as
|
| +// invalid. Some platforms (Windows, for now) won't use this and will
|
| +// instead calculate the diff-regions later (in step (2). Other
|
| +// platforms (Mac) will use this to mark all the changed regions of the
|
| +// screen. Some limited rect-merging (e.g., to eliminate exact
|
| +// duplicates) may be done here.
|
| +//
|
| +// (2) CaptureInvalidRects
|
| +// This is where the bits for the invalid rects are packaged up and sent
|
| +// to the encoder.
|
| +// A screen capture is performed if needed. For example, Windows requires
|
| +// a capture to calculate the diff from the previous screen, whereas the
|
| +// Mac version does not.
|
| +//
|
| +// Implementation has to ensure the following guarantees:
|
| // 1. Double buffering
|
| -// Since data can be read while another capture action is
|
| -// happening.
|
| +// Since data can be read while another capture action is happening.
|
| class Capturer {
|
| public:
|
| // CaptureCompletedCallback is called when the capturer has completed.
|
| @@ -28,11 +45,35 @@
|
| Capturer();
|
| virtual ~Capturer();
|
|
|
| + // Called when the screen configuration is changed.
|
| + virtual void ScreenConfigurationChanged() = 0;
|
|
|
| - // Capture the updated regions since last capture. If the last
|
| - // capture doesn't exist, the full window is captured.
|
| + // Return the width of the screen.
|
| + virtual int width() const { return width_; }
|
| +
|
| + // Return the height of the screen.
|
| + virtual int height() const { return height_; }
|
| +
|
| + // Return the pixel format of the screen.
|
| + virtual PixelFormat pixel_format() const { return pixel_format_; }
|
| +
|
| + // Clear out the list of invalid rects.
|
| + void ClearInvalidRects();
|
| +
|
| + // Invalidate the specified screen rects.
|
| + void InvalidateRects(const InvalidRects& inval_rects);
|
| +
|
| + // Invalidate the entire screen.
|
| + virtual void InvalidateFullScreen();
|
| +
|
| + // Capture the screen data associated with each of the accumulated
|
| + // rects in |inval_rects|.
|
| + // This routine will first call CalculateInvalidRects to update the
|
| + // list of |inval_rects|.
|
| + // When the capture is complete, |callback| is called.
|
| //
|
| - // When complete |callback| is called.
|
| + // If |inval_rects_| is empty, then this does nothing except
|
| + // call the |callback| routine.
|
| //
|
| // It is OK to call this method while another thread is reading
|
| // data of the last capture.
|
| @@ -40,45 +81,32 @@
|
| // method is called.
|
| virtual void CaptureInvalidRects(CaptureCompletedCallback* callback);
|
|
|
| + protected:
|
| + // Update the list of |invalid_rects| to prepare for capturing the
|
| + // screen data.
|
| + // Depending on the platform implementation, this routine might:
|
| + // (a) Analyze screen and calculate the list of rects that have changed
|
| + // since the last capture.
|
| + // (b) Merge already-acculumated rects into a more optimal list (for
|
| + // example, by combining or removing rects).
|
| + virtual void CalculateInvalidRects() = 0;
|
| +
|
| // Capture the specified screen rects and call |callback| when complete.
|
| // Dirty or invalid regions are ignored and only the given |rects| areas are
|
| // captured.
|
| - //
|
| - // It is OK to call this method while another thread is reading
|
| - // data of the last capture.
|
| - // There can be at most one concurrent read going on when this
|
| - // method is called.
|
| - virtual void CaptureRects(const RectVector& rects,
|
| + // This routine is used internally by CaptureInvalidRects().
|
| + virtual void CaptureRects(const InvalidRects& rects,
|
| CaptureCompletedCallback* callback) = 0;
|
|
|
| - // Invalidate the specified screen rects.
|
| - virtual void InvalidateRects(const RectVector& inval_rects);
|
| -
|
| - // Invalidate the entire screen.
|
| - virtual void InvalidateFullScreen();
|
| -
|
| - // Called when the screen configuration is changed.
|
| - virtual void ScreenConfigurationChanged() = 0;
|
| -
|
| - // Return the width of the screen.
|
| - virtual int width() const { return width_; }
|
| -
|
| - // Return the height of the screen
|
| - virtual int height() const { return height_; }
|
| -
|
| - // Return the pixel format of the screen
|
| - virtual PixelFormat pixel_format() const { return pixel_format_; }
|
| -
|
| - protected:
|
| // Finish/cleanup capture task.
|
| - // This should be called at the end of each of the CaptureXxx() routines.
|
| + // This should be called by CaptureRects() when it finishes.
|
| // This routine should (at least):
|
| // (1) Call the |callback| routine.
|
| // (2) Select the next screen buffer.
|
| // Note that capturers are required to be double-buffered so that we can
|
| // read from one which capturing into another.
|
| - virtual void FinishCapture(scoped_refptr<CaptureData> data,
|
| - CaptureCompletedCallback* callback);
|
| + void FinishCapture(scoped_refptr<CaptureData> data,
|
| + CaptureCompletedCallback* callback);
|
|
|
| // Number of screen buffers.
|
| static const int kNumBuffers = 2;
|
| @@ -95,11 +123,10 @@
|
| int current_buffer_;
|
|
|
| private:
|
| -
|
| // Rects that have been manually invalidated (through InvalidateRect).
|
| // These will be returned as dirty_rects in the capture data during the next
|
| // capture.
|
| - RectVector inval_rects_;
|
| + InvalidRects inval_rects_;
|
|
|
| // A lock protecting |inval_rects_| across threads.
|
| Lock inval_rects_lock_;
|
|
|