/* * 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_DESKTOP_FRAME_PROVIDER_H_ #define MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_FRAME_PROVIDER_H_ #include #include #include #include #include "api/sequence_checker.h" #include "modules/desktop_capture/shared_desktop_frame.h" #include "sdk/objc/helpers/scoped_cftyperef.h" namespace webrtc { class DesktopFrameProvider { public: explicit DesktopFrameProvider(bool allow_iosurface); ~DesktopFrameProvider(); DesktopFrameProvider(const DesktopFrameProvider&) = delete; DesktopFrameProvider& operator=(const DesktopFrameProvider&) = delete; // The caller takes ownership of the returned desktop frame. Otherwise // returns null if `display_id` is invalid or not ready. Note that this // function does not remove the frame from the internal container. Caller // has to call the Release function. std::unique_ptr TakeLatestFrameForDisplay( CGDirectDisplayID display_id); // OS sends the latest IOSurfaceRef through // CGDisplayStreamFrameAvailableHandler callback; we store it here. void InvalidateIOSurface(CGDirectDisplayID display_id, rtc::ScopedCFTypeRef io_surface); // Expected to be called before stopping the CGDisplayStreamRef streams. void Release(); private: SequenceChecker thread_checker_; const bool allow_iosurface_; // Most recent IOSurface that contains a capture of matching display. std::map> io_surfaces_; }; } // namespace webrtc #endif // MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_FRAME_PROVIDER_H_