use std::fmt;
#[cfg(feature = "exp-video-codecs")]
use crate::codecs::CodecInfo;
use crate::codecs::CodecProfile;
use crate::common::FourCc;
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct VideoCodecId(u32);
pub const CODEC_ID_NULL_VIDEO: VideoCodecId = VideoCodecId(0x0);
impl Default for VideoCodecId {
fn default() -> Self {
CODEC_ID_NULL_VIDEO
}
}
impl VideoCodecId {
pub const fn new(cc: FourCc) -> VideoCodecId {
Self(0x8000_0000 | u32::from_be_bytes(cc.get()))
}
}
impl From<FourCc> for VideoCodecId {
fn from(value: FourCc) -> Self {
VideoCodecId::new(value)
}
}
impl fmt::Display for VideoCodecId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:#x}", self.0)
}
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct VideoExtraDataId(u32);
pub const VIDEO_EXTRA_DATA_ID_NULL: VideoExtraDataId = VideoExtraDataId(0x0);
impl Default for VideoExtraDataId {
fn default() -> Self {
VIDEO_EXTRA_DATA_ID_NULL
}
}
#[derive(Clone, Debug, Default)]
pub struct VideoExtraData {
pub id: VideoExtraDataId,
pub data: Box<[u8]>,
}
#[derive(Clone, Debug, Default)]
pub struct VideoCodecParameters {
pub codec: VideoCodecId,
pub profile: Option<CodecProfile>,
pub level: Option<u32>,
pub width: Option<u16>,
pub height: Option<u16>,
pub extra_data: Vec<VideoExtraData>,
}
impl VideoCodecParameters {
pub fn for_codec(&mut self, codec: VideoCodecId) -> &mut Self {
self.codec = codec;
self
}
pub fn with_profile(&mut self, profile: CodecProfile) -> &mut Self {
self.profile = Some(profile);
self
}
pub fn with_level(&mut self, level: u32) -> &mut Self {
self.level = Some(level);
self
}
pub fn with_width(&mut self, width: u16) -> &mut Self {
self.width = Some(width);
self
}
pub fn with_height(&mut self, height: u16) -> &mut Self {
self.height = Some(height);
self
}
pub fn add_extra_data(&mut self, data: VideoExtraData) -> &mut Self {
self.extra_data.push(data);
self
}
}
#[cfg(feature = "exp-video-codecs")]
#[non_exhaustive]
#[derive(Copy, Clone, Debug, Default)]
pub struct VideoDecoderOptions {
}
#[cfg(feature = "exp-video-codecs")]
pub trait VideoDecoder: Send + Sync {
fn reset(&mut self);
fn codec_info(&self) -> &CodecInfo;
fn codec_params(&self) -> &VideoCodecParameters;
}
pub mod well_known {
use super::VideoCodecId;
pub const CODEC_ID_MJPEG: VideoCodecId = VideoCodecId(0x100);
pub const CODEC_ID_BINK_VIDEO: VideoCodecId = VideoCodecId(0x200);
pub const CODEC_ID_SMACKER_VIDEO: VideoCodecId = VideoCodecId(0x201);
pub const CODEC_ID_CINEPAK: VideoCodecId = VideoCodecId(0x300);
pub const CODEC_ID_INDEO2: VideoCodecId = VideoCodecId(0x400);
pub const CODEC_ID_INDEO3: VideoCodecId = VideoCodecId(0x401);
pub const CODEC_ID_INDEO4: VideoCodecId = VideoCodecId(0x402);
pub const CODEC_ID_INDEO5: VideoCodecId = VideoCodecId(0x403);
pub const CODEC_ID_SVQ1: VideoCodecId = VideoCodecId(0x500);
pub const CODEC_ID_SVQ3: VideoCodecId = VideoCodecId(0x501);
pub const CODEC_ID_FLV: VideoCodecId = VideoCodecId(0x502);
pub const CODEC_ID_RV10: VideoCodecId = VideoCodecId(0x600);
pub const CODEC_ID_RV20: VideoCodecId = VideoCodecId(0x601);
pub const CODEC_ID_RV30: VideoCodecId = VideoCodecId(0x602);
pub const CODEC_ID_RV40: VideoCodecId = VideoCodecId(0x603);
pub const CODEC_ID_MSMPEG4V1: VideoCodecId = VideoCodecId(0x700);
pub const CODEC_ID_MSMPEG4V2: VideoCodecId = VideoCodecId(0x701);
pub const CODEC_ID_MSMPEG4V3: VideoCodecId = VideoCodecId(0x702);
pub const CODEC_ID_WMV1: VideoCodecId = VideoCodecId(0x703);
pub const CODEC_ID_WMV2: VideoCodecId = VideoCodecId(0x704);
pub const CODEC_ID_WMV3: VideoCodecId = VideoCodecId(0x705);
pub const CODEC_ID_VP3: VideoCodecId = VideoCodecId(0x800);
pub const CODEC_ID_VP4: VideoCodecId = VideoCodecId(0x801);
pub const CODEC_ID_VP5: VideoCodecId = VideoCodecId(0x802);
pub const CODEC_ID_VP6: VideoCodecId = VideoCodecId(0x803);
pub const CODEC_ID_VP7: VideoCodecId = VideoCodecId(0x804);
pub const CODEC_ID_VP8: VideoCodecId = VideoCodecId(0x805);
pub const CODEC_ID_VP9: VideoCodecId = VideoCodecId(0x806);
pub const CODEC_ID_THEORA: VideoCodecId = VideoCodecId(0x900);
pub const CODEC_ID_AV1: VideoCodecId = VideoCodecId(0x901);
pub const CODEC_ID_MPEG1: VideoCodecId = VideoCodecId(0xa00);
pub const CODEC_ID_MPEG2: VideoCodecId = VideoCodecId(0xa01);
pub const CODEC_ID_MPEG4: VideoCodecId = VideoCodecId(0xa02);
pub const CODEC_ID_H261: VideoCodecId = VideoCodecId(0xb01);
pub const CODEC_ID_H263: VideoCodecId = VideoCodecId(0xb03);
pub const CODEC_ID_H264: VideoCodecId = VideoCodecId(0xb04);
pub const CODEC_ID_HEVC: VideoCodecId = VideoCodecId(0xb05);
pub const CODEC_ID_VVC: VideoCodecId = VideoCodecId(0xb06);
pub const CODEC_ID_VC1: VideoCodecId = VideoCodecId(0xc00);
pub const CODEC_ID_AVS1: VideoCodecId = VideoCodecId(0xd00);
pub const CODEC_ID_AVS2: VideoCodecId = VideoCodecId(0xd01);
pub const CODEC_ID_AVS3: VideoCodecId = VideoCodecId(0xd02);
pub mod profiles {
use crate::codecs::CodecProfile;
pub const CODEC_PROFILE_AV1_MAIN: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_AV1_HIGH: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_AV1_PROFESSIONAL: CodecProfile = CodecProfile(2);
pub const CODEC_PROFILE_MPEG2_SIMPLE: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_MPEG2_MAIN: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_MPEG2_SNR_SCALABLE: CodecProfile = CodecProfile(2);
pub const CODEC_PROFILE_MPEG2_SPATIAL_SCALABLE: CodecProfile = CodecProfile(3);
pub const CODEC_PROFILE_MPEG2_HIGH: CodecProfile = CodecProfile(4);
pub const CODEC_PROFILE_MPEG2_422: CodecProfile = CodecProfile(5);
pub const CODEC_PROFILE_MPEG4_SIMPLE: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_MPEG4_ADVANCED_SIMPLE: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_H264_BASELINE: CodecProfile = CodecProfile(66);
pub const CODEC_PROFILE_H264_CONSTRAINED_BASELINE: CodecProfile =
CodecProfile(66 | 1 << (8 + 1)); pub const CODEC_PROFILE_H264_MAIN: CodecProfile = CodecProfile(77);
pub const CODEC_PROFILE_H264_EXTENDED: CodecProfile = CodecProfile(88);
pub const CODEC_PROFILE_H264_HIGH: CodecProfile = CodecProfile(100);
pub const CODEC_PROFILE_H264_PROGRESSIVE_HIGH: CodecProfile =
CodecProfile(100 | 1 << (8 + 4)); pub const CODEC_PROFILE_H264_CONSTRAINED_HIGH: CodecProfile =
CodecProfile(100 | 1 << (8 + 4) | 1 << (8 + 5)); pub const CODEC_PROFILE_H264_HIGH_10: CodecProfile = CodecProfile(110);
pub const CODEC_PROFILE_H264_HIGH_10_INTRA: CodecProfile = CodecProfile(110 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_HIGH_422: CodecProfile = CodecProfile(122);
pub const CODEC_PROFILE_H264_HIGH_422_INTRA: CodecProfile =
CodecProfile(122 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_HIGH_444: CodecProfile = CodecProfile(144);
pub const CODEC_PROFILE_H264_HIGH_444_PREDICTIVE: CodecProfile = CodecProfile(244);
pub const CODEC_PROFILE_H264_HIGH_444_INTRA: CodecProfile =
CodecProfile(244 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_CAVLC_444: CodecProfile = CodecProfile(44);
pub const CODEC_PROFILE_HEVC_MAIN: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_HEVC_MAIN_10: CodecProfile = CodecProfile(2);
pub const CODEC_PROFILE_HEVC_MAIN_STILL_PICTURE: CodecProfile = CodecProfile(3);
pub const CODEC_PROFILE_VP9_0: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_VP9_1: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_VP9_2: CodecProfile = CodecProfile(2);
pub const CODEC_PROFILE_VP9_3: CodecProfile = CodecProfile(3);
pub const CODEC_PROFILE_VC1_SIMPLE: CodecProfile = CodecProfile(0);
pub const CODEC_PROFILE_VC1_MAIN: CodecProfile = CodecProfile(1);
pub const CODEC_PROFILE_VC1_ADVANCED: CodecProfile = CodecProfile(2);
}
pub mod extra_data {
use crate::codecs::video::VideoExtraDataId;
pub const VIDEO_EXTRA_DATA_ID_AVC_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(1);
pub const VIDEO_EXTRA_DATA_ID_HEVC_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(2);
pub const VIDEO_EXTRA_DATA_ID_VP9_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(3);
pub const VIDEO_EXTRA_DATA_ID_AV1_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(4);
pub const VIDEO_EXTRA_DATA_ID_DOLBY_VISION_CONFIG: VideoExtraDataId = VideoExtraDataId(5);
pub const VIDEO_EXTRA_DATA_ID_DOLBY_VISION_EL_HEVC: VideoExtraDataId = VideoExtraDataId(6);
}
}