# Format and feature support FFmpeg capability is determined from the **loaded core**, not from filename extensions or this document. The app queries muxers, demuxers, decoders, encoders and filters; a preset is disabled with missing components listed. Browser playback is a separate capability checked with MIME/media APIs. ## 0.3.0 release fixture matrix All 15 files are generated and re-probed with native FFmpeg 7.1.3 for test preparation and pass the checksum/probe verifier. That proves fixture provenance, not ffmpeg.wasm behavior. A 2026-07-24 Vitest run passed 303 tests with one conditional native subtitle-filter skip and includes broad execution of typed plans against native FFmpeg 7.1.3. Chromium automation also runs a broad operation matrix against the real pinned ST core. The real MT core is queried and completes an H.264/AAC conversion, but the complete ST operation matrix has not been duplicated under MT. The following table distinguishes exact browser evidence from still-pending coverage; it must not be generalized to Firefox, Safari or mobile. | Input | Fixture | Expected streams | Browser preview expectation | Recorded pinned-core Chromium evidence | | ------------------- | ---------------------------------- | -------------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------- | | MP4 / H.264 + AAC | `pattern-av.mp4`, compatible clips | H.264 video, AAC audio | commonly playable after `canPlayType`/media load succeeds | broad ST operations; real MT conversion; exhaustive MT pending | | WebM / VP8 + Vorbis | `pattern.webm` | VP8 video, Vorbis audio | commonly playable in Chromium/Firefox; browser-dependent elsewhere | ST probe, remux and VP8/Vorbis re-encode; MT pending | | WAV / PCM s16le | `tone.wav` | mono PCM | commonly playable | ST WAV output re-probed; exact input fixture and MT pending | | MP3 | `tone.mp3` | mono MP3 | commonly playable | ST MP3 outputs re-probed; exact input fixture and MT pending | | FLAC | `tone.flac` | mono FLAC | browser/version-dependent | ST input and FLAC output re-probed; MT pending | | MP3 + attached PNG | `attached-cover.mp3` | MP3 audio, attached-picture PNG | audio may play; cover rendering is app-owned | ST probe/stream selection; MT pending | | MP4 tags | `metadata.mp4` | H.264/AAC | same as MP4 | ST import/removal and output metadata round-trip; MT pending | | MP4 chapters | `chapters.mp4` | H.264/AAC/data plus two chapters | media may play; browser does not expose all chapter data | ST generated-output chapter round-trip; fixture import pending | | malformed MP4 | `truncated.mp4` | no usable streams expected | must not preview | ST bounded failure, cleanup and recovery; MT pending | The runtime query for pinned core 0.12.10 recorded 341 demuxers, 173 muxers, 515 decoders, 204 encoders and 465 filters (1,698 entries total). Runtime discovery only says that FFmpeg exposes an item; the application must still build a valid plan, the input must be compatible, resources must fit and the browser may still be unable to preview the result. ## Output presets Preset availability always depends on detected runtime requirements: | Preset family | Required examples | Browser result preview | | ------------------ | ---------------------------------------- | -------------------------------------------------------- | | MP4 H.264/AAC | `mp4`, `libx264`, `aac` | usually, but verify actual output | | WebM VP9/Opus | `webm`, `libvpx-vp9`, `libopus` | enabled when the loaded core advertises all requirements | | WebM VP8/Vorbis | `webm`, `libvpx`, `libvorbis` | commonly Chromium/Firefox | | Matroska H.264/AAC | `matroska`, `libx264`, `aac` | generally download-only in browsers | | animated WebP | `webp`, `libwebp_anim` | browser-dependent image preview | | GIF | `gif`, `gif`, `palettegen`, `paletteuse` | broadly image-previewable | | MP3 | `mp3`, `libmp3lame` | commonly playable | | M4A/AAC | `ipod`, `aac` | commonly playable | | Ogg Vorbis | `ogg`, `libvorbis` | browser-dependent | | Opus | `opus`, `libopus` | Chromium ST/MT encode and re-probe recorded | | WAV/PCM | `wav`, `pcm_s16le` | commonly playable | | FLAC | `flac`, `flac` | browser-dependent | “Lossless” applies only to a lossless audio codec such as PCM/FLAC relative to its decoded samples. It does not make a lossy source lossless. Stream-copy remux avoids re-encoding compatible streams but may change container metadata. ## Structural editing - The Edit workspace exposes fast/accurate trim for the selected timeline range and fast/normalized concat for clips in visible timeline order. Availability still fails closed against loaded-core capabilities. - Fast trim uses stream copy where container/stream/timestamp constraints are compatible. It can begin at a nearby keyframe and is not promised frame-accurate. - Accurate trim decodes/re-encodes selected streams and can still be limited by source timestamps. - Stream-copy concat requires compatible codec parameters, time bases, dimensions, sample layout and selected streams; the UI requires a completed compatibility check before enabling it. Otherwise normalized re-encoding is required. - Normalized concat uses an explicit export preset and requires an explicit insert-silence, drop-all-audio or reject policy when clips have mismatched audio presence. - Normalized concat can overlap every edit with one uniform 0.04–10 second `xfade` and, when audio is retained, `acrossfade`. End clips must contain at least one transition duration and internal clips two; the active core must expose each required filter. - Crop, resize, frame-rate conversion, fades, normalization, burn-in and contact sheets require specific filters discovered at runtime. - Even-dimension correction is applied when the selected pixel format/encoder requires it and is reported in the plan/result. ## Images and scene selection Thumbnail/contact-sheet scene mode first performs a bounded full-source analysis with `select`/`showinfo`, stopping after at most 100 qualifying frames. Extraction then selects those exact source PTS values; no guessed time rounding or remote analysis is used. If no frame meets the 0.01–0.95 threshold, the operation reports that result and asks for a lower threshold or a deterministic selection mode. Contact-sheet labels require runtime `drawtext`. The app mounts only its same-origin DejaVu Sans 2.37 asset after verifying 757,076 bytes and SHA-256 `7da195a74c55bef988d0d48f9508bd5d849425c1770dba5d7bfc6ce9ed848954`. No remote or host-system font fallback is used. `SOURCE.md` and `LICENSES/DEJAVU_FONTS.txt` provide provenance and terms. ## Subtitles The text fixtures cover SRT, WebVTT and ASS import with explicit time shift. The Chromium ST matrix converts a generated SRT to WebVTT with a time shift, soft-muxes it into Matroska, burns it into H.264 video and extracts the soft-muxed stream. The exact standalone WebVTT and ASS fixtures and equivalent MT paths are not separately browser-smoked. Soft-subtitle muxing depends on container support (for example converted text in MP4 versus text/ASS in Matroska). ASS burn-in requires `subtitles`/libass and local font support; no remote font is fetched. Bitmap subtitle streams are identified but are not claimed to support arbitrary conversion or OCR. Unsupported container/codec combinations must remain disabled with reasons. ## Metadata and chapters Format and stream tags can be inspected. Edits/removal are limited to fields the selected muxer writes; “remove metadata” is best effort and the output is re-probed to report remaining structural/encoder/container fields. Stream language, title and dispositions are separate from format tags. Chapters use validated integer time bases, monotonic non-overlapping ranges and escaped titles. Some output containers do not support chapters. Browser media elements do not reliably expose them, so ffprobe round-trip is authoritative. ## Known unsupported or conditional cases - remote protocols, live capture, DRM/encrypted media and network playlists; - hardware-accelerated encoding or desktop-FFmpeg performance; - files above the 2 GiB WASM input ceiling or stricter product policy; - arbitrary filters/commands, arbitrary compositing and nonlinear overlap; - frame-accurate stream-copy trimming; - complete metadata erasure/anonymity; - browser preview of every FFmpeg-readable result; - Opus on browsers, inputs or deployments outside the exact reviewed Chromium regression: both ST and MT pass the non-empty encode/re-probe gate, but runtime capability discovery and normal per-job limits still apply; - any capability omitted by the active core's runtime query. Update this file only from re-probed generated/public-domain fixtures and record the engine mode, browser and exact core version.