123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- #ifndef MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
- #define MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
- #include <CoreGraphics/CoreGraphics.h>
- #include <memory>
- #include <vector>
- #include "modules/desktop_capture/desktop_capture_options.h"
- #include "modules/desktop_capture/desktop_capturer.h"
- #include "modules/desktop_capture/desktop_frame.h"
- #include "modules/desktop_capture/desktop_geometry.h"
- #include "modules/desktop_capture/desktop_region.h"
- #include "modules/desktop_capture/mac/desktop_configuration.h"
- #include "modules/desktop_capture/mac/desktop_configuration_monitor.h"
- #include "modules/desktop_capture/mac/desktop_frame_provider.h"
- #include "modules/desktop_capture/screen_capture_frame_queue.h"
- #include "modules/desktop_capture/screen_capturer_helper.h"
- #include "modules/desktop_capture/shared_desktop_frame.h"
- #include "rtc_base/thread_checker.h"
- namespace webrtc {
- class DisplayStreamManager;
- // A class to perform video frame capturing for mac.
- class ScreenCapturerMac final : public DesktopCapturer {
- public:
- ScreenCapturerMac(
- rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor,
- bool detect_updated_region,
- bool allow_iosurface);
- ~ScreenCapturerMac() override;
- // TODO(julien.isorce): Remove Init() or make it private.
- bool Init();
- // DesktopCapturer interface.
- void Start(Callback* callback) override;
- void CaptureFrame() override;
- void SetExcludedWindow(WindowId window) override;
- bool GetSourceList(SourceList* screens) override;
- bool SelectSource(SourceId id) override;
- private:
- // Returns false if the selected screen is no longer valid.
- bool CgBlit(const DesktopFrame& frame, const DesktopRegion& region);
- // Called when the screen configuration is changed.
- void ScreenConfigurationChanged();
- bool RegisterRefreshAndMoveHandlers();
- void UnregisterRefreshAndMoveHandlers();
- void ScreenRefresh(CGDirectDisplayID display_id,
- CGRectCount count,
- const CGRect* rect_array,
- DesktopVector display_origin,
- IOSurfaceRef io_surface);
- void ReleaseBuffers();
- std::unique_ptr<DesktopFrame> CreateFrame();
- const bool detect_updated_region_;
- Callback* callback_ = nullptr;
- // Queue of the frames buffers.
- ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
- // Current display configuration.
- MacDesktopConfiguration desktop_config_;
- // 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_ = 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_ = 1.0f;
- // A thread-safe list of invalid rectangles, and the size of the most
- // recently captured screen.
- ScreenCapturerHelper helper_;
- // Contains an invalid region from the previous capture.
- DesktopRegion last_invalid_region_;
- // Monitoring display reconfiguration.
- rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor_;
- CGWindowID excluded_window_ = 0;
- // List of streams, one per screen.
- std::vector<CGDisplayStreamRef> display_streams_;
- // Container holding latest state of the snapshot per displays.
- DesktopFrameProvider desktop_frame_provider_;
- // Start, CaptureFrame and destructor have to called in the same thread.
- rtc::ThreadChecker thread_checker_;
- RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerMac);
- };
- } // namespace webrtc
- #endif // MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
|