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 | |