Files
marfrit-packages/debian/ffmpeg-v4l2-request-fourier/build-deb.sh
T
test0r a0e0d123b2 fourier-debian: Path A — ffmpeg into /opt/fourier prefix
Stock Debian trixie ships FFmpeg 7.1 (libavcodec.so.61), our fork
ships FFmpeg 8.1 (libavcodec.so.62) — different SONAMEs, NOT a
drop-in for trixie's libavcodec61-consuming desktop.  Previous
Conflicts: libavcodec61, libavformat61, ... triggered apt to remove
~50 packages (kde-plasma-desktop, vlc, dolphin, ...) when a user
just wanted ffmpeg-v4l2-request-fourier installed alongside.

This commit:

1. ffmpeg-v4l2-request-fourier (pkgrel=2):
   - --prefix=/opt/fourier (instead of /usr)
   - --extra-ldexeflags / --extra-ldsoflags: -Wl,-rpath,/opt/fourier/lib
     so /opt/fourier/bin/ffmpeg finds its own libs without external help
   - Ship /etc/ld.so.conf.d/fourier.conf with /opt/fourier/lib + ldconfig
     in postinst/postrm.  dlopen-by-SONAME consumers (firefox, daedalus)
     find libavcodec.so.62 via ld.so cache without LD_LIBRARY_PATH.
   - Drop ALL Conflicts/Replaces/Provides for libav* / libpostproc /
     libsw* — no SONAME clash with stock libavcodec61, no reason to
     evict anything.
   - /usr/bin/ffmpeg-fourier + ffprobe-fourier convenience symlinks.

2. daedalus-v4l2 (pkgrel=2):
   - Depends: ffmpeg-v4l2-request-fourier (>= 2:8.1+rfourier)
     instead of stock 'ffmpeg (>= 7.1)'.  The daedalus binary was
     linked against libavcodec.so.62 at build time (CI runner had
     marfrit/ffmpeg-v4l2-request-fourier installed); at runtime it
     needs the .so.62 that only the fourier pkg provides.

Not touched:
  - libva-v4l2-request-fourier: ships only v4l2_request_drv_video.so
    at /usr/lib/<triplet>/dri/ which libva dlopens by file pattern.
    Path A would break the lookup unless every consumer launcher sets
    LIBVA_DRIVERS_PATH.  Driver name is unique; no conflict.  STAY.
  - mpv-fourier: Depends already correctly bound to fourier ffmpeg.
    Will receive libavcodec.so.62 via the ld.so.cache mechanism
    above without recipe changes.
2026-05-19 10:12:36 +02:00

222 lines
7.8 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=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" <<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,
libfontconfig1,
libfreetype6,
libfribidi0,
libxml2,
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"