11 Commits

Author SHA1 Message Date
marfrit b69db65037 libva-v4l2-request-fourier: bump pin to 2860d75 (#13 bounds-check fix)
Bumps both the Arch PKGBUILD and the Debian build-deb.sh pins to PR
#14 merge — codec_store_buffer bounds-checks for VASliceDataBufferType.
Picks up the SIGSEGV fix for mpv --hwdec=vaapi-copy on resolution
upshift mid-stream (issue #13).

Dual-pin so check-already-published.sh detects both pool ABIs as
needing a fresh build.
2026-05-21 12:19:04 +02:00
marfrit adcc824bf7 Merge pull request 'daedalus-v4l2-dkms: postinst — autoinstall for all installed kernels (#64)' (#65) from claude-noether/marfrit-packages:fix/daedalus-dkms-multi-kernel-64 into main
Reviewed-on: marfrit/marfrit-packages#65
2026-05-21 09:28:47 +00:00
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
9 changed files with 154 additions and 83 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;
+16 -17
View File
@@ -24,29 +24,28 @@ pkgname=libva-v4l2-request-fourier
epoch=1 epoch=1
_upstreampkg=libva-v4l2-request _upstreampkg=libva-v4l2-request
# Pin the fork tip. 77f9236 = PR #12 merge "av1: populate # Pin the fork tip. 2860d75 = PR #14 merge "picture: bounds-check
# V4L2_CID_STATELESS_AV1_SEQUENCE in codec_set_controls (#11 libva side)" # codec_store_buffer slice writes against source_size (#13)" — addresses
# — addresses the libva-side portion of marfrit/libva-v4l2-request-fourier#11. # marfrit/libva-v4l2-request-fourier#13. Guards the three append sites
# Adds src/av1.{c,h} with av1_set_controls that maps VAAPI's # in codec_store_buffer's VASliceDataBufferType branch (H.264 Annex-B
# VAPictureParameterBufferAV1.seq_info_fields onto struct # start code, VP8 uncompressed-header pad, slice payload) against the
# v4l2_ctrl_av1_sequence and queues V4L2_CID_STATELESS_AV1_SEQUENCE via # OUTPUT pool slot's fixed sizeimage; returns
# S_EXT_CTRLS. The daedalus_v4l2 daemon track is the consumer that turns # VA_STATUS_ERROR_ALLOCATION_FAILED with a request_log line instead of
# the ctrl into an OBU_SEQUENCE_HEADER and prepends it to the slice # memcpy'ing past the mmap on a resolution upshift mid-stream (SIGSEGV
# bitstream so libdav1d can parse the (sequence-header-stripped) OUTPUT # in mpv --hwdec=vaapi-copy, heap-corruption hazard in Firefox RDD).
# buffer that ffmpeg-vaapi delivers. Until the daemon side lands the ctrl # The root-cause refactor (re-init OUTPUT pool / re-create surfaces on
# is just sitting in the request unused — no-cost no-op for HW decoders # resolution change, or grow source_data on demand) is tracked as the
# (vpu981 parses OBU bytes directly). # follow-up backlog item; this PR is the memory-safety floor.
# #
# Prior pin (c1bb444) = PR #9 merge — h264_set_controls # Prior pin (77f9236) = PR #12 merge — av1_set_controls
# max_num_ref_frames fallback + libva-boundary instrumentation for the # (V4L2_CID_STATELESS_AV1_SEQUENCE for the daedalus daemon track).
# daedalus consumer-strict path (issue #8 libva side). _commit=2860d75afe6a8e34df6afb508ff85c822bf9e908
_commit=77f92364661419f6e5a7bd827c1b845b4e426569
# 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.r386.77f9236 pkgver=1.0.0.r388.2860d75
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
+16 -15
View File
@@ -10,22 +10,23 @@
# 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. 77f9236 = PR #12 merge "av1: # Same pin as the Arch PKGBUILD. 2860d75 = PR #14 merge "picture:
# populate V4L2_CID_STATELESS_AV1_SEQUENCE in codec_set_controls # bounds-check codec_store_buffer slice writes against source_size
# (#11 libva side)" — adds src/av1.{c,h} with av1_set_controls that # (#13)" — guards the three append sites in codec_store_buffer's
# maps VAAPI's VAPictureParameterBufferAV1.seq_info_fields onto # VASliceDataBufferType branch (H.264 Annex-B start code, VP8
# struct v4l2_ctrl_av1_sequence and queues V4L2_CID_STATELESS_AV1_ # uncompressed-header pad, slice payload) against the OUTPUT pool
# SEQUENCE via S_EXT_CTRLS. The daedalus_v4l2 daemon track is the # slot's fixed sizeimage; returns VA_STATUS_ERROR_ALLOCATION_FAILED
# consumer that turns the ctrl into an OBU_SEQUENCE_HEADER and # with a request_log line instead of memcpy'ing past the mmap on a
# prepends it to the slice bitstream so libdav1d can parse the # resolution upshift mid-stream. Fixes a SIGSEGV in mpv
# (sequence-header-stripped) OUTPUT buffer that ffmpeg-vaapi # --hwdec=vaapi-copy and a heap-corruption hazard in Firefox RDD.
# delivers. # The root-cause refactor (re-init OUTPUT pool / re-create surfaces
# on resolution change, or grow source_data on demand) is tracked
# as the follow-up backlog item; this is the memory-safety floor.
# #
# Prior pin (c1bb444) = PR #9 merge — h264_set_controls # Prior pin (77f9236) = PR #12 merge — av1_set_controls
# max_num_ref_frames fallback + libva-boundary instrumentation for # (V4L2_CID_STATELESS_AV1_SEQUENCE for the daedalus daemon track).
# the daedalus consumer-strict path (issue #8 libva side). UPSTREAM_COMMIT=2860d75afe6a8e34df6afb508ff85c822bf9e908
UPSTREAM_COMMIT=77f92364661419f6e5a7bd827c1b845b4e426569 PKGVER=1.0.0+r388+g2860d75
PKGVER=1.0.0+r386+g77f9236
PKGREL=1 PKGREL=1
HERE=$(dirname "$(readlink -f "$0")") HERE=$(dirname "$(readlink -f "$0")")