#!/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=2 # pkgrel=2 — Path A move to /opt/fourier prefix (2026-05-19) 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" # 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' \ --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-libxml2 \ --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"