build: combine pipewire patches (#46129)
This commit is contained in:
parent
bf1d377e08
commit
bf64967b68
5 changed files with 101 additions and 110 deletions
|
@ -1,3 +1 @@
|
||||||
fix_fallback_to_x11_capturer_on_wayland.patch
|
fix_handle_pipewire_capturer_initialization_and_management.patch
|
||||||
fix_mark_pipewire_capturer_as_failed_after_session_is_closed.patch
|
|
||||||
fix_check_pipewire_init_before_creating_generic_capturer.patch
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Athul Iddya <athul@iddya.com>
|
|
||||||
Date: Tue, 12 Sep 2023 22:19:46 -0700
|
|
||||||
Subject: fix: check PipeWire init before creating generic capturer
|
|
||||||
|
|
||||||
Check if PipeWire can be initialized before creating generic capturer.
|
|
||||||
This harmonizes the conditions with the ones used in Linux
|
|
||||||
implementations of DesktopCapturer::CreateRawScreenCapturer and
|
|
||||||
DesktopCapturer::CreateRawWindowCapturer.
|
|
||||||
|
|
||||||
diff --git a/modules/desktop_capture/desktop_capturer.cc b/modules/desktop_capture/desktop_capturer.cc
|
|
||||||
index 7fd0fc31d81bf4d5eca5f8aa7106388ea4c518e4..51dde063a78be7aade1953fbee8bb2db71b72ce5 100644
|
|
||||||
--- a/modules/desktop_capture/desktop_capturer.cc
|
|
||||||
+++ b/modules/desktop_capture/desktop_capturer.cc
|
|
||||||
@@ -113,7 +113,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateGenericCapturer(
|
|
||||||
std::unique_ptr<DesktopCapturer> capturer;
|
|
||||||
|
|
||||||
#if defined(WEBRTC_USE_PIPEWIRE)
|
|
||||||
- if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
|
|
||||||
+ if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) {
|
|
||||||
capturer = std::make_unique<BaseCapturerPipeWire>(
|
|
||||||
options, CaptureType::kAnyScreenContent);
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: VerteDinde <keeleymhammond@gmail.com>
|
|
||||||
Date: Sun, 5 Mar 2023 21:04:37 -0800
|
|
||||||
Subject: fix: fallback to X11 capturer on Wayland
|
|
||||||
|
|
||||||
CL: https://webrtc-review.googlesource.com/c/src/+/279163
|
|
||||||
|
|
||||||
Desktop Capturer behaves inconsistently on Wayland. PipeWire does not
|
|
||||||
always successfully start; if it does not, we return a nullptr rather
|
|
||||||
than falling back on the X11 capturer, crashing the application.
|
|
||||||
|
|
||||||
If the X11 capturer is enabled, we should at minimum try to fallback
|
|
||||||
to X11 for desktop capturer. This patch re-enables that fallback,
|
|
||||||
which was previously default behavior.
|
|
||||||
|
|
||||||
This patch can be removed when 1) this fix is upstreamed, or 2) the
|
|
||||||
stability of PipeWire initialization is improved upstream.
|
|
||||||
|
|
||||||
Patch_Filename: fix_fallback_to_x11_desktop_capturer_wayland.patch
|
|
||||||
|
|
||||||
diff --git a/modules/desktop_capture/screen_capturer_linux.cc b/modules/desktop_capture/screen_capturer_linux.cc
|
|
||||||
index 44993837e8bbd84a11ec9d187349a95f83258910..cd9f8b0be6a19d057fe9150382fb72bc4032b343 100644
|
|
||||||
--- a/modules/desktop_capture/screen_capturer_linux.cc
|
|
||||||
+++ b/modules/desktop_capture/screen_capturer_linux.cc
|
|
||||||
@@ -34,11 +34,10 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
|
|
||||||
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
|
||||||
|
|
||||||
#if defined(WEBRTC_USE_X11)
|
|
||||||
- if (!DesktopCapturer::IsRunningUnderWayland())
|
|
||||||
- return ScreenCapturerX11::CreateRawScreenCapturer(options);
|
|
||||||
-#endif // defined(WEBRTC_USE_X11)
|
|
||||||
-
|
|
||||||
+ return ScreenCapturerX11::CreateRawScreenCapturer(options);
|
|
||||||
+#else
|
|
||||||
return nullptr;
|
|
||||||
+#endif // defined(WEBRTC_USE_X11)
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace webrtc
|
|
||||||
diff --git a/modules/desktop_capture/window_capturer_linux.cc b/modules/desktop_capture/window_capturer_linux.cc
|
|
||||||
index 4205bf9bc0eede48cdc39353c77ceb6e7529fd51..785dc01a1911fd027401b1461223668333e05558 100644
|
|
||||||
--- a/modules/desktop_capture/window_capturer_linux.cc
|
|
||||||
+++ b/modules/desktop_capture/window_capturer_linux.cc
|
|
||||||
@@ -34,11 +34,10 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
|
|
||||||
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
|
||||||
|
|
||||||
#if defined(WEBRTC_USE_X11)
|
|
||||||
- if (!DesktopCapturer::IsRunningUnderWayland())
|
|
||||||
- return WindowCapturerX11::CreateRawWindowCapturer(options);
|
|
||||||
-#endif // defined(WEBRTC_USE_X11)
|
|
||||||
-
|
|
||||||
+ return WindowCapturerX11::CreateRawWindowCapturer(options);
|
|
||||||
+#else
|
|
||||||
return nullptr;
|
|
||||||
+#endif // defined(WEBRTC_USE_X11)
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace webrtc
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Athul Iddya <athul@iddya.com>
|
||||||
|
Date: Tue, 12 Sep 2023 22:19:46 -0700
|
||||||
|
Subject: fix: Handle PipeWire capturer initialization and management
|
||||||
|
|
||||||
|
This patch handles several fixes related to PipeWire capturer initialization
|
||||||
|
and management.
|
||||||
|
|
||||||
|
1. Mark PipeWire capturer as failed after session is closed
|
||||||
|
|
||||||
|
After a PipeWire screencast session is successfully started, the
|
||||||
|
consumer is expected to keep calling CaptureFrame() from the
|
||||||
|
DesktopCapturer interface in a loop to pull frames. A PipeWire
|
||||||
|
screencast session can be closed by the server on user action. Once the
|
||||||
|
session is closed, there's no point in calling CaptureFrame() again as
|
||||||
|
the capture has to be restarted. Inform the caller of the failure by
|
||||||
|
returning Result::ERROR_PERMANENT on the next invocation of
|
||||||
|
CaptureFrame().
|
||||||
|
|
||||||
|
2. Check PipeWire init before creating generic capturer
|
||||||
|
|
||||||
|
Check if PipeWire can be initialized before creating generic capturer.
|
||||||
|
This harmonizes the conditions with the ones used in Linux
|
||||||
|
implementations of DesktopCapturer::CreateRawScreenCapturer and
|
||||||
|
DesktopCapturer::CreateRawWindowCapturer.
|
||||||
|
|
||||||
|
3. Establishes fallback to X11 capturer when PipeWire fails to start
|
||||||
|
|
||||||
|
CL: https://webrtc-review.googlesource.com/c/src/+/279163
|
||||||
|
|
||||||
|
Desktop Capturer behaves inconsistently on Wayland. PipeWire does not
|
||||||
|
always successfully start; if it does not, we return a nullptr rather
|
||||||
|
than falling back on the X11 capturer, crashing the application. If the
|
||||||
|
X11 capturer is enabled, we should at minimum try to fallback to X11
|
||||||
|
for desktop capturer. This change re-enables that fallback, which was
|
||||||
|
previously default behavior.
|
||||||
|
|
||||||
|
diff --git a/modules/desktop_capture/desktop_capturer.cc b/modules/desktop_capture/desktop_capturer.cc
|
||||||
|
index 7fd0fc31d81bf4d5eca5f8aa7106388ea4c518e4..51dde063a78be7aade1953fbee8bb2db71b72ce5 100644
|
||||||
|
--- a/modules/desktop_capture/desktop_capturer.cc
|
||||||
|
+++ b/modules/desktop_capture/desktop_capturer.cc
|
||||||
|
@@ -113,7 +113,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateGenericCapturer(
|
||||||
|
std::unique_ptr<DesktopCapturer> capturer;
|
||||||
|
|
||||||
|
#if defined(WEBRTC_USE_PIPEWIRE)
|
||||||
|
- if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
|
||||||
|
+ if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) {
|
||||||
|
capturer = std::make_unique<BaseCapturerPipeWire>(
|
||||||
|
options, CaptureType::kAnyScreenContent);
|
||||||
|
}
|
||||||
|
diff --git a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
||||||
|
index 81caa9bd2d97ec73120c07c17d7290b2c3c5d598..3ba5267bf5c7de420131b2c14fcadffd1f5b1326 100644
|
||||||
|
--- a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
||||||
|
+++ b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
||||||
|
@@ -111,6 +111,7 @@ void BaseCapturerPipeWire::OnScreenCastRequestResult(RequestResponse result,
|
||||||
|
void BaseCapturerPipeWire::OnScreenCastSessionClosed() {
|
||||||
|
if (!capturer_failed_) {
|
||||||
|
options_.screencast_stream()->StopScreenCastStream();
|
||||||
|
+ capturer_failed_ = true;
|
||||||
|
}
|
||||||
|
capturer_failed_ = true;
|
||||||
|
}
|
||||||
|
diff --git a/modules/desktop_capture/screen_capturer_linux.cc b/modules/desktop_capture/screen_capturer_linux.cc
|
||||||
|
index 44993837e8bbd84a11ec9d187349a95f83258910..cd9f8b0be6a19d057fe9150382fb72bc4032b343 100644
|
||||||
|
--- a/modules/desktop_capture/screen_capturer_linux.cc
|
||||||
|
+++ b/modules/desktop_capture/screen_capturer_linux.cc
|
||||||
|
@@ -34,11 +34,10 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
|
||||||
|
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
||||||
|
|
||||||
|
#if defined(WEBRTC_USE_X11)
|
||||||
|
- if (!DesktopCapturer::IsRunningUnderWayland())
|
||||||
|
- return ScreenCapturerX11::CreateRawScreenCapturer(options);
|
||||||
|
-#endif // defined(WEBRTC_USE_X11)
|
||||||
|
-
|
||||||
|
+ return ScreenCapturerX11::CreateRawScreenCapturer(options);
|
||||||
|
+#else
|
||||||
|
return nullptr;
|
||||||
|
+#endif // defined(WEBRTC_USE_X11)
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
|
diff --git a/modules/desktop_capture/window_capturer_linux.cc b/modules/desktop_capture/window_capturer_linux.cc
|
||||||
|
index 4205bf9bc0eede48cdc39353c77ceb6e7529fd51..785dc01a1911fd027401b1461223668333e05558 100644
|
||||||
|
--- a/modules/desktop_capture/window_capturer_linux.cc
|
||||||
|
+++ b/modules/desktop_capture/window_capturer_linux.cc
|
||||||
|
@@ -34,11 +34,10 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
|
||||||
|
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
||||||
|
|
||||||
|
#if defined(WEBRTC_USE_X11)
|
||||||
|
- if (!DesktopCapturer::IsRunningUnderWayland())
|
||||||
|
- return WindowCapturerX11::CreateRawWindowCapturer(options);
|
||||||
|
-#endif // defined(WEBRTC_USE_X11)
|
||||||
|
-
|
||||||
|
+ return WindowCapturerX11::CreateRawWindowCapturer(options);
|
||||||
|
+#else
|
||||||
|
return nullptr;
|
||||||
|
+#endif // defined(WEBRTC_USE_X11)
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
|
@ -1,26 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Athul Iddya <athul@iddya.com>
|
|
||||||
Date: Sat, 22 Jul 2023 11:11:01 -0700
|
|
||||||
Subject: fix: mark PipeWire capturer as failed after session is closed
|
|
||||||
|
|
||||||
After a PipeWire screencast session is successfully started, the
|
|
||||||
consumer is expected to keep calling CaptureFrame() from the
|
|
||||||
DesktopCapturer interface in a loop to pull frames. A PipeWire
|
|
||||||
screencast session can be closed by the server on user action. Once the
|
|
||||||
session is closed, there's no point in calling CaptureFrame() again as
|
|
||||||
the capture has to be restarted. Inform the caller of the failure by
|
|
||||||
returning Result::ERROR_PERMANENT on the next invocation of
|
|
||||||
CaptureFrame().
|
|
||||||
|
|
||||||
diff --git a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
|
||||||
index 81caa9bd2d97ec73120c07c17d7290b2c3c5d598..3ba5267bf5c7de420131b2c14fcadffd1f5b1326 100644
|
|
||||||
--- a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
|
||||||
+++ b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
|
|
||||||
@@ -111,6 +111,7 @@ void BaseCapturerPipeWire::OnScreenCastRequestResult(RequestResponse result,
|
|
||||||
void BaseCapturerPipeWire::OnScreenCastSessionClosed() {
|
|
||||||
if (!capturer_failed_) {
|
|
||||||
options_.screencast_stream()->StopScreenCastStream();
|
|
||||||
+ capturer_failed_ = true;
|
|
||||||
}
|
|
||||||
capturer_failed_ = true;
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue