Index: webrtc/modules/desktop_capture/screen_capturer_mac.mm |
diff --git a/webrtc/modules/desktop_capture/screen_capturer_mac.mm b/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
index c41dc4d7a3b4ba59e4ebe6880f1e090dae5386b5..2c22ee5e46fb43745fdd175d97330fbe2133f9fe 100644 |
--- a/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
+++ b/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
@@ -22,7 +22,9 @@ |
#include <OpenGL/CGLMacro.h> |
#include <OpenGL/OpenGL.h> |
+#include "webrtc/base/checks.h" |
#include "webrtc/base/macutils.h" |
+#include "webrtc/base/thread_checker.h" |
#include "webrtc/modules/desktop_capture/desktop_capture_options.h" |
#include "webrtc/modules/desktop_capture/desktop_frame.h" |
#include "webrtc/modules/desktop_capture/desktop_geometry.h" |
@@ -188,8 +190,6 @@ class ScreenCapturerMac : public ScreenCapturer { |
rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor); |
virtual ~ScreenCapturerMac(); |
- bool Init(); |
- |
// Overridden from ScreenCapturer: |
void Start(Callback* callback) override; |
void Capture(const DesktopRegion& region) override; |
@@ -198,6 +198,8 @@ class ScreenCapturerMac : public ScreenCapturer { |
bool SelectScreen(ScreenId id) override; |
private: |
+ bool Initialize(); |
+ |
void GlBlitFast(const DesktopFrame& frame, |
const DesktopRegion& region); |
void GlBlitSlow(const DesktopFrame& frame); |
@@ -228,9 +230,11 @@ class ScreenCapturerMac : public ScreenCapturer { |
DesktopFrame* CreateFrame(); |
- Callback* callback_; |
+ rtc::ThreadChecker thread_checker_; |
+ |
+ Callback* callback_ = nullptr; |
- CGLContextObj cgl_context_; |
+ CGLContextObj cgl_context_ = nullptr; |
ScopedPixelBufferObject pixel_buffer_object_; |
// Queue of the frames buffers. |
@@ -241,13 +245,13 @@ class ScreenCapturerMac : public ScreenCapturer { |
// Currently selected display, or 0 if the full desktop is selected. On OS X |
// 10.6 and before, this is always 0. |
- CGDirectDisplayID current_display_; |
+ CGDirectDisplayID current_display_ = 0; |
// The physical pixel bounds of the current screen. |
DesktopRect screen_pixel_bounds_; |
// The dip to physical pixel scale of the current screen. |
- float dip_to_pixel_scale_; |
+ float dip_to_pixel_scale_ = 1.0f; |
// A thread-safe list of invalid rectangles, and the size of the most |
// recently captured screen. |
@@ -260,20 +264,20 @@ class ScreenCapturerMac : public ScreenCapturer { |
rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor_; |
// Power management assertion to prevent the screen from sleeping. |
- IOPMAssertionID power_assertion_id_display_; |
+ IOPMAssertionID power_assertion_id_display_ = kIOPMNullAssertionID; |
// Power management assertion to indicate that the user is active. |
- IOPMAssertionID power_assertion_id_user_; |
+ IOPMAssertionID power_assertion_id_user_ = kIOPMNullAssertionID; |
// Dynamically link to deprecated APIs for Mac OS X 10.6 support. |
- void* app_services_library_; |
- CGDisplayBaseAddressFunc cg_display_base_address_; |
- CGDisplayBytesPerRowFunc cg_display_bytes_per_row_; |
- CGDisplayBitsPerPixelFunc cg_display_bits_per_pixel_; |
- void* opengl_library_; |
- CGLSetFullScreenFunc cgl_set_full_screen_; |
+ void* app_services_library_ = nullptr; |
+ CGDisplayBaseAddressFunc cg_display_base_address_ = nullptr; |
+ CGDisplayBytesPerRowFunc cg_display_bytes_per_row_ = nullptr; |
+ CGDisplayBitsPerPixelFunc cg_display_bits_per_pixel_ = nullptr; |
+ void* opengl_library_ = nullptr; |
+ CGLSetFullScreenFunc cgl_set_full_screen_ = nullptr; |
- CGWindowID excluded_window_; |
+ CGWindowID excluded_window_ = 0; |
RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerMac); |
}; |
@@ -303,23 +307,15 @@ class InvertedDesktopFrame : public DesktopFrame { |
ScreenCapturerMac::ScreenCapturerMac( |
rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor) |
- : callback_(NULL), |
- cgl_context_(NULL), |
- current_display_(0), |
- dip_to_pixel_scale_(1.0f), |
- desktop_config_monitor_(desktop_config_monitor), |
- power_assertion_id_display_(kIOPMNullAssertionID), |
- power_assertion_id_user_(kIOPMNullAssertionID), |
- app_services_library_(NULL), |
- cg_display_base_address_(NULL), |
- cg_display_bytes_per_row_(NULL), |
- cg_display_bits_per_pixel_(NULL), |
- opengl_library_(NULL), |
- cgl_set_full_screen_(NULL), |
- excluded_window_(0) { |
+ : desktop_config_monitor_(desktop_config_monitor) { |
+ // ScreenCapturer can be used on a thread different from the thread on which |
+ // it's created. |
+ thread_checker_.DetachFromThread(); |
} |
ScreenCapturerMac::~ScreenCapturerMac() { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (power_assertion_id_display_ != kIOPMNullAssertionID) { |
IOPMAssertionRelease(power_assertion_id_display_); |
power_assertion_id_display_ = kIOPMNullAssertionID; |
@@ -335,7 +331,7 @@ ScreenCapturerMac::~ScreenCapturerMac() { |
dlclose(opengl_library_); |
} |
-bool ScreenCapturerMac::Init() { |
+bool ScreenCapturerMac::Initialize() { |
if (!RegisterRefreshAndMoveHandlers()) { |
return false; |
} |
@@ -359,11 +355,17 @@ void ScreenCapturerMac::ReleaseBuffers() { |
} |
void ScreenCapturerMac::Start(Callback* callback) { |
- assert(!callback_); |
- assert(callback); |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(!callback_); |
+ RTC_DCHECK(callback); |
callback_ = callback; |
+ if (!Initialize()) { |
+ callback_->OnInitializationFailed(); |
+ return; |
+ } |
+ |
// Create power management assertions to wake the display and prevent it from |
// going to sleep on user idle. |
// TODO(jamiewalch): Use IOPMAssertionDeclareUserActivity on 10.7.3 and above |
@@ -381,6 +383,8 @@ void ScreenCapturerMac::Start(Callback* callback) { |
} |
void ScreenCapturerMac::Capture(const DesktopRegion& region_to_capture) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
TickTime capture_start_time = TickTime::Now(); |
queue_.MoveToNextFrame(); |
@@ -449,11 +453,14 @@ void ScreenCapturerMac::Capture(const DesktopRegion& region_to_capture) { |
} |
void ScreenCapturerMac::SetExcludedWindow(WindowId window) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
excluded_window_ = window; |
} |
bool ScreenCapturerMac::GetScreenList(ScreenList* screens) { |
- assert(screens->size() == 0); |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(screens->size() == 0); |
+ |
if (rtc::GetOSVersionName() < rtc::kMacOSLion) { |
// Single monitor cast is not supported on pre OS X 10.7. |
Screen screen; |
@@ -472,6 +479,8 @@ bool ScreenCapturerMac::GetScreenList(ScreenList* screens) { |
} |
bool ScreenCapturerMac::SelectScreen(ScreenId id) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (rtc::GetOSVersionName() < rtc::kMacOSLion) { |
// Ignore the screen selection on unsupported OS. |
assert(!current_display_); |
@@ -980,11 +989,7 @@ ScreenCapturer* ScreenCapturer::Create(const DesktopCaptureOptions& options) { |
if (!options.configuration_monitor()) |
return NULL; |
- std::unique_ptr<ScreenCapturerMac> capturer( |
- new ScreenCapturerMac(options.configuration_monitor())); |
- if (!capturer->Init()) |
- capturer.reset(); |
- return capturer.release(); |
+ return new ScreenCapturerMac(options.configuration_monitor()); |
} |
} // namespace webrtc |