new workspace
This commit is contained in:
78
wlx-capture/README.md
Normal file
78
wlx-capture/README.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# wlx-capture
|
||||
|
||||
This aims to be an all-in-one Linux desktop capture solution.
|
||||
|
||||
I'm primarily using this for various XR projects.
|
||||
|
||||
Supported capture methods:
|
||||
- Pipewire (MemFd+MemPtr+DmaBuf)
|
||||
- Wlr-Dmabuf (Sway, Hyprland, River etc)
|
||||
- XSHM
|
||||
|
||||
# Early Development
|
||||
|
||||
This project is in a highly experimental state. If you want to talk about this project, find me on:
|
||||
|
||||
- Discord: https://discord.gg/gHwJ2vwSWV
|
||||
- Matrix Space: `#linux-vr-adventures:matrix.org`
|
||||
|
||||
# Usage
|
||||
|
||||
### Pipewire Setup
|
||||
```rust
|
||||
let Ok(node_id) = pipewire_select_screen(None, true, true, true).await else {
|
||||
return;
|
||||
};
|
||||
let capture = PipewireCapture::new(
|
||||
"wlx-capture", // name of stream
|
||||
node_id,
|
||||
60, // fps to give to pipewire, no effect as of writing
|
||||
);
|
||||
```
|
||||
|
||||
### Wlr-Dmabuf Setup
|
||||
```rust
|
||||
let wl = WlxClient::new();
|
||||
|
||||
// select desired screen
|
||||
let output_id = wl.outputs.keys().first().unwrap();
|
||||
|
||||
let mut capture = WlrDmabufCapture::new(wl, *output_id).unwrap();
|
||||
```
|
||||
|
||||
|
||||
### XSHM Setup
|
||||
```rust
|
||||
let monitors = XshmCapture::get_monitors();
|
||||
let mut capture = XshmCapture::new(monitors[0]).unwrap();
|
||||
```
|
||||
|
||||
|
||||
### Receiving Frames
|
||||
```rust
|
||||
let frame_rx = capture.init();
|
||||
capture.request_new_frame();
|
||||
loop {
|
||||
if let Ok(frame) = frame_rx.try_recv() {
|
||||
match frame {
|
||||
WlxFrame::DmaBuf(dmabuf_frame) => {
|
||||
// vulkano: https://github.com/galister/wlx-overlay-s/blob/6ee0cb4fd1bd099a0f22171656f87f85e3f86abd/src/graphics.rs#L740
|
||||
// egl: https://github.com/galister/wlx-overlay-x/blob/04f5e90cf8248705010beaf35aed3cf22f0e62c1/src/desktop/frame.rs#L255
|
||||
}
|
||||
WlxFrame::MemFd(memfd_frame) => {
|
||||
// egl: https://github.com/galister/wlx-overlay-x/blob/04f5e90cf8248705010beaf35aed3cf22f0e62c1/src/desktop/frame.rs#L207
|
||||
}
|
||||
WlxFrame::MemPtr(memptr_frame) => {
|
||||
// egl: https://github.com/galister/wlx-overlay-x/blob/04f5e90cf8248705010beaf35aed3cf22f0e62c1/src/desktop/frame.rs#L185
|
||||
}
|
||||
}
|
||||
capture.request_new_frame();
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Notes:
|
||||
- `PipewireCapture` will produce frames on its own and doesn't require `request_new_frame`.
|
||||
- You may call `request_new_frame` at any time after `init` without worrying if a frame capture is already in progress.
|
||||
- Calling `request_new_frame` when a frame is not ready yet will return and not trigger another frame capture.
|
||||
Reference in New Issue
Block a user