fix_use_delegated_generic_capturer_when_available.patch 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Athul Iddya <[email protected]>
  3. Date: Fri, 14 Jul 2023 08:03:37 -0700
  4. Subject: fix: use delegated generic capturer when available
  5. When the generic capturer is used to fetch capture sources, the returned
  6. ID will be arbitrarily prefixed with "screen" or "window" regardless of
  7. the source type. If the window capturer is used to stream video when the
  8. source was a screen or vice-versa, the stream fails to restart in
  9. delegated capturers like PipeWire.
  10. To fix this, use the generic capturer to fetch the media stream if it's
  11. delegated and available. This does not cause any issues if the original
  12. capturer was window or screen-specific, as the IDs remain valid for
  13. generic capturer as well.
  14. diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
  15. index 162de4cdcb00386943272c15aa2e809511d851ad..6e28dcfbc6164caa92938980f92a718e45c976c1 100644
  16. --- a/content/browser/media/capture/desktop_capture_device.cc
  17. +++ b/content/browser/media/capture/desktop_capture_device.cc
  18. @@ -822,8 +822,14 @@ std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
  19. DesktopCapturerLacros::CaptureType::kScreen,
  20. webrtc::DesktopCaptureOptions());
  21. #else
  22. - std::unique_ptr<webrtc::DesktopCapturer> screen_capturer(
  23. - webrtc::DesktopCapturer::CreateScreenCapturer(options));
  24. + std::unique_ptr<webrtc::DesktopCapturer> screen_capturer;
  25. + if (auto generic_capturer =
  26. + webrtc::DesktopCapturer::CreateGenericCapturer(options);
  27. + generic_capturer && generic_capturer->GetDelegatedSourceListController()) {
  28. + screen_capturer = std::move(generic_capturer);
  29. + } else {
  30. + screen_capturer = webrtc::DesktopCapturer::CreateScreenCapturer(options);
  31. + }
  32. #endif
  33. if (screen_capturer && screen_capturer->SelectSource(source.id)) {
  34. capturer = std::make_unique<webrtc::DesktopAndCursorComposer>(
  35. @@ -842,8 +848,14 @@ std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
  36. new DesktopCapturerLacros(DesktopCapturerLacros::CaptureType::kWindow,
  37. webrtc::DesktopCaptureOptions()));
  38. #else
  39. - std::unique_ptr<webrtc::DesktopCapturer> window_capturer =
  40. - webrtc::DesktopCapturer::CreateWindowCapturer(options);
  41. + std::unique_ptr<webrtc::DesktopCapturer> window_capturer;
  42. + if (auto generic_capturer =
  43. + webrtc::DesktopCapturer::CreateGenericCapturer(options);
  44. + generic_capturer && generic_capturer->GetDelegatedSourceListController()) {
  45. + window_capturer = std::move(generic_capturer);
  46. + } else {
  47. + window_capturer = webrtc::DesktopCapturer::CreateWindowCapturer(options);
  48. + }
  49. #endif
  50. if (window_capturer && window_capturer->SelectSource(source.id)) {
  51. capturer = std::make_unique<webrtc::DesktopAndCursorComposer>(