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: I0dbd154eb16d4149f967c4a818eea51e7e6eb9a9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/257000 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Alexander Cooper <alcooper@chromium.org> Commit-Queue: Salman Malik <salmanmalik@google.com> Cr-Commit-Position: refs/heads/main@{#36399}
60 lines
2.3 KiB
C++
60 lines
2.3 KiB
C++
/*
|
|
* Copyright 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_LINUX_WAYLAND_BASE_CAPTURER_PIPEWIRE_H_
|
|
#define MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_BASE_CAPTURER_PIPEWIRE_H_
|
|
|
|
#include "modules/desktop_capture/desktop_capture_options.h"
|
|
#include "modules/desktop_capture/desktop_capturer.h"
|
|
#include "modules/desktop_capture/linux/wayland/screen_capture_portal_interface.h"
|
|
#include "modules/desktop_capture/linux/wayland/screencast_portal.h"
|
|
#include "modules/desktop_capture/linux/wayland/shared_screencast_stream.h"
|
|
#include "modules/desktop_capture/linux/wayland/xdg_desktop_portal_utils.h"
|
|
#include "modules/desktop_capture/linux/wayland/xdg_session_details.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class BaseCapturerPipeWire : public DesktopCapturer,
|
|
public ScreenCastPortal::PortalNotifier {
|
|
public:
|
|
explicit BaseCapturerPipeWire(const DesktopCaptureOptions& options);
|
|
BaseCapturerPipeWire(
|
|
const DesktopCaptureOptions& options,
|
|
std::unique_ptr<xdg_portal::ScreenCapturePortalInterface> portal);
|
|
~BaseCapturerPipeWire() override;
|
|
|
|
BaseCapturerPipeWire(const BaseCapturerPipeWire&) = delete;
|
|
BaseCapturerPipeWire& operator=(const BaseCapturerPipeWire&) = delete;
|
|
|
|
// DesktopCapturer interface.
|
|
void Start(Callback* delegate) override;
|
|
void CaptureFrame() override;
|
|
bool GetSourceList(SourceList* sources) override;
|
|
bool SelectSource(SourceId id) override;
|
|
|
|
// ScreenCastPortal::PortalNotifier interface.
|
|
void OnScreenCastRequestResult(xdg_portal::RequestResponse result,
|
|
uint32_t stream_node_id,
|
|
int fd) override;
|
|
void OnScreenCastSessionClosed() override;
|
|
|
|
xdg_portal::SessionDetails GetSessionDetails();
|
|
|
|
private:
|
|
DesktopCaptureOptions options_ = {};
|
|
Callback* callback_ = nullptr;
|
|
bool capturer_failed_ = false;
|
|
std::unique_ptr<xdg_portal::ScreenCapturePortalInterface> portal_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_BASE_CAPTURER_PIPEWIRE_H_
|