Skip to main content

ffmpeg_next/util/color/
space.rs

1use std::ffi::CStr;
2use std::str::from_utf8_unchecked;
3
4use crate::ffi::AVColorSpace::*;
5use crate::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.as_ref()
44                .map(|ptr| 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            #[cfg(feature = "non-exhaustive-enums")]
78            _ => unimplemented!(),
79        }
80    }
81}
82
83impl From<Space> for AVColorSpace {
84    fn from(value: Space) -> AVColorSpace {
85        match value {
86            Space::RGB => AVCOL_SPC_RGB,
87            Space::BT709 => AVCOL_SPC_BT709,
88            Space::Unspecified => AVCOL_SPC_UNSPECIFIED,
89            Space::Reserved => AVCOL_SPC_RESERVED,
90            Space::FCC => AVCOL_SPC_FCC,
91            Space::BT470BG => AVCOL_SPC_BT470BG,
92            Space::SMPTE170M => AVCOL_SPC_SMPTE170M,
93            Space::SMPTE240M => AVCOL_SPC_SMPTE240M,
94            Space::YCGCO => AVCOL_SPC_YCGCO,
95            Space::BT2020NCL => AVCOL_SPC_BT2020_NCL,
96            Space::BT2020CL => AVCOL_SPC_BT2020_CL,
97            Space::SMPTE2085 => AVCOL_SPC_SMPTE2085,
98
99            Space::ChromaDerivedNCL => AVCOL_SPC_CHROMA_DERIVED_NCL,
100            Space::ChromaDerivedCL => AVCOL_SPC_CHROMA_DERIVED_CL,
101            Space::ICTCP => AVCOL_SPC_ICTCP,
102
103            #[cfg(feature = "ffmpeg_7_1")]
104            Space::IPT_C2 => AVCOL_SPC_IPT_C2,
105            #[cfg(feature = "ffmpeg_7_1")]
106            Space::YCGCO_RE => AVCOL_SPC_YCGCO_RE,
107            #[cfg(feature = "ffmpeg_7_1")]
108            Space::YCGCO_RO => AVCOL_SPC_YCGCO_RO,
109        }
110    }
111}