wrec / Linux recording / hardware test report
Real Radeon capture passes on Corex.
H.264 display capture and animated HEVC window capture completed through GNOME Wayland, PipeWire DMA-BUF and VA-API. No encoder fallback was used. Pause/resume, stopping while paused, and a live system-audio track passed.
Pull request #31 · 5afccdbb1d3d379a3de403a57130d7c2298e1650
Updated 2026-09-05 09:40 UTC · PR open; no merge performed.
Hardware evidence
| Test | Result | Observed output |
|---|
| H.264 display | Passed | 1920×1080, 5.06 s, about 30.1 fps; vah264enc, shared GPU buffers |
| HEVC animated window | Passed | 1920×1080, 16.93 s, 529 frames; vah265enc, shared GPU buffers |
| System audio | Passed | Live output-monitor capture; AAC, 48 kHz stereo, 16.89 s |
| Pause / resume / paused stop | Passed | Two pauses; movie timestamps omit paused time; file finalized while paused |
| File integrity | Passed | FFmpeg decoded every video/audio packet without errors; FFprobe confirmed strictly increasing DTS per stream |
| Motion and frame retention | Passed | 17 distinct decoded frames sampled at 1 fps; zero drops reported by the recorder |
| Static desktop | Passed earlier in hardware testing | 15.10 s H.264 movie; keepalive frames preserved the timeline without forcing a full frame rate |
Decoded frame from the HEVC recording. The window contains only the test fixture created for this run.
Measured resource use
| Phase | Recorder CPU | Recorder peak RSS | Compositor CPU |
|---|
| animated desktop before recording | 0.0% | 8.7 MiB | 7.0% |
| recording animated window with system audio | 4.0% | 128.8 MiB | 7.7% |
| paused | 1.0% | 128.8 MiB | 6.5% |
| resumed recording | 4.0% | 129.1 MiB | 7.6% |
CPU percentages are relative to one logical core, sampled from /proc every 0.5 s. Baseline: a fresh daemon before its first recording, sampled for 3 s with the test animation already running. Active samples: 8 s before and 8 s after pause. Paused sample: 2 s. These are short observations of a simple animated window, not a general performance benchmark.
The HEVC job requested a 60 fps ceiling but recorded about 31.2 fps. This run does not establish sustained 60 fps, 4K performance, or efficiency parity with macOS. RSS includes shared native libraries; after recording, the process reported about 58.9 MiB PSS and 29.9 MiB private dirty memory. Those latter figures are post-recording measurements, not capture peaks.
Automated checks
| Check | Result |
|---|
| Workspace tests | 143 passed |
| Isolated ScreenCast portal test | 1 passed separately: repeated target queries, source/cursor options, denial, cancellation, fresh remote connections and cleanup |
| Native pipeline tests | Video plus two AAC tracks, variable-rate negotiation, pause timing, failure paths and strict DMA-BUF checking |
| Extracted package | Six headless checks and three real Xvfb/X11 capture checks passed, including H.264/HEVC decode and pause/resume |
| Process teardown | Pending real portal picker exited in 0.20 s after SIGTERM. Two native GStreamer hangs encountered during diagnosis exited at the 15 s deadline; both processes were confirmed gone. |
| Formatting, compilation, Clippy | Passed; Clippy checked all targets with warnings denied |
| Final PR CI | Passed on 5afccdb: Linux, macOS Rust/Swift and docs. Optional [code]smith check skipped. |
| Final automated review | Devin completed its analysis. The shutdown-validation note was tested; Intel hardware coverage remains open. |
What hardware testing fixed
Repeated portal requests stopped working after the first query because ashpd retained a connection whose runtime had been destroyed. The portal now uses a persistent runtime. GNOME's variable-rate stream also failed the original fixed-frame-rate negotiation; wrec now requests a maximum frame rate.
Native PipeWire pause/resume failed on this host. Pause now leaves approved streams alive, drops incoming video/audio before conversion and encoding, and adjusts timestamp metadata on resume. It preserves GPU memory and avoids restarting the source. Synthetic tests cover audio/video timing; the real Radeon test verifies resume and finalization.
Earlier review fixes covered shutdown deadlines, picker and pre-start cancellation, recording-history timestamps, missing artifacts after failed starts, daemon discovery, unsupported settings and pinned CI actions. The original hardware review note is now addressed for AMD; Intel validation remains outstanding.
Environment and remaining coverage
Corex: AMD Ryzen 9 5900H, Radeon Cezanne [1002:1638], Ubuntu 26.04.1, GNOME Shell 50.1, GStreamer 1.28.2, PipeWire 1.6.2, Mesa 26.0.8 and xdg-desktop-portal-gnome 50.0. Tests ran through the configured SSH host in its active Wayland session. The earlier container lacked GPU devices and desktop sockets; the host supplied both.
The sharing picker was operated through accessibility inspection and a temporary keyboard device. The cursor was not moved. The test daemon, test window and virtual keyboards were stopped afterward.
Intel/NVIDIA hardware, other compositor combinations, audible A/V and microphone synchronization, desktop sharing-control stops, sustained 60 fps, 4K, GPU memory and power remain unverified. HDR is not implemented. Wayland and X11 are supported paths; a desktop session and native plugins are still required. Software fallback uses more CPU, and archives target their build architecture and libc.
Local automated tests used stable Rust 1.98.1 and GStreamer 1.22. The repository's advertised Rust 1.78 also fails on the unchanged base's existing SQLite dependency; this PR does not resolve that pre-existing issue.
wrec targets --json
wrec record --target display:0 --codec h264 --fps 30 \
--resolution 1080p --duration 5s --no-system-audio
wrec record --target window:0 --codec hevc --quality high \
--fps 60 --resolution native --system-audio --no-cursor --detach
# Select the source in the desktop picker, then use:
wrec job pause <id>
wrec job resume <id>
wrec job pause <id>
wrec job stop <id>
Setup and complete validation instructions