a0e0d123b2
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.
222 lines
7.8 KiB
Bash
Executable File
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"
|