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:
+10
-4
@@ -1,8 +1,9 @@
|
||||
# Packaging punktfunk for Fedora / Bazzite
|
||||
|
||||
The punktfunk host is Linux-only and links system FFmpeg (NVENC), PipeWire, Opus and
|
||||
the NVIDIA driver. This directory packages it for the **Fedora Atomic / Bazzite** world
|
||||
(rpm-ostree + bootc), where most of those deps are already present.
|
||||
The punktfunk host links system FFmpeg (NVENC on NVIDIA, VAAPI on AMD/Intel, with a GPU-less
|
||||
software-H.264 fallback), PipeWire and Opus. This page covers packaging it for the
|
||||
**Fedora Atomic / Bazzite** world (rpm-ostree + bootc), where most of those deps are already
|
||||
present; the NVIDIA-specific notes below apply to the NVENC path.
|
||||
|
||||
> 👉 **Ubuntu/Debian hosts** install via `apt` from Gitea's package registry — see
|
||||
> [`debian/README.md`](debian/README.md) (`apt update && apt upgrade` for new builds).
|
||||
@@ -20,6 +21,10 @@ packaging/
|
||||
copr/ # COPR build-from-SCM settings
|
||||
```
|
||||
|
||||
The other packaging targets have their own READMEs: [`debian/`](debian/README.md) (apt),
|
||||
[`arch/`](arch/README.md) (PKGBUILD + sysext), [`flatpak/`](flatpak/README.md) (the client),
|
||||
[`windows/`](windows/README.md) (host installer + drivers), plus `kde/` and `linux/` helpers.
|
||||
|
||||
## What's needed beyond base Fedora
|
||||
|
||||
| Dependency | Where it comes from |
|
||||
@@ -121,7 +126,8 @@ An RPM (or the bootc layer) installs into the host system where those just work.
|
||||
## Building the SRPM/RPM locally (Fedora only)
|
||||
|
||||
```sh
|
||||
git archive --format=tar.gz --prefix=punktfunk-0.0.1/ -o ~/rpmbuild/SOURCES/punktfunk-0.0.1.tar.gz HEAD
|
||||
git archive --format=tar.gz --prefix=punktfunk-0.3.0/ -o ~/rpmbuild/SOURCES/punktfunk-0.3.0.tar.gz HEAD
|
||||
rpmbuild -ba packaging/rpm/punktfunk.spec # needs the BuildRequires from the spec
|
||||
# (0.3.0 = the spec's default %{pf_version}; the prefix and tarball name must match it)
|
||||
```
|
||||
(Not buildable on Debian/Ubuntu — use a Fedora toolbox/container or COPR.)
|
||||
|
||||
Reference in New Issue
Block a user