oximedia-container
Container format mux/demux for the OxiMedia multimedia framework — MP4, MKV, MPEG-TS, OGG, and more.
Part of the oximedia workspace — a comprehensive pure-Rust media processing framework.
Version: 0.1.4 — 2026-04-20 — 1,183 tests
Overview
oximedia-container provides demuxers and muxers for media container formats:
| Format | Demux | Mux | Extensions |
|---|---|---|---|
| Matroska | Yes | Yes | .mkv |
| WebM | Yes | Yes | .webm |
| MPEG-TS | Yes | Yes | .ts, .m2ts |
| MP4 | Yes | — | .mp4 (AV1/VP9 only) |
| Ogg | Yes | — | .ogg, .opus, .oga |
| FLAC | Yes | — | .flac |
| WAV | Yes | — | .wav |
Features
- Format Detection — Automatic format probing from magic bytes
- Matroska/WebM — Full EBML parser, cluster management, cue points, chapters, attachments
- MPEG-TS — PES packet parsing, PAT/PMT tables, PCR/timing, DVB support
- MP4 — Atom-based parsing, edit lists, sample tables, timecode tracks, fragments (CMAF)
- Ogg — Page-based demuxing for Vorbis, Opus, FLAC, Theora
- Metadata — Tag editing for Vorbis comments, Matroska tags, MP4 metadata
- Streaming — Streaming demux and mux for live workflows
- Seeking — Keyframe-accurate seeking with cue/index structures
- Tracks — Multi-track management: video, audio, subtitle, data (GPS, telemetry)
- Chapters — Chapter list reading and writing (Matroska and MP4)
- Timecode — SMPTE timecode track support
Usage
Add to your Cargo.toml:
[]
= "0.1.4"
Format Detection
use probe_format;
let data = read?;
let result = probe_format?;
println!;
Demuxing
use ;
use FileSource;
let source = open.await?;
let mut demuxer = new;
demuxer.probe.await?;
for stream in demuxer.streams
while let Ok = demuxer.read_packet.await
Muxing
use ;
let config = new.with_title;
let mut muxer = new;
muxer.add_stream?;
muxer.add_stream?;
muxer.write_header.await?;
for packet in packets
muxer.write_trailer.await?;
Metadata Editing
use MetadataEditor;
let mut editor = open.await?;
if let Some = editor.get_text
editor.set;
editor.save.await?;
Key Types
| Type | Description |
|---|---|
ContainerFormat |
Enumeration of supported formats |
Packet |
Compressed media packet with timestamps |
PacketFlags |
Packet properties (keyframe, corrupt, etc.) |
StreamInfo |
Stream metadata (codec, dimensions, etc.) |
CodecParams |
Codec-specific parameters |
Demuxer |
Trait for container demuxers |
Muxer |
Trait for container muxers |
Mp4FragmentMode |
Progressive vs. fragmented (CMAF/DASH) MP4 mux mode |
DecodeSkipCursor |
Sample-accurate seek result (keyframe offset + skip count) |
CmafChunkMode |
Standard / Chunked / LowLatencyChunked CMAF delivery mode |
CmafChunkedConfig |
Full configuration for CMAF chunked transfer |
BlockAdditionMapping |
Matroska v4 per-track auxiliary data channel descriptor |
Wave 4 Additions (0.1.4)
Mp4FragmentMode — Progressive and Fragmented MP4
mux::mp4::Mp4FragmentMode selects how the MP4 muxer lays out sample data:
Progressive(default) — classic single-moov+mdatfile, best for file download.Fragmented { fragment_duration_ms }— ISOBMFF fragmented MP4 (fMP4); each fragment is an independentmoof+mdatpair suitable for DASH and CMAF delivery.
Mp4Mode is a backward-compatible type alias for Mp4FragmentMode.
DecodeSkipCursor — Sample-Accurate Seeking
seek_sample_accurate() on the Matroska, MP4, and AVI demuxers returns a DecodeSkipCursor
that pinpoints where to start decoding (byte_offset, sample_index) and how many decoded
samples to discard (skip_samples) before the requested target_pts is reached.
CmafChunkMode / CmafChunkedConfig — CMAF Low-Latency Delivery
streaming::mux::CmafChunkMode implements ISO/IEC 23000-19 chunked CMAF transfer:
| Mode | Description |
|---|---|
Standard |
Whole segments (no chunking; default) |
Chunked |
Multiple moof+mdat pairs per segment, governed by chunk_duration_ms |
LowLatencyChunked |
One sample per chunk — minimum end-to-end latency |
CmafChunkedConfig::signal_low_latency causes the muxer to write cmfl in the styp box
compatible-brands list, signalling LL-CMAF compliance to players.
BlockAdditionMapping — Matroska v4 HDR/DV Track Metadata
demux::matroska::matroska_v4::BlockAdditionMapping (EBML ID 0x41CB) carries auxiliary
per-block data channels on a Matroska track — used for HDR10+ dynamic metadata, Dolby Vision
RPU payloads, depth maps, and similar extensions. Accessible via
StreamInfo::block_addition_mappings after probing.
Module Structure (95 source files, 951 public items)
src/
├── lib.rs # Crate root
├── demux/
│ ├── matroska/ # EBML parser, Matroska/WebM demuxer
│ ├── mpegts/ # MPEG-TS packet, PES, PAT/PMT
│ ├── ogg/ # Ogg page demuxer
│ ├── flac/ # FLAC demuxer
│ ├── wav/ # WAV demuxer
│ └── mp4/ # MP4/MOV demuxer
├── mux/
│ ├── matroska/ # Matroska/WebM muxer (EBML writer, clusters, cues)
│ └── mpegts/ # MPEG-TS muxer (PES, PCR)
├── metadata/ # Tag editing (Vorbis, Matroska, MP4)
├── chapters/ # Chapter list handling
├── fragment/ # Fragmented MP4 / CMAF support
├── streaming/ # Streaming demux and mux
├── tracks/ # Multi-track management
├── seek/ # Seeking infrastructure
├── timecode/ # SMPTE timecode track
├── data/ # Data tracks (GPS, telemetry, atoms)
├── edit/ # Edit list handling
└── cue/ # Cue point generation and optimization
Patent Policy
All supported codecs are royalty-free:
Supported: AV1, VP9, VP8, Theora, Opus, Vorbis, FLAC, PCM
Rejected: H.264, H.265, AAC, AC-3, DTS (returns PatentViolation error if detected)
Policy
- No unsafe code (
#![forbid(unsafe_code)]) - Apache-2.0 license
License
Apache-2.0 — Copyright 2024-2026 COOLJAPAN OU (Team Kitasan)