Revert "wayland: Add a common interface for screencast and remote desktop portal"

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}
This commit is contained in:
Henrik Boström
2022-03-25 09:23:33 +00:00
committed by WebRTC LUCI CQ
parent 887754af75
commit e39daf4146
14 changed files with 19 additions and 166 deletions

View File

@ -332,7 +332,6 @@ rtc_library("desktop_capture_generic") {
"cropping_window_capturer.h",
"desktop_and_cursor_composer.cc",
"desktop_and_cursor_composer.h",
"desktop_capture_metadata.h",
"desktop_capture_metrics_helper.cc",
"desktop_capture_metrics_helper.h",
"desktop_capture_options.cc",
@ -571,7 +570,6 @@ rtc_library("desktop_capture_generic") {
"linux/wayland/mouse_cursor_monitor_pipewire.h",
"linux/wayland/scoped_glib.cc",
"linux/wayland/scoped_glib.h",
"linux/wayland/screen_capture_portal_interface.h",
"linux/wayland/screencast_portal.cc",
"linux/wayland/screencast_portal.h",
"linux/wayland/screencast_stream_utils.cc",
@ -580,7 +578,6 @@ rtc_library("desktop_capture_generic") {
"linux/wayland/shared_screencast_stream.h",
"linux/wayland/xdg_desktop_portal_utils.cc",
"linux/wayland/xdg_desktop_portal_utils.h",
"linux/wayland/xdg_session_details.h",
]
configs += [

View File

@ -203,12 +203,6 @@ bool DesktopAndCursorComposer::IsOccluded(const DesktopVector& pos) {
return desktop_capturer_->IsOccluded(pos);
}
#if defined(WEBRTC_USE_PIPEWIRE)
DesktopCaptureMetadata DesktopAndCursorComposer::GetMetadata() {
return desktop_capturer_->GetMetadata();
}
#endif // defined(WEBRTC_USE_PIPEWIRE)
void DesktopAndCursorComposer::OnCaptureResult(
DesktopCapturer::Result result,
std::unique_ptr<DesktopFrame> frame) {

View File

@ -12,9 +12,7 @@
#define MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
#include <memory>
#if defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_metadata.h"
#endif // defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_options.h"
#include "modules/desktop_capture/desktop_capture_types.h"
#include "modules/desktop_capture/desktop_capturer.h"
@ -61,9 +59,6 @@ class RTC_EXPORT DesktopAndCursorComposer
bool SelectSource(SourceId id) override;
bool FocusOnSelectedSource() override;
bool IsOccluded(const DesktopVector& pos) override;
#if defined(WEBRTC_USE_PIPEWIRE)
DesktopCaptureMetadata GetMetadata() override;
#endif // defined(WEBRTC_USE_PIPEWIRE)
// MouseCursorMonitor::Callback interface.
void OnMouseCursor(MouseCursor* cursor) override;

View File

@ -1,31 +0,0 @@
/*
* Copyright (c) 2022 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_CAPTURE_METADATA_H_
#define MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_METADATA_H_
#if defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/linux/wayland/xdg_session_details.h"
#endif
namespace webrtc {
// Container for the metadata associated with a desktop capturer.
struct DesktopCaptureMetadata {
#if defined(WEBRTC_USE_PIPEWIRE)
// Details about the XDG desktop session handle (used by wayland
// implementation in remoting)
xdg_portal::SessionDetails session_details;
#endif
};
} // namespace webrtc
#endif // MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_METADATA_H_

View File

@ -19,9 +19,6 @@
#include <type_traits>
#include <vector>
#if defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_metadata.h"
#endif // defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_types.h"
#include "modules/desktop_capture/desktop_frame.h"
#include "modules/desktop_capture/shared_memory.h"
@ -146,12 +143,6 @@ class RTC_EXPORT DesktopCapturer {
static bool IsRunningUnderWayland();
#endif // defined(WEBRTC_USE_PIPEWIRE) || defined(WEBRTC_USE_X11)
#if defined(WEBRTC_USE_PIPEWIRE)
// Populates implementation specific metadata into the passed in pointer.
// Classes can choose to override it or use the default no-op implementation.
virtual DesktopCaptureMetadata GetMetadata() { return {}; }
#endif // defined(WEBRTC_USE_PIPEWIRE)
protected:
// CroppingWindowCapturer needs to create raw capturers without wrappers, so
// the following two functions are protected.

View File

@ -186,12 +186,6 @@ bool DesktopCapturerDifferWrapper::IsOccluded(const DesktopVector& pos) {
return base_capturer_->IsOccluded(pos);
}
#if defined(WEBRTC_USE_PIPEWIRE)
DesktopCaptureMetadata DesktopCapturerDifferWrapper::GetMetadata() {
return base_capturer_->GetMetadata();
}
#endif // defined(WEBRTC_USE_PIPEWIRE)
void DesktopCapturerDifferWrapper::OnCaptureResult(
Result result,
std::unique_ptr<DesktopFrame> input_frame) {

View File

@ -12,9 +12,7 @@
#define MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_DIFFER_WRAPPER_H_
#include <memory>
#if defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_metadata.h"
#endif // defined(WEBRTC_USE_PIPEWIRE)
#include "modules/desktop_capture/desktop_capture_types.h"
#include "modules/desktop_capture/desktop_capturer.h"
#include "modules/desktop_capture/desktop_frame.h"
@ -54,9 +52,7 @@ class RTC_EXPORT DesktopCapturerDifferWrapper
bool SelectSource(SourceId id) override;
bool FocusOnSelectedSource() override;
bool IsOccluded(const DesktopVector& pos) override;
#if defined(WEBRTC_USE_PIPEWIRE)
DesktopCaptureMetadata GetMetadata() override;
#endif // defined(WEBRTC_USE_PIPEWIRE)
private:
// DesktopCapturer::Callback interface.
void OnCaptureResult(Result result,

View File

@ -21,22 +21,14 @@ namespace webrtc {
namespace {
using xdg_portal::RequestResponse;
using xdg_portal::ScreenCapturePortalInterface;
using xdg_portal::SessionDetails;
} // namespace
BaseCapturerPipeWire::BaseCapturerPipeWire(const DesktopCaptureOptions& options)
: BaseCapturerPipeWire(
options,
std::make_unique<ScreenCastPortal>(
ScreenCastPortal::CaptureSourceType::kAnyScreenContent,
this)) {}
BaseCapturerPipeWire::BaseCapturerPipeWire(
const DesktopCaptureOptions& options,
std::unique_ptr<ScreenCapturePortalInterface> portal)
: options_(options), portal_(std::move(portal)) {}
: options_(options) {
screencast_portal_ = std::make_unique<ScreenCastPortal>(
ScreenCastPortal::CaptureSourceType::kAnyScreenContent, this);
}
BaseCapturerPipeWire::~BaseCapturerPipeWire() {}
@ -64,7 +56,7 @@ void BaseCapturerPipeWire::Start(Callback* callback) {
callback_ = callback;
portal_->Start();
screencast_portal_->Start();
}
void BaseCapturerPipeWire::CaptureFrame() {
@ -105,8 +97,4 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
return true;
}
SessionDetails BaseCapturerPipeWire::GetSessionDetails() {
return portal_->GetSessionDetails();
}
} // namespace webrtc

View File

@ -13,21 +13,16 @@
#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(const DesktopCaptureOptions& options);
~BaseCapturerPipeWire() override;
BaseCapturerPipeWire(const BaseCapturerPipeWire&) = delete;
@ -45,13 +40,11 @@ class BaseCapturerPipeWire : public DesktopCapturer,
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_;
std::unique_ptr<ScreenCastPortal> screencast_portal_;
};
} // namespace webrtc

View File

@ -1,30 +0,0 @@
/*
* Copyright (c) 2022 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_SCREEN_CAPTURE_PORTAL_INTERFACE_H_
#define MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_SCREEN_CAPTURE_PORTAL_INTERFACE_H_
#include "modules/desktop_capture/linux/wayland/xdg_session_details.h"
namespace webrtc {
namespace xdg_portal {
// An interface for XDG desktop portals that can capture desktop/screen.
class ScreenCapturePortalInterface {
public:
virtual ~ScreenCapturePortalInterface() {}
virtual xdg_portal::SessionDetails GetSessionDetails() = 0;
virtual void Start() = 0;
};
} // namespace xdg_portal
} // namespace webrtc
#endif // MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_SCREEN_CAPTURE_PORTAL_INTERFACE_H_

View File

@ -112,10 +112,6 @@ void ScreenCastPortal::Start() {
cancellable_, this);
}
xdg_portal::SessionDetails ScreenCastPortal::GetSessionDetails() {
return {}; // No-op
}
void ScreenCastPortal::PortalFailed(RequestResponse result) {
notifier_->OnScreenCastRequestResult(result, pw_stream_node_id_, pw_fd_);
}

View File

@ -15,13 +15,11 @@
#include <string>
#include "modules/desktop_capture/linux/wayland/screen_capture_portal_interface.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 ScreenCastPortal : public xdg_portal::ScreenCapturePortalInterface {
class ScreenCastPortal {
public:
using ProxyRequestResponseHandler = void (*)(GObject* object,
GAsyncResult* result,
@ -88,8 +86,7 @@ class ScreenCastPortal : public xdg_portal::ScreenCapturePortalInterface {
// The observer will return whether the communication with xdg-desktop-portal
// was successful and only then you will be able to get all the required
// information in order to continue working with PipeWire.
void Start() override;
xdg_portal::SessionDetails GetSessionDetails() override;
void Start();
// Method to notify the reason for failure of a portal request.
void PortalFailed(xdg_portal::RequestResponse result);

View File

@ -18,7 +18,6 @@
#include <vector>
#include "modules/desktop_capture/linux/wayland/scoped_glib.h"
#include "modules/desktop_capture/linux/wayland/xdg_session_details.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
@ -33,6 +32,13 @@ constexpr char kSessionInterfaceName[] = "org.freedesktop.portal.Session";
constexpr char kRequestInterfaceName[] = "org.freedesktop.portal.Request";
constexpr char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast";
struct SessionDetails {
GDBusProxy* proxy;
GCancellable* cancellable;
std::string session_handle;
uint32_t pipewire_stream_node_id;
};
using ProxyRequestCallback = void (*)(GObject*, GAsyncResult*, gpointer);
using SessionRequestCallback = void (*)(GDBusProxy*, GAsyncResult*, gpointer);
using SessionRequestResponseSignalHandler = void (*)(GDBusConnection*,

View File

@ -1,33 +0,0 @@
/*
* Copyright 2022 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_XDG_SESSION_DETAILS_H_
#define MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_XDG_SESSION_DETAILS_H_
#include <gio/gio.h>
#include <string>
namespace webrtc {
namespace xdg_portal {
// Details of the session associated with XDG desktop portal session. Portal API
// calls can be invoked by utilizing the information here.
struct SessionDetails {
GDBusProxy* proxy = nullptr;
GCancellable* cancellable = nullptr;
std::string session_handle;
uint32_t pipewire_stream_node_id = 0;
};
} // namespace xdg_portal
} // namespace webrtc
#endif // MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_XDG_SESSION_DETAILS_H_