| Index: remoting/host/capturer.h
|
| ===================================================================
|
| --- remoting/host/capturer.h (revision 0)
|
| +++ remoting/host/capturer.h (revision 0)
|
| @@ -0,0 +1,123 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef REMOTING_HOST_CAPTURER_H_
|
| +#define REMOTING_HOST_CAPTURER_H_
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/task.h"
|
| +#include "gfx/rect.h"
|
| +#include "remoting/base/protocol/chromotocol.pb.h"
|
| +
|
| +namespace remoting {
|
| +
|
| +typedef std::vector<gfx::Rect> DirtyRects;
|
| +
|
| +// 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:
|
| +// 1. Double buffering
|
| +// Since data can be read while another capture action is
|
| +// happening.
|
| +class Capturer {
|
| + public:
|
| + Capturer();
|
| + virtual ~Capturer();
|
| +
|
| + // Capture the full screen. When the action is completed |done_task|
|
| + // is called.
|
| + //
|
| + // It is OK to call this methods while another thread is reading
|
| + // data of the last capture.
|
| + // There can be at most one concurrent read going on when this
|
| + // methods is called.
|
| + virtual void CaptureFullScreen(Task* done_task) = 0;
|
| +
|
| + // Capture the updated regions since last capture. If the last
|
| + // capture doesn't exist, the full window is captured.
|
| + //
|
| + // When complete |done_task| is called.
|
| + //
|
| + // 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
|
| + // methods is called.
|
| + virtual void CaptureDirtyRects(Task* done_task) = 0;
|
| +
|
| + // Capture the specified screen rect and call |done_task| when complete.
|
| + // Dirty or invalid regions are ignored and only the given |rect| area is
|
| + // 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
|
| + // methods is called.
|
| + virtual void CaptureRect(const gfx::Rect& rect, Task* done_task) = 0;
|
| +
|
| + // Get the image data of the last capture. The pointers to data is
|
| + // written to |planes|. |planes| should be an array of 3 elements.
|
| + virtual void GetData(const uint8* planes[]) const = 0;
|
| +
|
| + // Get the image data stride of the last capture. This size of strides
|
| + // is written to |strides|. |strides| should be array of 3 elements.
|
| + virtual void GetDataStride(int strides[]) const = 0;
|
| +
|
| + // Get the list of updated rectangles in the last capture. The result is
|
| + // written into |rects|.
|
| + virtual void GetDirtyRects(DirtyRects* rects) const;
|
| +
|
| + // Get the width of the image captured.
|
| + virtual int GetWidth() const;
|
| +
|
| + // Get the height of the image captured.
|
| + virtual int GetHeight() const;
|
| +
|
| + // Get the pixel format of the image captured.
|
| + virtual chromotocol_pb::PixelFormat GetPixelFormat() const;
|
| +
|
| + // Invalidate the specified screen rect.
|
| + virtual void InvalidateRect(gfx::Rect dirty);
|
| +
|
| + protected:
|
| + // Finish/cleanup capture task.
|
| + // This should be called at the end of each of the CaptureXxx() routines.
|
| + // This routine should (at least):
|
| + // (1) Call the |done_task| 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(Task* done_task);
|
| +
|
| + // Number of screen buffers.
|
| + static const int kNumBuffers = 2;
|
| +
|
| + // Capture screen dimensions.
|
| + int width_;
|
| + int height_;
|
| +
|
| + // Format of pixels returned in buffer.
|
| + chromotocol_pb::PixelFormat pixel_format_;
|
| +
|
| + // Information about screen.
|
| + int bytes_per_pixel_;
|
| + int bytes_per_row_;
|
| +
|
| + // The current buffer with valid data for reading.
|
| + int current_buffer_;
|
| +
|
| + // List of dirty rects.
|
| + // These are the rects that we send to the client to update.
|
| + DirtyRects dirty_rects_;
|
| +
|
| + // Rects that have been manually invalidated (through InvalidateRect).
|
| + // These will be merged into |dirty_rects_| during the next capture.
|
| + DirtyRects inval_rects_;
|
| +};
|
| +
|
| +} // namespace remoting
|
| +
|
| +#endif // REMOTING_HOST_CAPTURER_H_
|
|
|
| Property changes on: remoting/host/capturer.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|