Repository navigation
Description
Goal
coreav ffmpeg runs the common ffmpeg -c copy invocations (seeking, trimming, concatenation, segmenting, HLS, stream selection) on top of CoreAV's existing commands, and meets bars B2, B3b and B4 of docs/design/compat-cli.md ("The bars, pre-registered"): every native command runs, its output passes the oracle of the job it is, and its median speed ratio against FFmpeg is at most 1.00.
Current state
-
fix(mp4): match copied MP3 bitrate metadata #497 matches copied MP3 bitrate metadata from MP4 using complete frame clocks, and normalizes copied AAC/Opus metadata when the bitrate option is absent. A generated 48 kHz CBR MP3 average is 64,000 bits/s, matching pinned FFmpeg 9.0.2 instead of the former 67,511. Packets, sample tables and native command admission are unchanged. Matroska copied AAC/Opus clock parity remains separate work. These generated controls add no measured command coverage.
-
fix(mp4): match copied audio bitrate metadata #496 matches copied AAC and Opus bitrate metadata for MP4-sourced audio beside encoded video, including stale or absent bitrate boxes. Audio packets, sample tables, native command admission and Matroska-sourced outputs are unchanged. Generated controls compare complete files with independently observed FFmpeg 9.0.2 metadata; raw container tags and layout remain separate. This changes no measured command coverage.
-
fix(mp4): match AAC terminal sample timing #492 matches the final partially presented AAC sample duration in
coreav ffmpegMP4 output while preserving priming and edit lists. Native transcode keeps complete AAC frame durations. -
fix(ffmpeg): apply default video encoder options #477 applies MP4 crop, CRF, preset, pixel-format, passthrough and unchanged-size options through the default libx264 encoder. Generated controls match pinned FFmpeg 9.0.2 decoded frames and geometry/aspect. Previously refused scale, resize and video-bitrate requests retain whole-command fallback; previously native explicit and unmatched-codec commands retain their behavior. This changes no measured command coverage.
-
fix(ffmpeg): admit ignored H264 video quality #483 accepts finite
-q:vvalues as ignored options only when the selected video is encoded with libx264, including the default MP4 encoder. Generated controls retain the same output with and without the option, and decoded frames match pinned FFmpeg 9.0.2. Copy, image and audio-only routes keep their existing refusals, and commands without the option keep their previous admission. This changes no measured command coverage. -
fix(transcode): keep AAC probes encoder-only #479 checks AAC encoder availability with an empty raw-PCM encode under the existing sandbox and deadline instead of an encoder-help command. Generated FLAC inputs retain exact decoded samples and frame timing against pinned FFmpeg 9.0.2 in builds with and without the AAC decoder. The real AAC encode and complete Matroska readback are unchanged; missing encoders remain unsupported and resource, signal and malformed-output failures remain terminal. This changes no measured command coverage.
-
feat(ffmpeg): support literal crop rectangles #444 supports one literal, even-aligned
crop=W:H:X:Yin the H.264 encoder adapter for fixed-size planar 8-bit 4:2:0 frames. Every decoded byte and timestamp matches pinned FFmpeg 9.0.2 on generated development controls, including a non-proportional crop; declared source SAR is retained. Expressions, chains, crop with scale, odd fields and out-of-bounds rectangles retain refusal. Existing native admission, runtime safety and C02 remain unchanged. This changes no measured coverage count. -
fix(transcode): retain declared square pixels #441 preserves valid container-declared sample aspect ratios, including square pixels, in unscaled H.264 output and its summary. Unstated or invalid ratios and explicit scaling retain their previous behavior. The fixed legacy command, unaffected exact comparisons and runtime safety remain unchanged; affected cases verify only SAR signalling and its forced lengths. Existing timing differences and the timestamped FFmpeg worker's VUI defaults remain documented. This changes no measured coverage count.
-
feat(cli): write audio-only PCM in MP4 #439 adds bounded native audio-only S16 PCM in MP4 with explicit
-vn, one selected mono 48 kHz stream, unchanged channels/rate and regular-file output. Existing native outputs retain their complete bytes; AAC remains opt-in under its separate decode-tolerance contract. This changes no measured coverage count. -
feat(concat): preserve primed AAC presentation #437 restores twelve primed-AAC H.264 concat recipes and four separately qualified controls with configuration-only avc1 and each input's priming-excluding presentation edits. Direct-native FLAC keeps packet copying with unknown totals when its clocks cannot establish sample counts. This does not register a compatible-output category or change measured coverage; the PR records the FFmpeg-player edit-window caveat.
-
fix(join): retain video field metadata #436 preserves the first selected source's AV1, VP9 and HEVC field declarations in native MP4 joins and reports only genuinely omitted field boxes. Complete generated stream/packet comparisons retain all existing native executions; direct AAC joins keep spec-correct per-input edit presentation rather than ordinary concat timing. This changes no measured compatibility count.
-
test(ffmpeg): preserve copied-video AAC fallback #408 guards copied-video AAC refusal and complete pinned FFmpeg 9.0.2 fallback without adding native AAC encoding. Strict-safe mode starts no external encoder and preserves absent/existing destinations and staging; ordinary fallback retains the original arguments and complete output bytes. This test-only change adds no native admission or measured coverage.
-
feat(ffmpeg): copy bounded AVC to MPEG-TS #423 adds bounded native MPEG-TS copy for one local ISO input containing one qualified progressive High-profile H.264 video track, with explicit audio exclusion. Automatic or explicit Annex-B conversion preserves the pinned FFmpeg 9.0.2 packet/decode predicate and stream/program metadata; preparation verifies serialized transport bounds before atomic publication. Unsupported layouts, audio-bearing sources, edits and M2TS retain refusal or original-command fallback. Generated exact-output checks do not establish a new measured coverage total.
-
feat(ffmpeg): decode bounded standalone FLAC #406 adds bounded standalone FLAC to raw S16/F32 for known-length 16/24-bit mono/stereo input with unchanged rate/channels. Complete CRC, range, sequence, total and declared MD5 validation precedes publication of the same immutable payload. Raw files, stdout and bounded encoded-stdin replay retain atomic refusal and original-command fallback; no measured command coverage increase is claimed.
-
fix(ffmpeg): qualify Matroska AAC copy clocks #413 qualifies compatibility Matroska AAC copy clocks for the evidenced aligned 32 kHz mono/stereo audio-only subset. Other unqualified clocks refuse before output or retain original-command fallback. Native remux and ISO copy keep their separate behavior; no measured coverage increase is claimed.
-
feat(ffmpeg): write WAV from integer WAVE #401 adds complete pinned-byte WAV output from full-width integer WAVE input with unchanged mono/stereo channels and rate. It keeps its exact writer separate from scoped AAC compatibility. WAVE WAV pipes and unproved conversions refuse before output; native force help describes existing regular-file destination protection. The unchanged AAC representative gains no measured coverage.
-
fix(copy): preserve mapped packet order #410 preserves complete packet order and source-duration admission when video-bearing ISO copy maps contribute from at least two inputs. Supported reversed/repeated maps, three inputs and faststart reuse the ordinary-copy scheduler; later-input-only and audio-only copies retain their separate policy. Native public defaults and existing budgets are unchanged. Generated exact-output checks do not establish a new measured coverage total.
-
fix(cli): preserve output destination semantics #404 preserves special, linked and unwritable output destinations through the shared owner. Native atomic-file commands reject these paths without replacement; compatibility commands retain strict-safe refusal or the original FFmpeg fallback.
-
feat(aac): qualify scoped PCM compatibility #405 registers scoped AAC-LC PCM compatibility only for opt-in AAC builds, with S16 error at most one LSB, F32 error at most 2^-16 and exact complete presentation. PNS remains ineligible, including in the unchanged registered command representative, so these AAC-to-PCM shapes gain no coverage. This category is separate from exact output.
-
fix(copy): preserve interleaved packet order #400 preserves complete packet order for supported ordinary ISO audiovisual copy, including faststart, explicit copy codecs and input-zero-only maps. Header offsets and payload copying share edited rational DTS order and output-track-order ties. Native remux keeps its default layout, and additional chunks consume the existing table budget. Generated exact-output checks do not establish a new measured coverage total.
-
fix(ffmpeg): explain AAC raw output refusal #398 adds a specific diagnostic for unqualified AAC raw-PCM decoding and verifies complete pinned FFmpeg 9.0.2 fallback while preserving strict-safe refusal and existing destinations. It adds no native decoder admission or measured command coverage.
-
fix(ffmpeg): require exact input-seek timing #390 admits input-seek copies only when the retained packet timeline is exact. Unsupported audio, reordered pre-roll, clock precision and incomplete metadata refuse before publication, preserve absent/existing destinations and staging, or use original-argument pinned fallback. Native clip, split and ordinary copy retain their separate behavior. Generated exact-output and required-refusal checks add no measured native coverage.
-
test(ffmpeg): guard exact AAC filter fallback #392 adds regression coverage for explicit AAC concat-filter refusal and exact pinned fallback. Strict-safe mode preserves absent/existing destinations and staging; regular fallback must match the complete FFmpeg 9.0.2 output and exit status. Runtime behavior and unfiltered concat are unchanged. This test-only change adds no native admission or measured coverage.
-
fix(ffmpeg): refuse leading negative maps #388 refuses a negative map before any positive selection instead of publishing a successful but mismatched output. Strict-safe mode preserves absent/existing destinations and regular mode retains original-argument fallback. Positive-first removal and re-addition keep their existing packet checks. Generated regressions add no measured native coverage.
-
fix(ffmpeg): rebuild first-input copy durations #387 applies ordinary copy's duration reconstruction and timing admission when the final stream maps select only input zero, even with unused inputs present. Every input is still validated, stream order and first-input metadata are preserved, and native remux retains its separate policy. Mixed-input and later-input-only timing remain open. Generated exact-output checks are limited diagnostics, not additional measured coverage.
-
fix(ffmpeg): refuse concat audio gaps #385 refuses compatibility concat output requiring multiple audio edits instead of publishing mismatched packet timing. Strict-safe mode preserves absent/existing destinations and regular mode replays the original arguments to pinned FFmpeg 9.0.2. Native join is unchanged; exact native audio-gap reconstruction remains open. Generated diagnostics and required-refusal fixture checks do not establish additional measured native coverage.
-
fix(ffmpeg): rebuild copied header durations #383 rebuilds supported ordinary ISO copy duration headers from copied samples and validated edits instead of retaining conflicting declarations. Native remux keeps its separate preservation policy. Shortened video edits, audio edits excluding whole trailing samples and unsupported endpoints refuse before publication or use original-argument fallback; an overlong AAC edit is shortened only to an exactly representable sample end. Origin and duration options are also exercised in the bounded remux fuzz target. Generated exact-output checks and fixed-input replays are limited diagnostics, not additional measured coverage or a fuzz campaign.
-
fix(ffmpeg): normalize copied video origins #382 normalizes ordinary single-video copy to zero for supported unedited, unfragmented inputs without losing samples. Byte-derived admission refuses a later decoded sample composed before the first, and normalization reconstructs media duration from copied samples rather than a conflicting declaration. Other unsupported origins retain strict-safe refusal or original-argument fallback, while native remux keeps its separate default preservation policy. Generated exact-output checks are limited diagnostics, not additional measured coverage.
-
fix(ffmpeg): correct unedited concat timing #381 preserves the complete composition span of unedited concat video instead of capping it at the sum of decode durations. This keeps source tail frames and corrects the reproduced positive-video-start and zero-audio-start timing. A nonzero first-input format origin is refused before output staging or sent to existing fallback; native join preserves its own origin. Six generated native commands and three fallback controls matched pinned FFmpeg 9.0.2 exactly. These are limited development diagnostics, not additional measured coverage.
-
fix(ffmpeg): refuse positive AAC concat edits #379 merged the refusal for concat inputs with positive AAC media edit offsets, including unselected audio and retained later AAC descriptions. Strict-safe mode exits 4 without publishing output; regular mode forwards the original arguments to FFmpeg. Ordinary copy and native join are unchanged. Nine independent generated fallback commands match pinned FFmpeg 9.0.2 exactly, and four native controls preserve baseline output hashes. These are limited diagnostics, not additional measured native coverage.
-
Bounded standalone RIFF/WAVE, RF64 and BW64 PCM input landed in feat(ffmpeg): read bounded WAVE PCM #356. One parser supplies validated data spans to the existing registered S16/F32 stages, with reads and packed chunks bounded to 64 KiB. Complete full-width mono/stereo integer PCM and finite unchanged-rate F32 identity are supported within their registered compositions. F32-to-S16, F32-source rate conversion and changed-rate U8-to-S16 remain unregistered and retain original-input fallback. The pinned FFmpeg 9.0.2 Linux checker passed 2,624 generated WAVE exact-output, eligibility and replay checks; this is not new measured command coverage or a release verdict.
-
Synthetic V2 fixtures and explicit supplemental input tuples landed in test(compat): add supplemental V2 fixtures #315. The runner tries them only after all original fixture assignments fail, stages sparse inputs and local dependencies, and records every input hash. Commands and judging rules are unchanged; no new measured V2 pass count is claimed.
-
Explicit mono/stereo raw S16 input, equal-rate integer bypass and bounded native rate conversion to WAV/raw PCM landed in feat(ffmpeg): read raw signed-16 audio #308. Pre-merge verification matched 160 complete synthetic commands, 60 raw library replays and 764 retained S16 capture pairs. These are finite synthetic checks, not general parity or new measured V2 coverage; other raw formats, raw-to-FLAC output, rematrixing, dither and soxr remain unsupported.
-
Copied audio the Matroska writer cannot map is refused before video encoding, and public transcode summary helpers classify each copied stream by its media type, in fix(ffmpeg): refuse unmapped audio before encode #309. The command still exits 4 with the writer's message and writes no output. Printed CLI summaries and output files are unchanged, because a non-audio stream beside the encoded video is already refused. No change to frozen command labels or measured coverage is claimed.
-
Default AAC encoding of supported mono/stereo 48 kHz Opus sources and its versioned composed verification landed in feat(transcode): verify composed Opus AAC output #292. The checker preserves source-declared presentation and verifies exact AAC output from successfully written encoder input, while historical B9 and the existing lossless-source judgments stay unchanged. Generated-fixture success is not a new measured coverage or release verdict.
-
Matroska and WebM stream-copy output and existing H.264 transcodes into Matroska landed in feat(ffmpeg): write Matroska output #267. Supported paths preserve packet order, edits, priming, padding and explicit colour/scan declarations. No change to the frozen command labels or measured command coverage is claimed.
-
The registered V2 decoded-output oracle is implemented in feat(compat): apply the registered V2 oracle #272. It reports observed coverage without a release threshold and checks complete decoded values, stream fields and timing for registered lossless and external MP3 jobs. No new measured coverage or encoder implementation is claimed; historical judging is unchanged.
-
coreav ffmpegruns twelve shapes of the 0.1.0 command set natively (feat(cli): run ffmpeg -c copy commands natively #53, feat(cli): join ffmpeg -f concat lists natively #60): C01, C02, C03, C05, C13, C17, C18, C20, C23, C25, C26 and C32 of compat-cli.md. These are a remux to MP4 from MP4/MOV or Matroska/WebM, a clip (-ss,-t,-to), segments (-f segment), audio extraction to M4A and a join of an-f concatlist of MP4/MOV files, with the streams FFmpeg's own selection picks. -
R3 on the fixtures is met and gated in CI: every 0.1.0
ffmpegcommand on the generated fixtures writes an output that passes its job's oracle and matches the pinned FFmpeg 7.0.2's stream mapping, on both fixture sets. -
A command it does not run natively, and any
coreav ffprobecommand outside its vocabulary, runs the realffmpegorffprobefromCOREAV_FALLBACKorPATHinstead, with one notice line on standard error and an optional redacted JSON log (COREAV_FALLBACK_LOG) (feat(cli): run FFmpeg for commands that are not native #49; compat-cli.md, "Fallback to FFmpeg"). This includes standard input and output, and any file name with a colon before its first/, whereffmpegmay read a protocol. -
Strict-safe mode (
COREAV_STRICT_SAFE=1orcoreav --strict-safe), the mode for untrusted input, never runs FFmpeg: such a command is refused by name with exit status 4 and writes no file (bar B1, met: compat-ffprobe.md). The corpus and speed scripts and the bench guard run in it. -
The jobs behind it exist as commands, each with its fixture oracle:
clip,split,join,remux,sanitize,extract-audioandhls. -
8.1% of the usable
ffmpegcommands of the command-coverage set are native under the vocabulary (compat-cli.md). -
fix(cli): restore native AVC concat #435 restores twelve targeted H.264 MP4 concat commands to native execution with avc1 and parameter sets only in avcC. Complete-output regressions cover packet/decode identity with explicit metadata and reference-carriage differences; this is compatible output, not byte-exact FFmpeg 9.0.2 output or a new measured coverage count. Joined FLAC/ALAC metadata and stored video media duration are corrected. Primed-AAC, unsupported timing and explicit-filter qualification remain separate work.
-
Clips of audio alone (C15, C19) run natively since feat(cli): clip audio alone in coreav ffmpeg #67: a new writer for one AAC track that presents the range exactly, checked by the clip oracle on every AAC fixture without video. With it every
ffmpegshape of the 0.1.0 command set runs natively on the fixtures. -
Not native yet: subtitle streams, PCM into MP4 outside the bounded audio-only subset, MP3 audio into MP4,
-fflags +igndtsand-map_metadata 0:s:0(refused because FFmpeg's output would differ). -
R3 on the held-out draw and the speed bar R4 have not been measured.
-
It comes after
coreav ffprobe(coreav ffprobe: agreement with ffprobe #24).
Checklist
-
Match generated AAC
esdsES_ID and rates and missingbtrtmetadata parity. -
Match copied MP3 bitrate fields using its complete frame clock rather than shortened stored sample durations (fix(mp4): match copied MP3 bitrate metadata #497).
-
Match Matroska-sourced copied AAC and Opus sample clocks before claiming bitrate metadata parity.
-
Match generated encoder tag
moov/udta/meta/ilst/©too/dataparity. -
Match MP4 top-level layout,
freebox andstcoplacement parity. -
Apply frame-exact default MP4 video options and same-size output while retaining excluded fallback paths, in fix(ffmpeg): apply default video encoder options #477.
-
Qualify native scaling and bitrate parity before admitting the currently refused implicit options.
-
Correct legacy unmatched codec-selector handling through a native fix rather than removing existing native commands.
-
Accept ignored finite H.264
-q:vrequests without widening copy or other-codec routes, in fix(ffmpeg): admit ignored H264 video quality #483. -
Add explicit Matroska coverage for the existing ignored H.264
-q:vpath and document the unsupported-qscale:v,-qand-q:v:0spellings. -
Keep AAC availability probes encoder-only with a bounded empty-PCM encode, in fix(transcode): keep AAC probes encoder-only #479.
-
Optionally qualify availability behavior for externally selected encoder binaries outside the pinned FFmpeg build; the current generated checks establish the pinned build only.
-
Optionally preserve signal termination identity in the test-only AAC PCM wrapper; the existing wrapper tests do not judge signal classification.
-
Support one bounded literal H.264 crop while preserving strict refusals, source SAR and existing non-crop paths, in feat(ffmpeg): support literal crop rectangles #444.
-
Add colour metadata assertions to the committed crop regression, retaining the independently checked BT.709 control as regression coverage.
-
Run the unchanged registered shape comparison after merged adapter changes before updating measured command coverage.
-
Preserve declared sample aspect ratios in unscaled H.264 encoding, including square pixels, without changing scaling, in fix(transcode): retain declared square pixels #441.
-
Preserve complete ordinary audiovisual copy packet order while retaining native defaults and existing budgets, in fix(copy): preserve interleaved packet order #400.
-
Preserve exact contributing-input copy packet order and source duration admission, in fix(copy): preserve mapped packet order #410.
-
Guard copied-video AAC refusal and complete exact pinned fallback, in test(ffmpeg): preserve copied-video AAC fallback #408.
-
Qualify native QuickTime MOV copy output against its container profile and pinned FFmpeg before replacing refusal or fallback.
-
Add bounded native ISO H.264 video copy to MPEG-TS with qualified transport conversion, atomic refusal and original-command fallback, in feat(ffmpeg): copy bounded AVC to MPEG-TS #423.
-
Qualify excluded MPEG-TS copy source layouts, including audio-bearing inputs with audio excluded and edit lists, before broadening native admission.
-
Qualify broader AVC B-frame reordering using the H.264 E.2.1 reorder-count rule rather than the conservative presentation-slot distance, while preserving exact output or refusal.
-
Use a single-threaded oracle input decoder before extending MPEG-TS CLI decoded-frame comparisons to corrupt-slice cases.
-
Explain unqualified AAC raw-PCM refusal and verify complete pinned fallback and destination preservation, in fix(ffmpeg): explain AAC raw output refusal #398.
-
Preserve special, linked and unwritable output destinations through the shared owner, in fix(cli): preserve output destination semantics #404.
-
Write exact WAV output from integer WAVE sources, in feat(ffmpeg): write WAV from integer WAVE #401.
-
Match the pinned exit status for an ordinary existing regular output with
-nwithout changing its contents. -
Qualify the evidenced aligned Matroska AAC copy subset and refuse other unqualified clocks without changing native remux, in fix(ffmpeg): qualify Matroska AAC copy clocks #413.
-
Qualify additional Matroska AAC clock configurations against complete packet and presentation evidence before replacing their refusal or fallback.
-
Require exact native input-seek timing or safe refusal with complete pinned fallback, in fix(ffmpeg): require exact input-seek timing #390.
-
Reconstruct exact native input-seek audio, reordered pre-roll and fractional bounds before replacing their refusal or fallback.
-
Qualify locally selected FFmpeg test oracles through the shared oracle-pin verifier without changing runtime fallback selection.
-
Reuse ordinary copy's duration reconstruction and timing admission for final first-input-only mappings despite unused inputs, in fix(ffmpeg): rebuild first-input copy durations #387.
-
Refuse concat output requiring multiple audio edits rather than publishing mismatched packet timing, in fix(ffmpeg): refuse concat audio gaps #385.
-
Reconstruct exact native concat audio-gap packet timing instead of relying on refusal or fallback.
-
Refuse leading-negative-map commands without publishing output, preserving original-argument fallback, in fix(ffmpeg): refuse leading negative maps #388.
-
Guard explicit AAC concat-filter refusal and complete exact pinned fallback, in test(ffmpeg): guard exact AAC filter fallback #392.
-
Qualify exact native AAC concat filtering before replacing its existing refusal.
-
Refuse inexact H.264 compatibility concat before publishing and retain complete original-command fallback, in fix(ffmpeg): refuse inexact H.264 concat #426.
-
Restore twelve targeted H.264 concat commands with configuration-only avc1 and corrected metadata, without changing exact-output labels, in fix(cli): restore native AVC concat #435.
-
Qualify a separate FLAC concat frame-header/checksum rewrite that removes restarted frame numbers and internal short-block deviations rather than claiming standalone conformance from packet-copy identity.
-
Preserve direct-native FLAC admission at unproved sample clocks with truthful unknown totals, in feat(concat): preserve primed AAC presentation #437; frame-header/checksum conformance remains separate work.
-
After feat(compat): classify avc1 carriage separately #433 merges, register independently qualified configuration-only AVC concat in the compatible-output category without changing exact-output labels.
-
Audit native AV1, VP9 and HEVC concat against complete stream records and packet bytes and preserve source field declarations and accurate omission summaries, in fix(join): retain video field metadata #436; the three direct AAC join comparisons retain their separate native presentation contract.
-
Validate metadata snapshot stability across probe and later scan, including a selected track disappearing from a mutable source, while retaining terminal source-change treatment rather than fallback.
-
Avoid the discarded bounded H.264 join before fallback without changing terminal source, integrity or resource failures and earlier timing-refusal reasons.
-
Preserve the pinned encoder metadata in AAC compatibility WAV output using the existing WAV header owner, without changing decoder qualification or native decode-audio output.
-
Refuse concat inputs with positive AAC media edit offsets instead of returning mismatched timing, in fix(ffmpeg): refuse positive AAC concat edits #379.
-
Qualify twelve primed-AAC concat recipes with configuration-only avc1 and per-input priming-excluding presentation, plus four separately qualified controls, in feat(concat): preserve primed AAC presentation #437.
-
Qualify compatibility FLAC sample totals at differing media clocks from payload-backed evidence while retaining existing refusal boundaries.
-
Qualify implicit SBR in AAC payloads before broadening the primed-AAC admission claim beyond its parsed configuration.
-
Add independent mixed primed/unprimed single-edit and 960-frame AAC fixtures before broadening that qualification.
-
Preserve complete unedited concat video presentation tails, including the reproduced positive-video-start and zero-audio-start timing, in fix(ffmpeg): correct unedited concat timing #381.
-
Normalize nonzero first-input concat format origins natively without changing raw probe timing or native join origin.
-
Reconstruct duration headers for supported ordinary zero-origin copy from copied samples and validated edits while preserving native remux defaults, in fix(ffmpeg): rebuild copied header durations #383.
-
Exercise origin and duration-rebuild controls in the bounded remux fuzz target while preserving its sample invariants, in fix(ffmpeg): rebuild copied header durations #383; fixed-input replay is not a fuzz campaign.
-
Implement exact native copy timing for shortened simple edits rather than retaining refusal or fallback.
-
Qualify exact later-input-only and audio-only mapped copies, unequal source movie clocks and per-input origin normalization against pinned FFmpeg 9.0.2 without changing the registered comparison.
-
Correct remaining output-seek and input-until copy timing discrepancies against pinned FFmpeg 9.0.2, or refuse them safely.
-
Reproduce and correct remaining concat clock differences without positive AAC edits using independent development inputs and the pinned FFmpeg comparison.
-
Register generated supplemental V2 fixtures without changing commands or judging rules in test(compat): add supplemental V2 fixtures #315.
-
Support explicit raw S16 input with integer equal-rate bypass and bounded rate conversion to WAV/raw PCM in feat(ffmpeg): read raw signed-16 audio #308.
-
Reject conflicting manual audio workflow modes or replace the two booleans with one mode choice.
-
Retain reproducible, source-bound synthetic characterization records beyond expiring Actions artifacts.
-
Run the unchanged full-command V2 oracle after the candidate registration gate before counting new raw PCM support.
-
Track multi-input encoding and automatic routing in Transcode: sources beyond H.264 #26.
-
Track encoding-time seeking and trimming in Transcode: sources beyond H.264 #26.
-
Track remaining
-asyncand output-rate-rbehavior in Transcode: sources beyond H.264 #26. -
Finish a command-by-command support and refusal inventory for the remaining encoding paths in Transcode: sources beyond H.264 #26.
-
Share the Matroska adapter's copied-audio capability and configuration preflight before video encoding, so unsupported copied audio is refused before encoding and spooling.
-
Correct public Rust Matroska summary helpers so a copied second video is not classified as audio; the current CLI and output-file paths are unaffected.
-
Map the native
ffmpegcommands of the coverage set onto the existing commands. -
The concatenation writer and its oracle (feat(join): join inputs that carry several edits #50, feat(cli): join ffmpeg -f concat lists natively #60).
-
B3b: each native command's output passes its job's oracle on 100% of the fixtures.
-
B4: measure speed against the same FFmpeg command, and add a regression guard (B6).
-
A clip writer for audio alone, so that C15 and C19 run natively (feat(cli): clip audio alone in coreav ffmpeg #67).
-
Let
coreav cliptake--video noneand clip audio alone through the same writer; today onlycoreav ffmpegreaches it. -
Copy subtitle (
mov_text) streams and timecode (tmcd) tracks in the MP4 remux; FFmpeg keeps them and the remux drops them. -
Check clip outputs against ranges derived from the command line itself, not from the writer's summary.
-
Join concat lists whose files' streams end at different times, placing each file at its format duration as the concat demuxer does, instead of refusing them.
-
Join concat lists whose files have several edits in a copied track, as the concat demuxer reads them, instead of refusing them.
-
Stream registered F32/S16 audio to files or stdout with bounded stdin replay in feat(ffmpeg): stream registered raw audio #346.
-
Add bounded WAV/PCM input over the existing standalone parser's validated data spans, with the same stage eligibility rules, in feat(ffmpeg): read bounded WAVE PCM #356.
-
Add bounded standalone FLAC decoding as a separately registered raw S16/F32 source, in feat(ffmpeg): decode bounded standalone FLAC #406.
-
Qualify additional source, packing, channel, sample-rate and platform compositions independently before enabling them, including the unregistered WAVE float and U8-to-S16 rate paths.
-
Align the two existing no-network URL tests with the current refusal policy without changing runtime networking behavior.
Not in scope
-
Re-encoding (
-c:v libx264and the like): Transcode: sources beyond H.264 #26. -
Generic filter expressions and chains remain out of scope; the existing scale forms and the literal-crop adapter in feat(ffmpeg): support literal crop rectangles #444 are narrow supported exceptions. Other options outside the vocabulary of compat-cli.md stay refused by name.
-
Strengthen the existing raw and WAV two-pass content-stability checks without adding a decoder or weakening terminal source-change handling; PCM-in-MP4 already checks the complete emitted payload length and fingerprint.
-
Make the composed Opus-to-AAC check show the error output of a failed reference command, such as a curl download error. This changes a registered judging source, so it needs approval first.
-
Cache the pinned Opus comparator archive by its digest, so pull requests that change the composed sources stop downloading it on every CI run.
Native H.264 follow-ups
-
Extend the opt-in MP4 native H.264 path from feat(cli): add opt-in native H.264 encoding #509 to supported constant rational frame rates and signalled non-square sample aspect ratios; retain fallback for variable frame rates and other unsupported inputs, in feat(cli): expand native H.264 metadata support #525.
-
Qualify native H.264 Matroska cadence separately after feat(cli): add opt-in native H.264 encoding #509, retaining the existing fallback until then.
-
Decide from the specification whether Opus copied from ISO base media presents samples past a shortened final sample duration: the MP4 decoder keeps them while the Matroska writer stops there (found in fix(mkv): trim copied Opus by its edit, not PreSkip #533).
-
Refuse native H.264 Matroska rates the cadence cannot represent before decoding or encoding, in fix(transcode): refuse native Matroska cadence before encoding #537.
Activity
gunwooterry commentedon Nov 7, 2026
#500 (f1feda3) adds regressions verifying that decoded audio from Matroska-sourced copied AAC and Opus remains identical to the input when written to MP4. It also documents a known difference from the reference tool.
pesoszpesosz commentedon Nov 9, 2026
I work on video delivery at SeedanceCheap. For the MP4
mov_textitem, here's a small FFmpeg reference case for exports with two selectable caption languages. Explicit mapping made a difference even though the subtitle codec was already compatible with MP4.Save these two cues as UTF-8 files:
With FFmpeg 8.1.2 on Windows,
all.mp4retained both languages, their dispositions, and the four subtitle packets' PTS, duration and payload hashes. Each track has a two-byte empty sample at PTS zero before its first cue. The non-empty cues start at 0.250 s and 0.500 s and last 1 s each.spanish.mp4retained the two Spanish packets with identical timing and hashes. Its sole subtitle track read back as both default and forced. Automatic selection inauto.mp4retained the video and selected zero subtitle streams.For this case, I would check the explicit stream selection and per-track packet data alongside the stream count. This is a synthetic reference observation from 8.1.2. I haven't tested CoreAV or the project's pinned FFmpeg version.