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

Side by Side Diff: webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.cc

Issue 2446733003: Update XServerPixelBuffer to handle errors returned from XGetImage(). (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 void XServerPixelBuffer::Synchronize() { 224 void XServerPixelBuffer::Synchronize() {
225 if (shm_segment_info_ && !shm_pixmap_) { 225 if (shm_segment_info_ && !shm_pixmap_) {
226 // XShmGetImage can fail if the display is being reconfigured. 226 // XShmGetImage can fail if the display is being reconfigured.
227 XErrorTrap error_trap(display_); 227 XErrorTrap error_trap(display_);
228 // XShmGetImage fails if the window is partially out of screen. 228 // XShmGetImage fails if the window is partially out of screen.
229 xshm_get_image_succeeded_ = 229 xshm_get_image_succeeded_ =
230 XShmGetImage(display_, window_, x_image_, 0, 0, AllPlanes); 230 XShmGetImage(display_, window_, x_image_, 0, 0, AllPlanes);
231 } 231 }
232 } 232 }
233 233
234 void XServerPixelBuffer::CaptureRect(const DesktopRect& rect, 234 bool XServerPixelBuffer::CaptureRect(const DesktopRect& rect,
235 DesktopFrame* frame) { 235 DesktopFrame* frame) {
236 assert(rect.right() <= window_size_.width()); 236 assert(rect.right() <= window_size_.width());
237 assert(rect.bottom() <= window_size_.height()); 237 assert(rect.bottom() <= window_size_.height());
238 238
239 uint8_t* data; 239 uint8_t* data;
240 240
241 if (shm_segment_info_ && (shm_pixmap_ || xshm_get_image_succeeded_)) { 241 if (shm_segment_info_ && (shm_pixmap_ || xshm_get_image_succeeded_)) {
242 if (shm_pixmap_) { 242 if (shm_pixmap_) {
243 XCopyArea(display_, window_, shm_pixmap_, shm_gc_, 243 XCopyArea(display_, window_, shm_pixmap_, shm_gc_,
244 rect.left(), rect.top(), rect.width(), rect.height(), 244 rect.left(), rect.top(), rect.width(), rect.height(),
245 rect.left(), rect.top()); 245 rect.left(), rect.top());
246 XSync(display_, False); 246 XSync(display_, False);
247 } 247 }
248 data = reinterpret_cast<uint8_t*>(x_image_->data) + 248 data = reinterpret_cast<uint8_t*>(x_image_->data) +
249 rect.top() * x_image_->bytes_per_line + 249 rect.top() * x_image_->bytes_per_line +
250 rect.left() * x_image_->bits_per_pixel / 8; 250 rect.left() * x_image_->bits_per_pixel / 8;
251 } else { 251 } else {
252 if (x_image_) 252 if (x_image_)
253 XDestroyImage(x_image_); 253 XDestroyImage(x_image_);
254 x_image_ = XGetImage(display_, window_, rect.left(), rect.top(), 254 x_image_ = XGetImage(display_, window_, rect.left(), rect.top(),
255 rect.width(), rect.height(), AllPlanes, ZPixmap); 255 rect.width(), rect.height(), AllPlanes, ZPixmap);
256 if (!x_image_)
257 return false;
258
256 data = reinterpret_cast<uint8_t*>(x_image_->data); 259 data = reinterpret_cast<uint8_t*>(x_image_->data);
257 } 260 }
258 261
259 if (IsXImageRGBFormat(x_image_)) { 262 if (IsXImageRGBFormat(x_image_)) {
260 FastBlit(data, rect, frame); 263 FastBlit(data, rect, frame);
261 } else { 264 } else {
262 SlowBlit(data, rect, frame); 265 SlowBlit(data, rect, frame);
263 } 266 }
267
268 return true;
264 } 269 }
265 270
266 void XServerPixelBuffer::FastBlit(uint8_t* image, 271 void XServerPixelBuffer::FastBlit(uint8_t* image,
267 const DesktopRect& rect, 272 const DesktopRect& rect,
268 DesktopFrame* frame) { 273 DesktopFrame* frame) {
269 uint8_t* src_pos = image; 274 uint8_t* src_pos = image;
270 int src_stride = x_image_->bytes_per_line; 275 int src_stride = x_image_->bytes_per_line;
271 int dst_x = rect.left(), dst_y = rect.top(); 276 int dst_x = rect.left(), dst_y = rect.top();
272 277
273 uint8_t* dst_pos = frame->data() + frame->stride() * dst_y; 278 uint8_t* dst_pos = frame->data() + frame->stride() * dst_y;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 // Write as 32-bit RGB. 331 // Write as 32-bit RGB.
327 dst_pos_32[x] = ((r >> 8) & 0xff0000) | ((g >> 16) & 0xff00) | 332 dst_pos_32[x] = ((r >> 8) & 0xff0000) | ((g >> 16) & 0xff00) |
328 ((b >> 24) & 0xff); 333 ((b >> 24) & 0xff);
329 } 334 }
330 dst_pos += frame->stride(); 335 dst_pos += frame->stride();
331 src_pos += src_stride; 336 src_pos += src_stride;
332 } 337 }
333 } 338 }
334 339
335 } // namespace webrtc 340 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698