/* * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ // Don't include this file in any .h files because it pulls in some X headers. #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_ #define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_ #include "webrtc/modules/desktop_capture/desktop_geometry.h" #include #include namespace webrtc { class DesktopFrame; // A class to allow the X server's pixel buffer to be accessed as efficiently // as possible. class XServerPixelBuffer { public: XServerPixelBuffer(); ~XServerPixelBuffer(); void Release(); // Allocate (or reallocate) the pixel buffer for |window|. Returns false in // case of an error (e.g. window doesn't exist). bool Init(Display* display, Window window); bool is_initialized() { return window_ != 0; } // Returns the size of the window the buffer was initialized for. const DesktopSize& window_size() { return window_size_; } // Returns true if the window can be found. bool IsWindowValid() const; // If shared memory is being used without pixmaps, synchronize this pixel // buffer with the root window contents (otherwise, this is a no-op). // This is to avoid doing a full-screen capture for each individual // rectangle in the capture list, when it only needs to be done once at the // beginning. void Synchronize(); // Capture the specified rectangle and stores it in the |frame|. In the case // where the full-screen data is captured by Synchronize(), this simply // returns the pointer without doing any more work. The caller must ensure // that |rect| is not larger than window_size(). void CaptureRect(const DesktopRect& rect, DesktopFrame* frame); private: void InitShm(const XWindowAttributes& attributes); bool InitPixmaps(int depth); // We expose two forms of blitting to handle variations in the pixel format. // In FastBlit(), the operation is effectively a memcpy. void FastBlit(uint8_t* image, const DesktopRect& rect, DesktopFrame* frame); void SlowBlit(uint8_t* image, const DesktopRect& rect, DesktopFrame* frame); Display* display_; Window window_; DesktopSize window_size_; XImage* x_image_; XShmSegmentInfo* shm_segment_info_; Pixmap shm_pixmap_; GC shm_gc_; RTC_DISALLOW_COPY_AND_ASSIGN(XServerPixelBuffer); }; } // namespace webrtc #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_