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

Unified Diff: webrtc/modules/desktop_capture/screen_capturer_mac.mm

Issue 2417603002: Several fixes to screen capturer mac. (Closed)
Patch Set: nits Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()));
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698