forked from marfrit/marfrit-packages
f21c1ff80a
Lock-step bump of both packages to daedalus-v4l2#7 + #4. PROTO_VERSION bumps 0 → 1 at the daemon ↔ kernel chardev wire: REQ_DECODE adds __u64 src_pts (the OUTPUT vb2 timestamp); RESP_FRAME adds __u32 flags (HAS_PIXELS / SRC_CONSUMED) + __u64 output_src_pts (= frame->pts on drain). Both .debs must be installed atomically or the chardev handshake rejects the version mismatch. * daedalus-v4l2: daemon's send_packet → receive_frame loop now stamps pkt->pts = req->src_pts and looks up the cookie for each drained frame via frame->pts. chardev_client emits multiple RESP_FRAME messages per REQ_DECODE when libavcodec's display- order DPB releases an earlier frame on receipt of a later bitstream — fixes the "2 1 4 3 6 5" pair-swap on H.264 streams with B-frames. * daedalus-v4l2-dkms: kernel device_run mirrors src_buf timestamp into REQ_DECODE.src_pts. Completion path splits HAS_PIXELS / SRC_CONSUMED: src is released as soon as send_packet succeeds (so the m2m scheduler moves on), dst stays parked until the matching frame is drained later. TIMESTAMP_COPY's auto src→dst pairing no longer applies once lifecycles decouple — dst is stamped explicitly from inflight->src_pts at HAS_PIXELS time. * daedalus-v4l2-dkms also carries forward the -2 multi-kernel postinst fix (#64) from the prior PKGREL. PKGREL resets to 1 on the new upstream pin. The daedalus-v4l2#4 H.264 DECODE_MODE + START_CODE menu controls (a cosmetic warning fix that PR landed alongside #7) is also subsumed — "Unable to set control(s) error_idx=2/2" no longer fires. Refs: * reauktion/daedalus-v4l2#7 * reauktion/daedalus-v4l2#4 * reauktion/daedalus-v4l2#6
201 lines
6.9 KiB
Bash
Executable File
201 lines
6.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Build daedalus-v4l2-dkms_<ver>_all.deb (kernel module via DKMS).
|
|
#
|
|
# Installs kernel/ source tree to /usr/src/daedalus_v4l2-${PKGVER}/
|
|
# plus a dkms.conf. Postinst registers with DKMS (dkms add + build +
|
|
# install). Prerm deregisters. Result: the daedalus_v4l2 module
|
|
# auto-rebuilds against any installed kernel headers without users
|
|
# needing to remember to dkms-add it.
|
|
#
|
|
# Architecture: all. The kernel module itself is per-kernel-version,
|
|
# but the SOURCE package is arch-independent.
|
|
#
|
|
# Sibling Arch package: ../../arch/daedalus-v4l2-dkms/PKGBUILD
|
|
# Sibling userspace package: ../daedalus-v4l2/build-deb.sh
|
|
set -euo pipefail
|
|
|
|
UPSTREAM_COMMIT=79256dc7ef41f83873ca9c23db20f5888858e65d
|
|
PKGVER=0.1.0+r28+g79256dc
|
|
PKGREL=1 # reset for new upstream pin (79256dc — H.264 B-frame reorder fix); still carries the #64 multi-kernel postinst fix
|
|
MODULE_NAME=daedalus_v4l2
|
|
|
|
HERE=$(dirname "$(readlink -f "$0")")
|
|
|
|
# Reproducible build. 2026-05-18 23:00 UTC — Phase 8.13 close.
|
|
export SOURCE_DATE_EPOCH=1779231600
|
|
|
|
work=$(mktemp -d)
|
|
trap "rm -rf $work" EXIT
|
|
|
|
cd "$work"
|
|
curl --connect-timeout 10 --max-time 600 --retry 3 --retry-delay 5 -sSLfo daedalus-v4l2.tar.gz \
|
|
"https://git.reauktion.de/reauktion/daedalus-v4l2/archive/${UPSTREAM_COMMIT}.tar.gz"
|
|
tar xzf daedalus-v4l2.tar.gz
|
|
SRCDIR=daedalus-v4l2
|
|
|
|
ROOT="$work/pkgroot"
|
|
SRCROOT="$ROOT/usr/src/${MODULE_NAME}-${PKGVER}"
|
|
|
|
mkdir -p "$SRCROOT/include" \
|
|
"$ROOT/DEBIAN" \
|
|
"$ROOT/usr/share/doc/daedalus-v4l2-dkms"
|
|
|
|
# Copy kernel/ source files to the DKMS source dir.
|
|
cp -r "$work/$SRCDIR/kernel/." "$SRCROOT/"
|
|
|
|
# Embed the shared protocol header inline (rather than referencing
|
|
# ../include/ which doesn't exist after DKMS extracts the tree).
|
|
# Patch the Makefile to find it at $SRCROOT/include/ instead.
|
|
install -m 644 "$work/$SRCDIR/include/daedalus_v4l2_proto.h" \
|
|
"$SRCROOT/include/daedalus_v4l2_proto.h"
|
|
sed -i 's|-I\$(src)/\.\./include|-I$(src)/include|' "$SRCROOT/Makefile"
|
|
|
|
# Generate dkms.conf with the actual version substituted.
|
|
cat > "$SRCROOT/dkms.conf" <<EOF
|
|
PACKAGE_NAME="${MODULE_NAME}"
|
|
PACKAGE_VERSION="${PKGVER}"
|
|
|
|
BUILT_MODULE_NAME[0]="${MODULE_NAME}"
|
|
DEST_MODULE_LOCATION[0]="/updates"
|
|
|
|
MAKE[0]="make KERNELDIR=/lib/modules/\${kernelver}/build all"
|
|
CLEAN="make KERNELDIR=/lib/modules/\${kernelver}/build clean"
|
|
|
|
AUTOINSTALL="yes"
|
|
EOF
|
|
|
|
# Doc
|
|
install -m 644 "$work/$SRCDIR/README.md" \
|
|
"$ROOT/usr/share/doc/daedalus-v4l2-dkms/README.md"
|
|
install -Dm644 "$HERE/debian/copyright" "$ROOT/usr/share/doc/daedalus-v4l2-dkms/copyright"
|
|
install -Dm644 "$HERE/debian/changelog" "$ROOT/usr/share/doc/daedalus-v4l2-dkms/changelog.Debian"
|
|
gzip -9 -n "$ROOT/usr/share/doc/daedalus-v4l2-dkms/changelog.Debian"
|
|
|
|
# DKMS post-install / pre-remove hooks.
|
|
cat > "$ROOT/DEBIAN/postinst" <<EOF
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
NAME=${MODULE_NAME}
|
|
VERSION=${PKGVER}
|
|
|
|
# Yellow + bold ANSI for the warning so it stands out in apt's
|
|
# stream of "Setting up" lines. Disable colour on non-TTY.
|
|
if [ -t 1 ]; then
|
|
Y=\$(printf '\\033[1;33m'); R=\$(printf '\\033[0m')
|
|
else
|
|
Y=''; R=''
|
|
fi
|
|
|
|
warn() {
|
|
printf '%s==> daedalus-v4l2-dkms: %s%s\\n' "\$Y" "\$1" "\$R" >&2
|
|
}
|
|
|
|
if [ "\$1" = "configure" ]; then
|
|
if ! command -v dkms >/dev/null 2>&1; then
|
|
warn "dkms not installed; module \$NAME/\$VERSION not registered."
|
|
warn "Install 'dkms' then run: dkms add \$NAME/\$VERSION && dkms autoinstall"
|
|
exit 0
|
|
fi
|
|
|
|
dkms add "\$NAME/\$VERSION" 2>/dev/null || true
|
|
|
|
# Enumerate every kernel whose headers are actually present
|
|
# (/lib/modules/<kver>/build resolves to a directory). We iterate
|
|
# all of them — not just \$(uname -r) — so that installing this
|
|
# 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
|
|
|
|
if [ -z "\$kvers" ]; then
|
|
warn ""
|
|
warn "No kernels with headers found under /lib/modules/*/build."
|
|
warn "Install kernel headers (e.g. linux-headers-rpi-2712 on Pi OS)"
|
|
warn "then finish with:"
|
|
warn " sudo dkms autoinstall \$NAME/\$VERSION"
|
|
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 "DKMS build did NOT land for kernel(s):\$failed"
|
|
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
|
|
|
|
#DEBHELPER#
|
|
EOF
|
|
chmod 755 "$ROOT/DEBIAN/postinst"
|
|
|
|
cat > "$ROOT/DEBIAN/prerm" <<EOF
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
NAME=${MODULE_NAME}
|
|
VERSION=${PKGVER}
|
|
|
|
if [ "\$1" = "remove" ] && command -v dkms >/dev/null 2>&1; then
|
|
dkms remove "\$NAME/\$VERSION" --all || true
|
|
fi
|
|
|
|
#DEBHELPER#
|
|
EOF
|
|
chmod 755 "$ROOT/DEBIAN/prerm"
|
|
|
|
cat > "$ROOT/DEBIAN/control" <<EOF
|
|
Package: daedalus-v4l2-dkms
|
|
Version: ${PKGVER}-${PKGREL}
|
|
Section: kernel
|
|
Priority: optional
|
|
Architecture: all
|
|
Depends: dkms (>= 2.1.0.0)
|
|
Recommends: daedalus-v4l2, linux-headers-rpi-2712 | linux-headers-rpi | linux-headers-generic | linux-headers
|
|
Maintainer: Markus Fritsche <mfritsche@reauktion.de>
|
|
Homepage: https://git.reauktion.de/reauktion/daedalus-v4l2
|
|
Description: V4L2 stateless decoder shim kernel module (DKMS) — Pi 5 / CM5
|
|
Out-of-tree V4L2 m2m kernel module for the daedalus-v4l2 stack on
|
|
Raspberry Pi 5 / CM5. Registers /dev/videoNN (V4L2 stateless m2m
|
|
decoder), /dev/mediaNN (media controller with request API), and
|
|
/dev/daedalus-v4l2 (chardev bridge to the userspace daemon).
|
|
.
|
|
The actual decode happens in the userspace daemon shipped by the
|
|
daedalus-v4l2 package — this module is just the kernel-side V4L2
|
|
plumbing. Install both to actually serve VAAPI / V4L2 clients.
|
|
.
|
|
Built via DKMS against the running kernel's headers.
|
|
EOF
|
|
|
|
DEB_OUT="daedalus-v4l2-dkms_${PKGVER}-${PKGREL}_all.deb"
|
|
dpkg-deb --root-owner-group --build "$ROOT" "$HERE/$DEB_OUT"
|
|
echo "built: $HERE/$DEB_OUT"
|