| 1 | use std::ffi::CStr; |
| 2 | use std::str::from_utf8_unchecked; |
| 3 | |
| 4 | use ffi::AVColorSpace::*; |
| 5 | use ffi::*; |
| 6 | |
| 7 | #[derive (Eq, PartialEq, Clone, Copy, Debug)] |
| 8 | pub enum Space { |
| 9 | RGB, |
| 10 | BT709, |
| 11 | Unspecified, |
| 12 | Reserved, |
| 13 | FCC, |
| 14 | BT470BG, |
| 15 | SMPTE170M, |
| 16 | SMPTE240M, |
| 17 | YCGCO, |
| 18 | BT2020NCL, |
| 19 | BT2020CL, |
| 20 | SMPTE2085, |
| 21 | |
| 22 | ChromaDerivedNCL, |
| 23 | ChromaDerivedCL, |
| 24 | ICTCP, |
| 25 | |
| 26 | #[cfg (feature = "ffmpeg_7_1" )] |
| 27 | IPT_C2, |
| 28 | #[cfg (feature = "ffmpeg_7_1" )] |
| 29 | YCGCO_RE, |
| 30 | #[cfg (feature = "ffmpeg_7_1" )] |
| 31 | YCGCO_RO, |
| 32 | } |
| 33 | |
| 34 | impl Space { |
| 35 | pub const YCOCG: Space = Space::YCGCO; |
| 36 | |
| 37 | pub fn name(&self) -> Option<&'static str> { |
| 38 | if *self == Space::Unspecified { |
| 39 | return None; |
| 40 | } |
| 41 | unsafe { |
| 42 | let ptr = av_color_space_name((*self).into()); |
| 43 | ptr&{unknown}.as_ref() |
| 44 | .map(|ptr: *const {unknown}| from_utf8_unchecked(CStr::from_ptr(ptr).to_bytes())) |
| 45 | } |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | impl From<AVColorSpace> for Space { |
| 50 | fn from(value: AVColorSpace) -> Self { |
| 51 | match value { |
| 52 | AVCOL_SPC_RGB => Space::RGB, |
| 53 | AVCOL_SPC_BT709 => Space::BT709, |
| 54 | AVCOL_SPC_UNSPECIFIED => Space::Unspecified, |
| 55 | AVCOL_SPC_RESERVED => Space::Reserved, |
| 56 | AVCOL_SPC_FCC => Space::FCC, |
| 57 | AVCOL_SPC_BT470BG => Space::BT470BG, |
| 58 | AVCOL_SPC_SMPTE170M => Space::SMPTE170M, |
| 59 | AVCOL_SPC_SMPTE240M => Space::SMPTE240M, |
| 60 | AVCOL_SPC_YCGCO => Space::YCGCO, |
| 61 | AVCOL_SPC_BT2020_NCL => Space::BT2020NCL, |
| 62 | AVCOL_SPC_BT2020_CL => Space::BT2020CL, |
| 63 | AVCOL_SPC_SMPTE2085 => Space::SMPTE2085, |
| 64 | AVCOL_SPC_NB => Space::Unspecified, |
| 65 | |
| 66 | AVCOL_SPC_CHROMA_DERIVED_NCL => Space::ChromaDerivedNCL, |
| 67 | AVCOL_SPC_CHROMA_DERIVED_CL => Space::ChromaDerivedCL, |
| 68 | AVCOL_SPC_ICTCP => Space::ICTCP, |
| 69 | |
| 70 | #[cfg (feature = "ffmpeg_7_1" )] |
| 71 | AVCOL_SPC_IPT_C2 => Space::IPT_C2, |
| 72 | #[cfg (feature = "ffmpeg_7_1" )] |
| 73 | AVCOL_SPC_YCGCO_RE => Space::YCGCO_RE, |
| 74 | #[cfg (feature = "ffmpeg_7_1" )] |
| 75 | AVCOL_SPC_YCGCO_RO => Space::YCGCO_RO, |
| 76 | } |
| 77 | } |
| 78 | } |
| 79 | |
| 80 | impl From<Space> for AVColorSpace { |
| 81 | fn from(value: Space) -> AVColorSpace { |
| 82 | match value { |
| 83 | Space::RGB => AVCOL_SPC_RGB, |
| 84 | Space::BT709 => AVCOL_SPC_BT709, |
| 85 | Space::Unspecified => AVCOL_SPC_UNSPECIFIED, |
| 86 | Space::Reserved => AVCOL_SPC_RESERVED, |
| 87 | Space::FCC => AVCOL_SPC_FCC, |
| 88 | Space::BT470BG => AVCOL_SPC_BT470BG, |
| 89 | Space::SMPTE170M => AVCOL_SPC_SMPTE170M, |
| 90 | Space::SMPTE240M => AVCOL_SPC_SMPTE240M, |
| 91 | Space::YCGCO => AVCOL_SPC_YCGCO, |
| 92 | Space::BT2020NCL => AVCOL_SPC_BT2020_NCL, |
| 93 | Space::BT2020CL => AVCOL_SPC_BT2020_CL, |
| 94 | Space::SMPTE2085 => AVCOL_SPC_SMPTE2085, |
| 95 | |
| 96 | Space::ChromaDerivedNCL => AVCOL_SPC_CHROMA_DERIVED_NCL, |
| 97 | Space::ChromaDerivedCL => AVCOL_SPC_CHROMA_DERIVED_CL, |
| 98 | Space::ICTCP => AVCOL_SPC_ICTCP, |
| 99 | |
| 100 | #[cfg (feature = "ffmpeg_7_1" )] |
| 101 | Space::IPT_C2 => AVCOL_SPC_IPT_C2, |
| 102 | #[cfg (feature = "ffmpeg_7_1" )] |
| 103 | Space::YCGCO_RE => AVCOL_SPC_YCGCO_RE, |
| 104 | #[cfg (feature = "ffmpeg_7_1" )] |
| 105 | Space::YCGCO_RO => AVCOL_SPC_YCGCO_RO, |
| 106 | } |
| 107 | } |
| 108 | } |
| 109 | |