• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 // Don't include this file in any .h files because it pulls in some X headers.
12 
13 #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
14 #define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
15 
16 #include "webrtc/modules/desktop_capture/desktop_geometry.h"
17 
18 #include <X11/Xutil.h>
19 #include <X11/extensions/XShm.h>
20 
21 namespace webrtc {
22 
23 class DesktopFrame;
24 
25 // A class to allow the X server's pixel buffer to be accessed as efficiently
26 // as possible.
27 class XServerPixelBuffer {
28  public:
29   XServerPixelBuffer();
30   ~XServerPixelBuffer();
31 
32   void Release();
33 
34   // Allocate (or reallocate) the pixel buffer for |window|. Returns false in
35   // case of an error (e.g. window doesn't exist).
36   bool Init(Display* display, Window window);
37 
is_initialized()38   bool is_initialized() { return window_ != 0; }
39 
40   // Returns the size of the window the buffer was initialized for.
window_size()41   const DesktopSize& window_size() { return window_size_; }
42 
43   // Returns true if the window can be found.
44   bool IsWindowValid() const;
45 
46   // If shared memory is being used without pixmaps, synchronize this pixel
47   // buffer with the root window contents (otherwise, this is a no-op).
48   // This is to avoid doing a full-screen capture for each individual
49   // rectangle in the capture list, when it only needs to be done once at the
50   // beginning.
51   void Synchronize();
52 
53   // Capture the specified rectangle and stores it in the |frame|. In the case
54   // where the full-screen data is captured by Synchronize(), this simply
55   // returns the pointer without doing any more work. The caller must ensure
56   // that |rect| is not larger than window_size().
57   void CaptureRect(const DesktopRect& rect, DesktopFrame* frame);
58 
59  private:
60   void InitShm(const XWindowAttributes& attributes);
61   bool InitPixmaps(int depth);
62 
63   // We expose two forms of blitting to handle variations in the pixel format.
64   // In FastBlit(), the operation is effectively a memcpy.
65   void FastBlit(uint8_t* image,
66                 const DesktopRect& rect,
67                 DesktopFrame* frame);
68   void SlowBlit(uint8_t* image,
69                 const DesktopRect& rect,
70                 DesktopFrame* frame);
71 
72   Display* display_;
73   Window window_;
74   DesktopSize window_size_;
75   XImage* x_image_;
76   XShmSegmentInfo* shm_segment_info_;
77   Pixmap shm_pixmap_;
78   GC shm_gc_;
79 
80   RTC_DISALLOW_COPY_AND_ASSIGN(XServerPixelBuffer);
81 };
82 
83 }  // namespace webrtc
84 
85 #endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
86