All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.0 - 2026-06-07
Added
- Track codec metadata —
track_info/2decodes a track's codec and media metadata into%ISOMedia.TrackInfo{}, including the RFC 6381 codec string (avc1.PPCCLL/mp4a.40.2) that streaming manifests require. - HLS playlists —
hls_media_playlist/2,hls_master_playlist/2, andwrite_hls/3generate HLS VOD.m3u8playlists for the CMAF segments. - DASH MPD —
dash_manifest/2andwrite_dash/3generate a static/VOD DASH.mpd(single muxed rendition,SegmentTemplate+SegmentTimeline) for the CMAF segments, via a zero-dependency XML builder.
0.1.0 - 2026-06-05
Initial release.
Added
- Tree surgery — parse any ISOBMFF file (MP4/MOV/M4A/HEIF) into a lossless
%ISOMedia.Box{}tree, navigate/edit/reorder/insert, and re-serialize byte-for-byte (serialize(parse(file)) == file). - faststart — move
moovahead ofmdatwithstco/co64chunk-offset rewriting, including automaticstco→co64promotion. - Lazy file-backed payloads —
read/2withlazy: truekeeps large leaf payloads on disk asFileSlicereferences;write/2streams them disk→disk so files larger than RAM can be processed. - Sample index + track extraction —
samples/2builds a flat[%Sample{}]per track (progressive or fragmented);extract_track/2demuxes one track. - Trim — time-range, keyframe-aligned, frame-accurate (
elst), interleave-preserving lossless trimming. - Concatenate — lossless end-to-end join of compatible clips.
- Recursive virtual I/O — chain
trim/extract_track/concat/fragment/defragmentin memory with no disk round-trip; bytes match a write+re-read between stages. - Fragmented MP4 —
defragment/1(fMP4 → progressive) andfragment/2(progressive → fMP4), inverses of each other. - CMAF segments —
split_segments/1andwrite_segments/3emit a CMAF init segment plus.m4smedia segments.