This reverts commit e1223747c27e22c4c4c3006af10d58aec9718b28. Reason for revert: Breaks WebRTC roll into Chromium. E.g: https://ci.chromium.org/ui/p/chromium/builders/try/cast_shell_linux/1166014/overview Original change's description: > wayland: Add a common interface for screencast and remote desktop portal > > Change adapts the `base_capturer_pipewire` so that a portal can be > injected in the capturer. This allows the remoting to inject its > own portal for the purpose of capturing desktop stream as long > as the injected portal provides implementation of the new interface > that is added as part of this change. > > Additionally, a method has been exposed on the capturer to get > details about the portal session so that the remoting > implementation can use the same underlying session for controlling > inputs on the remote host. > > Finally, desktop capturer interface is extended with a generic > method `GetMetadata` that is used to retrieve session related > information by CRD and relay it over to its input injector. Clients > provide override for the method and it eventually invokes the > underlying `GetSessionDetails` method on the portal instance. > > Bug: chromium:1291247 > Change-Id: I81b7ce3b949d8be2e24e2d303d5fbc76a849209c > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256400 > Reviewed-by: Alexander Cooper <alcooper@chromium.org> > Commit-Queue: Salman Malik <salmanmalik@google.com> > Cr-Commit-Position: refs/heads/main@{#36323} Bug: chromium:1291247 Change-Id: I73fbb1b9a103d61fd8d7f04bb8452b3e29da9025 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256801 Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com> Owners-Override: Henrik Boström <hbos@webrtc.org> Commit-Queue: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36331}
164 lines
5.9 KiB
C++
164 lines
5.9 KiB
C++
/*
|
|
* 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 <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <type_traits>
|
|
#include <vector>
|
|
|
|
#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<DesktopFrame> frame) = 0;
|
|
|
|
protected:
|
|
virtual ~Callback() {}
|
|
};
|
|
|
|
#if defined(CHROMEOS)
|
|
typedef int64_t SourceId;
|
|
#else
|
|
typedef intptr_t SourceId;
|
|
#endif
|
|
|
|
static_assert(std::is_same<SourceId, ScreenId>::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<Source> 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<SharedMemoryFactory> 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<DesktopCapturer> CreateWindowCapturer(
|
|
const DesktopCaptureOptions& options);
|
|
|
|
// Creates a DesktopCapturer instance which targets to capture screens.
|
|
static std::unique_ptr<DesktopCapturer> 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<DesktopCapturer> CreateRawWindowCapturer(
|
|
const DesktopCaptureOptions& options);
|
|
|
|
// Creates a platform specific DesktopCapturer instance which targets to
|
|
// capture screens.
|
|
static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer(
|
|
const DesktopCaptureOptions& options);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
|