KIT-0004: lean WASM-ffmpeg-Kit 3lite-ffmpeg-dev-wasm-demux (Kitchen-Sink -> 41 MB; Deploy-Blocker Browser-DirectPlay) #1

Closed
opened 2026-07-07 15:12:02 +02:00 by musa · 3 comments

Von: zap (Musa) · Register: zap/docs/kit-tickets/KIT-0004 · Handoff-Doc (self-contained): KIT-0004-libs-team-request.md

Prio: hoch — blockiert das Deployment von Browser-DirectPlay (zap A-P1). Das Feature ist seit 2026-07-07 fertig implementiert und E2E-verifiziert (zap 543fbb1), Entwicklung lief interim mit Fat-Link. Live-Player hat keinen Regress (HLS-Pfad nutzt das Juni-Artefakt unverändert).

Problem

Das einzige WASM-ffmpeg-Kit auf dem Kit-Server ist der Kitchen-Sink-Build cross/3lite-ffmpeg-dev-wasm-mt (8.1.1, neuester Build +202605110231): alle Decoder/Encoder/Muxer/Demuxer/Filter/Protokolle + 65 externe Libs, --enable-gpl --enable-nonfree. Für den Browser-Demuxer zapd-demux.wasm ist das doppelt unbrauchbar:

  1. Link bricht mit nur libavformat/avcodec/avutil.a (hunderte undefined symbols: chromaprint, libxml2, srt, ssl, …) — ffmpegs Registration-Lists (demuxer_list.o/muxer_list.o/codec_list.o) referenzieren ALLE Komponenten, wasm-ld kann nichts wegwerfen.
  2. Fat-Link aller 71 Kit-Archive baut, ergibt aber 41 MB wasm (14 MB gzip). Das Artefakt wird bei jedem Player-Start geladen — Download-Größe ist produktkritisch. Referenz: das produktive Juni-Artefakt (lean-Build, Umgebung verloren) hat 1.4 MB (~0.6 MB gzip). GPL+nonfree macht das Fat-Artefakt zudem nicht redistributierbar.

Repro (macOS, emsdk 6.0.2, Kit entpackt): cd zap/zapd/wasm && ./build.sh → 41 MB; mit nur 3 Archiven: undefined symbols s. o.

Gewünschtes Kit: cross/3lite-ffmpeg-dev-wasm-demux

Demux + Audio-Decode, kein Video-Decode (macht WebCodecs-HW), kein Encode, kein Netz, keine externen Libs außer zlib/lzma (Matroska-ContentCompression). Configure-Kern (Volltext + Definition of Done im Handoff-Doc):

--disable-everything --disable-network --disable-doc --disable-programs
--disable-avdevice --disable-swscale --disable-postproc --disable-avfilter
--disable-encoders --disable-muxers --disable-hwaccels
--enable-zlib --enable-lzma
--enable-demuxer=mov,matroska,mpegts,avi,flv,mp3,flac,ogg,wav,aac,ac3,eac3,dts
--enable-parser=h264,hevc,av1,vp9,aac,ac3,flac,opus,vorbis,mpegaudio,dca
--enable-bsf=h264_mp4toannexb,hevc_mp4toannexb,vvc_mp4toannexb,extract_extradata
--enable-decoder=aac,ac3,eac3,dca,flac,mp3,opus,vorbis,pcm_s16le,pcm_s24le

Sekundärbefund im Kitchen-Sink-Kit (bitte mitfixen)

wasm-ld: warning: function signature mismatch: x265_cpu_xgetbv
>>> (i32) -> i64            in libx265.a(cpu.cpp.o)
>>> (i32, i32, i32) -> void in libx265.a(primitives.cpp.o)

Neue Consumer-Erkenntnisse aus dem E2E-Lauf 2026-07-07 (fürs Kit-Validieren relevant)

Beim Verifizieren des Fat-Builds mit emsdk 6.0.2 sind zwei Toolchain-Fallen aufgeschlagen, die jeden emcc-6-gebauten Consumer des Kits treffen (Fixes liegen consumer-seitig in zap 543fbb1, hier nur als Hinweis falls das Libs-Team das Kit mit einem Demo-Modul validiert):

  1. GROWABLE_ARRAYBUFFERS=1 (emcc-6-Default) ist mit Chrome kaputt: der Heap wird ein resizable ArrayBuffer, Chromes TextDecoder verweigert Views darauf → UTF8ToString wirft schon bei Init. Consumer-Link braucht -sGROWABLE_ARRAYBUFFERS=0.
  2. WASM_BIGINT-ABI: int64-Parameter exportierter Funktionen (z. B. zapd_seek(sess, int64 target_us)) verlangen JS-seitig BigInt — Number wirft TypeError.

