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 
27 impl Space {
28     pub const YCOCG: Space = Space::YCGCO;
29 
name(&self) -> Option<&'static str>30     pub fn name(&self) -> Option<&'static str> {
31         if *self == Space::Unspecified {
32             return None;
33         }
34         unsafe {
35             let ptr = av_color_space_name((*self).into());
36             ptr.as_ref()
37                 .map(|ptr| from_utf8_unchecked(CStr::from_ptr(ptr).to_bytes()))
38         }
39     }
40 }
41 
42 impl From<AVColorSpace> for Space {
from(value: AVColorSpace) -> Self43     fn from(value: AVColorSpace) -> Self {
44         match value {
45             AVCOL_SPC_RGB => Space::RGB,
46             AVCOL_SPC_BT709 => Space::BT709,
47             AVCOL_SPC_UNSPECIFIED => Space::Unspecified,
48             AVCOL_SPC_RESERVED => Space::Reserved,
49             AVCOL_SPC_FCC => Space::FCC,
50             AVCOL_SPC_BT470BG => Space::BT470BG,
51             AVCOL_SPC_SMPTE170M => Space::SMPTE170M,
52             AVCOL_SPC_SMPTE240M => Space::SMPTE240M,
53             AVCOL_SPC_YCGCO => Space::YCGCO,
54             AVCOL_SPC_BT2020_NCL => Space::BT2020NCL,
55             AVCOL_SPC_BT2020_CL => Space::BT2020CL,
56             AVCOL_SPC_SMPTE2085 => Space::SMPTE2085,
57             AVCOL_SPC_NB => Space::Unspecified,
58 
59             AVCOL_SPC_CHROMA_DERIVED_NCL => Space::ChromaDerivedNCL,
60             AVCOL_SPC_CHROMA_DERIVED_CL => Space::ChromaDerivedCL,
61             AVCOL_SPC_ICTCP => Space::ICTCP,
62         }
63     }
64 }
65 
66 impl From<Space> for AVColorSpace {
from(value: Space) -> AVColorSpace67     fn from(value: Space) -> AVColorSpace {
68         match value {
69             Space::RGB => AVCOL_SPC_RGB,
70             Space::BT709 => AVCOL_SPC_BT709,
71             Space::Unspecified => AVCOL_SPC_UNSPECIFIED,
72             Space::Reserved => AVCOL_SPC_RESERVED,
73             Space::FCC => AVCOL_SPC_FCC,
74             Space::BT470BG => AVCOL_SPC_BT470BG,
75             Space::SMPTE170M => AVCOL_SPC_SMPTE170M,
76             Space::SMPTE240M => AVCOL_SPC_SMPTE240M,
77             Space::YCGCO => AVCOL_SPC_YCGCO,
78             Space::BT2020NCL => AVCOL_SPC_BT2020_NCL,
79             Space::BT2020CL => AVCOL_SPC_BT2020_CL,
80             Space::SMPTE2085 => AVCOL_SPC_SMPTE2085,
81 
82             Space::ChromaDerivedNCL => AVCOL_SPC_CHROMA_DERIVED_NCL,
83             Space::ChromaDerivedCL => AVCOL_SPC_CHROMA_DERIVED_CL,
84             Space::ICTCP => AVCOL_SPC_ICTCP,
85         }
86     }
87 }
88