Index: webrtc/modules/desktop_capture/screen_capturer_x11.cc |
diff --git a/webrtc/modules/desktop_capture/screen_capturer_x11.cc b/webrtc/modules/desktop_capture/screen_capturer_x11.cc |
index 5540e6820fa1f7f66468f1173c6a1de3e18552f7..57c2e5fc163981a5a5136f38a6e90d98a494043c 100644 |
--- a/webrtc/modules/desktop_capture/screen_capturer_x11.cc |
+++ b/webrtc/modules/desktop_capture/screen_capturer_x11.cc |
@@ -66,7 +66,7 @@ class ScreenCapturerLinux : public ScreenCapturer, |
// from HandleXEvent(). In the non-DAMAGE case, this captures the |
// whole screen, then calculates some invalid rectangles that include any |
// differences between this and the previous capture. |
- DesktopFrame* CaptureScreen(); |
+ std::unique_ptr<DesktopFrame> CaptureScreen(); |
// Called when the screen configuration is changed. |
void ScreenConfigurationChanged(); |
@@ -82,23 +82,23 @@ class ScreenCapturerLinux : public ScreenCapturer, |
DesktopCaptureOptions options_; |
- Callback* callback_; |
+ Callback* callback_ = nullptr; |
// X11 graphics context. |
- GC gc_; |
- Window root_window_; |
+ GC gc_ = nullptr; |
+ Window root_window_ = BadValue; |
// XFixes. |
- bool has_xfixes_; |
- int xfixes_event_base_; |
- int xfixes_error_base_; |
+ bool has_xfixes_ = false; |
+ int xfixes_event_base_ = -1; |
+ int xfixes_error_base_ = -1; |
// XDamage information. |
- bool use_damage_; |
- Damage damage_handle_; |
- int damage_event_base_; |
- int damage_error_base_; |
- XserverRegion damage_region_; |
+ bool use_damage_ = false; |
+ Damage damage_handle_ = 0; |
+ int damage_event_base_ = -1; |
+ int damage_error_base_ = -1; |
+ XserverRegion damage_region_ = 0; |
// Access to the X Server's pixel buffer. |
XServerPixelBuffer x_server_pixel_buffer_; |
@@ -120,18 +120,7 @@ class ScreenCapturerLinux : public ScreenCapturer, |
RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerLinux); |
}; |
-ScreenCapturerLinux::ScreenCapturerLinux() |
- : callback_(NULL), |
- gc_(NULL), |
- root_window_(BadValue), |
- has_xfixes_(false), |
- xfixes_event_base_(-1), |
- xfixes_error_base_(-1), |
- use_damage_(false), |
- damage_handle_(0), |
- damage_event_base_(-1), |
- damage_error_base_(-1), |
- damage_region_(0) { |
+ScreenCapturerLinux::ScreenCapturerLinux() { |
helper_.SetLogGridSize(4); |
} |
@@ -249,7 +238,7 @@ void ScreenCapturerLinux::Capture(const DesktopRegion& region) { |
// in a good shape. |
if (!x_server_pixel_buffer_.is_initialized()) { |
// We failed to initialize pixel buffer. |
- callback_->OnCaptureCompleted(NULL); |
+ callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr); |
return; |
} |
@@ -257,29 +246,26 @@ void ScreenCapturerLinux::Capture(const DesktopRegion& region) { |
// Note that we can't reallocate other buffers at this point, since the caller |
// may still be reading from them. |
if (!queue_.current_frame()) { |
- std::unique_ptr<DesktopFrame> frame( |
- new BasicDesktopFrame(x_server_pixel_buffer_.window_size())); |
- queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(frame.release())); |
+ queue_.ReplaceCurrentFrame( |
+ SharedDesktopFrame::Wrap(std::unique_ptr<DesktopFrame>( |
+ new BasicDesktopFrame(x_server_pixel_buffer_.window_size())))); |
} |
// Refresh the Differ helper used by CaptureFrame(), if needed. |
DesktopFrame* frame = queue_.current_frame(); |
- if (!use_damage_ && ( |
- !differ_.get() || |
- (differ_->width() != frame->size().width()) || |
- (differ_->height() != frame->size().height()) || |
- (differ_->bytes_per_row() != frame->stride()))) { |
+ if (!use_damage_ && |
+ (!differ_ || (differ_->width() != frame->size().width()) || |
+ (differ_->height() != frame->size().height()) || |
+ (differ_->bytes_per_row() != frame->stride()))) { |
differ_.reset(new Differ(frame->size().width(), frame->size().height(), |
- DesktopFrame::kBytesPerPixel, |
- frame->stride())); |
+ DesktopFrame::kBytesPerPixel, frame->stride())); |
} |
- DesktopFrame* result = CaptureScreen(); |
+ std::unique_ptr<DesktopFrame> result = CaptureScreen(); |
last_invalid_region_ = result->updated_region(); |
- result->set_capture_time_ms( |
- (rtc::TimeNanos() - capture_start_time_nanos) / |
- rtc::kNumNanosecsPerMillisec); |
- callback_->OnCaptureCompleted(result); |
+ result->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) / |
+ rtc::kNumNanosecsPerMillisec); |
+ callback_->OnCaptureResult(Result::SUCCESS, std::move(result)); |
} |
bool ScreenCapturerLinux::GetScreenList(ScreenList* screens) { |
@@ -311,8 +297,8 @@ bool ScreenCapturerLinux::HandleXEvent(const XEvent& event) { |
return false; |
} |
-DesktopFrame* ScreenCapturerLinux::CaptureScreen() { |
- DesktopFrame* frame = queue_.current_frame()->Share(); |
+std::unique_ptr<DesktopFrame> ScreenCapturerLinux::CaptureScreen() { |
+ std::unique_ptr<SharedDesktopFrame> frame = queue_.current_frame()->Share(); |
assert(x_server_pixel_buffer_.window_size().equals(frame->size())); |
// Pass the screen size to the helper, so it can clip the invalid region if it |
@@ -354,18 +340,18 @@ DesktopFrame* ScreenCapturerLinux::CaptureScreen() { |
for (DesktopRegion::Iterator it(*updated_region); |
!it.IsAtEnd(); it.Advance()) { |
- x_server_pixel_buffer_.CaptureRect(it.rect(), frame); |
+ x_server_pixel_buffer_.CaptureRect(it.rect(), frame.get()); |
} |
} else { |
// Doing full-screen polling, or this is the first capture after a |
// screen-resolution change. In either case, need a full-screen capture. |
DesktopRect screen_rect = DesktopRect::MakeSize(frame->size()); |
- x_server_pixel_buffer_.CaptureRect(screen_rect, frame); |
+ x_server_pixel_buffer_.CaptureRect(screen_rect, frame.get()); |
if (queue_.previous_frame()) { |
// Full-screen polling, so calculate the invalid rects here, based on the |
// changed pixels between current and previous buffers. |
- RTC_DCHECK(differ_.get() != NULL); |
+ RTC_DCHECK(differ_); |
RTC_DCHECK(queue_.previous_frame()->data()); |
differ_->CalcDirtyRegion(queue_.previous_frame()->data(), |
frame->data(), updated_region); |
@@ -378,7 +364,7 @@ DesktopFrame* ScreenCapturerLinux::CaptureScreen() { |
} |
} |
- return frame; |
+ return std::move(frame); |
} |
void ScreenCapturerLinux::ScreenConfigurationChanged() { |
@@ -415,7 +401,7 @@ void ScreenCapturerLinux::SynchronizeFrame() { |
void ScreenCapturerLinux::DeinitXlib() { |
if (gc_) { |
XFreeGC(display(), gc_); |
- gc_ = NULL; |
+ gc_ = nullptr; |
} |
x_server_pixel_buffer_.Release(); |
@@ -438,7 +424,7 @@ void ScreenCapturerLinux::DeinitXlib() { |
// static |
ScreenCapturer* ScreenCapturer::Create(const DesktopCaptureOptions& options) { |
if (!options.x_display()) |
- return NULL; |
+ return nullptr; |
std::unique_ptr<ScreenCapturerLinux> capturer(new ScreenCapturerLinux()); |
if (!capturer->Init(options)) |