From 514da29a7394a5be06436d9719d55b6ffd08cbfb Mon Sep 17 00:00:00 2001 From: claude-noether Date: Thu, 21 May 2026 21:19:24 +0200 Subject: [PATCH] daemon: dlopen Kwiboo fork's libavcodec.so.62 / libavformat.so.62 / libavutil.so.60 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch the daemon's runtime dlopen targets from Debian-stock soname 61/61/59 (FFmpeg 7.1.3) to the Kwiboo fourier fork's soname 62/62/60 (FFmpeg 8.1) installed at the /opt/fourier prefix. Why --- The substitution arc tracked at daedalus-v4l2#11 needs daedalus- fourier kernel calls woven into libavcodec's H264DSPContext NEON init (replacing ff_h264_idct_add_neon etc. with thunks calling daedalus_recipe_dispatch_h264_*). We do that via patches in the ffmpeg-v4l2-request-fourier package source — which we own, in marfrit-packages, alongside the existing libudev-bypass and nv15-to-p010 patches. But that package builds the Kwiboo fork at soname 62 / /opt/fourier. The daemon currently dlopens soname 61 (Debian-stock + a separately-built +fourier2 patch that isn't in marfrit-packages' source tree), so substitution patches there wouldn't reach the daemon. Switching to soname 62 routes the daemon through the package we control — first step toward landing daedalus-fourier kernel substitution into the production decode path. Compat ------ - /opt/fourier libs are already on every host running the daemon (hard build-dep of ffmpeg-v4l2-request-fourier). Firefox-fourier and mpv-fourier already dlopen them via the same path. - /etc/ld.so.conf.d/fourier.conf entry resolves the new sonames from /opt/fourier/lib via the ld cache; dlopen-by-soname works without LD_LIBRARY_PATH wrappers. - Build-side: daemon's pkg_check_modules picks up libav*.pc from /opt/fourier/lib/pkgconfig when PKG_CONFIG_PATH includes that directory (build-deb.sh follow-up will set it). - API surface unchanged: avcodec_send_packet / receive_frame / AVCodecContext flags / AVFrame fields are all stable between FFmpeg 7.1 and 8.1. Verified clean cross-compile on hertz. Wire protocol unchanged. No kmod bump. Next step (follow-up PRs) ------------------------- 1. ffmpeg-v4l2-request-fourier patch: add 0003-daedalus-fourier- substitute-h264-idct4.patch that replaces ff_h264_idct_add_neon in libavcodec/aarch64/h264dsp_init_aarch64.c with a thunk calling daedalus_recipe_dispatch_h264_idct4. 2. Repeat for IDCT 8×8, deblock luma-v, qpel mc20 (one kernel per PR for reviewability; bench delta + decode_us delta documented per substitution). 3. marfrit-packages bump to pick up the new daemon + the substituted fourier package. --- daemon/src/ffmpeg_loader.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/daemon/src/ffmpeg_loader.c b/daemon/src/ffmpeg_loader.c index d32ba91..4b9f940 100644 --- a/daemon/src/ffmpeg_loader.c +++ b/daemon/src/ffmpeg_loader.c @@ -11,14 +11,31 @@ #include /* - * SONAME versions match Debian Trixie / FFmpeg 7.1.3 today. If - * the system FFmpeg changes major, the daemon needs a rebuild; - * we could add fallback paths (.so.60, .so.59, ...) but for - * Phase 8.3 the pinned version is fine. + * SONAME versions match the Kwiboo ffmpeg-v4l2-request-fourier + * fork (FFmpeg 8.1) installed at the /opt/fourier prefix. The + * fourier campaign's ld.so.conf.d/fourier.conf entry resolves + * these sonames from /opt/fourier/lib via the ld cache, so + * dlopen-by-soname works without LD_LIBRARY_PATH wrappers. + * + * Switched from Debian-stock soname 61/61/59 (FFmpeg 7.1.3) at + * 2026-05-21 to land daedalus-fourier kernel substitution into + * the production decode path via patches in the Kwiboo fork + * (see daedalus-v4l2#11 substitution arc): we own the fork + * source in marfrit-packages, so we can layer NEON-DSP + * substitution patches there for libavcodec/aarch64/h264dsp_init + * → daedalus_recipe_dispatch_* thunks. The Debian-stock 7.1.3 + * is built outside the marfrit-packages source tree, which + * would have made layering substitution patches awkward. + * + * Note: libavutil bumps soname 59 → 60 between FFmpeg 7.1 and + * 8.1; libavformat + libavcodec each bump 61 → 62. The public + * API surface the daemon uses (avcodec_send_packet / + * receive_frame / AVCodecContext flags / AVFrame fields) is + * stable across the bump. */ -#define LIBAVFORMAT_SONAME "libavformat.so.61" -#define LIBAVCODEC_SONAME "libavcodec.so.61" -#define LIBAVUTIL_SONAME "libavutil.so.59" +#define LIBAVFORMAT_SONAME "libavformat.so.62" +#define LIBAVCODEC_SONAME "libavcodec.so.62" +#define LIBAVUTIL_SONAME "libavutil.so.60" /* * Resolve a symbol from a dlopen'd handle. Logs the failure