-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Use libwebrtc's DesktopCapturer for screen capture #42670
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
0c5daae to
b078823
Compare
b078823 to
0e67b6b
Compare
|
Nice! I'm very excited about fixing Wayland screen-sharing. We'd definitely need the webrtc build caching stuff to merge this though... thanks for fighting with that. Also looks like you removed the screen selector; is there an easy path to bring that back through webRTC's stuff? |
I split off the required build changes to a trivially small PR so it's easy for upstream to review that quickly: livekit/rust-sdks#784 (Edit: that has been merged, waiting on upstream to tag a new release)
Yeah, that took several weeks of yak shaving before I could actually work on Zed. 🪒 My CPU is not super fast (Intel Core i7 8550U) so there was lots of waiting involved.
I have not removed that, though the existing GUI code will need some work because applications can't have their own UI for that on Wayland. The XDG Desktop Portal doesn't expose the available screens/windows to applications; libwebrtc returns a single dummy CaptureSource with an empty string for a title. When DesktopCapturer::start_capture is called, the XDG Desktop Portal presents its GUI for the user to choose the screen (and/or window if enabled). |
4fe9304 to
1874bfa
Compare
|
I tested this on a call with my friend @NOTtheMessiah and he was able to see me sharing my screen from Wayland! 🎉 |
0a1b90c to
7fbf32f
Compare
54f4681 to
35b2a89
Compare
|
CI builds are working now except for Nix. The livekit-libwebrtc Nix package needs to be updated to include the changes made to the build of upstream's prebuilt library: livekit/rust-sdks#784 and livekit/rust-sdks#787 |
35b2a89 to
3bbfde2
Compare
| children.push( | ||
| SplitButton::new( | ||
| trigger.render(window, cx), | ||
| self.render_screen_list().into_any_element(), | ||
| ) | ||
| .style(SplitButtonStyle::Transparent) | ||
| .into_any_element(), | ||
| ); | ||
| match room.available_screens().len() { | ||
| 0 => (), | ||
| 1 => children.push(trigger.into_any_element()), | ||
| 2.. => children.push( | ||
| SplitButton::new( | ||
| trigger.render(window, cx), | ||
| self.render_screen_list().into_any_element(), | ||
| ) | ||
| .style(SplitButtonStyle::Transparent) | ||
| .into_any_element(), | ||
| ), | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed the title bar to not show the menu for screen selection when there is only one screen. This avoids a confusing situation on Wayland because libwebrtc only returns a single CaptureSource with an empty string for a title, which looked like this:
Applications can't choose the screen to share on Wayland. Instead, the XDG Desktop Portal presents a GUI for the user to select the screen without the application knowing which screen was picked.
The list of available screens is refreshed when joining a call, so if a screen is added while Zed is running, it can be shared by leaving and rejoining the call without having to restart Zed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The list of available screens is refreshed when joining a call, so if a screen is added while Zed is running, it can be shared by leaving and rejoining the call without having to restart Zed.
I have improved this to refresh the list of screens when sharing and unsharing a screen. This way, if a screen is plugged in during a call, sharing it doesn't even require leaving the call.
|
@mikayla-maki @ConradIrwin Could we test this on a call with you on macOS or Windows? I've invited you to a #libwebrtc-screenshare channel I created. Alternatively, you could invite me to one of Zed's channels and give me permission to screenshare there. |
80772a2 to
bf05695
Compare
|
@Be-ing great! Happy to help out, are you able to book time here: https://cal.com/conradirwin/pairing? then we can meet up and test things out. I also tried to amplify your work with the people we know at Livekit, so I'm hoping we can make progress on the merging front too. |
I booked for 1 PM US Central time this Friday.
Much appreciated! They recently did 2 thorough reviews of livekit/rust-sdks#725 and all that's left there is fixing the Android builds (not relevant for Zed, but Livekit needs that to release). |
3e7ca46 to
3e96af3
Compare
in buildInputs
3e96af3 to
75e7b0b
Compare
This adds support for screen sharing on Wayland (fixes zed-industries#28754). libwebrtc replaces scap, which aims to be cross platform but was only used on Windows and X11. The X11 support relied on an out-of-tree branch on which the original author closed their own pull request (CapSoftware/scap#124). This also replaces Zed's platform-specific code on macOS. Switching to a single cross platform library simplifies the code by removing the need for Zed to have its own traits for cross platform abstraction.
75e7b0b to
4d038c9
Compare
This adds support for screen sharing on Wayland (fixes #28754). I am not able to test on Windows and macOS, so I will need help testing those.
libwebrtc replaces scap, which aims to be cross platform but was only used on Windows and X11. The X11 support relied on an out-of-tree branch on which the original author closed their own pull request (CapSoftware/scap#124). This also replaces Zed's platform-specific code on macOS. Switching to a single cross platform library simplifies the code by removing the need for Zed to have its own traits for cross platform abstraction.
This uses my branch of the Livekit Rust SDK. This branch merges several pull requests I have awaiting review upstream:
Currently, the webrtc-sys crate from Livekit downloads a prebuilt static libwebrtc C++ library (which is a nonstarter for Linux distro packagers). This branch requires changes to how the C++ library is built. Because those changes in livekit/rust-sdks#725 have not yet been merged upstream, you must build libwebrtc from source to build this branch on Linux. My Livekit branch will build libwebrtc from source during the Cargo build if you set theLK_LIBWEBRTC_SOURCEenvironment variable to the absolute path of an archive of the libwebrtc source code. In my Livekit branch, there is a script to generate this source code archive, which you can do by running:git clone https://github.com/Be-ing/rust-sdks.git -b zed cd rust-sdks/webrtc-sys/libwebrtc/ ./generate-source-archive.shThis script takes a long time to run because libwebrtc is developed as part of Chromium. Thus, it requires downloading about 9 GB of junk that isn't needed for libwebrtc. Thegenerate-source-archive.shscript removes a bunch of that junk to strip it down to a 125 MB .tar.xz archive, which I hope will be published upstream by Livekit when my PRs are reviewed and merged.Release Notes:
TODO: