| 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 316aa3dbe6a04da78bad6a39ea21f7baa22638d8..eed59c8af8ff95a773e03869a8a953e71678dc90 100644
|
| --- a/webrtc/modules/desktop_capture/screen_capturer_mac.mm
|
| +++ b/webrtc/modules/desktop_capture/screen_capturer_mac.mm
|
| @@ -40,6 +40,27 @@
|
| #include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
|
| #include "webrtc/system_wrappers/include/logging.h"
|
|
|
| +// Once Chrome no longer supports OSX 10.8, everything within this
|
| +// preprocessor block can be removed. https://crbug.com/579255
|
| +#if !defined(MAC_OS_X_VERSION_10_9) || \
|
| + MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
|
| +CG_EXTERN const CGRect* CGDisplayStreamUpdateGetRects(
|
| + CGDisplayStreamUpdateRef updateRef,
|
| + CGDisplayStreamUpdateRectType rectType,
|
| + size_t* rectCount);
|
| +CG_EXTERN CFRunLoopSourceRef
|
| +CGDisplayStreamGetRunLoopSource(CGDisplayStreamRef displayStream);
|
| +CG_EXTERN CGError CGDisplayStreamStop(CGDisplayStreamRef displayStream);
|
| +CG_EXTERN CGError CGDisplayStreamStart(CGDisplayStreamRef displayStream);
|
| +CG_EXTERN CGDisplayStreamRef
|
| +CGDisplayStreamCreate(CGDirectDisplayID display,
|
| + size_t outputWidth,
|
| + size_t outputHeight,
|
| + int32_t pixelFormat,
|
| + CFDictionaryRef properties,
|
| + CGDisplayStreamFrameAvailableHandler handler);
|
| +#endif
|
| +
|
| namespace webrtc {
|
|
|
| namespace {
|
| @@ -63,7 +84,8 @@ class DisplayStreamManager {
|
| delete this;
|
| }
|
|
|
| - void SaveStream(int unique_id, CGDisplayStreamRef stream) {
|
| + void SaveStream(int unique_id,
|
| + CGDisplayStreamRef stream) {
|
| RTC_CHECK(unique_id <= unique_id_generator_);
|
| DisplayStreamWrapper wrapper;
|
| wrapper.stream = stream;
|
| @@ -75,13 +97,11 @@ class DisplayStreamManager {
|
| DisplayStreamWrapper& wrapper = pair.second;
|
| if (wrapper.active) {
|
| wrapper.active = false;
|
| -// CGDisplayStream* functions are only available in 10.8+. Chrome only supports
|
| -// 10.9+, but we can't remove these warning suppressions until the deployment
|
| -// target is updated. https://crbug.com/579255
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| + CFRunLoopSourceRef source =
|
| + CGDisplayStreamGetRunLoopSource(wrapper.stream);
|
| + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source,
|
| + kCFRunLoopDefaultMode);
|
| CGDisplayStreamStop(wrapper.stream);
|
| -#pragma clang diagnostic pop
|
| }
|
| }
|
| }
|
| @@ -287,11 +307,6 @@ class ScreenCapturerMac : public ScreenCapturer {
|
| void UnregisterRefreshAndMoveHandlers();
|
|
|
| void ScreenRefresh(CGRectCount count, const CGRect *rect_array);
|
| - void ScreenUpdateMove(CGFloat delta_x,
|
| - CGFloat delta_y,
|
| - size_t count,
|
| - const CGRect* rect_array);
|
| - void ScreenRefreshCallback(CGRectCount count, const CGRect* rect_array);
|
| void ReleaseBuffers();
|
|
|
| std::unique_ptr<DesktopFrame> CreateFrame();
|
| @@ -925,17 +940,19 @@ bool ScreenCapturerMac::RegisterRefreshAndMoveHandlers() {
|
| size_t pixel_height = config.pixel_bounds.height();
|
| if (pixel_width == 0 || pixel_height == 0)
|
| continue;
|
| - int unique_id = display_stream_manager_->GetUniqueId();
|
| + // Using a local variable forces the block to capture the raw pointer.
|
| + DisplayStreamManager* manager = display_stream_manager_;
|
| + int unique_id = manager->GetUniqueId();
|
| CGDirectDisplayID display_id = config.id;
|
| CGDisplayStreamFrameAvailableHandler handler =
|
| ^(CGDisplayStreamFrameStatus status, uint64_t display_time,
|
| IOSurfaceRef frame_surface, CGDisplayStreamUpdateRef updateRef) {
|
| if (status == kCGDisplayStreamFrameStatusStopped) {
|
| - display_stream_manager_->DestroyStream(unique_id);
|
| + manager->DestroyStream(unique_id);
|
| return;
|
| }
|
|
|
| - if (display_stream_manager_->ShouldIgnoreUpdates())
|
| + if (manager->ShouldIgnoreUpdates())
|
| return;
|
|
|
| // Only pay attention to frame updates.
|
| @@ -943,45 +960,26 @@ bool ScreenCapturerMac::RegisterRefreshAndMoveHandlers() {
|
| return;
|
|
|
| size_t count = 0;
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| -// TODO(erikchen): Use kCGDisplayStreamUpdateDirtyRects.
|
| const CGRect* rects = CGDisplayStreamUpdateGetRects(
|
| - updateRef, kCGDisplayStreamUpdateMovedRects, &count);
|
| -#pragma clang diagnostic pop
|
| - if (count != 0) {
|
| - CGFloat dx = 0;
|
| - CGFloat dy = 0;
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| - CGDisplayStreamUpdateGetMovedRectsDelta(updateRef, &dx, &dy);
|
| -#pragma clang diagnostic pop
|
| - ScreenUpdateMove(dx, dy, count, rects);
|
| - }
|
| -
|
| - count = 0;
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| - rects = CGDisplayStreamUpdateGetRects(
|
| - updateRef, kCGDisplayStreamUpdateRefreshedRects, &count);
|
| -#pragma clang diagnostic pop
|
| + updateRef, kCGDisplayStreamUpdateDirtyRects, &count);
|
| if (count != 0) {
|
| // According to CGDisplayStream.h, it's safe to call
|
| // CGDisplayStreamStop() from within the callback.
|
| - ScreenRefreshCallback(count, rects);
|
| + ScreenRefresh(count, rects);
|
| }
|
| };
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| CGDisplayStreamRef display_stream = CGDisplayStreamCreate(
|
| display_id, pixel_width, pixel_height, 'BGRA', nullptr, handler);
|
| -#pragma clang diagnostic pop
|
| +
|
| if (display_stream) {
|
| + CGError error = CGDisplayStreamStart(display_stream);
|
| + if (error != kCGErrorSuccess)
|
| + return false;
|
| +
|
| + CFRunLoopSourceRef source =
|
| + CGDisplayStreamGetRunLoopSource(display_stream);
|
| + CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
|
| display_stream_manager_->SaveStream(unique_id, display_stream);
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wunguarded-availability"
|
| - CGDisplayStreamStart(display_stream);
|
| -#pragma clang diagnostic pop
|
| }
|
| }
|
|
|
| @@ -995,7 +993,7 @@ void ScreenCapturerMac::UnregisterRefreshAndMoveHandlers() {
|
| void ScreenCapturerMac::ScreenRefresh(CGRectCount count,
|
| const CGRect* rect_array) {
|
| if (screen_pixel_bounds_.is_empty())
|
| - return;
|
| + ScreenConfigurationChanged();
|
|
|
| DesktopRegion region;
|
| DesktopVector translate_vector =
|
| @@ -1011,27 +1009,6 @@ void ScreenCapturerMac::ScreenRefresh(CGRectCount count,
|
| helper_.InvalidateRegion(region);
|
| }
|
|
|
| -void ScreenCapturerMac::ScreenUpdateMove(CGFloat delta_x,
|
| - CGFloat delta_y,
|
| - size_t count,
|
| - const CGRect* rect_array) {
|
| - // Translate |rect_array| to identify the move's destination.
|
| - CGRect refresh_rects[count];
|
| - for (CGRectCount i = 0; i < count; ++i) {
|
| - refresh_rects[i] = CGRectOffset(rect_array[i], delta_x, delta_y);
|
| - }
|
| -
|
| - // Currently we just treat move events the same as refreshes.
|
| - ScreenRefresh(count, refresh_rects);
|
| -}
|
| -
|
| -void ScreenCapturerMac::ScreenRefreshCallback(CGRectCount count,
|
| - const CGRect* rect_array) {
|
| - if (screen_pixel_bounds_.is_empty())
|
| - ScreenConfigurationChanged();
|
| - ScreenRefresh(count, rect_array);
|
| -}
|
| -
|
| std::unique_ptr<DesktopFrame> ScreenCapturerMac::CreateFrame() {
|
| std::unique_ptr<DesktopFrame> frame(
|
| new BasicDesktopFrame(screen_pixel_bounds_.size()));
|
|
|