ebml-webm
Status: early development (
0.x). Not recommended for production; public APIs may change without notice. Part of the Mediaway media stack.
Sans-IO EBML / WebM mux and demux. Demux handles the common Matroska/WebM profile —
SimpleBlock and BlockGroup frames, Xiph/fixed/EBML lacing, Cues/SeekHead
(index) — and mux writes spec-valid WebM with known-size clusters. Pure state machine:
push bytes in, poll frames out; no I/O in the core.
Quick start
use ;
use ;
let mut muxer = new;
muxer.add_track?;
let mut muxer: = muxer.begin;
muxer.push_frame?; // track, timecode, keyframe, payload
muxer.flush;
let mut webm = Vecnew;
muxer.poll_bytes;
// Demux: feed bytes, poll frames — the index is exposed informationally.
let mut demuxer = new;
demuxer.push_bytes;
while let Some = demuxer.poll_frame
let _index = demuxer.cues;
Status
Status marks: ✅ first-class (tests for claimed scope) · ⚡ Zero-Copy path (no payload copy; implies ✅) · 🆗 best-effort / prototype · 🛠️ planned · ❌ attempted and genuinely blocked · 👻 not exercisable yet (no hardware / device / session available)
| Area | Status | Notes |
|---|---|---|
Demux: EBML VINT, Segment/Tracks/Cluster/SimpleBlock |
✅ | |
Demux: lacing (Xiph, fixed, EBML), BlockGroup/BlockDuration |
✅ | |
Demux: Cues / SeekHead index |
✅ | Exposed informationally; no seeking in the core |
Mux (typestate Open → Live) |
✅ | Known-size clusters, SimpleBlock only (no lacing on write) |
Indefinite-size Cluster lookahead (live streams) |
🛠️ | Open-element stack grows until Segment closes |
| Mux-side lacing | 🛠️ | Demux already reads all three lacing kinds |
Docs
docs/roadmap.md— stages, deferred items, design decisionsmediaway-container— Mediaway-typedwebmsurface over this crate- Root README — container support matrix
Contributing
Contributions are welcome — open an issue or pull request at github.com/nyxways/mediaway.
License
MIT OR Apache-2.0.