diff --git a/CHANGELOG.md b/CHANGELOG.md index 5125c1a..7c9b538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,99 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.10](https://github.com/OxideAV/oxideav-mp4/compare/v0.0.9...v0.0.10) - 2026-08-15 + +### Other + +- structure-aware MP4/ISOBMFF battery — 6 targets, 3 hostile-input fixes +- §8.8.12 mfro surfacing + trailer-size cross-check +- fuzz-campaign hardening — five unbacked-allocation shapes fixed +- resolve_sai_aux_info — bridge the senc-less CENC carriage +- insert_empty_time — §8.8.6.1 empty-insert write side +- §8.8.2 mehd write side — sealed fragmented duration +- §8.8.7 duration-is-empty track fragments +- foreign-file elst equivalence pin + README seek-path accuracy +- start_time from the mapped §8.6.6 timeline + seek/hostile pins +- per-packet sample_description_index surfacing +- explicit edit lists reach the fragmented init segment +- explicit per-track edit lists on the muxer +- typed §8.6.6 edit-list public surface +- full §8.6.6 edit-list timeline mapping on demux +- mark internal boxes module #[doc(hidden)] +- emsg v0-delta absolute-time resolver + PIFF truncation sweeps +- wire PIFF uuid boxes + emsg into demux surface and fragment writer +- PIFF legacy uuid encryption boxes + DASH emsg byte layer +- README + CHANGELOG — round 396 self-describing CENC packaging docs +- CENC×index interplay hardening + EveryKeyframe final-sample fix +- CencFragmentPackager — plaintext-in, protected-fMP4-out write driver +- packager→demux→decrypt round-trip gate — every §10 scheme × fragmented shape +- seig key-rotation signalling on write — fragment-local sgpd/sbgp +- per-fragment senc + saiz/saio emission through write_protected_packet +- CENC seig group-entry serialiser (§6 write side) +- add CI / crates.io / docs.rs / MIT-license badges +- moof-level pssh emission for per-fragment key rotation +- CENC protected-track muxing — sinf envelope + moov-level pssh emission +- CENC write-side foundations — tenc/pssh/senc builders + AES encrypt driver +- muxer codec write-side coverage x12 — h265/av1/vp9/vp8/h263 + opus/alac/ac3/eac3/mp3/G.711 +- commit stranded pnot integration test +- QuickTime track load settings atom (trak/load) read + build +- QuickTime text sample description (text stsd entry) read + build +- QuickTime timecode sample description (tmcd stsd entry) read + build +- QuickTime timecode media info atom (tcmi §gmhd) read + build +- QuickTime base media info header (gmhd/gmin §minf) read + build +- HEIF item-properties crtt/mdft timestamps + README +- HEIF item-properties extended set (udes/altt/iscl/rref) +- surface per-item iloc/iref catalogue detail on metadata channel +- HEIF entity-grouping family (grpl/EntityToGroupBox) +- HEIF item-properties family (iprp/ipco/ipma + property boxes) +- README — document r375 box builders (tref/trgr/kind/cprt/tsel/strk/subs/saiz/saio/pdin/prft write side) +- saiz/saio (Sample Auxiliary Info Sizes/Offsets §8.7.8-9) public surface +- subs (SubSampleInformationBox §8.7.7) public parse + build surface +- prft (ProducerReferenceTimeBox §8.16.5) standalone builder +- pdin (ProgressiveDownloadInfoBox §8.1.3) builder +- trgr (TrackGroupBox §8.3.4) builder +- cprt/kind/tsel track-udta selection-box builders (§8.10) +- sub-track (strk/stri/strd/stsg §8.14) builders +- tref (TrackReferenceBox §8.3.3) builder +- document hint sample entries, hinf, FD item info, meco/mere +- hinf Hint Statistics Box parse+build (§9.1.5) +- rtcp reception + MPEG-2 TS (sm2t/rm2t) hint sample entries +- RTP/SRTP/reception hint sample-entry family (§9.1.2 / §9.4.1.2) +- meco/mere Additional Metadata Container family (§8.11.7/8) +- FD Item Information family parse+build (§8.13 / §9.2.4.7) +- pasp/clap/colr box builders (§12.1.4-5) +- demux VisualSampleEntry pasp/clap/colr boxes (§12.1.4-5) +- §8.11 meta-item box builders (iloc/pitm/iinf/iref/idat) +- demux idat capture + item-byte resolution (§8.11.11 / §8.11.3.3) +- demux file-level meta item infrastructure (iloc/pitm/iinf/iref, §8.11) +- parse fragment-local sample groups (sgpd/sbgp/csgp in traf, §8.9) +- wire csgp (CompactSampleToGroupBox §8.9.5) into non-fragmented muxer +- trep + assp fragmented-mux emission (§8.8.15 / §8.8.16) +- typed assp AlternativeStartupSequencePropertiesBox in trep (§8.8.16) +- add build_stvi_box write side + stvi integration round-trip tests +- parse stvi (StereoVideoBox, §8.15.4.2) from sample-entry sinf/schi +- ssix SubsegmentIndexBox emission after each sidx (ISO/IEC 14496-12 §8.16.4) +- leva LevelAssignmentBox emission in init mvex (ISO/IEC 14496-12 §8.8.13) +- build_leva_box LevelAssignmentBox builder (ISO/IEC 14496-12 §8.8.13) +- large_mdat option for 64-bit largesize mdat header (§4.2) +- document prft muxing; drop stale "no fragmented muxing" bullet +- prft ProducerReferenceTimeBox muxing (ISO/IEC 14496-12 §8.16.5) +- document typed §10 sample-group description entries +- decode_sample_group_entry dispatch + SampleGroupEntry +- rash RateShareEntry (§10.2.2) + CHANGELOG +- alst AlternativeStartupEntry (§10.3.2) +- rap/tele/sap single-byte bit-packed entries +- typed roll/prol RollRecoveryEntry (§10.1.1) +- capture 2022-edition flags annotating what the NTP time represents +- enforce §8.9.5 pattern/count 4-bit-width agreement constraint +- csgp pattern → sample expansion: CsgpBox::resolve_samples (§8.9.5) +- capture index_msb_indicates_fragment_local_description (flag bit 7) + width-aware MSB resolver +- parse btrt BitRateBox in sample entries (ISO/IEC 14496-12 §8.5.2) +- parse amve AmbientViewingEnvironmentBox inside VisualSampleEntry +- csgp CompactSampleToGroupBox builder (ISO/IEC 14496-12:2020 §8.9.5) +- demux hmhd HintMediaHeaderBox (ISO/IEC 14496-12 §12.4.2) +- refresh to current status, drop per-round changelog cruft + ### Added - Structure-aware fuzz surface expanded from one demux-only target to six (shared `oxideav_mp4_fuzz` scaffolding: a `Recipe` byte-reader, a valid-by-construction `MuxPlan`, and a full-accessor demux battery). New targets: `box_parsers` (hostile bytes through every standalone public box parser — HEIF item catalogue, CENC/PIFF, `emsg`, FD, hint, sample-group blobs, QuickTime atoms, aux-info/random-access records — with parse∘build fixed-point asserts wherever a byte-exact builder dual exists); `mux_roundtrip` (valid recipes must mux and re-demux byte-exactly across plain / faststart / fragmented — incl. `styp` + `sidx`/`mfra` — layouts, with exact pts identity through the media/movie timescale rescale and start-delay `elst`); `structured_mutate` (byte flips / truncations / targeted corruption right after the sample-table, fragment, and index FourCCs the offset walkers arithmetic on); `meta_graph` (builder-assembled `iloc`/`iinf`/`iref`/`ipma` catalogues — every construction method, reference cycles, out-of-range property indexes — reparse identically, then survive hostile mutation of the `meta` body); and `cenc_roundtrip` (encrypt∘decrypt identity under arbitrary-but-valid §10 scheme × `tenc` × subsample-partition metadata, plus hostile `plan_sample_cipher` / `senc` / `seig` walks). The retooled `demux` target now drives the whole public accessor set (CENC / PIFF / `emsg` / HEIF item resolution / edit lists / fragment records) plus both seek paths. Bounded inline ASan campaigns (5.9M+ execs total across targets) found and fixed three defects, each pinned as a fuzz-corpus regression + covered by a unit test: diff --git a/Cargo.toml b/Cargo.toml index 0c44e0c..f65a0f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "oxideav-mp4" -version = "0.0.9" +version = "0.0.10" edition = "2021" rust-version = "1.80" license = "MIT"