/* * Copyright (c) 2013 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_DESKTOP_CAPTURER_H_ #define MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_ #include #include #include #include #include #include #include "modules/desktop_capture/desktop_capture_types.h" #include "modules/desktop_capture/desktop_frame.h" #include "modules/desktop_capture/shared_memory.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { class DesktopCaptureOptions; class DesktopFrame; // Abstract interface for screen and window capturers. class RTC_EXPORT DesktopCapturer { public: enum class Result { // The frame was captured successfully. SUCCESS, // There was a temporary error. The caller should continue calling // CaptureFrame(), in the expectation that it will eventually recover. ERROR_TEMPORARY, // Capture has failed and will keep failing if the caller tries calling // CaptureFrame() again. ERROR_PERMANENT, MAX_VALUE = ERROR_PERMANENT }; // Interface that must be implemented by the DesktopCapturer consumers. class Callback { public: // Called after a frame has been captured. |frame| is not nullptr if and // only if |result| is SUCCESS. virtual void OnCaptureResult(Result result, std::unique_ptr frame) = 0; protected: virtual ~Callback() {} }; typedef intptr_t SourceId; static_assert(std::is_same::value, "SourceId should be a same type as ScreenId."); struct Source { // The unique id to represent a Source of current DesktopCapturer. SourceId id; // Title of the window or screen in UTF-8 encoding, maybe empty. This field // should not be used to identify a source. std::string title; }; typedef std::vector SourceList; virtual ~DesktopCapturer(); // Called at the beginning of a capturing session. |callback| must remain // valid until capturer is destroyed. virtual void Start(Callback* callback) = 0; // Sets SharedMemoryFactory that will be used to create buffers for the // captured frames. The factory can be invoked on a thread other than the one // where CaptureFrame() is called. It will be destroyed on the same thread. // Shared memory is currently supported only by some DesktopCapturer // implementations. virtual void SetSharedMemoryFactory( std::unique_ptr shared_memory_factory); // Captures next frame, and involve callback provided by Start() function. // Pending capture requests are canceled when DesktopCapturer is deleted. virtual void CaptureFrame() = 0; // Sets the window to be excluded from the captured image in the future // Capture calls. Used to exclude the screenshare notification window for // screen capturing. virtual void SetExcludedWindow(WindowId window); // TODO(zijiehe): Following functions should be pure virtual. The default // implementations are for backward compatibility only. Remove default // implementations once all DesktopCapturer implementations in Chromium have // implemented these functions. // Gets a list of sources current capturer supports. Returns false in case of // a failure. // For DesktopCapturer implementations to capture screens, this function // should return monitors. // For DesktopCapturer implementations to capture windows, this function // should only return root windows owned by applications. virtual bool GetSourceList(SourceList* sources); // Selects a source to be captured. Returns false in case of a failure (e.g. // if there is no source with the specified type and id.) virtual bool SelectSource(SourceId id); // Brings the selected source to the front and sets the input focus on it. // Returns false in case of a failure or no source has been selected or the // implementation does not support this functionality. virtual bool FocusOnSelectedSource(); // Returns true if the |pos| on the selected source is covered by other // elements on the display, and is not visible to the users. // |pos| is in full desktop coordinates, i.e. the top-left monitor always // starts from (0, 0). // The return value if |pos| is out of the scope of the source is undefined. virtual bool IsOccluded(const DesktopVector& pos); // Creates a DesktopCapturer instance which targets to capture windows. static std::unique_ptr CreateWindowCapturer( const DesktopCaptureOptions& options); // Creates a DesktopCapturer instance which targets to capture screens. static std::unique_ptr CreateScreenCapturer( const DesktopCaptureOptions& options); #if defined(WEBRTC_USE_PIPEWIRE) || defined(WEBRTC_USE_X11) static bool IsRunningUnderWayland(); #endif // defined(WEBRTC_USE_PIPEWIRE) || defined(WEBRTC_USE_X11) protected: // CroppingWindowCapturer needs to create raw capturers without wrappers, so // the following two functions are protected. // Creates a platform specific DesktopCapturer instance which targets to // capture windows. static std::unique_ptr CreateRawWindowCapturer( const DesktopCaptureOptions& options); // Creates a platform specific DesktopCapturer instance which targets to // capture screens. static std::unique_ptr CreateRawScreenCapturer( const DesktopCaptureOptions& options); }; } // namespace webrtc #endif // MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_