493c762967
Cycle 7 of the libavcodec.so substitution arc (reauktion/daedalus-v4l2#11 step 2). H264DSPContext.idct8_add — called per 8×8 block from the High-profile intra-8×8-DCT decode path in libavcodec/h264_mb.c — now dispatches through daedalus_recipe_dispatch_h264_idct8 instead of ff_h264_idct8_add_neon. ## What - Add 0004-h264-idct8-daedalus-fourier.patch (in both arch/ and debian/ ffmpeg-v4l2-request-fourier/). Extends libavcodec/aarch64/ h264_idct_daedalus.c (introduced by 0003) with ff_h264_idct8_add_daedalus and a daedalus_recipe_dispatch_h264_idct8 call; patches libavcodec/aarch64/h264dsp_init_aarch64.c to wire c->idct8_add to the new shim. - arch/PKGBUILD + debian/build-deb.sh: append the new patch to the apply list; bump pkgrel/PKGREL to 7. - No new build-deps, no Depends change, no daedalus-fourier rev — the d87239d pin already exposes daedalus_recipe_dispatch_h264_idct8. ## Why The recipe layer picks the substrate; for cycle 7 (H.264 IDCT 8×8) the recipe is CPU NEON, so this is effectively a NEON-to-NEON substitution layered on top of cycle 6. Production validation of cycle 6 on higgs Firefox YouTube: 3040 frames decoded cleanly, avg_decode_us=3388 (no regression vs the pre-substitution ~4 ms baseline). Cycle 7 inherits the same shim's pthread_once context. Bit-exact against ff_h264_idct8_add_neon (daedalus-fourier cycle 7 green; FFmpeg 8×8 block storage block[r + 8*c] matches daedalus column-major convention). ## Scope NOT covered (deferred) - Bulk c->idct8_add4 (inter 8×8-DCT macroblocks) stays on the in-tree NEON .S code; batched substitution with n_blocks>1 lands later alongside the cycle-6 bulk-paths work. - High-bit-depth (10-bit) path untouched. - Cycles 8/9 — separate PRs. ## SONAME Unchanged. libavcodec.so.62 / libavformat.so.62 / libavutil.so.60. ## Refs - reauktion/daedalus-v4l2 issue #11 (substitution arc): reauktion/daedalus-v4l2#11 - marfrit-packages PR #76 (cycle 6 IDCT 4×4) - marfrit-packages PR #78 (libxml2 ABI-skew workaround) - marfrit/daedalus-fourier cycle 7 close (H.264 IDCT 8×8 NEON green)
262 lines
9.7 KiB
Bash
Executable File
262 lines
9.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Build ffmpeg-v4l2-request-fourier_<ver>_arm64.deb (the Kwiboo FFmpeg
|
|
# fork with the V4L2-Request API hwaccel patches).
|
|
#
|
|
# Mirror of arch/ffmpeg-v4l2-request-fourier into the Debian tree.
|
|
# Provides the patched `ffmpeg` + `ffprobe` binaries plus the shared
|
|
# libav* libraries with v4l2-request support, so consumers like
|
|
# mpv-fourier (and the kdirect bit-exact reference test rig) work
|
|
# end-to-end without a stock-Debian FFmpeg fallback.
|
|
#
|
|
# **Private prefix /opt/fourier** (Path A per fourier-debian
|
|
# architecture discussion 2026-05-19). Stock Debian trixie ships
|
|
# FFmpeg 7.1.x = libavcodec.so.61; this package ships FFmpeg 8.1 =
|
|
# libavcodec.so.62 — different SOVERSION, NOT a drop-in for trixie's
|
|
# KDE/VLC/etc. Living in /opt/fourier/lib keeps the stock system
|
|
# intact; only fourier-aware consumers (firefox-fourier, mpv-fourier,
|
|
# daedalus-v4l2) RPATH into /opt/fourier/lib. Postinst drops an
|
|
# ld.so.conf.d entry so dlopen-based consumers (firefox at runtime)
|
|
# find the libs by SONAME without LD_LIBRARY_PATH wrappers.
|
|
#
|
|
# Big build: 25-40 min on a runner. Output is a single .deb that
|
|
# bundles ffmpeg/ffprobe + libavcodec.so.62 + libavformat.so.62 etc.
|
|
# all together — no split per-library subpackages. Easier to consume,
|
|
# trades off finer-grained downgrades.
|
|
#
|
|
# Sibling Arch package: ../../arch/ffmpeg-v4l2-request-fourier/PKGBUILD
|
|
# Upstream: https://github.com/Kwiboo/FFmpeg (branch v4l2-request-n8.1)
|
|
set -euo pipefail
|
|
|
|
# Same pin as arch/ — v4l2-request-n8.1 tip 2026-04-24.
|
|
UPSTREAM_COMMIT=b57fbbe50c9b2656fad86a1a7eeabfd2b2a50935
|
|
FFMPEG_VERSION=8.1
|
|
# epoch 2 matches Debian's stock ffmpeg (currently 7:7.1.x in trixie);
|
|
# +rfourier suffix to avoid colliding with upstream/Debian rebuilds.
|
|
PKGVER=2:${FFMPEG_VERSION}+rfourier+gb57fbbe
|
|
PKGREL=7 # pkgrel=7 — H.264 IDCT 8x8 daedalus-fourier substitution
|
|
# (cycle 7). Stacks on top of cycle-6 IDCT 4x4 (PR #76) and
|
|
# the libxml2-drop ABI-skew workaround (PR #78). Wires
|
|
# H264DSPContext.idct8_add through
|
|
# daedalus_recipe_dispatch_h264_idct8. (2026-05-22)
|
|
|
|
# daedalus-fourier pin — first kernel substitution in libavcodec (cycle 6
|
|
# H.264 IDCT 4x4). Same SHA as the daedalus-v4l2 daemon already ships
|
|
# inline; rev in lockstep with the daemon when the public API rolls.
|
|
DAEDALUS_FOURIER_COMMIT=d87239d8172307d9a1b93c95cbed116d175b85cc
|
|
|
|
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"
|
|
git clone --depth 1 \
|
|
--branch v4l2-request-n8.1 \
|
|
https://github.com/Kwiboo/FFmpeg.git FFmpeg
|
|
cd FFmpeg
|
|
# git fetch the specific commit (depth=1 of branch tip might not be it)
|
|
if [ "$(git rev-parse HEAD)" != "$UPSTREAM_COMMIT" ]; then
|
|
git fetch origin "$UPSTREAM_COMMIT"
|
|
git checkout "$UPSTREAM_COMMIT"
|
|
fi
|
|
|
|
# Apply patches (same as Arch).
|
|
patch -Np1 -i "$HERE/0001-libudev-bypass-fallback.patch"
|
|
patch -Np1 -i "$HERE/0002-nv15-to-p010-unpack.patch"
|
|
patch -Np1 -i "$HERE/0003-h264-idct4-daedalus-fourier.patch"
|
|
patch -Np1 -i "$HERE/0004-h264-idct8-daedalus-fourier.patch"
|
|
|
|
# --- daedalus-fourier: fetch + build static .a with PIC, install to a
|
|
# per-build prefix; libavcodec.so links it into the shared object so
|
|
# H264DSPContext.idct_add (and follow-up kernels) dispatch through the
|
|
# daedalus recipe layer instead of the in-tree NEON .S code. ---
|
|
#
|
|
# PIC is mandatory — the static .a is linked into a .so, so all object
|
|
# code must be relocatable. Vulkan is PUBLIC-linked by daedalus_core
|
|
# (queryable QPU substrate); we add libvulkan1 to Debian Depends below
|
|
# so dlopen of libavcodec.so.62 succeeds on stock trixie.
|
|
FOURIER_PREFIX=$work/fourier-prefix
|
|
mkdir -p "$FOURIER_PREFIX"
|
|
|
|
pushd "$work" >/dev/null
|
|
curl --connect-timeout 10 --max-time 600 --retry 3 --retry-delay 5 -sSLfo daedalus-fourier.tar.gz \
|
|
"https://git.reauktion.de/marfrit/daedalus-fourier/archive/${DAEDALUS_FOURIER_COMMIT}.tar.gz"
|
|
tar xzf daedalus-fourier.tar.gz
|
|
pushd daedalus-fourier >/dev/null
|
|
cmake -B build -G Ninja \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
|
-DCMAKE_INSTALL_PREFIX="$FOURIER_PREFIX"
|
|
cmake --build build --target daedalus_core
|
|
cmake --install build
|
|
popd >/dev/null
|
|
popd >/dev/null
|
|
cd "$work/FFmpeg"
|
|
|
|
# Configure with Arch-parity flags. Drops the same set of features
|
|
# (X11, AMF, CUDA, FireWire, AviSynth, Bluray, OpenMPT, JPEG-XL,
|
|
# Theora, XVid, rsvg, soxr, ssh, vidstab, modplug, SDL2, Vulkan,
|
|
# JACK, GSM, Speex) — not needed on the Fourier fleet, keeps the .deb
|
|
# smaller and the dependency graph tighter.
|
|
./configure \
|
|
--prefix=/opt/fourier \
|
|
--bindir=/opt/fourier/bin \
|
|
--libdir=/opt/fourier/lib \
|
|
--shlibdir=/opt/fourier/lib \
|
|
--incdir=/opt/fourier/include \
|
|
--datadir=/opt/fourier/share/ffmpeg \
|
|
--mandir=/opt/fourier/share/man \
|
|
--extra-ldexeflags='-Wl,-rpath,/opt/fourier/lib' \
|
|
--extra-ldsoflags='-Wl,-rpath,/opt/fourier/lib' \
|
|
--extra-cflags="-I${FOURIER_PREFIX}/include" \
|
|
--extra-ldflags="-L${FOURIER_PREFIX}/lib" \
|
|
--extra-libs="-ldaedalus_core -lvulkan -lpthread" \
|
|
--disable-debug \
|
|
--disable-static \
|
|
--disable-doc \
|
|
--disable-stripping \
|
|
--enable-shared \
|
|
--enable-gpl \
|
|
--enable-version3 \
|
|
--enable-pic \
|
|
--enable-neon \
|
|
--arch=aarch64 \
|
|
--enable-libdrm \
|
|
--enable-libv4l2 \
|
|
--enable-libudev \
|
|
--enable-v4l2-request \
|
|
--enable-v4l2_m2m \
|
|
--enable-vaapi \
|
|
--enable-opengl \
|
|
--enable-gnutls \
|
|
--enable-fontconfig \
|
|
--enable-libass \
|
|
--enable-libfreetype \
|
|
--enable-libfribidi \
|
|
--enable-libpulse \
|
|
--enable-libdav1d \
|
|
--enable-libopus \
|
|
--enable-libvorbis \
|
|
--enable-libmp3lame \
|
|
--enable-libvpx \
|
|
--enable-libx264 \
|
|
--enable-libx265 \
|
|
--enable-libwebp \
|
|
--host-cflags='-fPIC'
|
|
|
|
make -j"$(nproc)"
|
|
make tools/qt-faststart
|
|
|
|
# Stage
|
|
ROOT="$work/pkgroot"
|
|
make DESTDIR="$ROOT" install
|
|
install -Dm755 tools/qt-faststart "$ROOT/opt/fourier/bin/qt-faststart"
|
|
|
|
# ld.so.conf.d entry so dlopen-based consumers (firefox-fourier at
|
|
# runtime) find /opt/fourier/lib/libavcodec.so.62 by SONAME without an
|
|
# LD_LIBRARY_PATH wrapper. No risk of contaminating stock binaries:
|
|
# stock KDE/VLC link against libavcodec.so.61 (different SONAME), so
|
|
# the loader never sees our .so.62 as a match for their .so.61.
|
|
install -Dm644 /dev/stdin "$ROOT/etc/ld.so.conf.d/fourier.conf" <<EOF
|
|
# fourier campaign: FFmpeg 8.1 fork + libVA fork in private prefix.
|
|
/opt/fourier/lib
|
|
EOF
|
|
|
|
# Optional /usr/bin shims so users can call ffmpeg-fourier without
|
|
# remembering the /opt path. No conflict with stock /usr/bin/ffmpeg.
|
|
install -d "$ROOT/usr/bin"
|
|
ln -sf /opt/fourier/bin/ffmpeg "$ROOT/usr/bin/ffmpeg-fourier"
|
|
ln -sf /opt/fourier/bin/ffprobe "$ROOT/usr/bin/ffprobe-fourier"
|
|
|
|
# Doc
|
|
mkdir -p "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier" "$ROOT/DEBIAN"
|
|
install -Dm644 "$HERE/debian/copyright" \
|
|
"$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/copyright"
|
|
install -Dm644 "$HERE/debian/changelog" \
|
|
"$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/changelog.Debian"
|
|
gzip -9 -n "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/changelog.Debian"
|
|
|
|
cat > "$ROOT/DEBIAN/control" <<EOF
|
|
Package: ffmpeg-v4l2-request-fourier
|
|
Version: ${PKGVER}-${PKGREL}
|
|
Section: video
|
|
Priority: optional
|
|
Architecture: arm64
|
|
Depends: libc6,
|
|
libdrm2,
|
|
libvulkan1,
|
|
libfontconfig1,
|
|
libfreetype6,
|
|
libfribidi0,
|
|
libpulse0,
|
|
libdav1d7 | libdav1d6,
|
|
libopus0,
|
|
libvorbis0a,
|
|
libvorbisenc2,
|
|
libmp3lame0,
|
|
libvpx9 | libvpx8 | libvpx7,
|
|
libx264-164 | libx264-163,
|
|
libx265-215 | libx265-209 | libx265-199,
|
|
libwebp7 | libwebp6,
|
|
libwebpmux3,
|
|
libass9,
|
|
libgnutls30,
|
|
libudev1,
|
|
libv4l-0,
|
|
libva2,
|
|
libva-drm2
|
|
Maintainer: Markus Fritsche <mfritsche@reauktion.de>
|
|
Homepage: https://github.com/Kwiboo/FFmpeg
|
|
Description: FFmpeg with V4L2 Request API hwaccel (Kwiboo fork, /opt/fourier prefix)
|
|
FFmpeg ${FFMPEG_VERSION} patched with the V4L2 Request API stateless
|
|
video decoder hwaccel — Kwiboo's long-running rebase of Jernej
|
|
Škrabec's v4l2-request patchset onto FFmpeg release tags.
|
|
.
|
|
Provides 'ffmpeg -hwaccel v4l2request' / '-hwaccel drm' routes that
|
|
drive rkvdec / hantro / cedrus / rpi-hevc-dec / daedalus_v4l2
|
|
stateless decoders directly through libavcodec's hwdevice DRM path,
|
|
bypassing libva. Used by mpv-fourier and firefox-fourier as their
|
|
backing FFmpeg, and as the kdirect bit-exact reference in libva-v4l2-
|
|
request-fourier validation.
|
|
.
|
|
INSTALLED TO /opt/fourier (NOT /usr): this is FFmpeg 8.1 (libav*.so.62)
|
|
sitting alongside Debian trixie's stock FFmpeg 7.1 (libav*.so.61) —
|
|
different SONAMEs, no symbol clash. Consumer binaries RPATH into
|
|
/opt/fourier/lib; ld.so.conf.d/fourier.conf adds the path to ld.so
|
|
cache for dlopen-by-SONAME (firefox). /usr/bin/ffmpeg-fourier and
|
|
/usr/bin/ffprobe-fourier are convenience symlinks to /opt/fourier/bin.
|
|
Stock 'ffmpeg' command unaffected.
|
|
.
|
|
Drops X11/AMF/CUDA/Bluray/JACK/Vulkan/SDL2/Theora/XVid/Speex/JPEG-XL
|
|
per Fourier fleet policy (Wayland + ARM + video-decode focus).
|
|
No 'ffplay' binary; mpv-fourier covers interactive playback.
|
|
EOF
|
|
|
|
# ldconfig must be re-run after install so /opt/fourier/lib is in the cache.
|
|
cat > "$ROOT/DEBIAN/postinst" <<'PEOF'
|
|
#!/bin/sh
|
|
set -e
|
|
if [ "$1" = "configure" ]; then
|
|
ldconfig
|
|
fi
|
|
#DEBHELPER#
|
|
PEOF
|
|
chmod 755 "$ROOT/DEBIAN/postinst"
|
|
|
|
cat > "$ROOT/DEBIAN/postrm" <<'PEOF'
|
|
#!/bin/sh
|
|
set -e
|
|
if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then
|
|
ldconfig
|
|
fi
|
|
#DEBHELPER#
|
|
PEOF
|
|
chmod 755 "$ROOT/DEBIAN/postrm"
|
|
|
|
DEB_OUT="ffmpeg-v4l2-request-fourier_${PKGVER//:/%3a}-${PKGREL}_arm64.deb"
|
|
dpkg-deb --root-owner-group --build "$ROOT" "$HERE/$DEB_OUT"
|
|
echo "built: $HERE/$DEB_OUT"
|