feat: publish av-tools 0.2.0
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
# FFmpeg WebAssembly build record
|
||||
|
||||
av-tools ships the published ESM assets from `@ffmpeg/core` and
|
||||
`@ffmpeg/core-mt` **0.12.10**. The browser wrapper is `@ffmpeg/ffmpeg`
|
||||
**0.12.15** and helpers are `@ffmpeg/util` **0.12.2**. All versions are exact,
|
||||
not ranges.
|
||||
av-tools ships the locally rebuilt, reviewed core profile
|
||||
`0.12.10-reviewed-stack5m.1` in single-thread and multithread forms. The
|
||||
browser wrapper is `@ffmpeg/ffmpeg` **0.12.15** and helpers are
|
||||
`@ffmpeg/util` **0.12.2**. All versions and build inputs are exact, not ranges.
|
||||
|
||||
## Underlying build
|
||||
|
||||
The matching ffmpeg.wasm upstream release is `v12.15` at
|
||||
The base ffmpeg.wasm upstream release is `v12.15` at
|
||||
`71aa99d37c02a7b4c435275ca9ef50e612f6efa1`. Its Dockerfile selects:
|
||||
|
||||
- FFmpeg **n5.1.4** (libavcodec 59.37.100);
|
||||
@@ -15,6 +15,14 @@ The matching ffmpeg.wasm upstream release is `v12.15` at
|
||||
- production `-O3 -msimd128`;
|
||||
- pthread flags for the MT build and explicit thread disabling for ST.
|
||||
|
||||
The reviewed profile then applies upstream ffmpeg.wasm commit
|
||||
`b409e36475bc21f0451b5b1e1d126fa82871439a` to select a 5 MiB Emscripten stack.
|
||||
That upstream fix addresses the libopus zero-byte/out-of-bounds failures
|
||||
reported in issues `#591` and `#775`. The local driver additionally makes the
|
||||
upstream container-stage dependency isolation explicit, disables native x265
|
||||
assembly for the wasm32 build, bounds parallel jobs and refuses output that
|
||||
contains the maintainer's repository or SDK paths.
|
||||
|
||||
The build configuration embedded in both copied WASM files is:
|
||||
|
||||
```text
|
||||
@@ -35,8 +43,8 @@ The build configuration embedded in both copied WASM files is:
|
||||
--cxx=em++
|
||||
--objcc=emcc
|
||||
--dep-cc=emcc
|
||||
--extra-cflags='-I/opt/include -O3 -msimd128'
|
||||
--extra-cxxflags='-I/opt/include -O3 -msimd128'
|
||||
--extra-cflags='-I../../../../install/include -O3 -msimd128'
|
||||
--extra-cxxflags='-I../../../../install/include -O3 -msimd128'
|
||||
--enable-gpl
|
||||
--enable-libx264
|
||||
--enable-libx265
|
||||
@@ -76,16 +84,26 @@ respective branch tips. `SOURCE.md` records retrieval commands.
|
||||
|
||||
| Mode | File | Bytes | SHA-256 |
|
||||
| ---- | -------------------------- | -------: | ------------------------------------------------------------------ |
|
||||
| ST | `st/ffmpeg-core.js` | 111804 | `67a48f11645f85439f3fde4f2119042c16b374b910206b7a7a24f342e28dcae3` |
|
||||
| ST | `st/ffmpeg-core.wasm` | 32232419 | `9f57947a5bd530d8f00c5b3f2cb2a3492faa7e5d823315342d6a8656d0a6b7b7` |
|
||||
| MT | `mt/ffmpeg-core.js` | 128947 | `270a2e6ff945e173238610669a3f7132df5f9c52698a9bf708cf5c2ab6bda0de` |
|
||||
| MT | `mt/ffmpeg-core.wasm` | 32718323 | `be2c97605366b78f3f13e21b52e81a55a79e1f29c133b03a68ec187b1a2ec41a` |
|
||||
| ST | `st/ffmpeg-core.js` | 111804 | `80c05d79d0e4e9434977b76cb851d10ddf2bfd378570178700d2c43b8afdcb24` |
|
||||
| ST | `st/ffmpeg-core.wasm` | 32232580 | `fe41ddc77220cef6c04f5d48eeffcaaaef179ad270642e098f9945013aa0c9dc` |
|
||||
| MT | `mt/ffmpeg-core.js` | 128953 | `4f2650099ab70cb2583951c0421147c62bea6c18dfbba5cfae4d7698b5d0ab62` |
|
||||
| MT | `mt/ffmpeg-core.wasm` | 32718455 | `abbead010cb0448b26f01a36a3c8c03a6b04aca07812ddd4719a7f4b6bf4b645` |
|
||||
| MT | `mt/ffmpeg-core.worker.js` | 2115 | `f77898d631dc010b45c29c23cb4379c611a7d7b131bf591d08a656bb729a4ca3` |
|
||||
|
||||
`npm run vendor:ffmpeg` copies these files from `node_modules` to
|
||||
`public/vendor/ffmpeg/0.12.10/`; `npm run vendor:verify` checks versions,
|
||||
sizes, paths and digests. Vite then copies them unchanged into `dist`. A normal
|
||||
production build performs no network download.
|
||||
The deterministic five-file repository artifact is 21,338,974 bytes with
|
||||
SHA-256
|
||||
`ebc068c6d096de55ae3335b04b7121130665f5b0ffa7a828067122733f55185f`.
|
||||
|
||||
`npm run vendor:ffmpeg` verifies and unpacks the deterministic tracked core
|
||||
artifact to
|
||||
`public/vendor/ffmpeg/0.12.10-reviewed-stack5m.1/`;
|
||||
`npm run vendor:verify-runtime` checks the build profile,
|
||||
source/toolchain/patch identity, tracked artifact, generated paths, sizes and
|
||||
digests without requiring a release-directory download. The stricter
|
||||
`npm run vendor:verify` release gate also hashes the build-qualified
|
||||
Corresponding Source archive. Vite then copies the verified bytes into `dist`.
|
||||
A normal production build performs no network download and cannot fall back
|
||||
to the older published npm core bytes.
|
||||
|
||||
## Multithread Chromium guardrail
|
||||
|
||||
@@ -118,26 +136,42 @@ This is a conservative browser-memory guardrail, not a guarantee that sixteen
|
||||
large jobs or three large contact sheets fit in memory. Cancellation and
|
||||
failed filesystem-cleanup recovery continue to recreate the core immediately.
|
||||
|
||||
## Opus regression risk
|
||||
## Opus regression evidence
|
||||
|
||||
Pinned core 0.12.10 predates upstream ffmpeg.wasm fixes associated with stack
|
||||
size and Opus zero-byte/out-of-bounds failures (including upstream issues
|
||||
`#591` and `#775`). Therefore:
|
||||
Published core 0.12.10 predates the upstream stack-size fix and stalled in the
|
||||
real Opus preset path even though it advertised the `opus` muxer and
|
||||
`libopus` encoder. Capability discovery alone was therefore not accepted as
|
||||
enablement evidence.
|
||||
|
||||
- decoder/encoder listing is not enough to certify Opus;
|
||||
- real ST and MT fixture encodes must produce a non-empty, re-probeable output;
|
||||
- the Opus audio and VP9/Opus presets must remain disabled with a diagnostic
|
||||
if that smoke fails;
|
||||
- a core upgrade requires new checksums, capability snapshots, legal review
|
||||
and regression tests.
|
||||
On 2026-07-26 the Chromium harness used the checked
|
||||
`tests/fixtures/generated/tone.wav` fixture (32,102 bytes, SHA-256
|
||||
`0fd1f54d6be2f1cc7fd778775dd29cf184770d3716cf3394bf03ed54ac264c3c`)
|
||||
and the real built-in `audio-opus` preset/command planner. After rebuilding
|
||||
with the reviewed stack profile, the isolated ST and MT runs each:
|
||||
|
||||
This is a known pinned-core risk, not a claim that every Opus job fails.
|
||||
- loaded the requested mode rather than a fallback;
|
||||
- mapped PCM audio to `opus (libopus)`;
|
||||
- opened the declared Opus output and reported its libopus encoder;
|
||||
- returned non-empty bytes within its independent containment limit;
|
||||
- re-probed the result as positive-duration Opus audio.
|
||||
|
||||
```sh
|
||||
# Record JSON evidence.
|
||||
npm run evidence:opus
|
||||
|
||||
# Positive Opus enablement/release gate.
|
||||
npm run test:opus-regression
|
||||
```
|
||||
|
||||
The Opus audio and VP9/Opus presets are enabled only when the reviewed-core
|
||||
lock records both passing modes and runtime discovery finds every preset
|
||||
requirement. This is exact Chromium fixture evidence, not a claim about every
|
||||
browser, input or possible Opus build.
|
||||
|
||||
## Licence consequence
|
||||
|
||||
The core packages declare GPL-2.0-or-later and the actual build enables GPL and
|
||||
links external codecs. The wrapper/util are MIT. av-tools is
|
||||
GPL-3.0-or-later, and the distributed application must not be described as
|
||||
MIT-only. Publish the reviewed Corresponding Source and external notices with
|
||||
the binary release. See `LICENSE`, `LICENSES/`, `THIRD_PARTY_NOTICES.md` and
|
||||
`SOURCE.md`.
|
||||
The actual core build enables GPL and links external codecs. The wrapper/util
|
||||
are MIT. av-tools is GPL-3.0-or-later, and the distributed application must
|
||||
not be described as MIT-only. Publish the reviewed Corresponding Source and
|
||||
external notices with the binary release. See `LICENSE`, `LICENSES/`,
|
||||
`THIRD_PARTY_NOTICES.md` and `SOURCE.md`.
|
||||
|
||||
Reference in New Issue
Block a user