pub(crate) mod bitstream;
pub(crate) mod cabac;
pub(crate) mod cabac_ctx;
pub(crate) mod cavlc;
#[doc(hidden)] pub mod deblock;
#[doc(hidden)] pub mod decoder;
#[doc(hidden)] pub mod dpb_output;
#[doc(hidden)] pub mod inter_pred;
#[doc(hidden)] pub mod intra_pred;
#[doc(hidden)] pub mod macroblock_layer;
#[doc(hidden)] pub mod mb_address;
#[doc(hidden)] pub mod mb_grid;
#[doc(hidden)] pub mod mv_deriv;
#[doc(hidden)] pub mod nal;
#[doc(hidden)] pub mod non_vcl;
#[doc(hidden)] pub mod picture;
#[doc(hidden)] pub mod poc;
#[doc(hidden)] pub mod pps;
#[doc(hidden)] pub mod reconstruct;
#[doc(hidden)] pub mod ref_list;
#[doc(hidden)] pub mod ref_store;
#[doc(hidden)] pub mod scaling_list;
pub mod sei;
#[doc(hidden)] pub mod simd;
#[doc(hidden)] pub mod slice_data;
#[doc(hidden)] pub mod slice_header;
#[doc(hidden)] pub mod sp_transform;
#[doc(hidden)] pub mod sps;
#[doc(hidden)] pub mod sps_extension;
#[doc(hidden)] pub mod subset_sps;
#[doc(hidden)] pub mod transform;
#[doc(hidden)] pub mod vui;
pub mod avcc;
pub mod h264_decoder;
pub mod h264_encoder;
pub mod encoder;
pub mod es_demux;
use oxideav_core::{CodecCapabilities, CodecId, CodecTag};
use oxideav_core::{CodecInfo, CodecRegistry, RuntimeContext};
pub const CODEC_ID_STR: &str = "h264";
pub fn register_codecs(reg: &mut CodecRegistry) {
let caps = CodecCapabilities::video("h264_sw")
.with_lossy(true)
.with_lossless(true)
.with_intra_only(false)
.with_max_size(8192, 8192)
.with_pixel_formats(h264_encoder::accepted_pixel_formats().to_vec());
reg.register(
CodecInfo::new(CodecId::new(CODEC_ID_STR))
.capabilities(caps)
.decoder(h264_decoder::make_decoder)
.encoder(h264_encoder::make_encoder)
.encoder_options::<h264_encoder::H264EncoderOptions>()
.tags([
CodecTag::fourcc(b"H264"),
CodecTag::fourcc(b"h264"),
CodecTag::fourcc(b"AVC1"),
CodecTag::fourcc(b"avc1"),
CodecTag::fourcc(b"avc3"),
CodecTag::fourcc(b"X264"),
CodecTag::fourcc(b"x264"),
]),
);
}
pub fn register(ctx: &mut RuntimeContext) {
register_codecs(&mut ctx.codecs);
es_demux::register(&mut ctx.containers);
}
oxideav_core::register!("h264", register);
#[cfg(test)]
mod tests {
use super::*;
use oxideav_core::{CodecId, CodecParameters, RuntimeContext};
#[test]
fn register_via_runtime_context_installs_codec_factory() {
let mut ctx = RuntimeContext::new();
register(&mut ctx);
let params = CodecParameters::video(CodecId::new(CODEC_ID_STR));
let dec = ctx
.codecs
.first_decoder(¶ms)
.expect("h264 decoder factory");
assert_eq!(dec.codec_id().as_str(), CODEC_ID_STR);
}
}