From a0e0d123b24c7206c6f872115787db1790de8638 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Tue, 19 May 2026 10:12:36 +0200 Subject: [PATCH] =?UTF-8?q?fourier-debian:=20Path=20A=20=E2=80=94=20ffmpeg?= =?UTF-8?q?=20into=20/opt/fourier=20prefix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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//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. --- debian/daedalus-v4l2/build-deb.sh | 4 +- .../ffmpeg-v4l2-request-fourier/build-deb.sh | 90 ++++++++++++++----- 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/debian/daedalus-v4l2/build-deb.sh b/debian/daedalus-v4l2/build-deb.sh index 915375a6b..301ec02ae 100755 --- a/debian/daedalus-v4l2/build-deb.sh +++ b/debian/daedalus-v4l2/build-deb.sh @@ -17,7 +17,7 @@ set -euo pipefail # a pixel-correct decoded frame back in ffmpeg. UPSTREAM_COMMIT=f55b2cdab8a8c0bc04e8c1bb1d0b6ca85e7d96d2 PKGVER=0.1.0+r16+gf55b2cd -PKGREL=1 +PKGREL=2 # pkgrel=2 — Depends on ffmpeg-v4l2-request-fourier (Path A SONAME .so.62) HERE=$(dirname "$(readlink -f "$0")") @@ -81,7 +81,7 @@ Version: ${PKGVER}-${PKGREL} Section: video Priority: optional Architecture: arm64 -Depends: ffmpeg (>= 7.1), libdrm2 +Depends: ffmpeg-v4l2-request-fourier (>= 2:8.1+rfourier), libdrm2 Recommends: daedalus-v4l2-dkms Maintainer: Markus Fritsche Homepage: https://git.reauktion.de/reauktion/daedalus-v4l2 diff --git a/debian/ffmpeg-v4l2-request-fourier/build-deb.sh b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh index 4b708faa3..03e315829 100755 --- a/debian/ffmpeg-v4l2-request-fourier/build-deb.sh +++ b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh @@ -8,14 +8,18 @@ # mpv-fourier (and the kdirect bit-exact reference test rig) work # end-to-end without a stock-Debian FFmpeg fallback. # -# Conflicts: ffmpeg, libav* — this is a drop-in replacement. Pi 5 / -# CM5 (BCM2712) hosts using daedalus_v4l2 + libva-v4l2-request-fourier -# DON'T strictly need this package (stock Debian ffmpeg + libva path -# is sufficient for the VAAPI route), but the kdirect bit-exact -# reference + firefox-fourier / mpv-fourier consumers do. +# **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.61 + libavformat.so.61 etc. +# 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. # @@ -29,7 +33,7 @@ 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=1 +PKGREL=2 # pkgrel=2 — Path A move to /opt/fourier prefix (2026-05-19) HERE=$(dirname "$(readlink -f "$0")") @@ -60,10 +64,15 @@ patch -Np1 -i "$HERE/0002-nv15-to-p010-unpack.patch" # JACK, GSM, Speex) — not needed on the Fourier fleet, keeps the .deb # smaller and the dependency graph tighter. ./configure \ - --prefix=/usr \ - --libdir=/usr/lib/aarch64-linux-gnu \ - --shlibdir=/usr/lib/aarch64-linux-gnu \ - --incdir=/usr/include/aarch64-linux-gnu \ + --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 \ @@ -104,7 +113,23 @@ make tools/qt-faststart # Stage ROOT="$work/pkgroot" make DESTDIR="$ROOT" install -install -Dm755 tools/qt-faststart "$ROOT/usr/bin/qt-faststart" +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" < Homepage: https://github.com/Kwiboo/FFmpeg -Description: FFmpeg with V4L2 Request API hwaccel (Kwiboo fork) +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. @@ -167,11 +182,40 @@ Description: FFmpeg with V4L2 Request API hwaccel (Kwiboo fork) 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"