weavesignal/spike/desk-image/README.md
The WeaveSignal contributors 466b32ab6a WeaveSignal 1.0.0 — release one
The first public release. What it does: https://weavesignal.top; what changed: CHANGELOG.md.
2026-11-04 12:15:42 +00:00

61 lines
3.3 KiB
Markdown

# weavesignal-desk-spike image
A throwaway image for the WeaveSignal live-room spike. The "desk" is a GStreamer pipeline that
joins a LiveKit room, mixes the participants and sends Matroska over SRT to Liquidsoap.
## What it builds
A multi-stage `Containerfile` on `fedora:44`:
1. **Builder stage.** This stage builds two plugins from source:
- `libgstsrt.so` (`srtsrc`, `srtsink`). It comes from the upstream
`gst-plugins-bad-1.28.8.tar.xz`, with its sha256 pinned, and is built with meson with every
feature off except `srt`, against Fedora's `srt-devel` 1.5.7. Fedora's `bad-free` package
leaves SRT out, and so does RPM Fusion's `bad-freeworld`. RPM Fusion is not used.
- `libgstrswebrtc.so`. It comes from gst-plugins-rs tag **`0.15.4+fixup`**, the 0.15
series built for GStreamer 1.28 (`+fixup` changes only `Cargo.lock`). It is built with
`cargo cinstall --locked -p gst-plugin-webrtc --features livekit` on Fedora's Rust 1.99
and cargo-c 0.10.25. The default features are kept, which gives `whipclientsink`, WHEP
and Janus as well as LiveKit.
2. **Runtime stage.** Fedora's GStreamer 1.28.8 packages: base, good, bad-free (which includes
`webrtcbin` and `nvcodec`), the base tools, and `libnice-gstreamer1`. Also `srt-libs`,
`opus`, and Python 3.14 with `python3-gobject`, `python3-gstreamer1` and `numpy`. The two
plugins above are copied in.
During the build, `gst-inspect-1.0 --exists` checks every required element and the Python
`Gst` import is tried. The GStreamer registry cache is then deleted, so a run with the GPU
scans `nvcodec` again.
There is no maintained prebuilt image to use instead. The upstream CI images
(`registry.freedesktop.org/gstreamer/gstreamer-rs/debian/trixie-slim`) are Rust build
environments without compiled plugins. Fedora 44 does not package gst-plugins-rs.
## Build and run
```sh
cd spike/desk-image # from the repository's root
podman build -t localhost/weavesignal-desk-spike:dev .
podman run --rm localhost/weavesignal-desk-spike:dev gst-inspect-1.0 livekitwebrtcsrc
# NVIDIA (CDI); Bazzite's SELinux blocks /dev/nvidia* unless labelling is disabled:
podman run --rm --device nvidia.com/gpu=all --security-opt label=disable \
localhost/weavesignal-desk-spike:dev gst-inspect-1.0 nvav1enc
```
## Result (2026-10-24)
- **Build time:** 4 min 26 s, measured on a cold run (32 cores). Of that, the Rust compile took
1 min 56 s. The cargo registry and `target/` are cache mounts, so a rebuild is faster.
- **Image size:** about 1.0 GB.
- **Versions:** GStreamer 1.28.8, gst-plugins-rs 0.15.4 (`c164a66`), libsrt 1.5.7,
Python 3.14.8, PyGObject 3.56.3, numpy 2.4.6.
- **`gst-inspect-1.0`:** these elements pass: `livekitwebrtcsrc`, `livekitwebrtcsink`,
`whipclientsink`, `srtsink`, `srtsrc`, `matroskamux`, `audiomixer`, `opusenc`, `opusdec`,
`webrtcbin`, `audiotestsrc` and `level`.
- **Python:** `Gst.ElementFactory.find('livekitwebrtcsrc')` returns a factory.
- **`nvav1enc`:**
- Without a GPU it is absent, which is expected.
- With `--device nvidia.com/gpu=all` alone, CUDA fails to initialise because SELinux denies
access to `/dev/nvidia*`.
- With `--security-opt label=disable` added, it is present, along with `nvautogpuav1enc`,
H.264/H.265 encoders and NVDEC. A 4-second 480p30 AV1 encode at 800 kbit/s into
Matroska worked.