1use std::ffi::CStr;
2use std::str::from_utf8_unchecked;
3
4use ffi::AVColorSpace::*;
5use ffi::*;
6
7#[derive(Eq, PartialEq, Clone, Copy, Debug)]
8pub 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
34impl 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
49impl 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
80impl 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