diff --git a/src/codec/mod.rs b/src/codec/mod.rs index 254564d..f9746ce 100644 --- a/src/codec/mod.rs +++ b/src/codec/mod.rs @@ -23,6 +23,9 @@ pub use self::compliance::Compliance; pub mod debug; pub use self::debug::*; +pub mod profile; +pub use self::profile::Profile; + pub mod encoder; pub mod decoder; diff --git a/src/codec/profile.rs b/src/codec/profile.rs new file mode 100644 index 0000000..a02ea07 --- /dev/null +++ b/src/codec/profile.rs @@ -0,0 +1,330 @@ +use libc::c_int; +use ffi::*; +use super::Id; + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum Profile { + Unknown, + Reserved, + + AAC(AAC), + MPEG2(MPEG2), + DTS(DTS), + H264(H264), + VC1(VC1), + MPEG4(MPEG4), + JPEG2000(JPEG2000), + HEVC(HEVC), +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum AAC { + Main, + Low, + SSR, + LTP, + HE, + HEv2, + LD, + ELD, + + MPEG2Low, + MPEG2HE, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum DTS { + Default, + ES, + _96_24, + HD_HRA, + HD_MA, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum MPEG2 { + _422, + High, + SS, + SNRScalable, + Main, + Simple, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum H264 { + Constrained, + Intra, + Baseline, + ConstrainedBaseline, + Main, + Extended, + High, + High10, + High10Intra, + High422, + High422Intra, + High444, + High444Predictive, + High444Intra, + CAVLC444, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum VC1 { + Simple, + Main, + Complex, + Advanced, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum MPEG4 { + Simple, + SimpleScalable, + Core, + Main, + NBit, + ScalableTexture, + SimpleFaceAnimation, + BasicAnimatedTexture, + Hybrid, + AdvancedRealTime, + CoreScalable, + AdvancedCoding, + AdvancedCore, + AdvancedScalableTexture, + SimpleStudio, + AdvancedSimple, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum JPEG2000 { + CStreamRestriction0, + CStreamRestriction1, + CStreamNoRestriction, + DCinema2K, + DCinema4K, +} + +#[allow(non_camel_case_types)] +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum HEVC { + Main, + Main10, + MainStillPicture, + Rext, +} + +impl From<(Id, c_int)> for Profile { + fn from((id, value): (Id, c_int)) -> Profile { + if value == FF_PROFILE_UNKNOWN { + return Profile::Unknown; + } + + if value == FF_PROFILE_RESERVED { + return Profile::Reserved; + } + + match id { + Id::AAC => match value { + FF_PROFILE_AAC_MAIN => Profile::AAC(AAC::Main), + FF_PROFILE_AAC_LOW => Profile::AAC(AAC::Low), + FF_PROFILE_AAC_SSR => Profile::AAC(AAC::SSR), + FF_PROFILE_AAC_LTP => Profile::AAC(AAC::LTP), + FF_PROFILE_AAC_HE => Profile::AAC(AAC::HE), + FF_PROFILE_AAC_HE_V2 => Profile::AAC(AAC::HEv2), + FF_PROFILE_AAC_LD => Profile::AAC(AAC::LD), + FF_PROFILE_AAC_ELD => Profile::AAC(AAC::ELD), + + FF_PROFILE_MPEG2_AAC_LOW => Profile::AAC(AAC::MPEG2Low), + FF_PROFILE_MPEG2_AAC_HE => Profile::AAC(AAC::MPEG2HE), + + _ => Profile::Unknown + }, + + Id::DTS => match value { + FF_PROFILE_DTS => Profile::DTS(DTS::Default), + FF_PROFILE_DTS_ES => Profile::DTS(DTS::ES), + FF_PROFILE_DTS_96_24 => Profile::DTS(DTS::_96_24), + FF_PROFILE_DTS_HD_HRA => Profile::DTS(DTS::HD_HRA), + FF_PROFILE_DTS_HD_MA => Profile::DTS(DTS::HD_MA), + + _ => Profile::Unknown, + }, + + Id::MPEG2VIDEO => match value { + FF_PROFILE_MPEG2_422 => Profile::MPEG2(MPEG2::_422), + FF_PROFILE_MPEG2_HIGH => Profile::MPEG2(MPEG2::High), + FF_PROFILE_MPEG2_SS => Profile::MPEG2(MPEG2::SS), + FF_PROFILE_MPEG2_SNR_SCALABLE => Profile::MPEG2(MPEG2::SNRScalable), + FF_PROFILE_MPEG2_MAIN => Profile::MPEG2(MPEG2::Main), + FF_PROFILE_MPEG2_SIMPLE => Profile::MPEG2(MPEG2::Simple), + + _ => Profile::Unknown, + }, + + Id::H264 => match value { + FF_PROFILE_H264_CONSTRAINED => Profile::H264(H264::Constrained), + FF_PROFILE_H264_INTRA => Profile::H264(H264::Intra), + FF_PROFILE_H264_BASELINE => Profile::H264(H264::Baseline), + FF_PROFILE_H264_CONSTRAINED_BASELINE => Profile::H264(H264::ConstrainedBaseline), + FF_PROFILE_H264_MAIN => Profile::H264(H264::Main), + FF_PROFILE_H264_EXTENDED => Profile::H264(H264::Extended), + FF_PROFILE_H264_HIGH => Profile::H264(H264::High), + FF_PROFILE_H264_HIGH_10 => Profile::H264(H264::High10), + FF_PROFILE_H264_HIGH_10_INTRA => Profile::H264(H264::High10Intra), + FF_PROFILE_H264_HIGH_422 => Profile::H264(H264::High422), + FF_PROFILE_H264_HIGH_422_INTRA => Profile::H264(H264::High422Intra), + FF_PROFILE_H264_HIGH_444 => Profile::H264(H264::High444), + FF_PROFILE_H264_HIGH_444_PREDICTIVE => Profile::H264(H264::High444Predictive), + FF_PROFILE_H264_HIGH_444_INTRA => Profile::H264(H264::High444Intra), + FF_PROFILE_H264_CAVLC_444 => Profile::H264(H264::CAVLC444), + + _ => Profile::Unknown, + }, + + Id::VC1 => match value { + FF_PROFILE_VC1_SIMPLE => Profile::VC1(VC1::Simple), + FF_PROFILE_VC1_MAIN => Profile::VC1(VC1::Main), + FF_PROFILE_VC1_COMPLEX => Profile::VC1(VC1::Complex), + FF_PROFILE_VC1_ADVANCED => Profile::VC1(VC1::Advanced), + + _ => Profile::Unknown, + }, + + Id::MPEG4 => match value { + FF_PROFILE_MPEG4_SIMPLE => Profile::MPEG4(MPEG4::Simple), + FF_PROFILE_MPEG4_SIMPLE_SCALABLE => Profile::MPEG4(MPEG4::SimpleScalable), + FF_PROFILE_MPEG4_CORE => Profile::MPEG4(MPEG4::Core), + FF_PROFILE_MPEG4_MAIN => Profile::MPEG4(MPEG4::Main), + FF_PROFILE_MPEG4_N_BIT => Profile::MPEG4(MPEG4::NBit), + FF_PROFILE_MPEG4_SCALABLE_TEXTURE => Profile::MPEG4(MPEG4::ScalableTexture), + FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION => Profile::MPEG4(MPEG4::SimpleFaceAnimation), + FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE => Profile::MPEG4(MPEG4::BasicAnimatedTexture), + FF_PROFILE_MPEG4_HYBRID => Profile::MPEG4(MPEG4::Hybrid), + FF_PROFILE_MPEG4_ADVANCED_REAL_TIME => Profile::MPEG4(MPEG4::AdvancedRealTime), + FF_PROFILE_MPEG4_CORE_SCALABLE => Profile::MPEG4(MPEG4::CoreScalable), + FF_PROFILE_MPEG4_ADVANCED_CODING => Profile::MPEG4(MPEG4::AdvancedCoding), + FF_PROFILE_MPEG4_ADVANCED_CORE => Profile::MPEG4(MPEG4::AdvancedCore), + FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE => Profile::MPEG4(MPEG4::AdvancedScalableTexture), + FF_PROFILE_MPEG4_SIMPLE_STUDIO => Profile::MPEG4(MPEG4::SimpleStudio), + FF_PROFILE_MPEG4_ADVANCED_SIMPLE => Profile::MPEG4(MPEG4::AdvancedSimple), + + _ => Profile::Unknown, + }, + + Id::JPEG2000 => match value { + FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 => Profile::JPEG2000(JPEG2000::CStreamRestriction0), + FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 => Profile::JPEG2000(JPEG2000::CStreamRestriction1), + FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION => Profile::JPEG2000(JPEG2000::CStreamNoRestriction), + FF_PROFILE_JPEG2000_DCINEMA_2K => Profile::JPEG2000(JPEG2000::DCinema2K), + FF_PROFILE_JPEG2000_DCINEMA_4K => Profile::JPEG2000(JPEG2000::DCinema4K), + + _ => Profile::Unknown, + }, + + Id::HEVC => match value { + FF_PROFILE_HEVC_MAIN => Profile::HEVC(HEVC::Main), + FF_PROFILE_HEVC_MAIN_10 => Profile::HEVC(HEVC::Main10), + FF_PROFILE_HEVC_MAIN_STILL_PICTURE => Profile::HEVC(HEVC::MainStillPicture), + FF_PROFILE_HEVC_REXT => Profile::HEVC(HEVC::Rext), + + _ => Profile::Unknown, + }, + + _ => Profile::Unknown + } + } +} + +impl Into for Profile { + fn into(self) -> c_int { + match self { + Profile::Unknown => FF_PROFILE_UNKNOWN, + Profile::Reserved => FF_PROFILE_RESERVED, + + Profile::AAC(AAC::Main) => FF_PROFILE_AAC_MAIN, + Profile::AAC(AAC::Low) => FF_PROFILE_AAC_LOW, + Profile::AAC(AAC::SSR) => FF_PROFILE_AAC_SSR, + Profile::AAC(AAC::LTP) => FF_PROFILE_AAC_LTP, + Profile::AAC(AAC::HE) => FF_PROFILE_AAC_HE, + Profile::AAC(AAC::HEv2) => FF_PROFILE_AAC_HE_V2, + Profile::AAC(AAC::LD) => FF_PROFILE_AAC_LD, + Profile::AAC(AAC::ELD) => FF_PROFILE_AAC_ELD, + + Profile::AAC(AAC::MPEG2Low) => FF_PROFILE_MPEG2_AAC_LOW, + Profile::AAC(AAC::MPEG2HE) => FF_PROFILE_MPEG2_AAC_HE, + + Profile::DTS(DTS::Default) => FF_PROFILE_DTS, + Profile::DTS(DTS::ES) => FF_PROFILE_DTS_ES, + Profile::DTS(DTS::_96_24) => FF_PROFILE_DTS_96_24, + Profile::DTS(DTS::HD_HRA) => FF_PROFILE_DTS_HD_HRA, + Profile::DTS(DTS::HD_MA) => FF_PROFILE_DTS_HD_MA, + + Profile::MPEG2(MPEG2::_422) => FF_PROFILE_MPEG2_422, + Profile::MPEG2(MPEG2::High) => FF_PROFILE_MPEG2_HIGH, + Profile::MPEG2(MPEG2::SS) => FF_PROFILE_MPEG2_SS, + Profile::MPEG2(MPEG2::SNRScalable) => FF_PROFILE_MPEG2_SNR_SCALABLE, + Profile::MPEG2(MPEG2::Main) => FF_PROFILE_MPEG2_MAIN, + Profile::MPEG2(MPEG2::Simple) => FF_PROFILE_MPEG2_SIMPLE, + + Profile::H264(H264::Constrained) => FF_PROFILE_H264_CONSTRAINED, + Profile::H264(H264::Intra) => FF_PROFILE_H264_INTRA, + Profile::H264(H264::Baseline) => FF_PROFILE_H264_BASELINE, + Profile::H264(H264::ConstrainedBaseline) => FF_PROFILE_H264_CONSTRAINED_BASELINE, + Profile::H264(H264::Main) => FF_PROFILE_H264_MAIN, + Profile::H264(H264::Extended) => FF_PROFILE_H264_EXTENDED, + Profile::H264(H264::High) => FF_PROFILE_H264_HIGH, + Profile::H264(H264::High10) => FF_PROFILE_H264_HIGH_10, + Profile::H264(H264::High10Intra) => FF_PROFILE_H264_HIGH_10_INTRA, + Profile::H264(H264::High422) => FF_PROFILE_H264_HIGH_422, + Profile::H264(H264::High422Intra) => FF_PROFILE_H264_HIGH_422_INTRA, + Profile::H264(H264::High444) => FF_PROFILE_H264_HIGH_444, + Profile::H264(H264::High444Predictive) => FF_PROFILE_H264_HIGH_444_PREDICTIVE, + Profile::H264(H264::High444Intra) => FF_PROFILE_H264_HIGH_444_INTRA, + Profile::H264(H264::CAVLC444) => FF_PROFILE_H264_CAVLC_444, + + Profile::VC1(VC1::Simple) => FF_PROFILE_VC1_SIMPLE, + Profile::VC1(VC1::Main) => FF_PROFILE_VC1_MAIN, + Profile::VC1(VC1::Complex) => FF_PROFILE_VC1_COMPLEX, + Profile::VC1(VC1::Advanced) => FF_PROFILE_VC1_ADVANCED, + + Profile::MPEG4(MPEG4::Simple) => FF_PROFILE_MPEG4_SIMPLE, + Profile::MPEG4(MPEG4::SimpleScalable) => FF_PROFILE_MPEG4_SIMPLE_SCALABLE, + Profile::MPEG4(MPEG4::Core) => FF_PROFILE_MPEG4_CORE, + Profile::MPEG4(MPEG4::Main) => FF_PROFILE_MPEG4_MAIN, + Profile::MPEG4(MPEG4::NBit) => FF_PROFILE_MPEG4_N_BIT, + Profile::MPEG4(MPEG4::ScalableTexture) => FF_PROFILE_MPEG4_SCALABLE_TEXTURE, + Profile::MPEG4(MPEG4::SimpleFaceAnimation) => FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION, + Profile::MPEG4(MPEG4::BasicAnimatedTexture) => FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE, + Profile::MPEG4(MPEG4::Hybrid) => FF_PROFILE_MPEG4_HYBRID, + Profile::MPEG4(MPEG4::AdvancedRealTime) => FF_PROFILE_MPEG4_ADVANCED_REAL_TIME, + Profile::MPEG4(MPEG4::CoreScalable) => FF_PROFILE_MPEG4_CORE_SCALABLE, + Profile::MPEG4(MPEG4::AdvancedCoding) => FF_PROFILE_MPEG4_ADVANCED_CODING, + Profile::MPEG4(MPEG4::AdvancedCore) => FF_PROFILE_MPEG4_ADVANCED_CORE, + Profile::MPEG4(MPEG4::AdvancedScalableTexture) => FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE, + Profile::MPEG4(MPEG4::SimpleStudio) => FF_PROFILE_MPEG4_SIMPLE_STUDIO, + Profile::MPEG4(MPEG4::AdvancedSimple) => FF_PROFILE_MPEG4_ADVANCED_SIMPLE, + + Profile::JPEG2000(JPEG2000::CStreamRestriction0) => FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0, + Profile::JPEG2000(JPEG2000::CStreamRestriction1) => FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1, + Profile::JPEG2000(JPEG2000::CStreamNoRestriction) => FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION, + Profile::JPEG2000(JPEG2000::DCinema2K) => FF_PROFILE_JPEG2000_DCINEMA_2K, + Profile::JPEG2000(JPEG2000::DCinema4K) => FF_PROFILE_JPEG2000_DCINEMA_4K, + + Profile::HEVC(HEVC::Main) => FF_PROFILE_HEVC_MAIN, + Profile::HEVC(HEVC::Main10) => FF_PROFILE_HEVC_MAIN_10, + Profile::HEVC(HEVC::MainStillPicture) => FF_PROFILE_HEVC_MAIN_STILL_PICTURE, + Profile::HEVC(HEVC::Rext) => FF_PROFILE_HEVC_REXT, + } + } +}