A common vocabulary of pixel-format and color-metadata types for video processing pipelines. Pure data types: no SIMD, no decoder, no codec, no math — just the shared spine that a color-conversion library, a decoder backend, and a frame consumer can all speak to without agreeing on anything heavier.
color— ITU-T H.273 color metadata enums (ColorMatrix,ColorPrimaries,ColorTransfer,ColorRange,ChromaLocation) bundled intoColorInfo. PlusDcpTargetGamutfor DCI-XYZ pipelines.cfa— Bayer color-filter-array description (BayerPattern).pixel_format— singlePixelFormatenum covering every pixel format in FFmpegn8.1'sAVPixelFormat(254 variants excluding GPU-resident HW formats) plus cinema-RAW additions. Coverage is verified bycargo xtask checkagainst vendoredpixfmt.hslugs — see xtask.frame— structural primitives (Dimensions,Rect,Plane<B>), the runtime-taggedVideoFrame<P, B>, and the orthogonalTimestampedFrame<F>wrapper bundlingmediatime::TimestampPTS + duration around any inner frame shape. Plus per-format typed*Frame<'a, BE>zero-copy borrow views +*FrameErrorvalidation (feature-gated).source— per-format marker ZSTs (Yuv420p,Nv12,Rgb24, …),*Row<'a>borrows,*Sinksubtraits, and*_towalker fns that iterate Frame → Row →PixelSink. The walker macro generates the marker / Row / Sink / walker quartet uniformly. Marker construction isFoo::new()(private()field locks shape evolution to additive changes).PixelSink+SourceFormatsealed traits re-exported at the crate root.
[dependencies]
# Lean — color + pixel_format + frame primitives.
# Adds `mediatime` + `derive_more`. ~600 LoC compiled.
videoframe = "0.2"Opt into typed *Frame<'a> borrow views + the per-format
source::* walker quartet per family:
videoframe = { version = "0.1", features = ["yuv-planar", "rgb"] }Or take everything via the umbrella:
videoframe = { version = "0.1", features = ["frame"] }Enable only the families your pipeline actually consumes — each
flag pulls in just the matching *Frame validators, *Row borrow
types, marker ZSTs, walker fn, and Sink subtraits. The frame
umbrella enables all of them at once.
| Feature | Formats |
|---|---|
yuv-planar |
Yuv420p / 422p / 444p / 440p / 411p / 410p + 9-16 bit |
yuv-semi-planar |
Nv12 / 16 / 21 / 24 / 42, P010 / 210 / 410 family |
yuva |
YUVA planar 8-bit + 9-16 bit |
yuv-packed |
Yuyv422, Uyvy422, Yvyu422, Uyyvyy411 |
yuv-444-packed |
V410, Xv30, Xv36, Ayuv64, Vuya, Vuyx, V30X |
y2xx |
Y210 / Y212 / Y216 |
v210 |
V210 |
rgb |
Rgb24 / Bgr24 / Rgba / Bgra + 10-bit + 16-bit |
rgb-float |
Rgbf32 / Rgbf16 + Rgbaf16/f32 |
rgb-legacy |
Rgb444 / 555 / 565 + Bgr counterparts |
gbr |
Gbrp / Gbrap + 9-16 bit + float |
gray |
Gray8 / 9-16 bit / f32, Ya8 / Ya16 |
bayer |
Bayer 8 / 10 / 12 / 14 / 16-bit × 4 patterns |
xyz |
Xyz12 (DCI-XYZ) |
mono |
Monoblack / Monowhite / Pal8 |
frame |
umbrella — enables every sub-feature above |
Deps pulled in by family features:
thiserror— every per-family feature (for*FrameError).half—rgb-float,gbr,gray(forhalf::f16).derive_moretry_unwrap/unwrap—yuv-444-packed,y2xx.
# Pure no_std — just enums, marker ZSTs, structural primitives.
videoframe = { version = "0.1", default-features = false }
# no_std + alloc — adds Vec-using helpers and tests.
videoframe = { version = "0.1", default-features = false, features = ["alloc"] }The color, cfa, and pixel_format modules work without alloc
(pure enums / Copy types). Per-family frame / source features
work under no_std + alloc.
cargo xtask sync fetches FFmpeg's libavutil/pixfmt.h from the
pinned release tag (currently n8.1), extracts every
AV_PIX_FMT_<NAME> identifier, and writes the lowercase slug list
to xtask/vendor/ffmpeg-pixfmts.txt.
cargo xtask check diffs the vendored slug list against
PixelFormat::as_str() and fails on any missing variant. CI runs
this so the PixelFormat enum stays exhaustive against the pinned
FFmpeg version.
Vendoring only the slug list (not the LGPL pixfmt.h verbatim)
sidesteps the license question.
videoframe is under the terms of both the MIT license and the
Apache License (Version 2.0).
See LICENSE-APACHE, LICENSE-MIT for details.
Copyright (c) 2026 FinDIT Studio authors.