CI / Build + Clippy + Test (push) Failing after 1h10m8s
CI / Security audit (RUSTSEC) (push) Failing after 1m31s
Oracle P2 follow-up. The clippy --fix autofixes earlier in this branch
silently introduced dependencies on APIs newer than the README's
1.70+ claim:
- u32::is_multiple_of (stable 1.87)
- Option::is_none_or (stable 1.82)
clippy::incompatible_msrv flagged the mismatch once rust-version was
pinned. Bumping the floor to 1.87 is the honest fix — the codebase
genuinely depends on 1.87 features now, and 1.87 has been stable
long enough (current stable is 1.96) that desktop CLI users on stable
Rust already have it.
- Cargo.toml: rust-version '1.70' -> '1.87'. Comment lists the specific
APIs that drove the bump and notes that further bumps need to be
validated against clippy::incompatible_msrv.
- README.md: Prerequisites line updated to 1.87+ with a brief why.
- src/state_portal.rs: added the AsRawFd rustc-quirk comment that was
already in avhw.rs (rustc emits a false 'unused_imports' warning;
removing it produces E0599). Same known quirk, same documentation
pattern.
- src/transform.rs: fixed empty_line_after_doc_comments warning by
converting the leading // doc-style comment to a //! module-level
doc comment (which is what it should have been when I rewrote the
file in commit 145b5d3).
All 79 unit tests + 3 integration tests pass. clippy: 0 errors,
0 incompatible_msrv warnings, 0 empty_line_after_doc_comments warnings.
Remaining warnings are: 1 AsRawFd rustc false-positive (documented),
5 unnecessary_cast FFI false-positives (rustc quirk on pointer casts),
and 8 dead-code items that need product decisions.
84 lines
3.2 KiB
Markdown
84 lines
3.2 KiB
Markdown
# wl-webrtc
|
|
|
|
Wayland screen capture and encoding tool.
|
|
|
|
## Prerequisites
|
|
|
|
- **Rust toolchain** (1.87+; MSRV pinned to match `u32::is_multiple_of` / `Option::is_none_or` usage): `rustup default stable`
|
|
- **FFmpeg 6.0+** dev libraries with VAAPI support:
|
|
- Arch: `pacman -S ffmpeg`
|
|
- Ubuntu/Debian: `apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libva-dev`
|
|
- Fedora: `dnf install ffmpeg-devel libva-devel`
|
|
- **Wayland** dev libraries:
|
|
- Arch: `pacman -S wayland-protocols`
|
|
- Ubuntu/Debian: `apt install libwayland-dev wayland-protocols`
|
|
- Fedora: `dnf install wayland-devel wayland-protocols-devel`
|
|
- **DRM** dev libraries:
|
|
- Arch: `pacman -S libdrm`
|
|
- Ubuntu/Debian: `apt install libdrm-dev`
|
|
- Fedora: `dnf install libdrm-devel`
|
|
|
|
## Build
|
|
|
|
```bash
|
|
cargo build --release
|
|
```
|
|
|
|
## Run
|
|
|
|
```bash
|
|
# Basic capture to file
|
|
wl-webrtc --output output.mp4
|
|
|
|
# With custom FPS and bitrate
|
|
wl-webrtc --output output.mp4 --fps 60 --bitrate 8000000
|
|
|
|
# Specify DRM device for hardware encoding
|
|
wl-webrtc --output output.mp4 --drm-device /dev/dri/renderD128
|
|
|
|
# Verbose mode
|
|
wl-webrtc --output output.mp4 -v
|
|
|
|
# WebRTC streaming mode (HTTP signaling server)
|
|
wl-webrtc --port 8080 -v
|
|
|
|
# Force a fresh portal authorization dialog (ignore saved restore token)
|
|
wl-webrtc --output output.mp4 --no-persist
|
|
|
|
# Pin the capture backend instead of auto-detecting
|
|
wl-webrtc --output output.mp4 --backend portal # or: --backend screencopy
|
|
```
|
|
|
|
## CLI Arguments
|
|
|
|
> `src/args.rs` is the authoritative source. Run `wl-webrtc --help` for the live list.
|
|
|
|
| Argument | Default | Description |
|
|
|---|---|---|
|
|
| `-o`, `--output` | (optional) | Output file path (e.g. output.mp4). Optional when using `--port` for WebRTC mode. |
|
|
| `--output-name` | auto | Wayland output name to capture |
|
|
| `--fps` | 30 | Target frames per second |
|
|
| `--codec` | h264 | Video codec (h264 only for MVP) |
|
|
| `--hw-accel` | vaapi | Hardware acceleration method |
|
|
| `--drm-device` | auto | DRM render device path |
|
|
| `--bitrate` | auto | Target bitrate in bps |
|
|
| `--max-bitrate` | 8000000 | Max bitrate cap for WebRTC mode (caps BWE escalation; no effect in MP4 mode) |
|
|
| `--gop-size` | auto | Group of Pictures size |
|
|
| `-v`, `--verbose` | false | Enable verbose logging |
|
|
| `--backend` | auto | Capture backend: `screencopy` (wlroots) or `portal` (KWin/KDE). Auto-detected if omitted. |
|
|
| `--port` | 0 | WebRTC HTTP signaling server port. `0` keeps MP4 file output mode. |
|
|
| `--no-persist` | false | Force re-authorization (ignore saved portal restore token) |
|
|
| `--stats` | false | Print per-second pipeline statistics for stutter diagnosis |
|
|
|
|
## Capture backends
|
|
|
|
The tool supports two Wayland capture backends, auto-detected by default:
|
|
|
|
- **wlr-screencopy** (preferred when `zwlr_screencopy_manager_v1` is advertised):
|
|
works on wlroots-based compositors (Sway, Hyprland, etc.).
|
|
- **XDG Portal / PipeWire** (fallback when D-Bus ScreenCast is available):
|
|
works on KWin/KDE and any compositor that implements the XDG Desktop Portal
|
|
screen-cast protocol. The first run shows an authorization dialog; a restore
|
|
token is cached under `wl-webrtc/portal-restore-token` so subsequent runs
|
|
don't re-prompt (use `--no-persist` to force a fresh authorization).
|