oximedia-core
Core types and traits for OxiMedia.
Part of the oximedia workspace — a comprehensive pure-Rust media processing framework.
Version: 0.1.5 — 2026-04-21 — 1,004 tests
Overview
oximedia-core provides the foundational types used throughout OxiMedia:
- Types: Rational numbers, timestamps, pixel/sample formats, codec IDs, FourCC
- Traits: Decoder and demuxer interfaces
- Error handling: Unified error type with patent violation detection
- Memory management: Buffer pools for zero-copy operations
- HDR support: HDR metadata, transfer functions, color primaries
- Channel layout: Multi-channel audio layout definitions
- Codec negotiation: Format negotiation between components
- Event queue / Work queue: Internal messaging primitives
Features
Types
| Type | Description |
|---|---|
Rational |
Exact rational number representation (numerator/denominator) |
Timestamp |
Media timestamp with timebase support |
PixelFormat |
Video pixel format (YUV420p, NV12, P010, RGB24, etc.) |
SampleFormat |
Audio sample format (F32, S24, F64, planar variants, etc.) |
CodecId |
Codec identifier (Green List only) with FromStr + canonical_name() |
MediaType |
Media type classification (Video, Audio, Subtitle) |
FourCC |
Registry-oriented four-character code (crate::fourcc) |
FourCc |
Typed repr(transparent) FourCC value with 30+ named constants (types::fourcc) |
ColorPrimaries |
ITU-T H.273 primary chromaticities (BT.709, BT.2020, P3-D65, …) |
TransferCharacteristics |
Electro-optical transfer function (SDR, PQ/SMPTE 2084, HLG, …) |
MatrixCoefficients |
YCbCr derivation matrix (BT.601, BT.2020 NCL/CL, ICtCp, …) |
ColorRange |
Quantisation range: Limited (studio swing) or Full (PC range) |
Error Handling
| Error Type | Description |
|---|---|
IoError |
I/O operation failures |
FormatError |
Container format issues |
CodecError |
Codec-specific errors |
PatentViolation |
Attempted use of patent-encumbered codec |
Memory Management
| Type | Description |
|---|---|
BufferPool |
Zero-copy buffer allocation and reuse |
Usage
use ;
use OxiResult;
FourCC Constants
oximedia-core ships two FourCC types with different purposes:
crate::fourcc::FourCC— Registry-oriented type (is_video(),is_audio(),parse()).crate::types::fourcc::FourCc— Lightweightrepr(transparent)value type for compile-time constants andstd::str::FromStrintegration.
FourCc usage
use ;
// Named constants — zero runtime cost
assert_eq!;
assert_eq!; // APV intra-frame professional codec
assert_eq!; // JPEG-XL ISOBMFF brand (trailing space)
assert_eq!;
assert_eq!;
// Parse from a string (case-exact, must be exactly 4 bytes)
let code: FourCc = "av01".parse.expect;
assert_eq!;
// User-defined constant
const MY_BOX: FourCc = new;
Named constant groups:
| Group | Constants |
|---|---|
| Video codecs | AVC1, HVC1, HEV1, AV01, VP08, VP09, MJPG_AVI, MJPG_MP4, APV1, JXL_, FFV1 |
| Audio codecs | MP4A, OPUS, FLAC_, VRBIS |
| ISOBMFF boxes | FTYP, MOOV, MDAT, MOOF, TRAK, MDIA, MINF, STBL, STSD, SIDX |
| RIFF / AVI | RIFF, LIST, AVI_, AVIX, IDX1, MOVI |
PixelFormat — Hardware Interop Variants
In addition to the standard planar and packed formats, PixelFormat provides semi-planar
formats commonly output by hardware video decoders:
| Variant | Bits | Layout | Typical source |
|---|---|---|---|
Nv12 |
8 | Y plane + interleaved UV | Most hardware decoders |
Nv21 |
8 | Y plane + interleaved VU | Android camera HAL |
P010 |
10 | Y plane + interleaved UV (16-bit words) | 10-bit HDR hardware decode/encode |
P016 |
16 | Y plane + interleaved UV (16-bit words) | Full 16-bit HW precision |
SampleFormat — Extended Precision
SampleFormat covers the complete range from 8-bit unsigned to 64-bit double-precision:
| Variant | Bits | Type | Notes |
|---|---|---|---|
U8 |
8 | unsigned int | |
S16 / S16p |
16 | signed int | interleaved / planar |
S24 / S24p |
24 | signed int | 3 bytes/sample; WAV/professional audio |
S32 / S32p |
32 | signed int | |
F32 / F32p |
32 | float | default; ~144 dB dynamic range |
F64 / F64p |
64 | double | highest precision |
CodecId — String Parsing and New Variants
CodecId implements std::str::FromStr (case-insensitive) and Display. Parsing accepts
common aliases (jxl → JpegXl, mjpg → Mjpeg, exr → OpenExr, etc.).
use CodecId;
// Image codecs added in recent versions
let webp = WebP;
let gif = Gif;
let jxl = JpegXl;
// Round-trip through string
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// APV — royalty-free professional intra-frame codec (ISO/IEC 23009-13)
let apv: CodecId = "apv".parse.unwrap;
assert!;
Wave 4 Additions (0.1.4)
Color Metadata Enums
Four compact enums in color_metadata encode ITU-T H.273 / ISO 23001-8 colour description
parameters, enabling zero-overhead codec integration:
| Enum | Const fn | Description |
|---|---|---|
ColorPrimaries |
to_u8() / from_u8() |
Primary chromaticities: Bt709, Bt2020, DciP3, P3D65, … |
TransferCharacteristics |
to_u8() / from_u8() + is_hdr() |
Transfer function: Smpte2084 (PQ), Hlg, Srgb, … |
MatrixCoefficients |
to_u8() / from_u8() |
Derivation matrix: Bt601, Bt2020Ncl, ICtCp, … |
ColorRange |
— | Limited (studio swing) or Full (PC range) |
TransferCharacteristics::is_hdr() returns true for Smpte2084, Hlg, Bt2020_10,
and Bt2020_12.
use ;
// HDR10 descriptor
let primaries = Bt2020;
let transfer = Smpte2084;
let matrix = Bt2020Ncl;
assert!;
assert_eq!;
Timestamp Arithmetic Methods
Three new methods for wall-clock-based timestamp manipulation (saturating, timebase-aware):
| Method | Description |
|---|---|
duration_add(Duration) |
Advance PTS by a std::time::Duration; saturates at i64::MAX |
duration_sub(Duration) |
Retreat PTS; clamps to 0 on underflow |
scale_by(num, den) |
Multiply PTS by num/den; returns self unchanged when den == 0 |
Immersive Audio Channel Layouts
Three new variants in channel_layout::ChannelLayoutKind:
| Variant | Channels | Bed | Height | Use case |
|---|---|---|---|---|
Surround714 |
11 | 7.1 | 3 | Dolby Atmos 7.1.4 |
Surround916 |
16 | 9.1 | 6 | Auro-3D / Atmos 9.1.6 |
DolbyAtmosBed9_1_6 |
16 | 9.1 | 6 | Dolby Atmos canonical bed order |
All three report has_height_channels() == true.
Module Structure
src/
├── lib.rs # Crate root with re-exports
├── error.rs # OxiError and OxiResult
├── types/
│ ├── mod.rs
│ ├── rational.rs # Rational number type
│ ├── timestamp.rs # Timestamp with timebase
│ ├── pixel_format.rs # Video pixel formats (incl. NV12/NV21/P010/P016)
│ ├── sample_format.rs # Audio sample formats (incl. S24/F64)
│ ├── codec_id.rs # Codec identifiers (FromStr, canonical_name)
│ └── fourcc.rs # FourCc value type and 30+ named constants
├── traits/
│ ├── mod.rs
│ ├── decoder.rs # VideoDecoder trait
│ └── demuxer.rs # Demuxer trait
├── alloc/
│ └── buffer_pool.rs # Zero-copy buffer pool
├── buffer_pool.rs # Buffer pool (crate root level)
├── channel_layout.rs # Multi-channel audio layouts
├── codec_info.rs # Codec information
├── codec_negotiation.rs # Format negotiation
├── convert.rs # Type conversions
├── error_context.rs # Contextual error wrapping
├── event_queue.rs # Internal event queue
├── fourcc.rs # FourCC code support
├── frame_info.rs # Frame metadata
├── hdr.rs # HDR metadata and transfer functions
├── media_time.rs # Media time utilities
├── memory.rs # Memory management
├── pixel_format.rs # Pixel format (crate root level)
├── rational.rs # Rational arithmetic
├── resource_handle.rs # Resource lifecycle management
├── sample_format.rs # Sample format (crate root level)
├── sync.rs # Synchronization primitives
├── type_registry.rs # Runtime type registry
├── version.rs # Version information
├── work_queue.rs # Work queue primitive
└── wasm.rs # WASM bindings (wasm32 target only)
Green List (Supported Codecs)
| Category | Codecs |
|---|---|
| Video | AV1, VP9, VP8, Theora, MJPEG, APV, FFV1, H.263* |
| Image | JPEG-XL, WebP, GIF, PNG, TIFF, OpenEXR, DNG |
| Audio | Opus, Vorbis, FLAC, PCM, MP3* |
| Subtitle | WebVTT, ASS/SSA, SRT |
* H.263 and MP3 patents expired; included for compatibility.
Attempting to use patent-encumbered codecs (H.264, H.265, AAC, etc.) will result in a PatentViolation error.
Feature Flags
| Feature | Description |
|---|---|
wasm |
WASM bindings via wasm-bindgen |
Policy
- No warnings (clippy pedantic)
- Apache 2.0 license
License
Apache-2.0 — Copyright 2024-2026 COOLJAPAN OU (Team Kitasan)