11 Commits

Author SHA1 Message Date
claude-noether 7213b23861 daedalus-v4l2-dkms: postinst — autoinstall for all installed kernels (#64)
Previously dkms autoinstall ran only against $(uname -r), so installing
the package on kernel A and rebooting into separately-installed kernel B
left /lib/modules/B/updates/dkms/ empty.  /dev/daedalus-v4l2 absent,
daedalus daemon nothing to talk to, browser/VAAPI silently falling back
to software with no obvious diagnostic for the user.

Now we enumerate every /lib/modules/*/build that resolves to a real
directory (i.e. headers are actually installed for that kernel) and run
'dkms autoinstall -k <kver>' for each.  Per-kernel verify; aggregated
warning only for the kernels that didn't build.

Tested locally: enumeration filters dangling /build symlinks correctly
(2 kernels installed, 1 has headers → only that one is built against).

Bumps PKGREL 1 → 2.  Closes #64.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 11:07:35 +02:00
marfrit 2cd3acd680 Merge pull request 'firefox-fourier 0003: proper V4L2REQUEST type acceptance patch (closes #60)' (#63) from firefox-0003-v4l2request-proper-2026-05-21 into main
Reviewed-on: marfrit/marfrit-packages#63
2026-05-21 05:10:27 +00:00
marfrit 22ac3c9845 firefox-fourier 0003: V4L2REQUEST type acceptance (proper patch, regenerated from real source)
Closes #60.

Resolves the malformed-patch issue from #61 (since reverted in #62)
by regenerating the 0003 patch via actual application against firefox
150.0.3 Pi-OS source.

Functional change vs prior 0003: walking hw_configs accepts
AV_HWDEVICE_TYPE_DRM (legacy) OR integer device_type values 13/14
(AV_HWDEVICE_TYPE_V4L2REQUEST in Kwibos no-AMF / upstream-AMF trees).
CreateV4L2RequestDeviceContext passes integer 13 (Kwibos value) cast
to enum AVHWDeviceType for the av_hwdevice_ctx_create call.

Tested: applied cleanly via patch -p1 against firefox-150.0.3 source
post-Pi-OS-quilt-patches. Test build follow-up in firefox-rpios EC2
script (drops the in-source sed hack from v7-v8).
2026-05-21 06:59:20 +02:00
marfrit 3275d06728 Merge pull request 'Revert #61: malformed firefox-fourier 0003 patch' (#62) from revert-pr-61-malformed-patch into main
Reviewed-on: marfrit/marfrit-packages#62
2026-05-21 04:33:35 +00:00
marfrit 33b91cf7dc Revert "Merge pull request 'firefox-fourier patch #3: accept AV_HWDEVICE_TYPE_V4L2REQUEST too' (#61) from fix/firefox-v4l2request-type-accept-2026-05-21 into main"
This reverts commit a640633ea7, reversing
changes made to de3c2c6744.
2026-05-21 06:32:39 +02:00
marfrit a640633ea7 Merge pull request 'firefox-fourier patch #3: accept AV_HWDEVICE_TYPE_V4L2REQUEST too' (#61) from fix/firefox-v4l2request-type-accept-2026-05-21 into main
Reviewed-on: marfrit/marfrit-packages#61
2026-05-21 04:18:28 +00:00
marfrit 5f21a71770 firefox-fourier patch #3: accept AV_HWDEVICE_TYPE_V4L2REQUEST too
Closes part of #60 (firefox-side patch update for fourier2 ffmpeg).

Background: libavcodec61-fourier2 (Kwiboo v4l2-request-n7.1.3 backed)
registers its hwaccels with AV_HWDEVICE_TYPE_V4L2REQUEST (the dedicated
enum added in FFmpeg 7.1+), not AV_HWDEVICE_TYPE_DRM as fourier1 did.
The firefox-fourier patch #3 walked hw_configs looking only for DRM
and fell through to software for every codec.

Patch updates:
- CreateV4L2RequestDeviceContext now takes an int aDeviceType (Mozillas
  bundled libavutil headers may lack the V4L2REQUEST enumerator), passed
  through to av_hwdevice_ctx_create.
- hw_configs walk accepts DRM (legacy) OR V4L2REQUEST integer value
  (13 on Kwibooss no-AMF tree, 14 on upstream-AMF tree).
- Renamed mDRMDeviceContext to mV4L2RequestDeviceContext for accuracy.

Build pkgrel will be bumped at debian-package level to +fourier2.
2026-05-21 00:09:54 +02:00
marfrit de3c2c6744 Merge pull request 'daedalus-v4l2{,-dkms}: 462aa4b -> f0d4186 — per-ctx vb2 lock' (#58) from claude-noether/marfrit-packages:noether/daedalus-bump-f0d4186 into main
Reviewed-on: marfrit/marfrit-packages#58
2026-05-20 19:27:39 +00:00
marfrit e7e79e5a76 daedalus-v4l2{,-dkms}: 462aa4b -> f0d4186 — per-ctx vb2 lock
Upstream PR #3 — kernel per-context vb2_queue lock so concurrent
clients of /dev/video0 don't serialise on a device-wide mutex.
Pi 5 Firefox VAAPI playback (RDD + content + GPU processes each
opening the device) now works without S_FMT EBUSY collisions.

Verified on higgs: YouTube playback engages daedalus at sustained
~230 fps decode through the libavcodec dlopen path, ~7× headroom
over the 30fps@1080p Pi 5 Fourier target.

Both packages: pkgver 0.1.0.r24.f0d4186, pkgrel reset to 1.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 21:26:16 +02:00
marfrit 130a259c69 Merge pull request 'libva-v4l2-request-fourier: c1bb444 -> 77f9236 (PR #12 / issue #11 libva side)' (#57) from claude-noether/marfrit-packages:noether/libva-bump-77f9236 into main
Reviewed-on: marfrit/marfrit-packages#57
2026-05-20 19:18:38 +00:00
claude-noether 9580f33cb6 libva-v4l2-request-fourier: c1bb444 -> 77f9236 (PR #12 / issue #11 libva side)
Bumps both Arch (PKGBUILD) and Debian (build-deb.sh) sides in one commit
this time — following the dual-pin lesson from PR #53.

77f9236 = libva PR #12 merge: src/av1.{c,h} implements av1_set_controls
mapping VAPictureParameterBufferAV1 onto struct v4l2_ctrl_av1_sequence,
queued via S_EXT_CTRLS as V4L2_CID_STATELESS_AV1_SEQUENCE.  The
daedalus_v4l2 daemon track will consume the ctrl to synthesise an
OBU_SEQUENCE_HEADER and prepend it to the slice bitstream, so libdav1d
can parse the OUTPUT buffer that ffmpeg-vaapi delivers without the
sequence header.

Until the daemon-side OBU synth lands (issue #11 operator track), the
SEQUENCE ctrl is just sitting in the request unused.  Harmless on the
RK3588 vpu981 hardware path (vpu981 parses OBU bytes directly, ignores
the ctrl payload).

pkgver: r382.c1bb444 -> r386.77f9236 (commit count 382 -> 386, two new
upstream commits: 9fa18f2 av1 + 77f9236 merge).
pkgrel: 1 (fresh pkgver, no rebuild-only iteration).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 21:17:54 +02:00
9 changed files with 154 additions and 82 deletions
+2 -2
View File
@@ -18,9 +18,9 @@ _module=daedalus_v4l2
# Same pin as arch/daedalus-v4l2 — keep kernel module + daemon # Same pin as arch/daedalus-v4l2 — keep kernel module + daemon
# bit-versioned together so the chardev wire protocol stays in sync. # bit-versioned together so the chardev wire protocol stays in sync.
_commit=462aa4b4804972189d2f1b1ab5782f1ca1e8c423 _commit=f0d41867f60f5bf8dbfcc6cc16404d7d7eb90014
pkgver=0.1.0.r22.462aa4b pkgver=0.1.0.r24.f0d4186
pkgrel=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth) pkgrel=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth)
pkgdesc="V4L2 stateless decoder shim kernel module (DKMS) — Pi 5 / CM5" pkgdesc="V4L2 stateless decoder shim kernel module (DKMS) — Pi 5 / CM5"
arch=('any') arch=('any')
+2 -2
View File
@@ -21,11 +21,11 @@ _upstreampkg=daedalus-v4l2
# ffmpeg -hwaccel vaapi → libva → /dev/video0 → daemon path lands a # ffmpeg -hwaccel vaapi → libva → /dev/video0 → daemon path lands a
# pixel-correct decoded frame back in ffmpeg. Promote to a later pin # pixel-correct decoded frame back in ffmpeg. Promote to a later pin
# only after a future phase closes cleanly. # only after a future phase closes cleanly.
_commit=462aa4b4804972189d2f1b1ab5782f1ca1e8c423 _commit=f0d41867f60f5bf8dbfcc6cc16404d7d7eb90014
# 0.1.0 (pre-1.0) + commit count + short sha. Bump the .Y on each # 0.1.0 (pre-1.0) + commit count + short sha. Bump the .Y on each
# Phase 8.x close. pkgver() recomputes at build time. # Phase 8.x close. pkgver() recomputes at build time.
pkgver=0.1.0.r22.462aa4b pkgver=0.1.0.r24.f0d4186
pkgrel=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth) pkgrel=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth)
pkgdesc="Userspace daemon for the daedalus-v4l2 V4L2 stateless decoder shim (VP9/AV1/H.264 on Pi 5 / CM5)" pkgdesc="Userspace daemon for the daedalus-v4l2 V4L2 stateless decoder shim (VP9/AV1/H.264 on Pi 5 / CM5)"
arch=('aarch64') arch=('aarch64')
@@ -18,27 +18,30 @@ This patch adds a sibling init path, `InitV4L2RequestDecoder`, that:
* looks up the codec via two complementary mechanisms libavcodec * looks up the codec via two complementary mechanisms libavcodec
uses for v4l2_request: uses for v4l2_request:
- **named codec** (`h264_v4l2request`, `vp8_v4l2request`, etc.): - **named codec** (`h264_v4l2request`, `vp8_v4l2request`, etc.):
the legacy AVCodec-per-hwaccel registration. ALARM, Debian, the legacy AVCodec-per-hwaccel registration.
and most distros building with --enable-v4l2-request expose - **generic codec + hw_configs walk**: the modern hwaccel
this (avcodec_find_decoder_by_name lookup). registration. Accepts EITHER AV_HWDEVICE_TYPE_DRM (legacy
- **generic codec + AV_HWDEVICE_TYPE_DRM** in `hw_configs`: ffmpeg-v4l2-request-fork output prior to FFmpeg 7.1) OR
the modern hwaccel registration on some upstream-only ffmpeg AV_HWDEVICE_TYPE_V4L2REQUEST (FFmpeg 7.1+ dedicated enum,
builds. value 13 on Kwiboo's no-AMF tree, 14 on upstream-AMF tree).
Mozilla's bundled libavutil headers may not have the V4L2REQUEST
enumerator, so the test is on the integer value via `(int)cast`.
Probes named-codec first (explicit, portable) and falls back to Probes named-codec first (explicit, portable) and falls back to
walking the generic codec's `hw_configs` for the DRM device type; walking the generic codec's `hw_configs` for either device type;
* creates an `AV_HWDEVICE_TYPE_DRM` hwdevice context bound to * creates an hwdevice context bound to `/dev/dri/renderD128`. Uses
`/dev/dri/renderD128` via the new `av_hwdevice_ctx_create` wrapper integer 13 (V4L2REQUEST as defined by Kwiboo's v4l2-request-n7.1.3
(patch 2/4) and attaches it to the codec context; tree, what our libavcodec61-fourier emits) cast to enum
AVHWDeviceType for the av_hwdevice_ctx_create call;
* reuses the existing `ChooseV4L2PixelFormat` get-format callback * reuses the existing `ChooseV4L2PixelFormat` get-format callback
(already returns `AV_PIX_FMT_DRM_PRIME`) and the existing (already returns `AV_PIX_FMT_DRM_PRIME`) and the existing
`apply_cropping = 0` constraint. `apply_cropping = 0` constraint.
`InitV4L2RequestDecoder` is invoked **before** `InitV4L2Decoder` in `InitV4L2RequestDecoder` is invoked **before** `InitV4L2Decoder` in
`InitHWDecoderIfAllowed`. On Rockchip mainline it succeeds via either `InitHWDecoderIfAllowed`. On Rockchip mainline it succeeds via either
mechanism (ALARM uses the named codec). On Pi4 / Mediatek / mechanism. On Pi4 / Mediatek / vendor-MPP-stateful boards neither
vendor-MPP-stateful boards neither mechanism is registered for the mechanism is registered for the codec, the function bails out, and the
codec, the function bails out, and the existing stateful existing stateful `InitV4L2Decoder` runs as before. No regression of
`InitV4L2Decoder` runs as before. No regression of stateful boards. stateful boards.
`mDRMDeviceContext` is unconditionally `av_buffer_unref`'d in `mDRMDeviceContext` is unconditionally `av_buffer_unref`'d in
`ProcessShutdown` (no-op when null). Gated behind `ProcessShutdown` (no-op when null). Gated behind
@@ -46,9 +49,8 @@ codec, the function bails out, and the existing stateful
Bug 1969297. Bug 1969297.
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h --- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-05-21 04:57:59.570946601 +0000
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-03-18 19:22:14.000000000 +0000 +++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-05-21 04:57:59.876488776 +0000
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-04-27 20:43:39.347992674 +0000
@@ -225,7 +225,12 @@ @@ -225,7 +225,12 @@
bool IsLinuxHDR() const; bool IsLinuxHDR() const;
MediaResult InitVAAPIDecoder(); MediaResult InitVAAPIDecoder();
@@ -73,9 +75,8 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platfor
// If video overlay is used we want to upload SW decoded frames to // If video overlay is used we want to upload SW decoded frames to
// DMABuf and present it as a external texture to rendering pipeline. // DMABuf and present it as a external texture to rendering pipeline.
bool mUploadSWDecodeToDMABuf = false; bool mUploadSWDecodeToDMABuf = false;
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp --- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-05-21 04:57:59.566685221 +0000
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-04-27 16:09:10.000000000 +0200 +++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-05-21 04:58:00.136004159 +0000
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-04-29 00:10:00.098884335 +0200
@@ -403,6 +403,129 @@ @@ -403,6 +403,129 @@
return NS_OK; return NS_OK;
} }
@@ -90,7 +91,7 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platf
+ } + }
+ const char* drmDevice = "/dev/dri/renderD128"; + const char* drmDevice = "/dev/dri/renderD128";
+ if (mLib->av_hwdevice_ctx_create(&mDRMDeviceContext, + if (mLib->av_hwdevice_ctx_create(&mDRMDeviceContext,
+ AV_HWDEVICE_TYPE_DRM, drmDevice, + (enum AVHWDeviceType)13, drmDevice,
+ nullptr, 0) < 0) { + nullptr, 0) < 0) {
+ FFMPEG_LOG(" av_hwdevice_ctx_create(DRM, %s) failed", drmDevice); + FFMPEG_LOG(" av_hwdevice_ctx_create(DRM, %s) failed", drmDevice);
+ return false; + return false;
@@ -143,7 +144,7 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platf
+ for (int i = 0;; i++) { + for (int i = 0;; i++) {
+ const AVCodecHWConfig* cfg = mLib->avcodec_get_hw_config(generic, i); + const AVCodecHWConfig* cfg = mLib->avcodec_get_hw_config(generic, i);
+ if (!cfg) break; + if (!cfg) break;
+ if (cfg->device_type == AV_HWDEVICE_TYPE_DRM) { + if (cfg->device_type == AV_HWDEVICE_TYPE_DRM || (int)cfg->device_type == 13 || (int)cfg->device_type == 14) {
+ codec = generic; + codec = generic;
+ FFMPEG_LOG(" using generic codec %s with DRM hwaccel", codec->name); + FFMPEG_LOG(" using generic codec %s with DRM hwaccel", codec->name);
+ break; + break;
+17 -17
View File
@@ -24,29 +24,29 @@ pkgname=libva-v4l2-request-fourier
epoch=1 epoch=1
_upstreampkg=libva-v4l2-request _upstreampkg=libva-v4l2-request
# Pin the fork tip. c1bb444 = PR #9 merge "h264: max_num_ref_frames # Pin the fork tip. 77f9236 = PR #12 merge "av1: populate
# fallback + libva-boundary instrumentation (#8)" — addresses the # V4L2_CID_STATELESS_AV1_SEQUENCE in codec_set_controls (#11 libva side)"
# libva-side portion of marfrit/libva-v4l2-request-fourier#8: the # — addresses the libva-side portion of marfrit/libva-v4l2-request-fourier#11.
# daedalus_v4l2-via-libavcodec strict consumer rejected frames whose # Adds src/av1.{c,h} with av1_set_controls that maps VAAPI's
# sps.max_num_ref_frames was 0 (older ffmpeg-vaapi paths leave the # VAPictureParameterBufferAV1.seq_info_fields onto struct
# field unset and HW decoders tolerated it). Adds a per-profile spec # v4l2_ctrl_av1_sequence and queues V4L2_CID_STATELESS_AV1_SEQUENCE via
# minimum fallback (counts valid DPB entries first; 1 for baseline / # S_EXT_CTRLS. The daedalus_v4l2 daemon track is the consumer that turns
# 4 for main+high if even that is 0) and a one-line request_log at # the ctrl into an OBU_SEQUENCE_HEADER and prepends it to the slice
# h264_set_controls entry dumping raw VAAPI bitfields (seq_fields, # bitstream so libdav1d can parse the (sequence-header-stripped) OUTPUT
# pic_fields, num_ref_frames, bit_depth_*) for disambiguating where # buffer that ffmpeg-vaapi delivers. Until the daemon side lands the ctrl
# the still-open PPS-flag-zero portion of issue #8 originates. # is just sitting in the request unused — no-cost no-op for HW decoders
# (vpu981 parses OBU bytes directly).
# #
# Prior pin (9898331) was the LIBVA-2 close — config-side video_fd_daedalus # Prior pin (c1bb444) = PR #9 merge — h264_set_controls
# added to the profile enumeration probe array. c332d34 (LIBVA-1) added # max_num_ref_frames fallback + libva-boundary instrumentation for the
# the per-codec dispatch. Earlier de27e95 (Phase 8.13 diagnostic), # daedalus consumer-strict path (issue #8 libva side).
# 7ac934e (iter38b multi-device probe + MAX_PROFILES bounds-check fix). _commit=77f92364661419f6e5a7bd827c1b845b4e426569
_commit=c1bb444d0731ca7ca831c7e01ec4b52ed736ca8e
# Project version from meson.build (1.0.0) + commit count + short sha, # Project version from meson.build (1.0.0) + commit count + short sha,
# matching the ffmpeg-v4l2-request-fourier convention. Recomputed at # matching the ffmpeg-v4l2-request-fourier convention. Recomputed at
# build time by pkgver() below; the static value here is a placeholder # build time by pkgver() below; the static value here is a placeholder
# so AUR-style consumers see something coherent before src/ exists. # so AUR-style consumers see something coherent before src/ exists.
pkgver=1.0.0.r382.c1bb444 pkgver=1.0.0.r386.77f9236
pkgrel=1 pkgrel=1
pkgdesc="VA-API backend for V4L2 stateless decoders (multiplanar fork — fourier umbrella)" pkgdesc="VA-API backend for V4L2 stateless decoders (multiplanar fork — fourier umbrella)"
arch=('aarch64') arch=('aarch64')
+49 -23
View File
@@ -14,9 +14,9 @@
# Sibling userspace package: ../daedalus-v4l2/build-deb.sh # Sibling userspace package: ../daedalus-v4l2/build-deb.sh
set -euo pipefail set -euo pipefail
UPSTREAM_COMMIT=462aa4b4804972189d2f1b1ab5782f1ca1e8c423 UPSTREAM_COMMIT=f0d41867f60f5bf8dbfcc6cc16404d7d7eb90014
PKGVER=0.1.0+r22+g462aa4b PKGVER=0.1.0+r24+gf0d4186
PKGREL=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth) PKGREL=2 # postinst: autoinstall for every installed kernel with headers (#64)
MODULE_NAME=daedalus_v4l2 MODULE_NAME=daedalus_v4l2
HERE=$(dirname "$(readlink -f "$0")") HERE=$(dirname "$(readlink -f "$0")")
@@ -78,7 +78,6 @@ set -e
NAME=${MODULE_NAME} NAME=${MODULE_NAME}
VERSION=${PKGVER} VERSION=${PKGVER}
KERNELVER=\$(uname -r)
# Yellow + bold ANSI for the warning so it stands out in apt's # Yellow + bold ANSI for the warning so it stands out in apt's
# stream of "Setting up" lines. Disable colour on non-TTY. # stream of "Setting up" lines. Disable colour on non-TTY.
@@ -101,29 +100,56 @@ if [ "\$1" = "configure" ]; then
dkms add "\$NAME/\$VERSION" 2>/dev/null || true dkms add "\$NAME/\$VERSION" 2>/dev/null || true
# Don't let autoinstall failure mask the actual problem behind '|| true'. # Enumerate every kernel whose headers are actually present
# Run it, capture the result, then verify post-condition. # (/lib/modules/<kver>/build resolves to a directory). We iterate
autoinstall_rc=0 # all of them — not just \$(uname -r) — so that installing this
dkms autoinstall "\$NAME/\$VERSION" || autoinstall_rc=\$? # package after a kernel update covers the newly-installed kernel
# too, and so that a later kernel-headers install for a previously
# uncovered version gets picked up on dpkg-reconfigure. Without
# this, autoinstall (which targets only the running kernel) leaves
# /dev/daedalus-v4l2 absent after a kernel switch + reboot
# (marfrit/marfrit-packages#64).
kvers=''
for d in /lib/modules/*/build; do
[ -d "\$d" ] || continue
k=\$(basename "\$(dirname "\$d")")
kvers="\$kvers \$k"
done
# Verify the module actually built + installed for the running kernel. if [ -z "\$kvers" ]; then
status=\$(dkms status -m "\$NAME" -v "\$VERSION" -k "\$KERNELVER" 2>/dev/null || true)
if ! printf '%s\\n' "\$status" | grep -q -E 'installed|loaded'; then
warn "" warn ""
warn "DKMS build did NOT land for kernel \$KERNELVER." warn "No kernels with headers found under /lib/modules/*/build."
warn " dkms status -m \$NAME -v \$VERSION -k \$KERNELVER:" warn "Install kernel headers (e.g. linux-headers-rpi-2712 on Pi OS)"
warn " \$(printf '%s' "\$status" | head -1)" warn "then finish with:"
warn ""
warn "Most likely cause: kernel headers package is missing."
warn " Raspberry Pi OS / Pi 5: apt install linux-headers-rpi-2712"
warn " Debian generic: apt install linux-headers-\$KERNELVER"
warn ""
warn "After installing headers, finish the install with:"
warn " sudo dkms autoinstall \$NAME/\$VERSION" warn " sudo dkms autoinstall \$NAME/\$VERSION"
warn " sudo modprobe daedalus_v4l2" exit 0
fi
failed=''
for k in \$kvers; do
dkms autoinstall -k "\$k" "\$NAME/\$VERSION" >/dev/null 2>&1 || true
s=\$(dkms status -m "\$NAME" -v "\$VERSION" -k "\$k" 2>/dev/null || true)
if ! printf '%s\\n' "\$s" | grep -q -E 'installed|loaded'; then
failed="\$failed \$k"
fi
done
if [ -n "\$failed" ]; then
warn "" warn ""
warn "Until then daedalus_v4l2 will NOT be loadable and the" warn "DKMS build did NOT land for kernel(s):\$failed"
warn "userspace daedalus-v4l2 daemon will have nothing to talk to." warn ""
warn "Most likely cause: kernel headers missing for those versions."
warn " Raspberry Pi OS / Pi 5: apt install linux-headers-rpi-2712"
warn " Debian generic: apt install linux-headers-<version>"
warn ""
warn "After installing headers, finish with:"
for k in \$failed; do
warn " sudo dkms autoinstall -k \$k \$NAME/\$VERSION"
done
warn " sudo modprobe daedalus_v4l2 (after booting that kernel)"
warn ""
warn "Until then daedalus_v4l2 will NOT be loadable on those kernels"
warn "and the userspace daedalus-v4l2 daemon will have nothing to talk to."
fi fi
fi fi
+25
View File
@@ -1,3 +1,28 @@
daedalus-v4l2-dkms (0.1.0+r24+gf0d4186-2) bookworm trixie; urgency=medium
* postinst: autoinstall for every installed kernel with headers, not
just the running one. Previously `dkms autoinstall $NAME/$VERSION`
built only against `$(uname -r)`, so installing the package on
kernel A and then rebooting into a separately-installed kernel B
left /lib/modules/B/updates/dkms/ empty — /dev/daedalus-v4l2 absent,
daedalus daemon nothing to talk to, browser/VAAPI silently falling
back to software with no obvious diagnostic. Now we enumerate every
/lib/modules/*/build that resolves to a real directory and run
`dkms autoinstall -k <kver>` for each, reporting per-kernel failure
only when headers are missing. Closes #64.
-- Markus Fritsche <mfritsche@reauktion.de> Thu, 21 May 2026 09:30:00 +0000
daedalus-v4l2-dkms (0.1.0+r24+gf0d4186-1) bookworm trixie; urgency=medium
* Bump to f0d4186 — per-ctx vb2 lock fix. daedalus_queue_init now
uses ctx->vb_mutex instead of ctx->dev->m2m_lock for each
vb2_queue's lock, unblocking Firefox's multi-process VAAPI
clients (they were colliding on the device-wide mutex and one
would EBUSY-fail S_FMT while another was mid-streamon).
-- Markus Fritsche <mfritsche@reauktion.de> Wed, 20 May 2026 23:00:00 +0000
daedalus-v4l2-dkms (0.1.0+r22+g462aa4b-1) bookworm trixie; urgency=medium daedalus-v4l2-dkms (0.1.0+r22+g462aa4b-1) bookworm trixie; urgency=medium
* Bump to 462aa4b — kernel device_run() now calls * Bump to 462aa4b — kernel device_run() now calls
+2 -2
View File
@@ -15,8 +15,8 @@ set -euo pipefail
# end-to-end via libva (consumer target hit)" — first commit where the # end-to-end via libva (consumer target hit)" — first commit where the
# full ffmpeg -hwaccel vaapi → libva → /dev/video0 → daemon path lands # full ffmpeg -hwaccel vaapi → libva → /dev/video0 → daemon path lands
# a pixel-correct decoded frame back in ffmpeg. # a pixel-correct decoded frame back in ffmpeg.
UPSTREAM_COMMIT=462aa4b4804972189d2f1b1ab5782f1ca1e8c423 UPSTREAM_COMMIT=f0d41867f60f5bf8dbfcc6cc16404d7d7eb90014
PKGVER=0.1.0+r22+g462aa4b PKGVER=0.1.0+r24+gf0d4186
PKGREL=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth) PKGREL=1 # reset for new upstream pin (3dd0eb0 — DAEMON-PPS H.264 SPS/PPS NAL synth)
HERE=$(dirname "$(readlink -f "$0")") HERE=$(dirname "$(readlink -f "$0")")
+19
View File
@@ -1,3 +1,22 @@
daedalus-v4l2 (0.1.0+r24+gf0d4186-1) bookworm trixie; urgency=medium
* Bump to f0d4186 — kernel per-ctx vb2 lock fix. daedalus_queue_init
was wiring src_vq->lock and dst_vq->lock to ctx->dev->m2m_lock (a
device-wide mutex), serialising every vb2 ioctl across all
concurrent clients of /dev/video0. For Firefox (which spawns
separate content + RDD + GPU processes that each open the device
and run libva probe simultaneously), one libva session's
S_FMT(OUTPUT_MPLANE) hit EBUSY while another was mid-streamon —
Firefox VAAPI playback fell apart at startup.
* Fix gives each open() its own ctx->vb_mutex; vb2 ioctls run
independently per client. Matches cedrus / rkvdec / hantro
pattern.
* Verified on higgs: Firefox YouTube playback engages VAAPI cleanly,
sustained ~230 fps decode at 640x368 through the daedalus daemon,
zero EBUSY in stderr or daemon journal.
-- Markus Fritsche <mfritsche@reauktion.de> Wed, 20 May 2026 23:00:00 +0000
daedalus-v4l2 (0.1.0+r22+g462aa4b-1) bookworm trixie; urgency=medium daedalus-v4l2 (0.1.0+r22+g462aa4b-1) bookworm trixie; urgency=medium
* Bump to 462aa4b — kernel-side fix for control-binding gap that * Bump to 462aa4b — kernel-side fix for control-binding gap that
+15 -14
View File
@@ -10,21 +10,22 @@
# Upstream fork: https://git.reauktion.de/marfrit/libva-v4l2-request-fourier # Upstream fork: https://git.reauktion.de/marfrit/libva-v4l2-request-fourier
set -euo pipefail set -euo pipefail
# Same pin as the Arch PKGBUILD. c1bb444 = PR #9 merge "h264: # Same pin as the Arch PKGBUILD. 77f9236 = PR #12 merge "av1:
# max_num_ref_frames fallback + libva-boundary instrumentation (#8)" — # populate V4L2_CID_STATELESS_AV1_SEQUENCE in codec_set_controls
# addresses the libva-side portion of marfrit/libva-v4l2-request-fourier#8. # (#11 libva side)" — adds src/av1.{c,h} with av1_set_controls that
# The daedalus_v4l2-via-libavcodec strict consumer rejected frames whose # maps VAAPI's VAPictureParameterBufferAV1.seq_info_fields onto
# sps.max_num_ref_frames was 0 (older ffmpeg-vaapi paths leave the field # struct v4l2_ctrl_av1_sequence and queues V4L2_CID_STATELESS_AV1_
# unset and HW decoders tolerated it). PR adds a per-profile spec # SEQUENCE via S_EXT_CTRLS. The daedalus_v4l2 daemon track is the
# minimum fallback (counts valid DPB entries first; 1 for baseline / 4 # consumer that turns the ctrl into an OBU_SEQUENCE_HEADER and
# for main+high if even that is 0) and a one-line request_log at # prepends it to the slice bitstream so libdav1d can parse the
# h264_set_controls entry dumping raw VAAPI bitfields for diagnosing # (sequence-header-stripped) OUTPUT buffer that ffmpeg-vaapi
# the still-open PPS-flag-zero portion of issue #8. # delivers.
# #
# Prior pin (9898331) was the LIBVA-2 close — config-side # Prior pin (c1bb444) = PR #9 merge — h264_set_controls
# video_fd_daedalus added to the profile enumeration probe array. # max_num_ref_frames fallback + libva-boundary instrumentation for
UPSTREAM_COMMIT=c1bb444d0731ca7ca831c7e01ec4b52ed736ca8e # the daedalus consumer-strict path (issue #8 libva side).
PKGVER=1.0.0+r382+gc1bb444 UPSTREAM_COMMIT=77f92364661419f6e5a7bd827c1b845b4e426569
PKGVER=1.0.0+r386+g77f9236
PKGREL=1 PKGREL=1
HERE=$(dirname "$(readlink -f "$0")") HERE=$(dirname "$(readlink -f "$0")")