1use core::fmt;
3use std::fmt::Display;
4
5use num_derive::{FromPrimitive, ToPrimitive};
6
7#[cfg(target_os = "windows")]
8pub(crate) type OsEnumType = std::os::raw::c_int;
9#[cfg(not(target_os = "windows"))]
10pub(crate) type OsEnumType = std::os::raw::c_uint;
11
12#[cfg_attr(target_os = "windows", repr(i32))]
13#[cfg_attr(not(target_os = "windows"), repr(u32))]
14#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
15pub enum ObsVideoFormat {
18 AYUV = libobs::video_format_VIDEO_FORMAT_AYUV,
19 BGR3 = libobs::video_format_VIDEO_FORMAT_BGR3,
20 BGRA = libobs::video_format_VIDEO_FORMAT_BGRA,
21 BGRX = libobs::video_format_VIDEO_FORMAT_BGRX,
22 I010 = libobs::video_format_VIDEO_FORMAT_I010,
23 I210 = libobs::video_format_VIDEO_FORMAT_I210,
24 I40A = libobs::video_format_VIDEO_FORMAT_I40A,
25 I412 = libobs::video_format_VIDEO_FORMAT_I412,
26 I420 = libobs::video_format_VIDEO_FORMAT_I420,
27 I422 = libobs::video_format_VIDEO_FORMAT_I422,
28 I42A = libobs::video_format_VIDEO_FORMAT_I42A,
29 I444 = libobs::video_format_VIDEO_FORMAT_I444,
30 NONE = libobs::video_format_VIDEO_FORMAT_NONE,
31 NV12 = libobs::video_format_VIDEO_FORMAT_NV12,
32 P010 = libobs::video_format_VIDEO_FORMAT_P010,
33 P216 = libobs::video_format_VIDEO_FORMAT_P216,
34 P416 = libobs::video_format_VIDEO_FORMAT_P416,
35 R10L = libobs::video_format_VIDEO_FORMAT_R10L,
36 RGBA = libobs::video_format_VIDEO_FORMAT_RGBA,
37 UYVY = libobs::video_format_VIDEO_FORMAT_UYVY,
38 V210 = libobs::video_format_VIDEO_FORMAT_V210,
39 Y800 = libobs::video_format_VIDEO_FORMAT_Y800,
40 YA2L = libobs::video_format_VIDEO_FORMAT_YA2L,
41 YUVA = libobs::video_format_VIDEO_FORMAT_YUVA,
42 YUY2 = libobs::video_format_VIDEO_FORMAT_YUY2,
43 YVYU = libobs::video_format_VIDEO_FORMAT_YVYU,
44}
45
46#[cfg_attr(target_os = "windows", repr(i32))]
47#[cfg_attr(not(target_os = "windows"), repr(u32))]
48#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
49pub enum ObsColorspace {
52 CS2100HLG = libobs::video_colorspace_VIDEO_CS_2100_HLG,
53 CS2100PQ = libobs::video_colorspace_VIDEO_CS_2100_PQ,
54 CS601 = libobs::video_colorspace_VIDEO_CS_601,
55 CS709 = libobs::video_colorspace_VIDEO_CS_709,
56 Default = libobs::video_colorspace_VIDEO_CS_DEFAULT,
57 CSRGB = libobs::video_colorspace_VIDEO_CS_SRGB,
58}
59
60#[cfg_attr(target_os = "windows", repr(i32))]
61#[cfg_attr(not(target_os = "windows"), repr(u32))]
62#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
63pub enum ObsVideoRange {
67 Default = libobs::video_range_type_VIDEO_RANGE_DEFAULT,
68 Partial = libobs::video_range_type_VIDEO_RANGE_PARTIAL,
69 Full = libobs::video_range_type_VIDEO_RANGE_FULL,
70}
71
72#[cfg_attr(target_os = "windows", repr(i32))]
73#[cfg_attr(not(target_os = "windows"), repr(u32))]
74#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
75pub enum ObsScaleType {
79 Area = libobs::obs_scale_type_OBS_SCALE_AREA,
80 Bicubic = libobs::obs_scale_type_OBS_SCALE_BICUBIC,
81 Bilinear = libobs::obs_scale_type_OBS_SCALE_BILINEAR,
82 Disable = libobs::obs_scale_type_OBS_SCALE_DISABLE,
83 Lanczos = libobs::obs_scale_type_OBS_SCALE_LANCZOS,
84 Point = libobs::obs_scale_type_OBS_SCALE_POINT,
85}
86
87#[derive(Clone, Copy, Debug, PartialEq, Eq)]
88pub enum ObsGraphicsModule {
91 OpenGL,
92 DirectX11,
93}
94
95#[repr(i32)]
96#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
97pub enum ObsResetVideoStatus {
101 Success = libobs::OBS_VIDEO_SUCCESS as i32,
103 NotSupported = libobs::OBS_VIDEO_NOT_SUPPORTED,
106 InvalidParameter = libobs::OBS_VIDEO_INVALID_PARAM,
108 CurrentlyActive = libobs::OBS_VIDEO_CURRENTLY_ACTIVE,
111 Failure = libobs::OBS_VIDEO_FAIL,
114}
115
116#[cfg_attr(target_os = "windows", repr(i32))]
119#[cfg_attr(not(target_os = "windows"), repr(u32))]
120#[derive(Clone, Copy, Debug, PartialEq, Eq)]
121pub enum ObsSamplesPerSecond {
122 F44100 = 44100,
124 F48000 = 48000,
126}
127
128#[cfg_attr(target_os = "windows", repr(i32))]
129#[cfg_attr(not(target_os = "windows"), repr(u32))]
130#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
131pub enum ObsSpeakerLayout {
132 S2Point1 = libobs::speaker_layout_SPEAKERS_2POINT1,
133 S4Point0 = libobs::speaker_layout_SPEAKERS_4POINT0,
134 S4Point1 = libobs::speaker_layout_SPEAKERS_4POINT1,
135 S5Point1 = libobs::speaker_layout_SPEAKERS_5POINT1,
136 S7Point1 = libobs::speaker_layout_SPEAKERS_7POINT1,
137 Mono = libobs::speaker_layout_SPEAKERS_MONO,
138 Stereo = libobs::speaker_layout_SPEAKERS_STEREO,
139 Unknown = libobs::speaker_layout_SPEAKERS_UNKNOWN,
140}
141
142#[derive(Clone, Copy, Debug, PartialEq, Eq)]
143pub enum ObsOutputStopSignal {
144 Success,
146 BadPath,
148 ConnectFailed,
150 InvalidStream,
152 Error,
154 Disconnected,
156 Unsupported,
158 NoSpace,
160 EncodeError,
162}
163
164impl fmt::Display for ObsOutputStopSignal {
165 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
166 let s = match self {
167 ObsOutputStopSignal::Success => "Success",
168 ObsOutputStopSignal::BadPath => "Bad Path",
169 ObsOutputStopSignal::ConnectFailed => "Connect Failed",
170 ObsOutputStopSignal::InvalidStream => "Invalid Stream",
171 ObsOutputStopSignal::Error => "Error",
172 ObsOutputStopSignal::Disconnected => "Disconnected",
173 ObsOutputStopSignal::Unsupported => "Unsupported",
174 ObsOutputStopSignal::NoSpace => "No Space",
175 ObsOutputStopSignal::EncodeError => "Encode Error",
176 };
177 write!(f, "{}", s)
178 }
179}
180
181impl From<ObsOutputStopSignal> for i32 {
182 fn from(val: ObsOutputStopSignal) -> Self {
183 match val {
184 ObsOutputStopSignal::Success => libobs::OBS_OUTPUT_SUCCESS as i32,
185 ObsOutputStopSignal::BadPath => libobs::OBS_OUTPUT_BAD_PATH,
186 ObsOutputStopSignal::ConnectFailed => libobs::OBS_OUTPUT_CONNECT_FAILED,
187 ObsOutputStopSignal::InvalidStream => libobs::OBS_OUTPUT_INVALID_STREAM,
188 ObsOutputStopSignal::Error => libobs::OBS_OUTPUT_ERROR,
189 ObsOutputStopSignal::Disconnected => libobs::OBS_OUTPUT_DISCONNECTED,
190 ObsOutputStopSignal::Unsupported => libobs::OBS_OUTPUT_UNSUPPORTED,
191 ObsOutputStopSignal::NoSpace => libobs::OBS_OUTPUT_NO_SPACE,
192 ObsOutputStopSignal::EncodeError => libobs::OBS_OUTPUT_ENCODE_ERROR,
193 }
194 }
195}
196
197impl TryFrom<i32> for ObsOutputStopSignal {
198 type Error = &'static str;
199
200 fn try_from(value: i32) -> Result<Self, <ObsOutputStopSignal as TryFrom<i32>>::Error> {
201 match value {
202 x if x == libobs::OBS_OUTPUT_SUCCESS as i32 => Ok(ObsOutputStopSignal::Success),
203 x if x == libobs::OBS_OUTPUT_BAD_PATH => Ok(ObsOutputStopSignal::BadPath),
204 x if x == libobs::OBS_OUTPUT_CONNECT_FAILED => Ok(ObsOutputStopSignal::ConnectFailed),
205 x if x == libobs::OBS_OUTPUT_INVALID_STREAM => Ok(ObsOutputStopSignal::InvalidStream),
206 x if x == libobs::OBS_OUTPUT_ERROR => Ok(ObsOutputStopSignal::Error),
207 x if x == libobs::OBS_OUTPUT_DISCONNECTED => Ok(ObsOutputStopSignal::Disconnected),
208 x if x == libobs::OBS_OUTPUT_UNSUPPORTED => Ok(ObsOutputStopSignal::Unsupported),
209 x if x == libobs::OBS_OUTPUT_NO_SPACE => Ok(ObsOutputStopSignal::NoSpace),
210 x if x == libobs::OBS_OUTPUT_ENCODE_ERROR => Ok(ObsOutputStopSignal::EncodeError),
211 _ => Err("Invalid value"),
212 }
213 }
214}
215
216#[cfg_attr(target_os = "windows", repr(i32))]
217#[cfg_attr(not(target_os = "windows"), repr(u32))]
218#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
219pub enum ObsEncoderType {
220 Video = libobs::obs_encoder_type_OBS_ENCODER_VIDEO,
221 Audio = libobs::obs_encoder_type_OBS_ENCODER_AUDIO,
222}
223
224#[cfg_attr(target_os = "windows", repr(i32))]
225#[cfg_attr(not(target_os = "windows"), repr(u32))]
226#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
227pub enum ObsLogLevel {
228 Error = libobs::LOG_ERROR,
229 Warning = libobs::LOG_WARNING,
230 Info = libobs::LOG_INFO,
231 Debug = libobs::LOG_DEBUG,
232}
233
234impl Display for ObsLogLevel {
235 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
236 write!(f, "{:?}", self)
237 }
238}
239
240#[cfg(feature = "color-logger")]
241impl ObsLogLevel {
242 pub fn colorize(&self, s: &str) -> String {
243 use colored::Colorize;
244
245 match self {
246 ObsLogLevel::Error => s.on_red().to_string(),
247 ObsLogLevel::Warning => s.yellow().to_string(),
248 ObsLogLevel::Info => s.green().bold().to_string(),
249 ObsLogLevel::Debug => s.blue().to_string(),
250 }
251 }
252}
253
254#[cfg_attr(target_os = "windows", repr(i32))]
255#[cfg_attr(not(target_os = "windows"), repr(u32))]
256#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
257pub enum ObsBounds {
261 None = libobs::obs_bounds_type_OBS_BOUNDS_NONE,
263 Stretch = libobs::obs_bounds_type_OBS_BOUNDS_STRETCH,
265 ScaleInner = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_INNER,
267 ScaleOuter = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_OUTER,
269 ScaleToWidth = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_TO_WIDTH,
271 ScaleToHeight = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_TO_HEIGHT,
273 MaxOnly = libobs::obs_bounds_type_OBS_BOUNDS_MAX_ONLY,
275}
276
277#[cfg_attr(target_os = "windows", repr(i32))]
278#[cfg_attr(not(target_os = "windows"), repr(u32))]
279#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
280pub enum ObsBoundsType {
281 None = libobs::obs_bounds_type_OBS_BOUNDS_NONE,
282 Stretch = libobs::obs_bounds_type_OBS_BOUNDS_STRETCH,
283 ScaleInner = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_INNER,
284 ScaleOuter = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_OUTER,
285 ScaleToWidth = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_TO_WIDTH,
286 ScaleToHeight = libobs::obs_bounds_type_OBS_BOUNDS_SCALE_TO_HEIGHT,
287 MaxOnly = libobs::obs_bounds_type_OBS_BOUNDS_MAX_ONLY,
288}
289
290pub mod obs_alignment {
291 pub const LEFT: u32 = libobs::OBS_ALIGN_LEFT;
292 pub const TOP: u32 = libobs::OBS_ALIGN_TOP;
293 pub const RIGHT: u32 = libobs::OBS_ALIGN_RIGHT;
294 pub const BOTTOM: u32 = libobs::OBS_ALIGN_BOTTOM;
295 pub const CENTER: u32 = libobs::OBS_ALIGN_CENTER;
296}