feat(protocol,clients): codec preference negotiation + Linux client decodes per Welcome (Phase 2a)
Adds a client-selectable **preferred codec** and wires the core + ABI + probe + Linux client to
negotiate and decode it. (Windows/Apple/Android follow in 2b.)
**Core:**
- `Hello.preferred_codec` (a single CODEC_* bit, 0 = auto) — a soft hint appended after
`video_codecs`. `resolve_codec(client, host, preferred)` now honors the preference when the host
can also emit it, else falls back to precedence (HEVC > AV1 > H.264). Roundtrip + preference tests.
- `NativeClient::connect` takes `video_codecs` + `preferred_codec`; `NativeClient.codec` exposes the
resolved `Welcome.codec`.
- ABI: `punktfunk_connect_ex7` (adds the two codec params; `ex6` delegates to it advertising
HEVC-only) + `punktfunk_connection_codec` getter + `PUNKTFUNK_CODEC_{H264,HEVC,AV1}` constants
(drift-guarded against the wire values). Header regenerated.
**Host:** passes `hello.preferred_codec` into `resolve_codec`.
**probe:** `--codec h264|hevc|av1|auto` sets the preference (still advertises it can decode all
three); the dump extension already follows the resolved codec.
**Linux client:** advertises the codecs FFmpeg can actually decode (`decodable_codecs()`), threads
the user's `codec` setting as the preference, and builds the decoder — both the software and VAAPI
paths, plus the mid-session VAAPI→software demotion — from the negotiated `Welcome.codec` instead of
hardcoding HEVC. New "Video codec" dropdown in Preferences (Automatic/HEVC/H.264/AV1).
Live-validated on the dev box: probe `--codec hevc` against a software (H.264-only) host resolves to
H.264 (graceful soft-preference fallback), no failure. clippy + core (57) + host (133) tests green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -39,9 +39,13 @@ git clone https://git.unom.io/unom/punktfunk ~/punktfunk
|
||||
bash ~/punktfunk/scripts/steamdeck/install.sh # PIN pairing required (secure default)
|
||||
bash ~/punktfunk/scripts/steamdeck/install.sh --open # trusted LAN: accept unpaired clients
|
||||
bash ~/punktfunk/scripts/steamdeck/install.sh --no-web # host only, no web console
|
||||
bash ~/punktfunk/scripts/steamdeck/install.sh --no-gamestream # native punktfunk/1 only, no Moonlight surface
|
||||
bash ~/punktfunk/scripts/steamdeck/update.sh # after pulling new source
|
||||
```
|
||||
|
||||
Note: unlike a bare `serve` (native-only by default), the Deck install enables `--gamestream` by
|
||||
default so stock Moonlight clients work out of the box; `--no-gamestream` turns that surface off.
|
||||
|
||||
Env overrides: `PUNKTFUNK_SRC` (source dir, default `~/punktfunk`), `PUNKTFUNK_BOX` (container name,
|
||||
default `pf2`), `PUNKTFUNK_MGMT_PORT` (47990), `PUNKTFUNK_WEB_PORT` (3000).
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ won't start. The service is down only for the build duration.
|
||||
|
||||
On an **installed** host (the `setup.exe`) the console is set up automatically — no manual steps.
|
||||
The installer bundles the built (self-contained, no-`node_modules`) `.output` server + a portable
|
||||
bun and runs `scripts\windows\web-setup.ps1`, which registers the **`PunktfunkWeb`** scheduled task
|
||||
bun and runs `punktfunk-host.exe web setup`, which registers the **`PunktfunkWeb`** scheduled task
|
||||
(at boot, as SYSTEM, restart-on-failure) running `{app}\web\web-run.cmd` →
|
||||
`bun …\.output\server\index.mjs` on `:3000`, opens inbound TCP 3000, and writes the login password to
|
||||
`%ProgramData%\punktfunk\web-password` (ACL'd to Administrators + SYSTEM). The mgmt bearer token it
|
||||
@@ -52,8 +52,8 @@ powershell -ExecutionPolicy Bypass -File scripts\windows\build-web.ps1
|
||||
|
||||
`bun install && bun run build` (Nitro `noExternals` -> a self-contained `.output`, no
|
||||
`node_modules`/`.npmrc`), then restarts the `PunktfunkWeb` task and checks `:3000/login`. Use
|
||||
this to iterate on the console against an installed host - `web-setup.ps1` (or a fresh install) is
|
||||
what creates the task in the first place.
|
||||
this to iterate on the console against an installed host - `punktfunk-host.exe web setup` (or a
|
||||
fresh install) is what creates the task in the first place.
|
||||
|
||||
## Typical flow after pulling new code
|
||||
|
||||
|
||||
Reference in New Issue
Block a user