123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Athul Iddya <[email protected]>
- Date: Fri, 14 Jul 2023 08:03:37 -0700
- Subject: fix: use delegated generic capturer when available
- When the generic capturer is used to fetch capture sources, the returned
- ID will be arbitrarily prefixed with "screen" or "window" regardless of
- the source type. If the window capturer is used to stream video when the
- source was a screen or vice-versa, the stream fails to restart in
- delegated capturers like PipeWire.
- To fix this, use the generic capturer to fetch the media stream if it's
- delegated and available. This does not cause any issues if the original
- capturer was window or screen-specific, as the IDs remain valid for
- generic capturer as well.
- diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
- index 60eabf1a69089049d4cddb81f87efca4f096a3b6..6618477648b7148ba66f5bb695be8eb6da045849 100644
- --- a/content/browser/media/capture/desktop_capture_device.cc
- +++ b/content/browser/media/capture/desktop_capture_device.cc
- @@ -811,8 +811,14 @@ std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
-
- switch (source.type) {
- case DesktopMediaID::TYPE_SCREEN: {
- - std::unique_ptr<webrtc::DesktopCapturer> screen_capturer(
- - webrtc::DesktopCapturer::CreateScreenCapturer(options));
- + std::unique_ptr<webrtc::DesktopCapturer> screen_capturer;
- + if (auto generic_capturer =
- + webrtc::DesktopCapturer::CreateGenericCapturer(options);
- + generic_capturer && generic_capturer->GetDelegatedSourceListController()) {
- + screen_capturer = std::move(generic_capturer);
- + } else {
- + screen_capturer = webrtc::DesktopCapturer::CreateScreenCapturer(options);
- + }
- if (screen_capturer && screen_capturer->SelectSource(source.id)) {
- capturer = std::make_unique<webrtc::DesktopAndCursorComposer>(
- std::move(screen_capturer), options);
- @@ -825,8 +831,14 @@ std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
- }
-
- case DesktopMediaID::TYPE_WINDOW: {
- - std::unique_ptr<webrtc::DesktopCapturer> window_capturer =
- - webrtc::DesktopCapturer::CreateWindowCapturer(options);
- + std::unique_ptr<webrtc::DesktopCapturer> window_capturer;
- + if (auto generic_capturer =
- + webrtc::DesktopCapturer::CreateGenericCapturer(options);
- + generic_capturer && generic_capturer->GetDelegatedSourceListController()) {
- + window_capturer = std::move(generic_capturer);
- + } else {
- + window_capturer = webrtc::DesktopCapturer::CreateWindowCapturer(options);
- + }
- if (window_capturer && window_capturer->SelectSource(source.id)) {
- capturer = std::make_unique<webrtc::DesktopAndCursorComposer>(
- std::move(window_capturer), options);
|