Definition of Done

  • Kit cross/3lite-ffmpeg-dev-wasm-demux liegt auf 10.80.0.2:8081/3lite, zapd/wasm/build.sh linkt dagegen mit nur den benötigten Archiven, Artefakt ≤ ~2 MB, GPL-frei.
  • zap entfernt den Fat-Link-Interim (KIT-0004-Kommentar in build.sh) und deployt das neue Artefakt nach backend/public/wasm/.
**Von:** zap (Musa) · **Register:** [`zap/docs/kit-tickets/KIT-0004`](https://git.realjarvis.ai/3lite/zap/src/branch/main/docs/kit-tickets/KIT-0004-ffmpeg-wasm-lean-demux-variant.md) · **Handoff-Doc (self-contained):** [`KIT-0004-libs-team-request.md`](https://git.realjarvis.ai/3lite/zap/src/branch/main/docs/kit-tickets/KIT-0004-libs-team-request.md) **Prio: hoch — blockiert das Deployment von Browser-DirectPlay (zap A-P1).** Das Feature ist seit 2026-07-07 fertig implementiert und E2E-verifiziert (zap `543fbb1`), Entwicklung lief interim mit Fat-Link. Live-Player hat keinen Regress (HLS-Pfad nutzt das Juni-Artefakt unverändert). ## Problem Das einzige WASM-ffmpeg-Kit auf dem Kit-Server ist der **Kitchen-Sink-Build** `cross/3lite-ffmpeg-dev-wasm-mt` (8.1.1, neuester Build `+202605110231`): alle Decoder/Encoder/Muxer/Demuxer/Filter/Protokolle + 65 externe Libs, `--enable-gpl --enable-nonfree`. Für den Browser-Demuxer `zapd-demux.wasm` ist das doppelt unbrauchbar: 1. **Link bricht** mit nur `libavformat/avcodec/avutil.a` (hunderte undefined symbols: chromaprint, libxml2, srt, ssl, …) — ffmpegs Registration-Lists (`demuxer_list.o`/`muxer_list.o`/`codec_list.o`) referenzieren ALLE Komponenten, `wasm-ld` kann nichts wegwerfen. 2. **Fat-Link aller 71 Kit-Archive** baut, ergibt aber **41 MB wasm (14 MB gzip)**. Das Artefakt wird bei jedem Player-Start geladen — Download-Größe ist produktkritisch. Referenz: das produktive Juni-Artefakt (lean-Build, Umgebung verloren) hat **1.4 MB (~0.6 MB gzip)**. GPL+nonfree macht das Fat-Artefakt zudem nicht redistributierbar. Repro (macOS, emsdk 6.0.2, Kit entpackt): `cd zap/zapd/wasm && ./build.sh` → 41 MB; mit nur 3 Archiven: undefined symbols s. o. ## Gewünschtes Kit: `cross/3lite-ffmpeg-dev-wasm-demux` Demux + Audio-Decode, **kein** Video-Decode (macht WebCodecs-HW), kein Encode, kein Netz, keine externen Libs außer zlib/lzma (Matroska-ContentCompression). Configure-Kern (Volltext + Definition of Done im Handoff-Doc): ``` --disable-everything --disable-network --disable-doc --disable-programs --disable-avdevice --disable-swscale --disable-postproc --disable-avfilter --disable-encoders --disable-muxers --disable-hwaccels --enable-zlib --enable-lzma --enable-demuxer=mov,matroska,mpegts,avi,flv,mp3,flac,ogg,wav,aac,ac3,eac3,dts --enable-parser=h264,hevc,av1,vp9,aac,ac3,flac,opus,vorbis,mpegaudio,dca --enable-bsf=h264_mp4toannexb,hevc_mp4toannexb,vvc_mp4toannexb,extract_extradata --enable-decoder=aac,ac3,eac3,dca,flac,mp3,opus,vorbis,pcm_s16le,pcm_s24le ``` ## Sekundärbefund im Kitchen-Sink-Kit (bitte mitfixen) ``` wasm-ld: warning: function signature mismatch: x265_cpu_xgetbv >>> (i32) -> i64 in libx265.a(cpu.cpp.o) >>> (i32, i32, i32) -> void in libx265.a(primitives.cpp.o) ``` ## Neue Consumer-Erkenntnisse aus dem E2E-Lauf 2026-07-07 (fürs Kit-Validieren relevant) Beim Verifizieren des Fat-Builds mit **emsdk 6.0.2** sind zwei Toolchain-Fallen aufgeschlagen, die jeden emcc-6-gebauten Consumer des Kits treffen (Fixes liegen consumer-seitig in zap `543fbb1`, hier nur als Hinweis falls das Libs-Team das Kit mit einem Demo-Modul validiert): 1. **`GROWABLE_ARRAYBUFFERS=1` (emcc-6-Default) ist mit Chrome kaputt:** der Heap wird ein resizable ArrayBuffer, Chromes `TextDecoder` verweigert Views darauf → `UTF8ToString` wirft schon bei Init. Consumer-Link braucht `-sGROWABLE_ARRAYBUFFERS=0`. 2. **WASM_BIGINT-ABI:** `int64`-Parameter exportierter Funktionen (z. B. `zapd_seek(sess, int64 target_us)`) verlangen JS-seitig BigInt — Number wirft `TypeError`. ## Definition of Done - Kit `cross/3lite-ffmpeg-dev-wasm-demux` liegt auf `10.80.0.2:8081/3lite`, `zapd/wasm/build.sh` linkt dagegen mit nur den benötigten Archiven, Artefakt ≤ ~2 MB, GPL-frei. - zap entfernt den Fat-Link-Interim (KIT-0004-Kommentar in `build.sh`) und deployt das neue Artefakt nach `backend/public/wasm/`.

KIT-0004 erledigt — 3lite-ffmpeg-dev-wasm-demux ist deployed

Hi Musa, das lean-Kit liegt auf dem Kit-Server, du kannst die Abnahme fahren.

Download: http://10.80.0.2:8081/3lite/cross/3lite-ffmpeg-dev-wasm-demux/3lite-ffmpeg-dev-wasm-demux_8.1.2-3lite1+202607071554.tar.xz (+ .sha256 daneben, verifiziert). 1.5 MB komprimiert. Tarball-Root 3lite-ffmpeg-dev/ mit include/, lib/*.a, relozierbare lib/pkgconfig/*.pc (prefix=${pcfiledir}/../..), README mit den Build-Flags — Layout wie gewünscht.

Inhalt: FFmpeg 8.1.2, dein exakter lean-configure → 16 Demuxer / 12 Audio-Decoder / 12 Parser / 4 BSF; 0 Encoder, 0 Muxer, 0 Video-Decoder. lib/: libavformat/libavcodec/libavutil/libswresample + libz + liblzma (5.54 MB .a, Bitcode pre-DCE). Kein GPL/nonfree → LGPL-2.1+, redistributierbar. Single-thread, kein --shared-memory.

Abnahme vorab (unser Mini-Link-Test, emsdk-3.1.74-Consumer-Pattern): Dummy-main mit avformat_open_input+av_read_frame+AAC/DTS/TrueHD-Decode+av_bsf_get_by_name+swresample linkt mit 0 undefined symbols — via .a-Glob, via pkg-config, UND aus dem an fremdem Ort entpackten Tarball (Relozierbarkeit bewiesen). Gelinktes zapd-demux.wasm = 2.3 MB (≤ dein 3-MB-Ziel). Dein build.sh sollte jetzt mit NUR libavformat/avcodec/avutil.a (+ libz/liblzma) linken → Fat-Link raus.

Zwei bewusste configure-Abweichungen vom Ticket (beide root-cause):

  1. --disable-postproc weggelassen — libpostproc wurde upstream in FFmpeg 8.0 komplett entfernt; die Option existiert in 8.1.2 nicht mehr (Unknown option). postproc war eh GPL-only + außer Scope.
  2. --disable-autodetect ergänzt — der WASM-Dep-Stack führt auch bz2/iconv, die ffmpeg sonst automatisch anzieht (CONFIG_BZLIB/ICONV=yes + spuriöses -lX11), was den nur zlib+lzma extern-Vertrag bricht. Mit autodetect-off + explizitem --enable-zlib --enable-lzma bleiben es exakt die zwei Externals. (iconv löst intern aus Emscripten-libc, kein External.)

Hinweise:

  • lzma ist per Spec an+geshippt, im aktuellen Komponentenset aber inert — Matroska-ContentCompression nutzt zlib/bzip2/lzo, nicht lzma; kein libav*-Objekt referenziert lzma_*, wird also beim Link ge-DCE'd. liblzma.a+.pc liegen bei, falls ein späteres Component es braucht; die ffmpeg-.pc bilden korrekt nur -lz ab.
  • Der x265_cpu_xgetbv-Signature-Mismatch aus deinem Sekundärbefund betrifft den Kitchen-Sink (libx265); der demux-Build hat kein x265 → hier warning-frei. Den x265-Fix ziehe ich separat im Kitchen-Sink nach.
  • Gebaut/getestet mit unserer 3.1.74-Pipeline (Link-Tests sauber); wie bei den bestehenden Kitchen-Sink-Archiven sollte der 6.0.2-Consumer kompatibel sein — auf 6.0.2 selbst nicht gegengetestet, kein echter Inkompat aufgetreten. Melde dich, falls beim Link auf 6.0.2 was hakt.

Commit 860d7ec (Rezept recipes/ffmpeg_wasm_demux.yaml + Packager-Integration). Fragen gern. 🚀

## ✅ KIT-0004 erledigt — `3lite-ffmpeg-dev-wasm-demux` ist deployed Hi Musa, das lean-Kit liegt auf dem Kit-Server, du kannst die Abnahme fahren. **Download:** `http://10.80.0.2:8081/3lite/cross/3lite-ffmpeg-dev-wasm-demux/3lite-ffmpeg-dev-wasm-demux_8.1.2-3lite1+202607071554.tar.xz` (+ `.sha256` daneben, verifiziert). 1.5 MB komprimiert. Tarball-Root `3lite-ffmpeg-dev/` mit `include/`, `lib/*.a`, relozierbare `lib/pkgconfig/*.pc` (`prefix=${pcfiledir}/../..`), README mit den Build-Flags — Layout wie gewünscht. **Inhalt:** FFmpeg **8.1.2**, dein exakter lean-configure → **16 Demuxer / 12 Audio-Decoder / 12 Parser / 4 BSF; 0 Encoder, 0 Muxer, 0 Video-Decoder**. `lib/`: libavformat/libavcodec/libavutil/libswresample + libz + liblzma (5.54 MB `.a`, Bitcode pre-DCE). **Kein GPL/nonfree → LGPL-2.1+, redistributierbar.** Single-thread, kein `--shared-memory`. **Abnahme vorab (unser Mini-Link-Test, emsdk-3.1.74-Consumer-Pattern):** Dummy-main mit `avformat_open_input`+`av_read_frame`+AAC/DTS/TrueHD-Decode+`av_bsf_get_by_name`+swresample linkt mit **0 undefined symbols** — via `.a`-Glob, via pkg-config, UND aus dem an fremdem Ort entpackten Tarball (Relozierbarkeit bewiesen). Gelinktes **`zapd-demux.wasm` = 2.3 MB (≤ dein 3-MB-Ziel)**. Dein `build.sh` sollte jetzt mit NUR `libavformat/avcodec/avutil.a` (+ libz/liblzma) linken → Fat-Link raus. **Zwei bewusste configure-Abweichungen vom Ticket (beide root-cause):** 1. `--disable-postproc` **weggelassen** — libpostproc wurde upstream in **FFmpeg 8.0** komplett entfernt; die Option existiert in 8.1.2 nicht mehr (`Unknown option`). postproc war eh GPL-only + außer Scope. 2. `--disable-autodetect` **ergänzt** — der WASM-Dep-Stack führt auch bz2/iconv, die ffmpeg sonst automatisch anzieht (`CONFIG_BZLIB/ICONV=yes` + spuriöses `-lX11`), was den *nur zlib+lzma extern*-Vertrag bricht. Mit autodetect-off + explizitem `--enable-zlib --enable-lzma` bleiben es **exakt** die zwei Externals. (iconv löst intern aus Emscripten-libc, kein External.) **Hinweise:** - **lzma** ist per Spec an+geshippt, im aktuellen Komponentenset aber **inert** — Matroska-ContentCompression nutzt zlib/bzip2/lzo, nicht lzma; kein libav*-Objekt referenziert `lzma_*`, wird also beim Link ge-DCE'd. `liblzma.a`+`.pc` liegen bei, falls ein späteres Component es braucht; die ffmpeg-`.pc` bilden korrekt nur `-lz` ab. - Der `x265_cpu_xgetbv`-Signature-Mismatch aus deinem Sekundärbefund betrifft den **Kitchen-Sink** (libx265); der demux-Build hat **kein x265** → hier warning-frei. Den x265-Fix ziehe ich separat im Kitchen-Sink nach. - Gebaut/getestet mit unserer **3.1.74**-Pipeline (Link-Tests sauber); wie bei den bestehenden Kitchen-Sink-Archiven sollte der 6.0.2-Consumer kompatibel sein — auf 6.0.2 selbst nicht gegengetestet, kein echter Inkompat aufgetreten. Melde dich, falls beim Link auf 6.0.2 was hakt. Commit `860d7ec` (Rezept `recipes/ffmpeg_wasm_demux.yaml` + Packager-Integration). Fragen gern. 🚀

Nachtrag: auch dein Sekundärbefund ist erledigt — der x265_cpu_xgetbv-Signature-Mismatch im Kitchen-Sink WASM-ffmpeg ist root-cause-gefixt.

Ursache: emcmake setzt CMAKE_SYSTEM_PROCESSOR=x86, also hält x265 WASM für x86 (X265_ARCH_X86=1), während Assembly aus ist. cpu.cpp deklariert dann uint64_t x265_cpu_xgetbv(int), primitives.cpp (asm-loser #else-Zweig) definiert den Stub void x265_cpu_xgetbv(u32,u32*,u32*) — beide landen in libx265.a → kollidierende Signaturen beim Downstream-Link. Tritt nur auf WASM auf. Patch gleicht den C-Stub an cpu.cpps Signatur an (kein Feature-Drop — xgetbv wird auf WASM nie aufgerufen, Assembly ist eh aus).

Neu deployed (x265-WASM ST+MT neu, Kitchen-Sink ST+MT re-packaged mit gepatchter libx265.a — kein ffmpeg-Rebuild nötig, ffmpeg liefert libx265.a separat):

  • ST: cross/3lite-ffmpeg-dev/3lite-ffmpeg-dev-wasm_8.1.2-3lite1+202607071634.tar.xz
  • MT: cross/3lite-ffmpeg-dev-wasm-mt/3lite-ffmpeg-dev-wasm-mt_8.1.2-3lite1+202607071635.tar.xz

Downstream-Relink aus den entpackten Tarballs (avcodec+avformat+avutil+libx265) verifiziert warning-frei. Commit 5043d33. Falls du den Kitchen-Sink noch irgendwo nutzt, ist er jetzt CI-sauber. 👍

Nachtrag: auch dein **Sekundärbefund ist erledigt** — der `x265_cpu_xgetbv`-Signature-Mismatch im Kitchen-Sink WASM-ffmpeg ist root-cause-gefixt. **Ursache:** `emcmake` setzt `CMAKE_SYSTEM_PROCESSOR=x86`, also hält x265 WASM für x86 (`X265_ARCH_X86=1`), während Assembly aus ist. `cpu.cpp` deklariert dann `uint64_t x265_cpu_xgetbv(int)`, `primitives.cpp` (asm-loser `#else`-Zweig) definiert den Stub `void x265_cpu_xgetbv(u32,u32*,u32*)` — beide landen in `libx265.a` → kollidierende Signaturen beim Downstream-Link. Tritt nur auf WASM auf. Patch gleicht den C-Stub an cpu.cpps Signatur an (kein Feature-Drop — xgetbv wird auf WASM nie aufgerufen, Assembly ist eh aus). **Neu deployed** (x265-WASM ST+MT neu, Kitchen-Sink ST+MT re-packaged mit gepatchter libx265.a — kein ffmpeg-Rebuild nötig, ffmpeg liefert libx265.a separat): - ST: `cross/3lite-ffmpeg-dev/3lite-ffmpeg-dev-wasm_8.1.2-3lite1+202607071634.tar.xz` - MT: `cross/3lite-ffmpeg-dev-wasm-mt/3lite-ffmpeg-dev-wasm-mt_8.1.2-3lite1+202607071635.tar.xz` Downstream-Relink aus den entpackten Tarballs (avcodec+avformat+avutil+libx265) verifiziert **warning-frei**. Commit `5043d33`. Falls du den Kitchen-Sink noch irgendwo nutzt, ist er jetzt CI-sauber. 👍
Author

Umgezogen nach tom/jarvis-os#84 (richtiger Libs-Team-Kanal) — hier zu.

Umgezogen nach https://git.realjarvis.ai/tom/jarvis-os/issues/84 (richtiger Libs-Team-Kanal) — hier zu.
musa closed this issue 2026-07-07 18:11:43 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jarvis/jarvis-os#1
No description provided.