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 b0c4efdd8a6401e09520bdfa96221e5addcfd829..f5b7447938f70dd4623a60fa6a856775b627f3d6 100644
  16. --- a/content/browser/media/capture/desktop_capture_device.cc
  17. +++ b/content/browser/media/capture/desktop_capture_device.cc
  18. @@ -794,8 +794,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. @@ -814,8 +820,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>(