daemon: shadow_decoder wiring (PR-Q3a.1) #25
Reference in New Issue
Block a user
Delete Branch "noether/daemon-shadow-decoder-wiring"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Toolchain plumbing for the upcoming daedalus-decoder shadow-mode path. Production behaviour is unchanged.
What lands here
libdaedalus_decoder.avia pkg-config (depends on thedaedalus-decoder.pcshipped by daedalus-decoder#17, merged today). Static archive — no .so dependency change in the daemon's link map.ffmpeg_loaderresolvesff_h264_set_mb_inspect_cbNULL-tolerantly. Stock libavcodec lacks the symbol (logged as INFO at startup); the marfrit-packagesffmpeg-v4l2-request-fourierfork's0016-h264-mb-inspect-callback.patchexports it. Shadow path activates only when both envDAEDALUS_SHADOW_MODE=1AND the symbol resolves.shadow_decoder.[ch]:shadow_decoder_create()gates on env + symbol presence, returnsNULLin production state (the common case).shadow_decoder_install_cb()registers a per-MB callback on the H.264AVCodecContext; a lazily-createddaedalus_decodercontext picks up dimensions from the first observedAVFrame.shadow_decoder_on_frame()logs per-frame MB-observed count.decoder.cstays clean of conditionals.decoder.{c,h}grow astruct shadow_decoder *shadowfield ondaedalus_decoder. Install hook fires once per H.264 codec open; frame hook fires after each successfulavcodec_receive_frame.What stays out
PR-Q3a.1 scope ENDS at the callback counting MBs. No
daedalus_decoder_append_mborflush_frameyet. Real-coeffs + edges extraction needs the patched FFmpeg source-tree headers (DAEDALUS_FFMPEG_SRC) to introspectH264Contextinternals — that lands in PR-Q3a.2.dejavucheck (architectural)This path is daedalus-decoder's frame-major UMA dispatch architecture (one cmdbuf per frame, one submit) running ALONGSIDE libavcodec's reference decode for validation. It is NOT per-kernel libavcodec function-pointer substitution. No new libavcodec patches; the existing 0016 callback is the only intercept point.
Verified on hertz
libdaedalus_decoder.alinked, no new .so dependencies.libavcodec lacks ff_h264_set_mb_inspect_cb (stock build, no daedalus-fourier 0016 patch) — shadow-mode unavailable.ffmpeg-v4l2-request-fourierrebuilt with patches 0016/0017 and deployed to hertz. Currently-installed release 10 predates them. Deployment task, separate from this PR.Followups
ffmpeg-v4l2-request-fourier.deb (release 11+) carrying patches 0016/0017 so the enabled-state shadow path is exercised on hertz.shadow_decoder.c(gated onDAEDALUS_FFMPEG_SRC).Toolchain plumbing for the upcoming daedalus-decoder shadow-mode path. Production behaviour is unchanged. What lands here: 1. CMake links libdaedalus_decoder via pkg-config. Static archive, so no .so dependency change in the daemon's link map. 2. ffmpeg_loader resolves ff_h264_set_mb_inspect_cb NULL-tolerantly. Stock libavcodec lacks the symbol (logged as INFO at startup); the marfrit-packages ffmpeg-v4l2-request-fourier fork's 0016 patch exports it. The shadow path activates only when both env DAEDALUS_SHADOW_MODE=1 AND the symbol resolves. 3. New shadow_decoder.[ch] module: - shadow_decoder_create() gates on env + symbol presence, returns NULL in production state (the common case). - shadow_decoder_install_cb() registers a per-MB callback on the H.264 AVCodecContext; lazily-created daedalus_decoder context will pick up dimensions from the first AVFrame. - shadow_decoder_on_frame() logs per-frame MB-observed count. Every entry point is NULL-safe so decoder.c stays clean of conditionals. 4. decoder.{c,h} grow a `struct shadow_decoder *shadow` field on daedalus_decoder. Install hook fires once per H.264 codec open; frame hook fires after each successful avcodec_receive_frame. PR-Q3a.1 scope ENDS here. The callback just counts MBs; no daedalus_decoder_append_mb or flush_frame yet. Real-coeffs / edges extraction needs the patched FFmpeg source-tree headers (DAEDALUS_FFMPEG_SRC) to introspect H264Context internals — that lands in PR-Q3a.2. dejavu-check: this path is daedalus-decoder's frame-major UMA dispatch architecture (one cmdbuf per frame, one submit) running alongside libavcodec's reference decode for validation. It is NOT per-kernel libavcodec function-pointer substitution. No new libavcodec patches; the existing 0016 callback is the only intercept point. Verified on hertz: - Build: clean, libdaedalus_decoder.a linked. - Disabled state (env unset OR symbol absent): no shadow log lines, daemon init continues normally, INFO logs "libavcodec lacks ff_h264_set_mb_inspect_cb (stock build, no daedalus-fourier 0016 patch) — shadow-mode unavailable". - Enabled state would require ffmpeg-v4l2-request-fourier .deb rebuilt with patches 0016/0017 deployed to hertz (current .deb release 10 predates them). That's a deployment task, separate from this PR. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>