6e68300d05
Ship systemd/screencast-receiver.service, a template the install script substitutes (binary path, run user) and enables so the receiver starts at boot after the network and avahi-daemon, with restart-on-failure and a raised start limit for slow-booting boards. SIGTERM gives the graceful shutdown that withdraws the mDNS announcement — systemctl stop never triggers the stale-record trap that kill -9 does. Headless consoles render via KMSDRM (the script adds the run user to video/render/input); desktop autologin sessions uncomment two documented Environment lines. The install script gains SC_RECEIVER_SERVICE=0 to opt out. Validated: systemd-analyze verify on the substituted unit (only the expected missing /usr/local/bin path on this dev machine), and a live lifecycle test as a user unit: the service-managed receiver announced itself (--discover found it), systemctl stop produced a clean exit (Result=success, no restart) and the mDNS announcement was withdrawn immediately.
74 lines
2.2 KiB
Markdown
74 lines
2.2 KiB
Markdown
# screen_cast
|
|
|
|
A native Linux peer-to-peer screencast application.
|
|
|
|
- **Send** your desktop or a window to another Linux machine.
|
|
- **Receive** a stream and render it in a window.
|
|
- Discover receivers on the LAN via **mDNS/Avahi**; negotiate sessions with
|
|
**JSON signaling**; stream **H.264 over RTP/UDP**.
|
|
|
|
Built with **C++20**, **Meson**, **PipeWire**, **FFmpeg**, and **SDL3**.
|
|
|
|
## Quick start
|
|
|
|
Requirements:
|
|
|
|
- C++20 compiler with `<format>` (GCC 13+, Clang 18+)
|
|
- Meson >= 0.63, Ninja
|
|
- FFmpeg development packages (`libavcodec`, `libavutil`, `libswscale`)
|
|
- SDL3 development package (`sdl3`)
|
|
- nlohmann JSON (`nlohmann_json`) and Avahi client (`avahi-client`)
|
|
- For the sender only: PipeWire dev (`libpipewire-0.3`) and libportal
|
|
|
|
Build and run tests:
|
|
|
|
```sh
|
|
meson setup build
|
|
meson compile -C build
|
|
meson test -C build --print-errorlogs
|
|
```
|
|
|
|
Stream between two machines:
|
|
|
|
```sh
|
|
screencast --receive # machine A: announces itself, opens a window
|
|
screencast --send # machine B: discovers A, negotiates, streams
|
|
```
|
|
|
|
See `docs/RUNBOOK.md` for all modes, flags, and validation procedures.
|
|
|
|
## Receiver on a small ARM board (e.g. Raspberry Pi Zero 2 W)
|
|
|
|
The receiver does not need the sender's PipeWire/portal capture stack. On
|
|
the board, run:
|
|
|
|
```sh
|
|
sudo ./scripts/install-receiver.sh
|
|
screencast --receive
|
|
```
|
|
|
|
The script installs the dependencies, builds a receiver-only binary
|
|
(`-Dsender=false`), runs the test suite, and installs to `/usr/local/bin`
|
|
(override with `SC_RECEIVER_INSTALL_DIR`). It needs Raspberry Pi OS Trixie
|
|
or newer (GCC 13+ for C++20 `<format>`), builds SDL3 from source when the
|
|
distribution does not package it, and enables `avahi-daemon`. It also
|
|
installs and enables a systemd service so the receiver starts at boot —
|
|
`systemctl status screencast-receiver` to check on it.
|
|
|
|
Performance note: decoding is software H.264; on very small boards expect
|
|
smooth playback for modest resolutions and reduced frame rates at high
|
|
resolutions. Hardware decode is planned for Phase 7.
|
|
|
|
## Architecture
|
|
|
|
See `docs/ARCHITECTURE.md` for module boundaries and design rules.
|
|
|
|
## Roadmap
|
|
|
|
Development is split into phases in `docs/PHASES.md`.
|
|
|
|
Current phase: **Phase 7 — Resilience and polish**.
|
|
|
|
## License
|
|
|
|
MIT — see `LICENSE` (to be added). |