#!/bin/bash # Build ffmpeg-v4l2-request-fourier__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=10 # pkgrel=10 — H.264 luma qpel mc20 daedalus-fourier substitution # (cycle 9 of the daedalus-v4l2#11 step 2 substitution arc; closes # the libavcodec.so substitution sequence 6 IDCT4 / 7 IDCT8 / # 8 luma-v deblock / 9 qpel mc20). Pulls daedalus-fourier PR #2 # which extends the public API with # daedalus_recipe_dispatch_h264_qpel_mc20. (2026-05-23) # daedalus-fourier pin. 209a421 = daedalus-fourier PR #2 merge — public # API now exposes daedalus_recipe_dispatch_h264_qpel_mc20 + # DAEDALUS_KERNEL_H264_QPEL_MC20. Cycle 9 plumbs the last H.264 NEON # kernel through the recipe layer. Daemon-side build (debian/daedalus-v4l2) # can bump in a follow-up; this PR only changes the libavcodec.so consumer. DAEDALUS_FOURIER_COMMIT=b9f9ff2a89c068aea54dcb52b543afddad28311e # PR #25 — public chroma DC Hadamard 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" patch -Np1 -i "$HERE/0005-h264-deblock-luma-v-daedalus-fourier.patch" patch -Np1 -i "$HERE/0006-h264-restore-low-delay.patch" patch -Np1 -i "$HERE/0007-h264-qpel-mc20-daedalus-fourier.patch" patch -Np1 -i "$HERE/0008-h264-deblock-luma-h-daedalus-fourier.patch" patch -Np1 -i "$HERE/0009-h264-deblock-chroma-daedalus-fourier.patch" patch -Np1 -i "$HERE/0010-h264-deblock-luma-intra-daedalus-fourier.patch" patch -Np1 -i "$HERE/0011-h264-chroma-dc-hadamard-daedalus-fourier.patch" patch -Np1 -i "$HERE/0012-h264-qpel-rest-daedalus-fourier.patch" patch -Np1 -i "$HERE/0013-h264-deblock-chroma-intra-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" < "$ROOT/DEBIAN/control" < 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"