Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1652)

Side by Side Diff: media/video/capture/screen/x11/x_server_pixel_buffer.cc

Issue 13983010: Use webrtc::DesktopCapturer for screen capturer implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/video/capture/screen/x11/x_server_pixel_buffer.h ('k') | remoting/codec/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/video/capture/screen/x11/x_server_pixel_buffer.h" 5 #include "media/video/capture/screen/x11/x_server_pixel_buffer.h"
6 6
7 #include <sys/shm.h> 7 #include <sys/shm.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 } 53 }
54 54
55 #endif // !defined(TOOLKIT_GTK) 55 #endif // !defined(TOOLKIT_GTK)
56 56
57 } // namespace 57 } // namespace
58 58
59 namespace media { 59 namespace media {
60 60
61 XServerPixelBuffer::XServerPixelBuffer() 61 XServerPixelBuffer::XServerPixelBuffer()
62 : display_(NULL), root_window_(0), 62 : display_(NULL), root_window_(0),
63 root_window_size_(SkISize::Make(0, 0)), x_image_(NULL), 63 x_image_(NULL),
64 shm_segment_info_(NULL), shm_pixmap_(0), shm_gc_(NULL) { 64 shm_segment_info_(NULL), shm_pixmap_(0), shm_gc_(NULL) {
65 } 65 }
66 66
67 XServerPixelBuffer::~XServerPixelBuffer() { 67 XServerPixelBuffer::~XServerPixelBuffer() {
68 Release(); 68 Release();
69 } 69 }
70 70
71 void XServerPixelBuffer::Release() { 71 void XServerPixelBuffer::Release() {
72 if (x_image_) { 72 if (x_image_) {
73 XDestroyImage(x_image_); 73 XDestroyImage(x_image_);
(...skipping 11 matching lines...) Expand all
85 if (shm_segment_info_->shmaddr != reinterpret_cast<char*>(-1)) 85 if (shm_segment_info_->shmaddr != reinterpret_cast<char*>(-1))
86 shmdt(shm_segment_info_->shmaddr); 86 shmdt(shm_segment_info_->shmaddr);
87 if (shm_segment_info_->shmid != -1) 87 if (shm_segment_info_->shmid != -1)
88 shmctl(shm_segment_info_->shmid, IPC_RMID, 0); 88 shmctl(shm_segment_info_->shmid, IPC_RMID, 0);
89 delete shm_segment_info_; 89 delete shm_segment_info_;
90 shm_segment_info_ = NULL; 90 shm_segment_info_ = NULL;
91 } 91 }
92 } 92 }
93 93
94 void XServerPixelBuffer::Init(Display* display, 94 void XServerPixelBuffer::Init(Display* display,
95 const SkISize& screen_size) { 95 const webrtc::DesktopSize& screen_size) {
96 Release(); 96 Release();
97 display_ = display; 97 display_ = display;
98 root_window_size_ = screen_size; 98 root_window_size_ = screen_size;
99 int default_screen = DefaultScreen(display_); 99 int default_screen = DefaultScreen(display_);
100 root_window_ = RootWindow(display_, default_screen); 100 root_window_ = RootWindow(display_, default_screen);
101 InitShm(default_screen); 101 InitShm(default_screen);
102 } 102 }
103 103
104 // static 104 // static
105 SkISize XServerPixelBuffer::GetRootWindowSize(Display* display) { 105 webrtc::DesktopSize XServerPixelBuffer::GetRootWindowSize(Display* display) {
106 XWindowAttributes root_attr; 106 XWindowAttributes root_attr;
107 XGetWindowAttributes(display, DefaultRootWindow(display), &root_attr); 107 XGetWindowAttributes(display, DefaultRootWindow(display), &root_attr);
108 return SkISize::Make(root_attr.width, root_attr.height); 108 return webrtc::DesktopSize(root_attr.width, root_attr.height);
109 } 109 }
110 110
111 void XServerPixelBuffer::InitShm(int screen) { 111 void XServerPixelBuffer::InitShm(int screen) {
112 Visual* default_visual = DefaultVisual(display_, screen); 112 Visual* default_visual = DefaultVisual(display_, screen);
113 int default_depth = DefaultDepth(display_, screen); 113 int default_depth = DefaultDepth(display_, screen);
114 114
115 int major, minor; 115 int major, minor;
116 Bool havePixmaps; 116 Bool havePixmaps;
117 if (!XShmQueryVersion(display_, &major, &minor, &havePixmaps)) 117 if (!XShmQueryVersion(display_, &major, &minor, &havePixmaps))
118 // Shared memory not supported. CaptureRect will use the XImage API instead. 118 // Shared memory not supported. CaptureRect will use the XImage API instead.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 204
205 void XServerPixelBuffer::Synchronize() { 205 void XServerPixelBuffer::Synchronize() {
206 if (shm_segment_info_ && !shm_pixmap_) { 206 if (shm_segment_info_ && !shm_pixmap_) {
207 // XShmGetImage can fail if the display is being reconfigured. 207 // XShmGetImage can fail if the display is being reconfigured.
208 EnableXServerErrorTrap(); 208 EnableXServerErrorTrap();
209 XShmGetImage(display_, root_window_, x_image_, 0, 0, AllPlanes); 209 XShmGetImage(display_, root_window_, x_image_, 0, 0, AllPlanes);
210 GetLastXServerError(); 210 GetLastXServerError();
211 } 211 }
212 } 212 }
213 213
214 uint8* XServerPixelBuffer::CaptureRect(const SkIRect& rect) { 214 uint8* XServerPixelBuffer::CaptureRect(const webrtc::DesktopRect& rect) {
215 DCHECK(SkIRect::MakeSize(root_window_size_).contains(rect)); 215 DCHECK_LE(rect.right(), root_window_size_.width());
216 DCHECK_LE(rect.bottom(), root_window_size_.height());
217
216 if (shm_segment_info_) { 218 if (shm_segment_info_) {
217 if (shm_pixmap_) { 219 if (shm_pixmap_) {
218 XCopyArea(display_, root_window_, shm_pixmap_, shm_gc_, 220 XCopyArea(display_, root_window_, shm_pixmap_, shm_gc_,
219 rect.fLeft, rect.fTop, rect.width(), rect.height(), 221 rect.left(), rect.top(), rect.width(), rect.height(),
220 rect.fLeft, rect.fTop); 222 rect.left(), rect.top());
221 XSync(display_, False); 223 XSync(display_, False);
222 } 224 }
223 return reinterpret_cast<uint8*>(x_image_->data) + 225 return reinterpret_cast<uint8*>(x_image_->data) +
224 rect.fTop * x_image_->bytes_per_line + 226 rect.top() * x_image_->bytes_per_line +
225 rect.fLeft * x_image_->bits_per_pixel / 8; 227 rect.left() * x_image_->bits_per_pixel / 8;
226 } else { 228 } else {
227 if (x_image_) 229 if (x_image_)
228 XDestroyImage(x_image_); 230 XDestroyImage(x_image_);
229 x_image_ = XGetImage(display_, root_window_, rect.fLeft, rect.fTop, 231 x_image_ = XGetImage(display_, root_window_, rect.left(), rect.top(),
230 rect.width(), rect.height(), AllPlanes, ZPixmap); 232 rect.width(), rect.height(), AllPlanes, ZPixmap);
231 return reinterpret_cast<uint8*>(x_image_->data); 233 return reinterpret_cast<uint8*>(x_image_->data);
232 } 234 }
233 } 235 }
234 236
235 int XServerPixelBuffer::GetStride() const { 237 int XServerPixelBuffer::GetStride() const {
236 return x_image_->bytes_per_line; 238 return x_image_->bytes_per_line;
237 } 239 }
238 240
239 int XServerPixelBuffer::GetDepth() const { 241 int XServerPixelBuffer::GetDepth() const {
(...skipping 10 matching lines...) Expand all
250 252
251 int XServerPixelBuffer::GetBlueMask() const { 253 int XServerPixelBuffer::GetBlueMask() const {
252 return x_image_->blue_mask; 254 return x_image_->blue_mask;
253 } 255 }
254 256
255 int XServerPixelBuffer::GetGreenMask() const { 257 int XServerPixelBuffer::GetGreenMask() const {
256 return x_image_->green_mask; 258 return x_image_->green_mask;
257 } 259 }
258 260
259 } // namespace media 261 } // namespace media
OLDNEW
« no previous file with comments | « media/video/capture/screen/x11/x_server_pixel_buffer.h ('k') | remoting/codec/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698