diff --git a/patches/webrtc/.patches b/patches/webrtc/.patches index 63f7e05ecd6b..1dd0c816a674 100644 --- a/patches/webrtc/.patches +++ b/patches/webrtc/.patches @@ -1,3 +1 @@ -fix_fallback_to_x11_capturer_on_wayland.patch -fix_mark_pipewire_capturer_as_failed_after_session_is_closed.patch -fix_check_pipewire_init_before_creating_generic_capturer.patch +fix_handle_pipewire_capturer_initialization_and_management.patch diff --git a/patches/webrtc/fix_check_pipewire_init_before_creating_generic_capturer.patch b/patches/webrtc/fix_check_pipewire_init_before_creating_generic_capturer.patch deleted file mode 100644 index be76ebeb3267..000000000000 --- a/patches/webrtc/fix_check_pipewire_init_before_creating_generic_capturer.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Athul Iddya -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::CreateGenericCapturer( - std::unique_ptr capturer; - - #if defined(WEBRTC_USE_PIPEWIRE) -- if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { -+ if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) { - capturer = std::make_unique( - options, CaptureType::kAnyScreenContent); - } diff --git a/patches/webrtc/fix_fallback_to_x11_capturer_on_wayland.patch b/patches/webrtc/fix_fallback_to_x11_capturer_on_wayland.patch deleted file mode 100644 index 7db9b2393ad0..000000000000 --- a/patches/webrtc/fix_fallback_to_x11_capturer_on_wayland.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: VerteDinde -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::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::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 diff --git a/patches/webrtc/fix_handle_pipewire_capturer_initialization_and_management.patch b/patches/webrtc/fix_handle_pipewire_capturer_initialization_and_management.patch new file mode 100644 index 000000000000..4b18538c8dc9 --- /dev/null +++ b/patches/webrtc/fix_handle_pipewire_capturer_initialization_and_management.patch @@ -0,0 +1,100 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Athul Iddya +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::CreateGenericCapturer( + std::unique_ptr capturer; + + #if defined(WEBRTC_USE_PIPEWIRE) +- if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { ++ if (options.allow_pipewire() && BaseCapturerPipeWire::IsSupported()) { + capturer = std::make_unique( + 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::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::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 diff --git a/patches/webrtc/fix_mark_pipewire_capturer_as_failed_after_session_is_closed.patch b/patches/webrtc/fix_mark_pipewire_capturer_as_failed_after_session_is_closed.patch deleted file mode 100644 index 336b687a0d7e..000000000000 --- a/patches/webrtc/fix_mark_pipewire_capturer_as_failed_after_session_is_closed.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Athul Iddya -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; - }