From 25610930ad06cb9fd42ef085c6074713a1d4bae8 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Tue, 26 May 2026 15:38:03 +0200 Subject: [PATCH] ffmpeg-v4l2-request-fourier: export ff_h264_set_mb_inspect_cb (0016 amend, PKGREL 15) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 0016 patch declared ff_h264_set_mb_inspect_cb in h264dec.h and defined it in h264_mb.c, but didn't touch libavcodec/libavcodec.v. FFmpeg's default version script exports only `av_*`, `avcodec_*`, `avpriv_*`, and `avsubtitle_free`; everything else is hidden as LOCAL behind a `*` glob. Result: `nm -D libavcodec.so.62 | grep ff_h264_set_mb_inspect_cb` returned nothing → dlsym() returned NULL. Static-link CLI consumer (daedalus_decode_h264) was unaffected because static linking doesn't care about symbol visibility. The daedalus-v4l2 daemon shadow_decoder path (PR-Q3a.1) dlopens libavcodec.so.62 and resolves the callback via dlsym — that needs the symbol exported. Fix: add ff_h264_set_mb_inspect_cb to the global list in libavcodec/libavcodec.v. Single-line addition to the 0016 patch. Mirrored across the arch/ + debian/ patch trees. PKGREL bump 14 → 15, changelog entry added (debian side). PKGBUILD pkgrel bumped on arch side too. No behaviour change to the decode path: the callback is still opt-in via the H264Context function pointer; only consumers that have explicitly installed a callback pay the one-load-one-branch cost per MB. dejavu-check: this is fixing the existing 0016 observation-hook to actually work as a dlsym intercept (the architectural shape the patch was designed for). NOT adding new per-kernel substitution. Same shape, same patch number, same intent. Just hiding/exporting plumbing. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../0016-h264-mb-inspect-callback.patch | 25 ++++++++++++++++--- arch/ffmpeg-v4l2-request-fourier/PKGBUILD | 2 +- .../0016-h264-mb-inspect-callback.patch | 25 ++++++++++++++++--- .../ffmpeg-v4l2-request-fourier/build-deb.sh | 10 +++----- .../debian/changelog | 18 +++++++++++++ 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/arch/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch b/arch/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch index 22871dc4d6..71ff20d3c2 100644 --- a/arch/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch +++ b/arch/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch @@ -35,13 +35,20 @@ to fall through. Used by: - daedalus-decoder/tools/daedalus_decode_h264 (PR-A1b) - - future daedalus-v4l2 daemon refactor + - daedalus-v4l2 daemon shadow-mode path (PR-Q3a.1+) + +The CLI static-links libavcodec.a so symbol visibility doesn't matter +there. The daemon dlopens libavcodec.so.62 and resolves the callback +via dlsym, so the symbol MUST be exported — added to libavcodec.v +explicitly (FFmpeg's default version script hides every `ff_*` symbol +as LOCAL behind a glob). Refs reauktion/daedalus-decoder!12 (Stage 2 PR-b complete). --- - libavcodec/h264_mb.c | 20 ++++++++++++++++++++ - libavcodec/h264dec.h | 26 ++++++++++++++++++++++++++ - 2 files changed, 46 insertions(+) + libavcodec/h264_mb.c | 20 ++++++++++++++++++++ + libavcodec/h264dec.h | 26 ++++++++++++++++++++++++++ + libavcodec/libavcodec.v | 1 + + 3 files changed, 47 insertions(+) --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -113,3 +120,13 @@ Refs reauktion/daedalus-decoder!12 (Stage 2 PR-b complete). + h->mb_inspect_cb = cb; + h->mb_inspect_opaque = opaque; } +--- a/libavcodec/libavcodec.v ++++ b/libavcodec/libavcodec.v +@@ -3,6 +3,7 @@ + av_*; + avcodec_*; + avpriv_*; ++ ff_h264_set_mb_inspect_cb; + avsubtitle_free; + local: + *; diff --git a/arch/ffmpeg-v4l2-request-fourier/PKGBUILD b/arch/ffmpeg-v4l2-request-fourier/PKGBUILD index 6380351ac6..98bdab121d 100644 --- a/arch/ffmpeg-v4l2-request-fourier/PKGBUILD +++ b/arch/ffmpeg-v4l2-request-fourier/PKGBUILD @@ -24,7 +24,7 @@ _srcname=FFmpeg _version='8.1' _commit='b57fbbe50c9b2656fad86a1a7eeabfd2b2a50935' # v4l2-request-n8.1 tip 2026-04-24 pkgver=8.1.r123329.b57fbbe -pkgrel=14 # pkgrel=14 — per-MB coefficient side buffer (0017) extending 0016 for daedalus-decoder CLI IDCT validation; observation-only, no behaviour change to existing decode path +pkgrel=15 # pkgrel=15 — export ff_h264_set_mb_inspect_cb via libavcodec.v so dlsym consumers (daedalus-v4l2 daemon shadow_decoder, PR-Q3a.1) can resolve the symbol; static-link CLI was unaffected. No behaviour change to existing decode path. (2026-05-26) epoch=2 # daedalus-fourier pin. 209a421 = PR #2 merge (Phase 8c — public API diff --git a/debian/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch b/debian/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch index 22871dc4d6..71ff20d3c2 100644 --- a/debian/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch +++ b/debian/ffmpeg-v4l2-request-fourier/0016-h264-mb-inspect-callback.patch @@ -35,13 +35,20 @@ to fall through. Used by: - daedalus-decoder/tools/daedalus_decode_h264 (PR-A1b) - - future daedalus-v4l2 daemon refactor + - daedalus-v4l2 daemon shadow-mode path (PR-Q3a.1+) + +The CLI static-links libavcodec.a so symbol visibility doesn't matter +there. The daemon dlopens libavcodec.so.62 and resolves the callback +via dlsym, so the symbol MUST be exported — added to libavcodec.v +explicitly (FFmpeg's default version script hides every `ff_*` symbol +as LOCAL behind a glob). Refs reauktion/daedalus-decoder!12 (Stage 2 PR-b complete). --- - libavcodec/h264_mb.c | 20 ++++++++++++++++++++ - libavcodec/h264dec.h | 26 ++++++++++++++++++++++++++ - 2 files changed, 46 insertions(+) + libavcodec/h264_mb.c | 20 ++++++++++++++++++++ + libavcodec/h264dec.h | 26 ++++++++++++++++++++++++++ + libavcodec/libavcodec.v | 1 + + 3 files changed, 47 insertions(+) --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -113,3 +120,13 @@ Refs reauktion/daedalus-decoder!12 (Stage 2 PR-b complete). + h->mb_inspect_cb = cb; + h->mb_inspect_opaque = opaque; } +--- a/libavcodec/libavcodec.v ++++ b/libavcodec/libavcodec.v +@@ -3,6 +3,7 @@ + av_*; + avcodec_*; + avpriv_*; ++ ff_h264_set_mb_inspect_cb; + avsubtitle_free; + local: + *; diff --git a/debian/ffmpeg-v4l2-request-fourier/build-deb.sh b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh index d56a92c4f9..3e9ab3a792 100755 --- a/debian/ffmpeg-v4l2-request-fourier/build-deb.sh +++ b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh @@ -33,12 +33,10 @@ 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=14 # pkgrel=14 — per-MB coefficient side buffer (0017) extending 0016 for daedalus-decoder CLI IDCT validation; observation-only, no behaviour change to existing decode path - # (cycle 9 of the daedalus-v4l2#11 step 2 substitution arc; closes - # the libavcodec.so substitution sequence 6 IDCT4 / 7 IDCT8 / - # 8 luma-v deblock / 9 qpel mc20). Pulls daedalus-fourier PR #2 - # which extends the public API with - # daedalus_recipe_dispatch_h264_qpel_mc20. (2026-05-23) +PKGREL=15 # pkgrel=15 — export ff_h264_set_mb_inspect_cb via libavcodec.v so + # dlsym consumers (daedalus-v4l2 daemon shadow_decoder, PR-Q3a.1) + # can resolve the symbol; static-link CLI was unaffected. No + # behaviour change to existing decode path. (2026-05-26) # daedalus-fourier pin. 209a421 = daedalus-fourier PR #2 merge — public # API now exposes daedalus_recipe_dispatch_h264_qpel_mc20 + diff --git a/debian/ffmpeg-v4l2-request-fourier/debian/changelog b/debian/ffmpeg-v4l2-request-fourier/debian/changelog index 84c4bf51d8..4145f9ac73 100644 --- a/debian/ffmpeg-v4l2-request-fourier/debian/changelog +++ b/debian/ffmpeg-v4l2-request-fourier/debian/changelog @@ -1,3 +1,21 @@ +ffmpeg-v4l2-request-fourier (2:8.1+rfourier+gb57fbbe-15) bookworm trixie; urgency=medium + + * Amend 0016-h264-mb-inspect-callback.patch to also add + ff_h264_set_mb_inspect_cb to libavcodec/libavcodec.v so the + symbol is exported (GLOBAL) on the shipped libavcodec.so.62. + Without this, FFmpeg's default version script hides every ff_* + symbol behind a glob → LOCAL → dlsym() returns NULL. The CLI + consumer (daedalus_decode_h264) was unaffected because it + static-links libavcodec.a; the daedalus-v4l2 daemon (PR-Q3a.1 + shadow_decoder path) dlopens libavcodec.so.62 and needs the + symbol resolvable at runtime. + * No behaviour change to existing decode path. Callback is still + opt-in via the function pointer (NULL default), so paying the + one-load-one-branch cost only when a consumer has explicitly + installed an inspection callback. + + -- Markus Fritsche Tue, 26 May 2026 15:00:00 +0200 + ffmpeg-v4l2-request-fourier (2:8.1+rfourier+gb57fbbe-10) bookworm trixie; urgency=medium * Add 0007-h264-qpel-mc20-daedalus-fourier.patch —