ccap/
types.rs

1use crate::sys;
2
3/// Pixel format enumeration
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum PixelFormat {
6    /// Unknown pixel format
7    Unknown,
8    /// NV12 pixel format
9    Nv12,
10    /// NV12F pixel format
11    Nv12F,
12    /// I420 pixel format
13    I420,
14    /// I420F pixel format
15    I420F,
16    /// YUYV pixel format
17    Yuyv,
18    /// YUYV flipped pixel format
19    YuyvF,
20    /// UYVY pixel format
21    Uyvy,
22    /// UYVY flipped pixel format
23    UyvyF,
24    /// RGB24 pixel format
25    Rgb24,
26    /// BGR24 pixel format
27    Bgr24,
28    /// RGBA32 pixel format
29    Rgba32,
30    /// BGRA32 pixel format
31    Bgra32,
32}
33
34impl From<sys::CcapPixelFormat> for PixelFormat {
35    fn from(format: sys::CcapPixelFormat) -> Self {
36        match format {
37            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UNKNOWN => PixelFormat::Unknown,
38            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_NV12 => PixelFormat::Nv12,
39            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_NV12F => PixelFormat::Nv12F,
40            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_I420 => PixelFormat::I420,
41            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_I420F => PixelFormat::I420F,
42            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_YUYV => PixelFormat::Yuyv,
43            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_YUYV_F => PixelFormat::YuyvF,
44            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UYVY => PixelFormat::Uyvy,
45            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UYVY_F => PixelFormat::UyvyF,
46            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_RGB24 => PixelFormat::Rgb24,
47            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_BGR24 => PixelFormat::Bgr24,
48            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_RGBA32 => PixelFormat::Rgba32,
49            sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_BGRA32 => PixelFormat::Bgra32,
50            _ => PixelFormat::Unknown,
51        }
52    }
53}
54
55impl PixelFormat {
56    /// Convert pixel format to C enum
57    pub fn to_c_enum(self) -> sys::CcapPixelFormat {
58        self.into()
59    }
60
61    /// Create pixel format from C enum
62    pub fn from_c_enum(format: sys::CcapPixelFormat) -> Self {
63        format.into()
64    }
65
66    /// Get string representation of pixel format
67    pub fn as_str(self) -> &'static str {
68        match self {
69            PixelFormat::Unknown => "Unknown",
70            PixelFormat::Nv12 => "NV12",
71            PixelFormat::Nv12F => "NV12F",
72            PixelFormat::I420 => "I420",
73            PixelFormat::I420F => "I420F",
74            PixelFormat::Yuyv => "YUYV",
75            PixelFormat::YuyvF => "YUYV_F",
76            PixelFormat::Uyvy => "UYVY",
77            PixelFormat::UyvyF => "UYVY_F",
78            PixelFormat::Rgb24 => "RGB24",
79            PixelFormat::Bgr24 => "BGR24",
80            PixelFormat::Rgba32 => "RGBA32",
81            PixelFormat::Bgra32 => "BGRA32",
82        }
83    }
84}
85
86impl From<PixelFormat> for sys::CcapPixelFormat {
87    fn from(val: PixelFormat) -> Self {
88        match val {
89            PixelFormat::Unknown => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UNKNOWN,
90            PixelFormat::Nv12 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_NV12,
91            PixelFormat::Nv12F => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_NV12F,
92            PixelFormat::I420 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_I420,
93            PixelFormat::I420F => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_I420F,
94            PixelFormat::Yuyv => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_YUYV,
95            PixelFormat::YuyvF => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_YUYV_F,
96            PixelFormat::Uyvy => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UYVY,
97            PixelFormat::UyvyF => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_UYVY_F,
98            PixelFormat::Rgb24 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_RGB24,
99            PixelFormat::Bgr24 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_BGR24,
100            PixelFormat::Rgba32 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_RGBA32,
101            PixelFormat::Bgra32 => sys::CcapPixelFormat_CCAP_PIXEL_FORMAT_BGRA32,
102        }
103    }
104}
105
106/// Frame orientation enumeration
107#[derive(Debug, Clone, Copy, PartialEq, Eq)]
108pub enum FrameOrientation {
109    /// Top to bottom orientation
110    TopToBottom,
111    /// Bottom to top orientation
112    BottomToTop,
113}
114
115impl From<sys::CcapFrameOrientation> for FrameOrientation {
116    fn from(orientation: sys::CcapFrameOrientation) -> Self {
117        match orientation {
118            sys::CcapFrameOrientation_CCAP_FRAME_ORIENTATION_TOP_TO_BOTTOM => {
119                FrameOrientation::TopToBottom
120            }
121            sys::CcapFrameOrientation_CCAP_FRAME_ORIENTATION_BOTTOM_TO_TOP => {
122                FrameOrientation::BottomToTop
123            }
124            _ => FrameOrientation::TopToBottom,
125        }
126    }
127}
128
129/// Camera property enumeration
130#[derive(Debug, Clone, Copy, PartialEq, Eq)]
131pub enum PropertyName {
132    /// Width property
133    Width,
134    /// Height property
135    Height,
136    /// Frame rate property
137    FrameRate,
138    /// Internal pixel format property
139    PixelFormatInternal,
140    /// Output pixel format property
141    PixelFormatOutput,
142    /// Frame orientation property
143    FrameOrientation,
144}
145
146impl PropertyName {
147    /// Convert property name to C enum
148    pub fn to_c_enum(self) -> sys::CcapPropertyName {
149        self.into()
150    }
151}
152
153impl From<PropertyName> for sys::CcapPropertyName {
154    fn from(prop: PropertyName) -> Self {
155        match prop {
156            PropertyName::Width => sys::CcapPropertyName_CCAP_PROPERTY_WIDTH,
157            PropertyName::Height => sys::CcapPropertyName_CCAP_PROPERTY_HEIGHT,
158            PropertyName::FrameRate => sys::CcapPropertyName_CCAP_PROPERTY_FRAME_RATE,
159            PropertyName::PixelFormatInternal => {
160                sys::CcapPropertyName_CCAP_PROPERTY_PIXEL_FORMAT_INTERNAL
161            }
162            PropertyName::PixelFormatOutput => {
163                sys::CcapPropertyName_CCAP_PROPERTY_PIXEL_FORMAT_OUTPUT
164            }
165            PropertyName::FrameOrientation => sys::CcapPropertyName_CCAP_PROPERTY_FRAME_ORIENTATION,
166        }
167    }
168}
169
170/// Color conversion backend enumeration
171#[derive(Debug, Clone, Copy, PartialEq, Eq)]
172pub enum ColorConversionBackend {
173    /// CPU backend
174    Cpu,
175    /// AVX2 backend
176    Avx2,
177    /// NEON backend
178    Neon,
179    /// Apple Accelerate backend
180    Accelerate,
181}
182
183impl ColorConversionBackend {
184    /// Convert backend to C enum
185    pub fn to_c_enum(self) -> sys::CcapConvertBackend {
186        match self {
187            ColorConversionBackend::Cpu => sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_CPU,
188            ColorConversionBackend::Avx2 => sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_AVX2,
189            ColorConversionBackend::Neon => sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_NEON,
190            ColorConversionBackend::Accelerate => {
191                sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_APPLE_ACCELERATE
192            }
193        }
194    }
195
196    /// Create backend from C enum
197    pub fn from_c_enum(backend: sys::CcapConvertBackend) -> Self {
198        match backend {
199            sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_CPU => ColorConversionBackend::Cpu,
200            sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_AVX2 => ColorConversionBackend::Avx2,
201            sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_NEON => ColorConversionBackend::Neon,
202            sys::CcapConvertBackend_CCAP_CONVERT_BACKEND_APPLE_ACCELERATE => {
203                ColorConversionBackend::Accelerate
204            }
205            _ => ColorConversionBackend::Cpu,
206        }
207    }
208}
209
210/// Resolution structure
211#[derive(Debug, Clone, Copy, PartialEq, Eq)]
212pub struct Resolution {
213    /// Width in pixels
214    pub width: u32,
215    /// Height in pixels
216    pub height: u32,
217}
218
219impl From<sys::CcapResolution> for Resolution {
220    fn from(res: sys::CcapResolution) -> Self {
221        Resolution {
222            width: res.width,
223            height: res.height,
224        }
225    }
226}