Files
punktfunk/docs-site/content/docs/pyrowave.md
T
enricobuehler a70811043e
ci / web (push) Successful in 52s
ci / docs-site (push) Successful in 54s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 8s
decky / build-publish (push) Successful in 17s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 8s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 8s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 9s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 44s
ci / bench (push) Successful in 5m47s
flatpak / build-publish (push) Failing after 8m11s
docker / deploy-docs (push) Successful in 27s
arch / build-publish (push) Successful in 10m58s
deb / build-publish (push) Successful in 12m26s
android / android (push) Successful in 16m59s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 12m16s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 17m59s
ci / rust (push) Successful in 24m26s
windows-host / package (push) Failing after 12m3s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 3m50s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 4m16s
apple / swift (push) Successful in 4m57s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 5m14s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 6m3s
release / apple (push) Successful in 25m6s
apple / screenshots (push) Has been cancelled
feat(presenter,docs): PyroWave mid-stream resize — HUD follows any mode switch; docs
- pf-presenter: the HUD/title mode line lived inside the match-window (D2)
  gate, so an accepted switch from any OTHER trigger (the
  PUNKTFUNK_DEBUG_RECONFIGURE lever, a host-side corrective rollback) left the
  label stale. Hoisted into its own per-iteration tick that runs whenever a
  stream is up.
- docs: pyrowave.md — the Automatic bitrate pin now follows a mid-stream
  resize; drop the "resolution changes rebuild the stream" limitation.

Completes the resize-rebuild work whose core landed in 9127c346
(video_pyrowave.rs sequence-header dims sniff + in-place decoder/plane-ring
rebuild with retired-ring lifetime handling, host per-mode ~1.6 bpp re-pin,
128px floor, debug reconfigure lever). On-glass validated on .21
(RTX 5070 Ti, Mutter virtual display): 1080p->720p and 1080p->1440p
mid-stream switches, lossless AND under 2% netem loss — decoder rebuilt in
place, 60 fps sustained (partials during loss), pinned rate re-resolved
199065->88473 / ->353894 kbps, HUD flips to the new mode.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 12:00:41 +02:00

3.4 KiB
Raw Blame History

title, description
title description
PyroWave (wired-LAN codec) The opt-in ultra-low-latency wavelet codec for wired links — what it is, the bandwidth it needs, and how to turn it on.

PyroWave is an opt-in video codec mode for links that can afford real bandwidth: wired Ethernet, a docked Steam Deck, a 2.5GbE LAN. It trades bitrate for latency — instead of H.264/HEVC/AV1 on the GPU's video engine, frames are compressed with PyroWave, an intra-only wavelet codec running as plain Vulkan compute. Punktfunk vendors a pinned copy and runs it on both ends.

It is never selected automatically. HEVC/AV1 remain the codecs for Wi-Fi and everything else; PyroWave engages only when you pick it on the client and the host supports it. If either side can't, the session silently falls back to the normal codec ladder.

Why you'd want it

  • Codec latency drops by an order of magnitude. Encode and decode each take a fraction of a millisecond of GPU compute (measured ~0.15 ms encode / ~0.07 ms decode at 1080p on an RTX 5070 Ti), versus one-to-several milliseconds per side for the hardware H.26x pipelines.
  • Every frame is a keyframe. There is no GOP, no reference chain, no keyframe round-trip after packet loss — a lost frame costs exactly that frame, and the next one is already a complete picture. The whole IDR/recovery apparatus that produces loss-time stutter simply doesn't exist in this mode.
  • Uniform frame sizes. The rate control hits its per-frame byte budget exactly, so the pacer sees a flat load instead of 2040× keyframe spikes.

What it costs

Bandwidth. At the codec's ~1.6 bits-per-pixel operating point (4:2:0, 60 fps):

Mode Bitrate
1280×800 @ 60 (Deck) ≈ 100 Mbps
1920×1080 @ 60 ≈ 200 Mbps
2560×1440 @ 60 ≈ 355 Mbps
3840×2160 @ 60 ≈ 800 Mbps

120 Hz doubles these. Gigabit Ethernet tops out around 940 Mbps of payload, so 4K60 wants 2.5GbE (or a lower rate). Do not run this over Wi-Fi — that's what HEVC/AV1 are for.

Also: PyroWave is 8-bit SDR only. An HDR session stays on HEVC/AV1 regardless of this setting.

Turning it on

  1. Host (Linux): build/install a host with the pyrowave feature. On an NVIDIA host the capture path additionally needs PUNKTFUNK_ENCODER=pyrowave in host.env for the codec to be advertised; AMD/Intel hosts advertise it automatically when the feature is present.
  2. Client (Linux session client with the pyrowave feature): set Settings → Video codec → PyroWave (wired LAN) in the gamepad console, or launch with PUNKTFUNK_PREFER_PYROWAVE=1.
  3. Leave the bitrate on Automatic: a PyroWave session pins itself to the ~1.6 bpp rate for your mode (≈200 Mbps at 1080p60). An explicit bitrate is honored if you set one, but the adaptive-bitrate controller stays off either way — this codec has no useful low-rate regime, so under sustained loss the right move is switching back to HEVC, not degrading. The pin follows the resolution: a mid-stream resize (e.g. Match window) re-pins the rate for the new mode, so resizing a window down also cuts the bandwidth.

The stats overlay shows pyrowave as the decode path when the mode is active.

Current limits

  • Linux host + Linux client (including docked Deck) today; the Windows host and the Apple native port are tracked on the roadmap.
  • 8-bit SDR, 4:2:0 only.