# oxideav-core
Core types for the [oxideav](https://github.com/OxideAV/oxideav-workspace)
pure-Rust media framework:
* **`Packet`** — one compressed chunk belonging to one stream, with
timestamps. Chainable `with_*` builders cover every
[`PacketFlags`](crate::packet::PacketFlags) field
(`with_keyframe` / `with_header` / `with_corrupt` / `with_discard` /
`with_unit_boundary`, plus a bulk `with_flags`) and the
stream-index / time-base / pts / dts / duration setters used by
demuxers and remuxers. An `end_pts()` accessor returns the
overflow-checked `pts + duration` for muxers that need a per-
packet end timestamp.
* **`Frame`** — one uncompressed audio / video / subtitle chunk.
* **`StreamInfo`** / **`CodecParameters`** — what a demuxer advertises and
what a decoder / encoder consumes.
* **`TimeBase`** / **`Timestamp`** / **`Rational`** — rational time per
stream; timestamps are integers in that base. Named constants
(`MILLIS` / `MICROS` / `NANOS` / `MPEG_TS` / `AUDIO_48K` / `AUDIO_44K1`
/ `AUDIO_8K` / `SECONDS`) replace the workspace's `TimeBase::new(1, …)`
magic-numbers; `TimeBase::from_rate(u32)` constructs the inverse-of-rate
form, and `ticks_of(seconds: f64)` is the overflow-clamped inverse of
the existing `seconds_of(ticks)`. `Timestamp::from_seconds` /
`checked_add_ticks` / `checked_sub_ticks` / `checked_diff` cover
per-stream timestamp arithmetic (including cross-base differences for
remux pipelines). `Rational` supports exact `+ - * /` and unary `-`
(results reduced via `i128` intermediates), plus `cmp_value` /
`equals_value` for value comparison (`30000/1001` vs `30/1`) that
doesn't disturb the structural `Eq`/`Hash` callers rely on to
preserve the on-wire fraction.
* **`PixelFormat`** / **`SampleFormat`** — enum of supported raw formats
(40+ pixel variants including 8/10/12-bit YUV, 10/12/14-bit planar
GBR(A), packed RGB/RGBA, NV12/NV21, all common sample layouts).
* **`AttachedPicture`** / **`PictureType`** — ID3v2 `APIC` taxonomy
shared by ID3v2 / FLAC / MP4 / Vorbis cover-art carriage. `PictureType`
round-trips byte-for-byte through `from_u8` ↔ `to_u8` over the spec-
assigned `0x00..=0x14` range; unassigned bytes collapse to `Unknown`,
flagged via `is_known()` so strict writers can refuse to emit the
`0xFF` sentinel. `AttachedPicture::new(mime, kind)` plus chainable
`with_description` / `with_data` / `with_picture_type` builders cover
the producer side (parsers writing into a partially-decoded picture
as bytes arrive), and `is_external_link()` distinguishes ID3v2's
`"-->"` URL-sentinel mime from inline image bytes without having to
hardcode the string at every call site.
* **`CodecTag`** / **`CodecResolver`** — neutral abstraction for mapping
container-level tags (AVI FourCC, WAVEFORMATEX `wFormatTag`, MP4 OTI,
Matroska CodecID strings) to oxideav `CodecId`s. Lets codec crates own
their own tag claims without pulling a codec registry into every
container.
* **`bits`** — shared MSB-first / LSB-first `BitReader` / `BitWriter`
plus unary helpers. Used by the FLAC, AAC, H.264, HEVC, Vorbis and a
dozen other codecs in the workspace.
* **`SourceRegistry`** — URI scheme dispatch for sources. Drivers
register as one of three shapes — `BytesSource` (file / http),
`PacketSource` (transport-layer protocols that pre-demux), or
`FrameSource` (synthetic generators that emit decoded frames) —
and `open(uri)` returns a `SourceOutput` enum the pipeline executor
branches on.
* **`Error`** — one unified error enum used across the ecosystem.
Zero C dependencies. Zero FFI. Zero `*-sys` crates.
## Usage
```toml
[dependencies]
oxideav-core = "0.1"
```
Everything downstream in oxideav (codec traits, container traits, codec
implementations, the CLI) depends on this crate transitively, so the
surface is kept deliberately small. The 0.1 series is the first stable
semver line — additive changes are `0.1.x` patch bumps; breaking
reshapes go to `0.2.0`.
## License
MIT — see [LICENSE](LICENSE).