Skip to main content

gstreamer/auto/
enums.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
4// DO NOT EDIT
5
6use crate::{EventTypeFlags, ffi};
7use glib::{GStr, prelude::*, translate::*};
8
9/// The different types of buffering methods.
10#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
11#[non_exhaustive]
12#[doc(alias = "GstBufferingMode")]
13pub enum BufferingMode {
14    /// a small amount of data is buffered
15    #[doc(alias = "GST_BUFFERING_STREAM")]
16    Stream,
17    /// the stream is being downloaded
18    #[doc(alias = "GST_BUFFERING_DOWNLOAD")]
19    Download,
20    /// the stream is being downloaded in a ringbuffer
21    #[doc(alias = "GST_BUFFERING_TIMESHIFT")]
22    Timeshift,
23    /// the stream is a live stream
24    #[doc(alias = "GST_BUFFERING_LIVE")]
25    Live,
26    #[doc(hidden)]
27    __Unknown(i32),
28}
29
30#[doc(hidden)]
31impl IntoGlib for BufferingMode {
32    type GlibType = ffi::GstBufferingMode;
33
34    #[inline]
35    fn into_glib(self) -> ffi::GstBufferingMode {
36        match self {
37            Self::Stream => ffi::GST_BUFFERING_STREAM,
38            Self::Download => ffi::GST_BUFFERING_DOWNLOAD,
39            Self::Timeshift => ffi::GST_BUFFERING_TIMESHIFT,
40            Self::Live => ffi::GST_BUFFERING_LIVE,
41            Self::__Unknown(value) => value,
42        }
43    }
44}
45
46#[doc(hidden)]
47impl FromGlib<ffi::GstBufferingMode> for BufferingMode {
48    #[inline]
49    unsafe fn from_glib(value: ffi::GstBufferingMode) -> Self {
50        skip_assert_initialized!();
51
52        match value {
53            ffi::GST_BUFFERING_STREAM => Self::Stream,
54            ffi::GST_BUFFERING_DOWNLOAD => Self::Download,
55            ffi::GST_BUFFERING_TIMESHIFT => Self::Timeshift,
56            ffi::GST_BUFFERING_LIVE => Self::Live,
57            value => Self::__Unknown(value),
58        }
59    }
60}
61
62impl StaticType for BufferingMode {
63    #[inline]
64    #[doc(alias = "gst_buffering_mode_get_type")]
65    fn static_type() -> glib::Type {
66        unsafe { from_glib(ffi::gst_buffering_mode_get_type()) }
67    }
68}
69
70impl glib::HasParamSpec for BufferingMode {
71    type ParamSpec = glib::ParamSpecEnum;
72    type SetValue = Self;
73    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
74
75    fn param_spec_builder() -> Self::BuilderFn {
76        Self::ParamSpec::builder_with_default
77    }
78}
79
80impl glib::value::ValueType for BufferingMode {
81    type Type = Self;
82}
83
84unsafe impl<'a> glib::value::FromValue<'a> for BufferingMode {
85    type Checker = glib::value::GenericValueTypeChecker<Self>;
86
87    #[inline]
88    unsafe fn from_value(value: &'a glib::Value) -> Self {
89        skip_assert_initialized!();
90        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
91    }
92}
93
94impl ToValue for BufferingMode {
95    #[inline]
96    fn to_value(&self) -> glib::Value {
97        let mut value = glib::Value::for_value_type::<Self>();
98        unsafe {
99            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
100        }
101        value
102    }
103
104    #[inline]
105    fn value_type(&self) -> glib::Type {
106        Self::static_type()
107    }
108}
109
110impl From<BufferingMode> for glib::Value {
111    #[inline]
112    fn from(v: BufferingMode) -> Self {
113        skip_assert_initialized!();
114        ToValue::to_value(&v)
115    }
116}
117
118/// The result values for a GstBusSyncHandler.
119#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
120#[repr(i32)]
121#[doc(alias = "GstBusSyncReply")]
122pub enum BusSyncReply {
123    /// drop the message
124    #[doc(alias = "GST_BUS_DROP")]
125    Drop = ffi::GST_BUS_DROP,
126    /// pass the message to the async queue
127    #[doc(alias = "GST_BUS_PASS")]
128    Pass = ffi::GST_BUS_PASS,
129    /// pass message to async queue, continue if message is handled
130    #[doc(alias = "GST_BUS_ASYNC")]
131    Async = ffi::GST_BUS_ASYNC,
132}
133
134#[doc(hidden)]
135impl IntoGlib for BusSyncReply {
136    type GlibType = ffi::GstBusSyncReply;
137
138    #[inline]
139    fn into_glib(self) -> ffi::GstBusSyncReply {
140        self as ffi::GstBusSyncReply
141    }
142}
143
144#[doc(hidden)]
145impl FromGlib<ffi::GstBusSyncReply> for BusSyncReply {
146    #[inline]
147    unsafe fn from_glib(value: ffi::GstBusSyncReply) -> Self {
148        skip_assert_initialized!();
149
150        debug_assert!([ffi::GST_BUS_DROP, ffi::GST_BUS_PASS, ffi::GST_BUS_ASYNC].contains(&value));
151        unsafe { std::mem::transmute(value) }
152    }
153}
154
155impl StaticType for BusSyncReply {
156    #[inline]
157    #[doc(alias = "gst_bus_sync_reply_get_type")]
158    fn static_type() -> glib::Type {
159        unsafe { from_glib(ffi::gst_bus_sync_reply_get_type()) }
160    }
161}
162
163impl glib::HasParamSpec for BusSyncReply {
164    type ParamSpec = glib::ParamSpecEnum;
165    type SetValue = Self;
166    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
167
168    fn param_spec_builder() -> Self::BuilderFn {
169        Self::ParamSpec::builder_with_default
170    }
171}
172
173impl glib::value::ValueType for BusSyncReply {
174    type Type = Self;
175}
176
177unsafe impl<'a> glib::value::FromValue<'a> for BusSyncReply {
178    type Checker = glib::value::GenericValueTypeChecker<Self>;
179
180    #[inline]
181    unsafe fn from_value(value: &'a glib::Value) -> Self {
182        skip_assert_initialized!();
183        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
184    }
185}
186
187impl ToValue for BusSyncReply {
188    #[inline]
189    fn to_value(&self) -> glib::Value {
190        let mut value = glib::Value::for_value_type::<Self>();
191        unsafe {
192            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
193        }
194        value
195    }
196
197    #[inline]
198    fn value_type(&self) -> glib::Type {
199        Self::static_type()
200    }
201}
202
203impl From<BusSyncReply> for glib::Value {
204    #[inline]
205    fn from(v: BusSyncReply) -> Self {
206        skip_assert_initialized!();
207        ToValue::to_value(&v)
208    }
209}
210
211/// Modes of caps intersection
212///
213/// [`ZigZag`][Self::ZigZag] tries to preserve overall order of both caps
214/// by iterating on the caps' structures as the following matrix shows:
215///
216/// ```text
217///          caps1
218///       +-------------
219///       | 1  2  4  7
220/// caps2 | 3  5  8 10
221///       | 6  9 11 12
222/// ```
223///
224/// Used when there is no explicit precedence of one caps over the other. e.g.
225/// tee's sink pad getcaps function, it will probe its src pad peers' for their
226/// caps and intersect them with this mode.
227///
228/// [`First`][Self::First] is useful when an element wants to preserve
229/// another element's caps priority order when intersecting with its own caps.
230/// Example: If caps1 is `[A, B, C]` and caps2 is `[E, B, D, A]`, the result
231/// would be `[A, B]`, maintaining the first caps priority on the intersection.
232#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
233#[non_exhaustive]
234#[doc(alias = "GstCapsIntersectMode")]
235pub enum CapsIntersectMode {
236    /// Zig-zags over both caps.
237    #[doc(alias = "GST_CAPS_INTERSECT_ZIG_ZAG")]
238    ZigZag,
239    /// Keeps the first caps order.
240    #[doc(alias = "GST_CAPS_INTERSECT_FIRST")]
241    First,
242    #[doc(hidden)]
243    __Unknown(i32),
244}
245
246#[doc(hidden)]
247impl IntoGlib for CapsIntersectMode {
248    type GlibType = ffi::GstCapsIntersectMode;
249
250    #[inline]
251    fn into_glib(self) -> ffi::GstCapsIntersectMode {
252        match self {
253            Self::ZigZag => ffi::GST_CAPS_INTERSECT_ZIG_ZAG,
254            Self::First => ffi::GST_CAPS_INTERSECT_FIRST,
255            Self::__Unknown(value) => value,
256        }
257    }
258}
259
260#[doc(hidden)]
261impl FromGlib<ffi::GstCapsIntersectMode> for CapsIntersectMode {
262    #[inline]
263    unsafe fn from_glib(value: ffi::GstCapsIntersectMode) -> Self {
264        skip_assert_initialized!();
265
266        match value {
267            ffi::GST_CAPS_INTERSECT_ZIG_ZAG => Self::ZigZag,
268            ffi::GST_CAPS_INTERSECT_FIRST => Self::First,
269            value => Self::__Unknown(value),
270        }
271    }
272}
273
274impl StaticType for CapsIntersectMode {
275    #[inline]
276    #[doc(alias = "gst_caps_intersect_mode_get_type")]
277    fn static_type() -> glib::Type {
278        unsafe { from_glib(ffi::gst_caps_intersect_mode_get_type()) }
279    }
280}
281
282impl glib::HasParamSpec for CapsIntersectMode {
283    type ParamSpec = glib::ParamSpecEnum;
284    type SetValue = Self;
285    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
286
287    fn param_spec_builder() -> Self::BuilderFn {
288        Self::ParamSpec::builder_with_default
289    }
290}
291
292impl glib::value::ValueType for CapsIntersectMode {
293    type Type = Self;
294}
295
296unsafe impl<'a> glib::value::FromValue<'a> for CapsIntersectMode {
297    type Checker = glib::value::GenericValueTypeChecker<Self>;
298
299    #[inline]
300    unsafe fn from_value(value: &'a glib::Value) -> Self {
301        skip_assert_initialized!();
302        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
303    }
304}
305
306impl ToValue for CapsIntersectMode {
307    #[inline]
308    fn to_value(&self) -> glib::Value {
309        let mut value = glib::Value::for_value_type::<Self>();
310        unsafe {
311            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
312        }
313        value
314    }
315
316    #[inline]
317    fn value_type(&self) -> glib::Type {
318        Self::static_type()
319    }
320}
321
322impl From<CapsIntersectMode> for glib::Value {
323    #[inline]
324    fn from(v: CapsIntersectMode) -> Self {
325        skip_assert_initialized!();
326        ToValue::to_value(&v)
327    }
328}
329
330/// The type of the clock entry
331#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
332#[non_exhaustive]
333#[doc(alias = "GstClockEntryType")]
334pub enum ClockEntryType {
335    /// a single shot timeout
336    #[doc(alias = "GST_CLOCK_ENTRY_SINGLE")]
337    Single,
338    /// a periodic timeout request
339    #[doc(alias = "GST_CLOCK_ENTRY_PERIODIC")]
340    Periodic,
341    #[doc(hidden)]
342    __Unknown(i32),
343}
344
345#[doc(hidden)]
346impl IntoGlib for ClockEntryType {
347    type GlibType = ffi::GstClockEntryType;
348
349    #[inline]
350    fn into_glib(self) -> ffi::GstClockEntryType {
351        match self {
352            Self::Single => ffi::GST_CLOCK_ENTRY_SINGLE,
353            Self::Periodic => ffi::GST_CLOCK_ENTRY_PERIODIC,
354            Self::__Unknown(value) => value,
355        }
356    }
357}
358
359#[doc(hidden)]
360impl FromGlib<ffi::GstClockEntryType> for ClockEntryType {
361    #[inline]
362    unsafe fn from_glib(value: ffi::GstClockEntryType) -> Self {
363        skip_assert_initialized!();
364
365        match value {
366            ffi::GST_CLOCK_ENTRY_SINGLE => Self::Single,
367            ffi::GST_CLOCK_ENTRY_PERIODIC => Self::Periodic,
368            value => Self::__Unknown(value),
369        }
370    }
371}
372
373impl StaticType for ClockEntryType {
374    #[inline]
375    #[doc(alias = "gst_clock_entry_type_get_type")]
376    fn static_type() -> glib::Type {
377        unsafe { from_glib(ffi::gst_clock_entry_type_get_type()) }
378    }
379}
380
381impl glib::HasParamSpec for ClockEntryType {
382    type ParamSpec = glib::ParamSpecEnum;
383    type SetValue = Self;
384    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
385
386    fn param_spec_builder() -> Self::BuilderFn {
387        Self::ParamSpec::builder_with_default
388    }
389}
390
391impl glib::value::ValueType for ClockEntryType {
392    type Type = Self;
393}
394
395unsafe impl<'a> glib::value::FromValue<'a> for ClockEntryType {
396    type Checker = glib::value::GenericValueTypeChecker<Self>;
397
398    #[inline]
399    unsafe fn from_value(value: &'a glib::Value) -> Self {
400        skip_assert_initialized!();
401        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
402    }
403}
404
405impl ToValue for ClockEntryType {
406    #[inline]
407    fn to_value(&self) -> glib::Value {
408        let mut value = glib::Value::for_value_type::<Self>();
409        unsafe {
410            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
411        }
412        value
413    }
414
415    #[inline]
416    fn value_type(&self) -> glib::Type {
417        Self::static_type()
418    }
419}
420
421impl From<ClockEntryType> for glib::Value {
422    #[inline]
423    fn from(v: ClockEntryType) -> Self {
424        skip_assert_initialized!();
425        ToValue::to_value(&v)
426    }
427}
428
429/// The return value of a clock operation.
430#[must_use]
431#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
432#[repr(i32)]
433#[doc(alias = "GstClockReturn")]
434pub enum ClockReturn {
435    /// The operation succeeded.
436    #[doc(alias = "GST_CLOCK_OK")]
437    Ok = ffi::GST_CLOCK_OK,
438    /// The operation was scheduled too late.
439    #[doc(alias = "GST_CLOCK_EARLY")]
440    Early = ffi::GST_CLOCK_EARLY,
441    /// The clockID was unscheduled
442    #[doc(alias = "GST_CLOCK_UNSCHEDULED")]
443    Unscheduled = ffi::GST_CLOCK_UNSCHEDULED,
444    /// The ClockID is busy
445    #[doc(alias = "GST_CLOCK_BUSY")]
446    Busy = ffi::GST_CLOCK_BUSY,
447    /// A bad time was provided to a function.
448    #[doc(alias = "GST_CLOCK_BADTIME")]
449    Badtime = ffi::GST_CLOCK_BADTIME,
450    /// An error occurred
451    #[doc(alias = "GST_CLOCK_ERROR")]
452    Error = ffi::GST_CLOCK_ERROR,
453    /// Operation is not supported
454    #[doc(alias = "GST_CLOCK_UNSUPPORTED")]
455    Unsupported = ffi::GST_CLOCK_UNSUPPORTED,
456    /// The ClockID is done waiting
457    #[doc(alias = "GST_CLOCK_DONE")]
458    Done = ffi::GST_CLOCK_DONE,
459}
460
461#[doc(hidden)]
462impl IntoGlib for ClockReturn {
463    type GlibType = ffi::GstClockReturn;
464
465    #[inline]
466    fn into_glib(self) -> ffi::GstClockReturn {
467        self as ffi::GstClockReturn
468    }
469}
470
471#[doc(hidden)]
472impl FromGlib<ffi::GstClockReturn> for ClockReturn {
473    #[inline]
474    unsafe fn from_glib(value: ffi::GstClockReturn) -> Self {
475        skip_assert_initialized!();
476
477        debug_assert!(
478            [
479                ffi::GST_CLOCK_OK,
480                ffi::GST_CLOCK_EARLY,
481                ffi::GST_CLOCK_UNSCHEDULED,
482                ffi::GST_CLOCK_BUSY,
483                ffi::GST_CLOCK_BADTIME,
484                ffi::GST_CLOCK_ERROR,
485                ffi::GST_CLOCK_UNSUPPORTED,
486                ffi::GST_CLOCK_DONE
487            ]
488            .contains(&value)
489        );
490        unsafe { std::mem::transmute(value) }
491    }
492}
493
494impl StaticType for ClockReturn {
495    #[inline]
496    #[doc(alias = "gst_clock_return_get_type")]
497    fn static_type() -> glib::Type {
498        unsafe { from_glib(ffi::gst_clock_return_get_type()) }
499    }
500}
501
502impl glib::HasParamSpec for ClockReturn {
503    type ParamSpec = glib::ParamSpecEnum;
504    type SetValue = Self;
505    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
506
507    fn param_spec_builder() -> Self::BuilderFn {
508        Self::ParamSpec::builder_with_default
509    }
510}
511
512impl glib::value::ValueType for ClockReturn {
513    type Type = Self;
514}
515
516unsafe impl<'a> glib::value::FromValue<'a> for ClockReturn {
517    type Checker = glib::value::GenericValueTypeChecker<Self>;
518
519    #[inline]
520    unsafe fn from_value(value: &'a glib::Value) -> Self {
521        skip_assert_initialized!();
522        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
523    }
524}
525
526impl ToValue for ClockReturn {
527    #[inline]
528    fn to_value(&self) -> glib::Value {
529        let mut value = glib::Value::for_value_type::<Self>();
530        unsafe {
531            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
532        }
533        value
534    }
535
536    #[inline]
537    fn value_type(&self) -> glib::Type {
538        Self::static_type()
539    }
540}
541
542impl From<ClockReturn> for glib::Value {
543    #[inline]
544    fn from(v: ClockReturn) -> Self {
545        skip_assert_initialized!();
546        ToValue::to_value(&v)
547    }
548}
549
550/// The different kind of clocks.
551#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
552#[non_exhaustive]
553#[doc(alias = "GstClockType")]
554pub enum ClockType {
555    /// time since Epoch
556    #[doc(alias = "GST_CLOCK_TYPE_REALTIME")]
557    Realtime,
558    /// monotonic time since some unspecified starting
559    ///  point
560    #[doc(alias = "GST_CLOCK_TYPE_MONOTONIC")]
561    Monotonic,
562    /// some other time source is used (Since: 1.0.5)
563    #[doc(alias = "GST_CLOCK_TYPE_OTHER")]
564    Other,
565    /// time since Epoch, but using International Atomic Time
566    ///  as reference (Since: 1.18)
567    #[cfg(feature = "v1_18")]
568    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
569    #[doc(alias = "GST_CLOCK_TYPE_TAI")]
570    Tai,
571    #[doc(hidden)]
572    __Unknown(i32),
573}
574
575#[doc(hidden)]
576impl IntoGlib for ClockType {
577    type GlibType = ffi::GstClockType;
578
579    #[inline]
580    fn into_glib(self) -> ffi::GstClockType {
581        match self {
582            Self::Realtime => ffi::GST_CLOCK_TYPE_REALTIME,
583            Self::Monotonic => ffi::GST_CLOCK_TYPE_MONOTONIC,
584            Self::Other => ffi::GST_CLOCK_TYPE_OTHER,
585            #[cfg(feature = "v1_18")]
586            Self::Tai => ffi::GST_CLOCK_TYPE_TAI,
587            Self::__Unknown(value) => value,
588        }
589    }
590}
591
592#[doc(hidden)]
593impl FromGlib<ffi::GstClockType> for ClockType {
594    #[inline]
595    unsafe fn from_glib(value: ffi::GstClockType) -> Self {
596        skip_assert_initialized!();
597
598        match value {
599            ffi::GST_CLOCK_TYPE_REALTIME => Self::Realtime,
600            ffi::GST_CLOCK_TYPE_MONOTONIC => Self::Monotonic,
601            ffi::GST_CLOCK_TYPE_OTHER => Self::Other,
602            #[cfg(feature = "v1_18")]
603            ffi::GST_CLOCK_TYPE_TAI => Self::Tai,
604            value => Self::__Unknown(value),
605        }
606    }
607}
608
609impl StaticType for ClockType {
610    #[inline]
611    #[doc(alias = "gst_clock_type_get_type")]
612    fn static_type() -> glib::Type {
613        unsafe { from_glib(ffi::gst_clock_type_get_type()) }
614    }
615}
616
617impl glib::HasParamSpec for ClockType {
618    type ParamSpec = glib::ParamSpecEnum;
619    type SetValue = Self;
620    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
621
622    fn param_spec_builder() -> Self::BuilderFn {
623        Self::ParamSpec::builder_with_default
624    }
625}
626
627impl glib::value::ValueType for ClockType {
628    type Type = Self;
629}
630
631unsafe impl<'a> glib::value::FromValue<'a> for ClockType {
632    type Checker = glib::value::GenericValueTypeChecker<Self>;
633
634    #[inline]
635    unsafe fn from_value(value: &'a glib::Value) -> Self {
636        skip_assert_initialized!();
637        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
638    }
639}
640
641impl ToValue for ClockType {
642    #[inline]
643    fn to_value(&self) -> glib::Value {
644        let mut value = glib::Value::for_value_type::<Self>();
645        unsafe {
646            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
647        }
648        value
649    }
650
651    #[inline]
652    fn value_type(&self) -> glib::Type {
653        Self::static_type()
654    }
655}
656
657impl From<ClockType> for glib::Value {
658    #[inline]
659    fn from(v: ClockType) -> Self {
660        skip_assert_initialized!();
661        ToValue::to_value(&v)
662    }
663}
664
665/// Core errors are errors inside the core GStreamer library.
666#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
667#[non_exhaustive]
668#[doc(alias = "GstCoreError")]
669pub enum CoreError {
670    /// a general error which doesn't fit in any other
671    /// category. Make sure you add a custom message to the error call.
672    #[doc(alias = "GST_CORE_ERROR_FAILED")]
673    Failed,
674    /// do not use this except as a placeholder for
675    /// deciding where to go while developing code.
676    #[doc(alias = "GST_CORE_ERROR_TOO_LAZY")]
677    TooLazy,
678    /// use this when you do not want to implement
679    /// this functionality yet.
680    #[doc(alias = "GST_CORE_ERROR_NOT_IMPLEMENTED")]
681    NotImplemented,
682    /// used for state change errors.
683    #[doc(alias = "GST_CORE_ERROR_STATE_CHANGE")]
684    StateChange,
685    /// used for pad-related errors.
686    #[doc(alias = "GST_CORE_ERROR_PAD")]
687    Pad,
688    /// used for thread-related errors.
689    #[doc(alias = "GST_CORE_ERROR_THREAD")]
690    Thread,
691    /// used for negotiation-related errors.
692    #[doc(alias = "GST_CORE_ERROR_NEGOTIATION")]
693    Negotiation,
694    /// used for event-related errors.
695    #[doc(alias = "GST_CORE_ERROR_EVENT")]
696    Event,
697    /// used for seek-related errors.
698    #[doc(alias = "GST_CORE_ERROR_SEEK")]
699    Seek,
700    /// used for caps-related errors.
701    #[doc(alias = "GST_CORE_ERROR_CAPS")]
702    Caps,
703    /// used for negotiation-related errors.
704    #[doc(alias = "GST_CORE_ERROR_TAG")]
705    Tag,
706    /// used if a plugin is missing.
707    #[doc(alias = "GST_CORE_ERROR_MISSING_PLUGIN")]
708    MissingPlugin,
709    /// used for clock related errors.
710    #[doc(alias = "GST_CORE_ERROR_CLOCK")]
711    Clock,
712    /// used if functionality has been disabled at
713    ///  compile time.
714    #[doc(alias = "GST_CORE_ERROR_DISABLED")]
715    Disabled,
716    #[doc(hidden)]
717    __Unknown(i32),
718}
719
720#[doc(hidden)]
721impl IntoGlib for CoreError {
722    type GlibType = ffi::GstCoreError;
723
724    fn into_glib(self) -> ffi::GstCoreError {
725        match self {
726            Self::Failed => ffi::GST_CORE_ERROR_FAILED,
727            Self::TooLazy => ffi::GST_CORE_ERROR_TOO_LAZY,
728            Self::NotImplemented => ffi::GST_CORE_ERROR_NOT_IMPLEMENTED,
729            Self::StateChange => ffi::GST_CORE_ERROR_STATE_CHANGE,
730            Self::Pad => ffi::GST_CORE_ERROR_PAD,
731            Self::Thread => ffi::GST_CORE_ERROR_THREAD,
732            Self::Negotiation => ffi::GST_CORE_ERROR_NEGOTIATION,
733            Self::Event => ffi::GST_CORE_ERROR_EVENT,
734            Self::Seek => ffi::GST_CORE_ERROR_SEEK,
735            Self::Caps => ffi::GST_CORE_ERROR_CAPS,
736            Self::Tag => ffi::GST_CORE_ERROR_TAG,
737            Self::MissingPlugin => ffi::GST_CORE_ERROR_MISSING_PLUGIN,
738            Self::Clock => ffi::GST_CORE_ERROR_CLOCK,
739            Self::Disabled => ffi::GST_CORE_ERROR_DISABLED,
740            Self::__Unknown(value) => value,
741        }
742    }
743}
744
745#[doc(hidden)]
746impl FromGlib<ffi::GstCoreError> for CoreError {
747    unsafe fn from_glib(value: ffi::GstCoreError) -> Self {
748        skip_assert_initialized!();
749
750        match value {
751            ffi::GST_CORE_ERROR_FAILED => Self::Failed,
752            ffi::GST_CORE_ERROR_TOO_LAZY => Self::TooLazy,
753            ffi::GST_CORE_ERROR_NOT_IMPLEMENTED => Self::NotImplemented,
754            ffi::GST_CORE_ERROR_STATE_CHANGE => Self::StateChange,
755            ffi::GST_CORE_ERROR_PAD => Self::Pad,
756            ffi::GST_CORE_ERROR_THREAD => Self::Thread,
757            ffi::GST_CORE_ERROR_NEGOTIATION => Self::Negotiation,
758            ffi::GST_CORE_ERROR_EVENT => Self::Event,
759            ffi::GST_CORE_ERROR_SEEK => Self::Seek,
760            ffi::GST_CORE_ERROR_CAPS => Self::Caps,
761            ffi::GST_CORE_ERROR_TAG => Self::Tag,
762            ffi::GST_CORE_ERROR_MISSING_PLUGIN => Self::MissingPlugin,
763            ffi::GST_CORE_ERROR_CLOCK => Self::Clock,
764            ffi::GST_CORE_ERROR_DISABLED => Self::Disabled,
765            value => Self::__Unknown(value),
766        }
767    }
768}
769
770impl glib::error::ErrorDomain for CoreError {
771    #[inline]
772    fn domain() -> glib::Quark {
773        skip_assert_initialized!();
774
775        unsafe { from_glib(ffi::gst_core_error_quark()) }
776    }
777
778    #[inline]
779    fn code(self) -> i32 {
780        self.into_glib()
781    }
782
783    #[inline]
784    #[allow(clippy::match_single_binding)]
785    fn from(code: i32) -> Option<Self> {
786        skip_assert_initialized!();
787        match unsafe { from_glib(code) } {
788            Self::__Unknown(_) => Some(Self::Failed),
789            value => Some(value),
790        }
791    }
792}
793
794impl StaticType for CoreError {
795    #[inline]
796    #[doc(alias = "gst_core_error_get_type")]
797    fn static_type() -> glib::Type {
798        unsafe { from_glib(ffi::gst_core_error_get_type()) }
799    }
800}
801
802impl glib::HasParamSpec for CoreError {
803    type ParamSpec = glib::ParamSpecEnum;
804    type SetValue = Self;
805    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
806
807    fn param_spec_builder() -> Self::BuilderFn {
808        Self::ParamSpec::builder_with_default
809    }
810}
811
812impl glib::value::ValueType for CoreError {
813    type Type = Self;
814}
815
816unsafe impl<'a> glib::value::FromValue<'a> for CoreError {
817    type Checker = glib::value::GenericValueTypeChecker<Self>;
818
819    #[inline]
820    unsafe fn from_value(value: &'a glib::Value) -> Self {
821        skip_assert_initialized!();
822        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
823    }
824}
825
826impl ToValue for CoreError {
827    #[inline]
828    fn to_value(&self) -> glib::Value {
829        let mut value = glib::Value::for_value_type::<Self>();
830        unsafe {
831            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
832        }
833        value
834    }
835
836    #[inline]
837    fn value_type(&self) -> glib::Type {
838        Self::static_type()
839    }
840}
841
842impl From<CoreError> for glib::Value {
843    #[inline]
844    fn from(v: CoreError) -> Self {
845        skip_assert_initialized!();
846        ToValue::to_value(&v)
847    }
848}
849
850/// The level defines the importance of a debugging message. The more important a
851/// message is, the greater the probability that the debugging system outputs it.
852#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
853#[non_exhaustive]
854#[doc(alias = "GstDebugLevel")]
855pub enum DebugLevel {
856    /// No debugging level specified or desired. Used to deactivate
857    ///  debugging output.
858    #[doc(alias = "GST_LEVEL_NONE")]
859    None,
860    /// Error messages are to be used only when an error occurred
861    ///  that stops the application from keeping working correctly.
862    ///  An examples is gst_element_error, which outputs a message with this priority.
863    ///  It does not mean that the application is terminating as with g_error.
864    #[doc(alias = "GST_LEVEL_ERROR")]
865    Error,
866    /// Warning messages are to inform about abnormal behaviour
867    ///  that could lead to problems or weird behaviour later on. An example of this
868    ///  would be clocking issues ("your computer is pretty slow") or broken input
869    ///  data ("Can't synchronize to stream.")
870    #[doc(alias = "GST_LEVEL_WARNING")]
871    Warning,
872    /// Fixme messages are messages that indicate that something
873    ///  in the executed code path is not fully implemented or handled yet. Note
874    ///  that this does not replace proper error handling in any way, the purpose
875    ///  of this message is to make it easier to spot incomplete/unfinished pieces
876    ///  of code when reading the debug log.
877    #[doc(alias = "GST_LEVEL_FIXME")]
878    Fixme,
879    /// Informational messages should be used to keep the developer
880    ///  updated about what is happening.
881    ///  Examples where this should be used are when a typefind function has
882    ///  successfully determined the type of the stream or when an mp3 plugin detects
883    ///  the format to be used. ("This file has mono sound.")
884    #[doc(alias = "GST_LEVEL_INFO")]
885    Info,
886    /// Debugging messages should be used when something common
887    ///  happens that is not the expected default behavior, or something that's
888    ///  useful to know but doesn't happen all the time (ie. per loop iteration or
889    ///  buffer processed or event handled).
890    ///  An example would be notifications about state changes or receiving/sending
891    ///  of events.
892    #[doc(alias = "GST_LEVEL_DEBUG")]
893    Debug,
894    /// Log messages are messages that are very common but might be
895    ///  useful to know. As a rule of thumb a pipeline that is running as expected
896    ///  should never output anything else but LOG messages whilst processing data.
897    ///  Use this log level to log recurring information in chain functions and
898    ///  loop functions, for example.
899    #[doc(alias = "GST_LEVEL_LOG")]
900    Log,
901    /// Tracing-related messages.
902    ///  Examples for this are referencing/dereferencing of objects.
903    #[doc(alias = "GST_LEVEL_TRACE")]
904    Trace,
905    /// memory dump messages are used to log (small) chunks of
906    ///  data as memory dumps in the log. They will be displayed as hexdump with
907    ///  ASCII characters.
908    #[doc(alias = "GST_LEVEL_MEMDUMP")]
909    Memdump,
910    #[doc(hidden)]
911    __Unknown(i32),
912}
913
914impl DebugLevel {
915    pub fn name<'a>(self) -> &'a GStr {
916        unsafe {
917            GStr::from_ptr(
918                ffi::gst_debug_level_get_name(self.into_glib())
919                    .as_ref()
920                    .expect("gst_debug_level_get_name returned NULL"),
921            )
922        }
923    }
924}
925
926impl std::fmt::Display for DebugLevel {
927    #[inline]
928    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
929        f.write_str(&self.name())
930    }
931}
932
933#[doc(hidden)]
934impl IntoGlib for DebugLevel {
935    type GlibType = ffi::GstDebugLevel;
936
937    #[inline]
938    fn into_glib(self) -> ffi::GstDebugLevel {
939        match self {
940            Self::None => ffi::GST_LEVEL_NONE,
941            Self::Error => ffi::GST_LEVEL_ERROR,
942            Self::Warning => ffi::GST_LEVEL_WARNING,
943            Self::Fixme => ffi::GST_LEVEL_FIXME,
944            Self::Info => ffi::GST_LEVEL_INFO,
945            Self::Debug => ffi::GST_LEVEL_DEBUG,
946            Self::Log => ffi::GST_LEVEL_LOG,
947            Self::Trace => ffi::GST_LEVEL_TRACE,
948            Self::Memdump => ffi::GST_LEVEL_MEMDUMP,
949            Self::__Unknown(value) => value,
950        }
951    }
952}
953
954#[doc(hidden)]
955impl FromGlib<ffi::GstDebugLevel> for DebugLevel {
956    #[inline]
957    unsafe fn from_glib(value: ffi::GstDebugLevel) -> Self {
958        skip_assert_initialized!();
959
960        match value {
961            ffi::GST_LEVEL_NONE => Self::None,
962            ffi::GST_LEVEL_ERROR => Self::Error,
963            ffi::GST_LEVEL_WARNING => Self::Warning,
964            ffi::GST_LEVEL_FIXME => Self::Fixme,
965            ffi::GST_LEVEL_INFO => Self::Info,
966            ffi::GST_LEVEL_DEBUG => Self::Debug,
967            ffi::GST_LEVEL_LOG => Self::Log,
968            ffi::GST_LEVEL_TRACE => Self::Trace,
969            ffi::GST_LEVEL_MEMDUMP => Self::Memdump,
970            value => Self::__Unknown(value),
971        }
972    }
973}
974
975impl StaticType for DebugLevel {
976    #[inline]
977    #[doc(alias = "gst_debug_level_get_type")]
978    fn static_type() -> glib::Type {
979        unsafe { from_glib(ffi::gst_debug_level_get_type()) }
980    }
981}
982
983impl glib::HasParamSpec for DebugLevel {
984    type ParamSpec = glib::ParamSpecEnum;
985    type SetValue = Self;
986    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
987
988    fn param_spec_builder() -> Self::BuilderFn {
989        Self::ParamSpec::builder_with_default
990    }
991}
992
993impl glib::value::ValueType for DebugLevel {
994    type Type = Self;
995}
996
997unsafe impl<'a> glib::value::FromValue<'a> for DebugLevel {
998    type Checker = glib::value::GenericValueTypeChecker<Self>;
999
1000    #[inline]
1001    unsafe fn from_value(value: &'a glib::Value) -> Self {
1002        skip_assert_initialized!();
1003        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1004    }
1005}
1006
1007impl ToValue for DebugLevel {
1008    #[inline]
1009    fn to_value(&self) -> glib::Value {
1010        let mut value = glib::Value::for_value_type::<Self>();
1011        unsafe {
1012            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1013        }
1014        value
1015    }
1016
1017    #[inline]
1018    fn value_type(&self) -> glib::Type {
1019        Self::static_type()
1020    }
1021}
1022
1023impl From<DebugLevel> for glib::Value {
1024    #[inline]
1025    fn from(v: DebugLevel) -> Self {
1026        skip_assert_initialized!();
1027        ToValue::to_value(&v)
1028    }
1029}
1030
1031/// [`EventType`][crate::EventType] lists the standard event types that can be sent in a pipeline.
1032///
1033/// The custom event types can be used for private messages between elements
1034/// that can't be expressed using normal
1035/// GStreamer buffer passing semantics. Custom events carry an arbitrary
1036/// [`Structure`][crate::Structure].
1037/// Specific custom events are distinguished by the name of the structure.
1038#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
1039#[non_exhaustive]
1040#[doc(alias = "GstEventType")]
1041pub enum EventType {
1042    /// unknown event.
1043    #[doc(alias = "GST_EVENT_UNKNOWN")]
1044    Unknown,
1045    /// Start a flush operation. This event clears all data
1046    ///  from the pipeline and unblock all streaming threads.
1047    #[doc(alias = "GST_EVENT_FLUSH_START")]
1048    FlushStart,
1049    /// Stop a flush operation. This event resets the
1050    ///  running-time of the pipeline.
1051    #[doc(alias = "GST_EVENT_FLUSH_STOP")]
1052    FlushStop,
1053    /// Event to mark the start of a new stream. Sent before any
1054    ///  other serialized event and only sent at the start of a new stream,
1055    ///  not after flushing seeks.
1056    #[doc(alias = "GST_EVENT_STREAM_START")]
1057    StreamStart,
1058    /// [`Caps`][crate::Caps] event. Notify the pad of a new media type.
1059    #[doc(alias = "GST_EVENT_CAPS")]
1060    Caps,
1061    /// A new media segment follows in the dataflow. The
1062    ///  segment events contains information for clipping buffers and
1063    ///  converting buffer timestamps to running-time and
1064    ///  stream-time.
1065    #[doc(alias = "GST_EVENT_SEGMENT")]
1066    Segment,
1067    /// A new [`StreamCollection`][crate::StreamCollection] is available (Since: 1.10)
1068    #[doc(alias = "GST_EVENT_STREAM_COLLECTION")]
1069    StreamCollection,
1070    /// A new set of metadata tags has been found in the stream.
1071    #[doc(alias = "GST_EVENT_TAG")]
1072    Tag,
1073    /// Notification of buffering requirements. Currently not
1074    ///  used yet.
1075    #[doc(alias = "GST_EVENT_BUFFERSIZE")]
1076    Buffersize,
1077    /// An event that sinks turn into a message. Used to
1078    ///  send messages that should be emitted in sync with
1079    ///  rendering.
1080    #[doc(alias = "GST_EVENT_SINK_MESSAGE")]
1081    SinkMessage,
1082    /// Indicates that there is no more data for
1083    ///  the stream group ID in the message. Sent before EOS
1084    ///  in some instances and should be handled mostly the same. (Since: 1.10)
1085    #[doc(alias = "GST_EVENT_STREAM_GROUP_DONE")]
1086    StreamGroupDone,
1087    /// End-Of-Stream. No more data is to be expected to follow
1088    ///  without either a STREAM_START event, or a FLUSH_STOP and a SEGMENT
1089    ///  event.
1090    #[doc(alias = "GST_EVENT_EOS")]
1091    Eos,
1092    /// An event which indicates that a new table of contents (TOC)
1093    ///  was found or updated.
1094    #[doc(alias = "GST_EVENT_TOC")]
1095    Toc,
1096    /// An event which indicates that new or updated
1097    ///  encryption information has been found in the stream.
1098    #[doc(alias = "GST_EVENT_PROTECTION")]
1099    Protection,
1100    /// Marks the end of a segment playback.
1101    #[doc(alias = "GST_EVENT_SEGMENT_DONE")]
1102    SegmentDone,
1103    /// Marks a gap in the datastream.
1104    #[doc(alias = "GST_EVENT_GAP")]
1105    Gap,
1106    /// Notify downstream that a playback rate override
1107    ///  should be applied as soon as possible. (Since: 1.18)
1108    #[cfg(feature = "v1_18")]
1109    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
1110    #[doc(alias = "GST_EVENT_INSTANT_RATE_CHANGE")]
1111    InstantRateChange,
1112    /// A quality message. Used to indicate to upstream elements
1113    ///  that the downstream elements should adjust their processing
1114    ///  rate.
1115    #[doc(alias = "GST_EVENT_QOS")]
1116    Qos,
1117    /// A request for a new playback position and rate.
1118    #[doc(alias = "GST_EVENT_SEEK")]
1119    Seek,
1120    /// Navigation events are usually used for communicating
1121    ///  user requests, such as mouse or keyboard movements,
1122    ///  to upstream elements.
1123    #[doc(alias = "GST_EVENT_NAVIGATION")]
1124    Navigation,
1125    /// Notification of new latency adjustment. Sinks will use
1126    ///  the latency information to adjust their synchronisation.
1127    #[doc(alias = "GST_EVENT_LATENCY")]
1128    Latency,
1129    /// A request for stepping through the media. Sinks will usually
1130    ///  execute the step operation.
1131    #[doc(alias = "GST_EVENT_STEP")]
1132    Step,
1133    /// A request for upstream renegotiating caps and reconfiguring.
1134    #[doc(alias = "GST_EVENT_RECONFIGURE")]
1135    Reconfigure,
1136    /// A request for a new playback position based on TOC
1137    ///  entry's UID.
1138    #[doc(alias = "GST_EVENT_TOC_SELECT")]
1139    TocSelect,
1140    /// A request to select one or more streams (Since: 1.10)
1141    #[doc(alias = "GST_EVENT_SELECT_STREAMS")]
1142    SelectStreams,
1143    /// Sent by the pipeline to notify elements that handle the
1144    ///  instant-rate-change event about the running-time when
1145    ///  the rate multiplier should be applied (or was applied). (Since: 1.18)
1146    #[cfg(feature = "v1_18")]
1147    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
1148    #[doc(alias = "GST_EVENT_INSTANT_RATE_SYNC_TIME")]
1149    InstantRateSyncTime,
1150    /// Upstream custom event
1151    #[doc(alias = "GST_EVENT_CUSTOM_UPSTREAM")]
1152    CustomUpstream,
1153    /// Downstream custom event that travels in the
1154    ///  data flow.
1155    #[doc(alias = "GST_EVENT_CUSTOM_DOWNSTREAM")]
1156    CustomDownstream,
1157    /// Custom out-of-band downstream event.
1158    #[doc(alias = "GST_EVENT_CUSTOM_DOWNSTREAM_OOB")]
1159    CustomDownstreamOob,
1160    /// Custom sticky downstream event.
1161    #[doc(alias = "GST_EVENT_CUSTOM_DOWNSTREAM_STICKY")]
1162    CustomDownstreamSticky,
1163    /// Custom upstream or downstream event.
1164    ///  In-band when travelling downstream.
1165    #[doc(alias = "GST_EVENT_CUSTOM_BOTH")]
1166    CustomBoth,
1167    /// Custom upstream or downstream out-of-band event.
1168    #[doc(alias = "GST_EVENT_CUSTOM_BOTH_OOB")]
1169    CustomBothOob,
1170    #[doc(hidden)]
1171    __Unknown(i32),
1172}
1173
1174impl EventType {
1175    #[doc(alias = "gst_event_type_get_flags")]
1176    #[doc(alias = "get_flags")]
1177    pub fn flags(self) -> EventTypeFlags {
1178        assert_initialized_main_thread!();
1179        unsafe { from_glib(ffi::gst_event_type_get_flags(self.into_glib())) }
1180    }
1181
1182    pub fn name<'a>(self) -> &'a GStr {
1183        unsafe {
1184            GStr::from_ptr(
1185                ffi::gst_event_type_get_name(self.into_glib())
1186                    .as_ref()
1187                    .expect("gst_event_type_get_name returned NULL"),
1188            )
1189        }
1190    }
1191
1192    #[doc(alias = "gst_event_type_to_quark")]
1193    pub fn to_quark(self) -> glib::Quark {
1194        assert_initialized_main_thread!();
1195        unsafe { from_glib(ffi::gst_event_type_to_quark(self.into_glib())) }
1196    }
1197}
1198
1199impl std::fmt::Display for EventType {
1200    #[inline]
1201    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1202        f.write_str(&self.name())
1203    }
1204}
1205
1206#[doc(hidden)]
1207impl IntoGlib for EventType {
1208    type GlibType = ffi::GstEventType;
1209
1210    fn into_glib(self) -> ffi::GstEventType {
1211        match self {
1212            Self::Unknown => ffi::GST_EVENT_UNKNOWN,
1213            Self::FlushStart => ffi::GST_EVENT_FLUSH_START,
1214            Self::FlushStop => ffi::GST_EVENT_FLUSH_STOP,
1215            Self::StreamStart => ffi::GST_EVENT_STREAM_START,
1216            Self::Caps => ffi::GST_EVENT_CAPS,
1217            Self::Segment => ffi::GST_EVENT_SEGMENT,
1218            Self::StreamCollection => ffi::GST_EVENT_STREAM_COLLECTION,
1219            Self::Tag => ffi::GST_EVENT_TAG,
1220            Self::Buffersize => ffi::GST_EVENT_BUFFERSIZE,
1221            Self::SinkMessage => ffi::GST_EVENT_SINK_MESSAGE,
1222            Self::StreamGroupDone => ffi::GST_EVENT_STREAM_GROUP_DONE,
1223            Self::Eos => ffi::GST_EVENT_EOS,
1224            Self::Toc => ffi::GST_EVENT_TOC,
1225            Self::Protection => ffi::GST_EVENT_PROTECTION,
1226            Self::SegmentDone => ffi::GST_EVENT_SEGMENT_DONE,
1227            Self::Gap => ffi::GST_EVENT_GAP,
1228            #[cfg(feature = "v1_18")]
1229            Self::InstantRateChange => ffi::GST_EVENT_INSTANT_RATE_CHANGE,
1230            Self::Qos => ffi::GST_EVENT_QOS,
1231            Self::Seek => ffi::GST_EVENT_SEEK,
1232            Self::Navigation => ffi::GST_EVENT_NAVIGATION,
1233            Self::Latency => ffi::GST_EVENT_LATENCY,
1234            Self::Step => ffi::GST_EVENT_STEP,
1235            Self::Reconfigure => ffi::GST_EVENT_RECONFIGURE,
1236            Self::TocSelect => ffi::GST_EVENT_TOC_SELECT,
1237            Self::SelectStreams => ffi::GST_EVENT_SELECT_STREAMS,
1238            #[cfg(feature = "v1_18")]
1239            Self::InstantRateSyncTime => ffi::GST_EVENT_INSTANT_RATE_SYNC_TIME,
1240            Self::CustomUpstream => ffi::GST_EVENT_CUSTOM_UPSTREAM,
1241            Self::CustomDownstream => ffi::GST_EVENT_CUSTOM_DOWNSTREAM,
1242            Self::CustomDownstreamOob => ffi::GST_EVENT_CUSTOM_DOWNSTREAM_OOB,
1243            Self::CustomDownstreamSticky => ffi::GST_EVENT_CUSTOM_DOWNSTREAM_STICKY,
1244            Self::CustomBoth => ffi::GST_EVENT_CUSTOM_BOTH,
1245            Self::CustomBothOob => ffi::GST_EVENT_CUSTOM_BOTH_OOB,
1246            Self::__Unknown(value) => value,
1247        }
1248    }
1249}
1250
1251#[doc(hidden)]
1252impl FromGlib<ffi::GstEventType> for EventType {
1253    unsafe fn from_glib(value: ffi::GstEventType) -> Self {
1254        skip_assert_initialized!();
1255
1256        match value {
1257            ffi::GST_EVENT_UNKNOWN => Self::Unknown,
1258            ffi::GST_EVENT_FLUSH_START => Self::FlushStart,
1259            ffi::GST_EVENT_FLUSH_STOP => Self::FlushStop,
1260            ffi::GST_EVENT_STREAM_START => Self::StreamStart,
1261            ffi::GST_EVENT_CAPS => Self::Caps,
1262            ffi::GST_EVENT_SEGMENT => Self::Segment,
1263            ffi::GST_EVENT_STREAM_COLLECTION => Self::StreamCollection,
1264            ffi::GST_EVENT_TAG => Self::Tag,
1265            ffi::GST_EVENT_BUFFERSIZE => Self::Buffersize,
1266            ffi::GST_EVENT_SINK_MESSAGE => Self::SinkMessage,
1267            ffi::GST_EVENT_STREAM_GROUP_DONE => Self::StreamGroupDone,
1268            ffi::GST_EVENT_EOS => Self::Eos,
1269            ffi::GST_EVENT_TOC => Self::Toc,
1270            ffi::GST_EVENT_PROTECTION => Self::Protection,
1271            ffi::GST_EVENT_SEGMENT_DONE => Self::SegmentDone,
1272            ffi::GST_EVENT_GAP => Self::Gap,
1273            #[cfg(feature = "v1_18")]
1274            ffi::GST_EVENT_INSTANT_RATE_CHANGE => Self::InstantRateChange,
1275            ffi::GST_EVENT_QOS => Self::Qos,
1276            ffi::GST_EVENT_SEEK => Self::Seek,
1277            ffi::GST_EVENT_NAVIGATION => Self::Navigation,
1278            ffi::GST_EVENT_LATENCY => Self::Latency,
1279            ffi::GST_EVENT_STEP => Self::Step,
1280            ffi::GST_EVENT_RECONFIGURE => Self::Reconfigure,
1281            ffi::GST_EVENT_TOC_SELECT => Self::TocSelect,
1282            ffi::GST_EVENT_SELECT_STREAMS => Self::SelectStreams,
1283            #[cfg(feature = "v1_18")]
1284            ffi::GST_EVENT_INSTANT_RATE_SYNC_TIME => Self::InstantRateSyncTime,
1285            ffi::GST_EVENT_CUSTOM_UPSTREAM => Self::CustomUpstream,
1286            ffi::GST_EVENT_CUSTOM_DOWNSTREAM => Self::CustomDownstream,
1287            ffi::GST_EVENT_CUSTOM_DOWNSTREAM_OOB => Self::CustomDownstreamOob,
1288            ffi::GST_EVENT_CUSTOM_DOWNSTREAM_STICKY => Self::CustomDownstreamSticky,
1289            ffi::GST_EVENT_CUSTOM_BOTH => Self::CustomBoth,
1290            ffi::GST_EVENT_CUSTOM_BOTH_OOB => Self::CustomBothOob,
1291            value => Self::__Unknown(value),
1292        }
1293    }
1294}
1295
1296impl StaticType for EventType {
1297    #[inline]
1298    #[doc(alias = "gst_event_type_get_type")]
1299    fn static_type() -> glib::Type {
1300        unsafe { from_glib(ffi::gst_event_type_get_type()) }
1301    }
1302}
1303
1304impl glib::HasParamSpec for EventType {
1305    type ParamSpec = glib::ParamSpecEnum;
1306    type SetValue = Self;
1307    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1308
1309    fn param_spec_builder() -> Self::BuilderFn {
1310        Self::ParamSpec::builder_with_default
1311    }
1312}
1313
1314impl glib::value::ValueType for EventType {
1315    type Type = Self;
1316}
1317
1318unsafe impl<'a> glib::value::FromValue<'a> for EventType {
1319    type Checker = glib::value::GenericValueTypeChecker<Self>;
1320
1321    #[inline]
1322    unsafe fn from_value(value: &'a glib::Value) -> Self {
1323        skip_assert_initialized!();
1324        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1325    }
1326}
1327
1328impl ToValue for EventType {
1329    #[inline]
1330    fn to_value(&self) -> glib::Value {
1331        let mut value = glib::Value::for_value_type::<Self>();
1332        unsafe {
1333            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1334        }
1335        value
1336    }
1337
1338    #[inline]
1339    fn value_type(&self) -> glib::Type {
1340        Self::static_type()
1341    }
1342}
1343
1344impl From<EventType> for glib::Value {
1345    #[inline]
1346    fn from(v: EventType) -> Self {
1347        skip_assert_initialized!();
1348        ToValue::to_value(&v)
1349    }
1350}
1351
1352/// Standard predefined formats
1353#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1354#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
1355#[non_exhaustive]
1356#[doc(alias = "GstFormat")]
1357pub enum Format {
1358    /// undefined format
1359    #[doc(alias = "GST_FORMAT_UNDEFINED")]
1360    Undefined,
1361    /// the default format of the pad/element. This can be
1362    ///  samples for raw audio, frames/fields for raw video (some, but not all,
1363    ///  elements support this; use [`Time`][Self::Time] if you don't have a good
1364    ///  reason to query for samples/frames)
1365    #[doc(alias = "GST_FORMAT_DEFAULT")]
1366    Default,
1367    /// bytes
1368    #[doc(alias = "GST_FORMAT_BYTES")]
1369    Bytes,
1370    /// time in nanoseconds
1371    #[doc(alias = "GST_FORMAT_TIME")]
1372    Time,
1373    /// buffers (few, if any, elements implement this as of
1374    ///  May 2009)
1375    #[doc(alias = "GST_FORMAT_BUFFERS")]
1376    Buffers,
1377    /// percentage of stream (few, if any, elements implement
1378    ///  this as of May 2009)
1379    #[doc(alias = "GST_FORMAT_PERCENT")]
1380    Percent,
1381    #[doc(hidden)]
1382    __Unknown(i32),
1383}
1384
1385impl Format {
1386    #[doc(alias = "gst_format_get_by_nick")]
1387    #[doc(alias = "get_by_nick")]
1388    pub fn by_nick(nick: &str) -> Format {
1389        assert_initialized_main_thread!();
1390        unsafe { from_glib(ffi::gst_format_get_by_nick(nick.to_glib_none().0)) }
1391    }
1392
1393    //#[doc(alias = "gst_format_get_details")]
1394    //#[doc(alias = "get_details")]
1395    //pub fn details(self) -> /*Ignored*/Option<FormatDefinition> {
1396    //    unsafe { TODO: call ffi:gst_format_get_details() }
1397    //}
1398
1399    #[doc(alias = "gst_format_get_name")]
1400    #[doc(alias = "get_name")]
1401    pub fn name(self) -> Option<glib::GString> {
1402        assert_initialized_main_thread!();
1403        unsafe { from_glib_none(ffi::gst_format_get_name(self.into_glib())) }
1404    }
1405
1406    //#[doc(alias = "gst_format_iterate_definitions")]
1407    //pub fn iterate_definitions() -> /*Ignored*/Iterator {
1408    //    unsafe { TODO: call ffi:gst_format_iterate_definitions() }
1409    //}
1410
1411    #[doc(alias = "gst_format_to_quark")]
1412    pub fn to_quark(self) -> glib::Quark {
1413        assert_initialized_main_thread!();
1414        unsafe { from_glib(ffi::gst_format_to_quark(self.into_glib())) }
1415    }
1416}
1417
1418#[doc(hidden)]
1419impl IntoGlib for Format {
1420    type GlibType = ffi::GstFormat;
1421
1422    #[inline]
1423    fn into_glib(self) -> ffi::GstFormat {
1424        match self {
1425            Self::Undefined => ffi::GST_FORMAT_UNDEFINED,
1426            Self::Default => ffi::GST_FORMAT_DEFAULT,
1427            Self::Bytes => ffi::GST_FORMAT_BYTES,
1428            Self::Time => ffi::GST_FORMAT_TIME,
1429            Self::Buffers => ffi::GST_FORMAT_BUFFERS,
1430            Self::Percent => ffi::GST_FORMAT_PERCENT,
1431            Self::__Unknown(value) => value,
1432        }
1433    }
1434}
1435
1436#[doc(hidden)]
1437impl FromGlib<ffi::GstFormat> for Format {
1438    #[inline]
1439    unsafe fn from_glib(value: ffi::GstFormat) -> Self {
1440        skip_assert_initialized!();
1441
1442        match value {
1443            ffi::GST_FORMAT_UNDEFINED => Self::Undefined,
1444            ffi::GST_FORMAT_DEFAULT => Self::Default,
1445            ffi::GST_FORMAT_BYTES => Self::Bytes,
1446            ffi::GST_FORMAT_TIME => Self::Time,
1447            ffi::GST_FORMAT_BUFFERS => Self::Buffers,
1448            ffi::GST_FORMAT_PERCENT => Self::Percent,
1449            value => Self::__Unknown(value),
1450        }
1451    }
1452}
1453
1454impl StaticType for Format {
1455    #[inline]
1456    #[doc(alias = "gst_format_get_type")]
1457    fn static_type() -> glib::Type {
1458        unsafe { from_glib(ffi::gst_format_get_type()) }
1459    }
1460}
1461
1462impl glib::HasParamSpec for Format {
1463    type ParamSpec = glib::ParamSpecEnum;
1464    type SetValue = Self;
1465    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1466
1467    fn param_spec_builder() -> Self::BuilderFn {
1468        Self::ParamSpec::builder_with_default
1469    }
1470}
1471
1472impl glib::value::ValueType for Format {
1473    type Type = Self;
1474}
1475
1476unsafe impl<'a> glib::value::FromValue<'a> for Format {
1477    type Checker = glib::value::GenericValueTypeChecker<Self>;
1478
1479    #[inline]
1480    unsafe fn from_value(value: &'a glib::Value) -> Self {
1481        skip_assert_initialized!();
1482        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1483    }
1484}
1485
1486impl ToValue for Format {
1487    #[inline]
1488    fn to_value(&self) -> glib::Value {
1489        let mut value = glib::Value::for_value_type::<Self>();
1490        unsafe {
1491            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1492        }
1493        value
1494    }
1495
1496    #[inline]
1497    fn value_type(&self) -> glib::Type {
1498        Self::static_type()
1499    }
1500}
1501
1502impl From<Format> for glib::Value {
1503    #[inline]
1504    fn from(v: Format) -> Self {
1505        skip_assert_initialized!();
1506        ToValue::to_value(&v)
1507    }
1508}
1509
1510/// Library errors are for errors from the library being used by elements
1511/// (initializing, finalizing, settings, ...)
1512#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1513#[non_exhaustive]
1514#[doc(alias = "GstLibraryError")]
1515pub enum LibraryError {
1516    /// a general error which doesn't fit in any other
1517    /// category. Make sure you add a custom message to the error call.
1518    #[doc(alias = "GST_LIBRARY_ERROR_FAILED")]
1519    Failed,
1520    /// do not use this except as a placeholder for
1521    /// deciding where to go while developing code.
1522    #[doc(alias = "GST_LIBRARY_ERROR_TOO_LAZY")]
1523    TooLazy,
1524    /// used when the library could not be opened.
1525    #[doc(alias = "GST_LIBRARY_ERROR_INIT")]
1526    Init,
1527    /// used when the library could not be closed.
1528    #[doc(alias = "GST_LIBRARY_ERROR_SHUTDOWN")]
1529    Shutdown,
1530    /// used when the library doesn't accept settings.
1531    #[doc(alias = "GST_LIBRARY_ERROR_SETTINGS")]
1532    Settings,
1533    /// used when the library generated an encoding error.
1534    #[doc(alias = "GST_LIBRARY_ERROR_ENCODE")]
1535    Encode,
1536    #[doc(hidden)]
1537    __Unknown(i32),
1538}
1539
1540#[doc(hidden)]
1541impl IntoGlib for LibraryError {
1542    type GlibType = ffi::GstLibraryError;
1543
1544    #[inline]
1545    fn into_glib(self) -> ffi::GstLibraryError {
1546        match self {
1547            Self::Failed => ffi::GST_LIBRARY_ERROR_FAILED,
1548            Self::TooLazy => ffi::GST_LIBRARY_ERROR_TOO_LAZY,
1549            Self::Init => ffi::GST_LIBRARY_ERROR_INIT,
1550            Self::Shutdown => ffi::GST_LIBRARY_ERROR_SHUTDOWN,
1551            Self::Settings => ffi::GST_LIBRARY_ERROR_SETTINGS,
1552            Self::Encode => ffi::GST_LIBRARY_ERROR_ENCODE,
1553            Self::__Unknown(value) => value,
1554        }
1555    }
1556}
1557
1558#[doc(hidden)]
1559impl FromGlib<ffi::GstLibraryError> for LibraryError {
1560    #[inline]
1561    unsafe fn from_glib(value: ffi::GstLibraryError) -> Self {
1562        skip_assert_initialized!();
1563
1564        match value {
1565            ffi::GST_LIBRARY_ERROR_FAILED => Self::Failed,
1566            ffi::GST_LIBRARY_ERROR_TOO_LAZY => Self::TooLazy,
1567            ffi::GST_LIBRARY_ERROR_INIT => Self::Init,
1568            ffi::GST_LIBRARY_ERROR_SHUTDOWN => Self::Shutdown,
1569            ffi::GST_LIBRARY_ERROR_SETTINGS => Self::Settings,
1570            ffi::GST_LIBRARY_ERROR_ENCODE => Self::Encode,
1571            value => Self::__Unknown(value),
1572        }
1573    }
1574}
1575
1576impl glib::error::ErrorDomain for LibraryError {
1577    #[inline]
1578    fn domain() -> glib::Quark {
1579        skip_assert_initialized!();
1580
1581        unsafe { from_glib(ffi::gst_library_error_quark()) }
1582    }
1583
1584    #[inline]
1585    fn code(self) -> i32 {
1586        self.into_glib()
1587    }
1588
1589    #[inline]
1590    #[allow(clippy::match_single_binding)]
1591    fn from(code: i32) -> Option<Self> {
1592        skip_assert_initialized!();
1593        match unsafe { from_glib(code) } {
1594            Self::__Unknown(_) => Some(Self::Failed),
1595            value => Some(value),
1596        }
1597    }
1598}
1599
1600impl StaticType for LibraryError {
1601    #[inline]
1602    #[doc(alias = "gst_library_error_get_type")]
1603    fn static_type() -> glib::Type {
1604        unsafe { from_glib(ffi::gst_library_error_get_type()) }
1605    }
1606}
1607
1608impl glib::HasParamSpec for LibraryError {
1609    type ParamSpec = glib::ParamSpecEnum;
1610    type SetValue = Self;
1611    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1612
1613    fn param_spec_builder() -> Self::BuilderFn {
1614        Self::ParamSpec::builder_with_default
1615    }
1616}
1617
1618impl glib::value::ValueType for LibraryError {
1619    type Type = Self;
1620}
1621
1622unsafe impl<'a> glib::value::FromValue<'a> for LibraryError {
1623    type Checker = glib::value::GenericValueTypeChecker<Self>;
1624
1625    #[inline]
1626    unsafe fn from_value(value: &'a glib::Value) -> Self {
1627        skip_assert_initialized!();
1628        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1629    }
1630}
1631
1632impl ToValue for LibraryError {
1633    #[inline]
1634    fn to_value(&self) -> glib::Value {
1635        let mut value = glib::Value::for_value_type::<Self>();
1636        unsafe {
1637            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1638        }
1639        value
1640    }
1641
1642    #[inline]
1643    fn value_type(&self) -> glib::Type {
1644        Self::static_type()
1645    }
1646}
1647
1648impl From<LibraryError> for glib::Value {
1649    #[inline]
1650    fn from(v: LibraryError) -> Self {
1651        skip_assert_initialized!();
1652        ToValue::to_value(&v)
1653    }
1654}
1655
1656/// The direction of a pad.
1657#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1658#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
1659#[repr(i32)]
1660#[doc(alias = "GstPadDirection")]
1661pub enum PadDirection {
1662    /// direction is unknown.
1663    #[doc(alias = "GST_PAD_UNKNOWN")]
1664    Unknown = ffi::GST_PAD_UNKNOWN,
1665    /// the pad is a source pad.
1666    #[doc(alias = "GST_PAD_SRC")]
1667    Src = ffi::GST_PAD_SRC,
1668    /// the pad is a sink pad.
1669    #[doc(alias = "GST_PAD_SINK")]
1670    Sink = ffi::GST_PAD_SINK,
1671}
1672
1673#[doc(hidden)]
1674impl IntoGlib for PadDirection {
1675    type GlibType = ffi::GstPadDirection;
1676
1677    #[inline]
1678    fn into_glib(self) -> ffi::GstPadDirection {
1679        self as ffi::GstPadDirection
1680    }
1681}
1682
1683#[doc(hidden)]
1684impl FromGlib<ffi::GstPadDirection> for PadDirection {
1685    #[inline]
1686    unsafe fn from_glib(value: ffi::GstPadDirection) -> Self {
1687        skip_assert_initialized!();
1688
1689        debug_assert!([ffi::GST_PAD_UNKNOWN, ffi::GST_PAD_SRC, ffi::GST_PAD_SINK].contains(&value));
1690        unsafe { std::mem::transmute(value) }
1691    }
1692}
1693
1694impl StaticType for PadDirection {
1695    #[inline]
1696    #[doc(alias = "gst_pad_direction_get_type")]
1697    fn static_type() -> glib::Type {
1698        unsafe { from_glib(ffi::gst_pad_direction_get_type()) }
1699    }
1700}
1701
1702impl glib::HasParamSpec for PadDirection {
1703    type ParamSpec = glib::ParamSpecEnum;
1704    type SetValue = Self;
1705    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1706
1707    fn param_spec_builder() -> Self::BuilderFn {
1708        Self::ParamSpec::builder_with_default
1709    }
1710}
1711
1712impl glib::value::ValueType for PadDirection {
1713    type Type = Self;
1714}
1715
1716unsafe impl<'a> glib::value::FromValue<'a> for PadDirection {
1717    type Checker = glib::value::GenericValueTypeChecker<Self>;
1718
1719    #[inline]
1720    unsafe fn from_value(value: &'a glib::Value) -> Self {
1721        skip_assert_initialized!();
1722        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1723    }
1724}
1725
1726impl ToValue for PadDirection {
1727    #[inline]
1728    fn to_value(&self) -> glib::Value {
1729        let mut value = glib::Value::for_value_type::<Self>();
1730        unsafe {
1731            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1732        }
1733        value
1734    }
1735
1736    #[inline]
1737    fn value_type(&self) -> glib::Type {
1738        Self::static_type()
1739    }
1740}
1741
1742impl From<PadDirection> for glib::Value {
1743    #[inline]
1744    fn from(v: PadDirection) -> Self {
1745        skip_assert_initialized!();
1746        ToValue::to_value(&v)
1747    }
1748}
1749
1750/// The status of a GstPad. After activating a pad, which usually happens when the
1751/// parent element goes from READY to PAUSED, the GstPadMode defines if the
1752/// pad operates in push or pull mode.
1753#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1754#[repr(i32)]
1755#[doc(alias = "GstPadMode")]
1756pub enum PadMode {
1757    /// Pad will not handle dataflow
1758    #[doc(alias = "GST_PAD_MODE_NONE")]
1759    None = ffi::GST_PAD_MODE_NONE,
1760    /// Pad handles dataflow in downstream push mode
1761    #[doc(alias = "GST_PAD_MODE_PUSH")]
1762    Push = ffi::GST_PAD_MODE_PUSH,
1763    /// Pad handles dataflow in upstream pull mode
1764    #[doc(alias = "GST_PAD_MODE_PULL")]
1765    Pull = ffi::GST_PAD_MODE_PULL,
1766}
1767
1768impl PadMode {
1769    pub fn name<'a>(self) -> &'a GStr {
1770        unsafe {
1771            GStr::from_ptr(
1772                ffi::gst_pad_mode_get_name(self.into_glib())
1773                    .as_ref()
1774                    .expect("gst_pad_mode_get_name returned NULL"),
1775            )
1776        }
1777    }
1778}
1779
1780impl std::fmt::Display for PadMode {
1781    #[inline]
1782    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1783        f.write_str(&self.name())
1784    }
1785}
1786
1787#[doc(hidden)]
1788impl IntoGlib for PadMode {
1789    type GlibType = ffi::GstPadMode;
1790
1791    #[inline]
1792    fn into_glib(self) -> ffi::GstPadMode {
1793        self as ffi::GstPadMode
1794    }
1795}
1796
1797#[doc(hidden)]
1798impl FromGlib<ffi::GstPadMode> for PadMode {
1799    #[inline]
1800    unsafe fn from_glib(value: ffi::GstPadMode) -> Self {
1801        skip_assert_initialized!();
1802
1803        debug_assert!(
1804            [
1805                ffi::GST_PAD_MODE_NONE,
1806                ffi::GST_PAD_MODE_PUSH,
1807                ffi::GST_PAD_MODE_PULL
1808            ]
1809            .contains(&value)
1810        );
1811        unsafe { std::mem::transmute(value) }
1812    }
1813}
1814
1815impl StaticType for PadMode {
1816    #[inline]
1817    #[doc(alias = "gst_pad_mode_get_type")]
1818    fn static_type() -> glib::Type {
1819        unsafe { from_glib(ffi::gst_pad_mode_get_type()) }
1820    }
1821}
1822
1823impl glib::HasParamSpec for PadMode {
1824    type ParamSpec = glib::ParamSpecEnum;
1825    type SetValue = Self;
1826    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1827
1828    fn param_spec_builder() -> Self::BuilderFn {
1829        Self::ParamSpec::builder_with_default
1830    }
1831}
1832
1833impl glib::value::ValueType for PadMode {
1834    type Type = Self;
1835}
1836
1837unsafe impl<'a> glib::value::FromValue<'a> for PadMode {
1838    type Checker = glib::value::GenericValueTypeChecker<Self>;
1839
1840    #[inline]
1841    unsafe fn from_value(value: &'a glib::Value) -> Self {
1842        skip_assert_initialized!();
1843        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1844    }
1845}
1846
1847impl ToValue for PadMode {
1848    #[inline]
1849    fn to_value(&self) -> glib::Value {
1850        let mut value = glib::Value::for_value_type::<Self>();
1851        unsafe {
1852            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1853        }
1854        value
1855    }
1856
1857    #[inline]
1858    fn value_type(&self) -> glib::Type {
1859        Self::static_type()
1860    }
1861}
1862
1863impl From<PadMode> for glib::Value {
1864    #[inline]
1865    fn from(v: PadMode) -> Self {
1866        skip_assert_initialized!();
1867        ToValue::to_value(&v)
1868    }
1869}
1870
1871/// Indicates when this pad will become available.
1872#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1873#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
1874#[repr(i32)]
1875#[doc(alias = "GstPadPresence")]
1876pub enum PadPresence {
1877    /// the pad is always available
1878    #[doc(alias = "GST_PAD_ALWAYS")]
1879    Always = ffi::GST_PAD_ALWAYS,
1880    /// the pad will become available depending on the media stream
1881    #[doc(alias = "GST_PAD_SOMETIMES")]
1882    Sometimes = ffi::GST_PAD_SOMETIMES,
1883    /// the pad is only available on request with
1884    ///  [`ElementExt::request_pad()`][crate::prelude::ElementExt::request_pad()].
1885    #[doc(alias = "GST_PAD_REQUEST")]
1886    Request = ffi::GST_PAD_REQUEST,
1887}
1888
1889#[doc(hidden)]
1890impl IntoGlib for PadPresence {
1891    type GlibType = ffi::GstPadPresence;
1892
1893    #[inline]
1894    fn into_glib(self) -> ffi::GstPadPresence {
1895        self as ffi::GstPadPresence
1896    }
1897}
1898
1899#[doc(hidden)]
1900impl FromGlib<ffi::GstPadPresence> for PadPresence {
1901    #[inline]
1902    unsafe fn from_glib(value: ffi::GstPadPresence) -> Self {
1903        skip_assert_initialized!();
1904
1905        debug_assert!(
1906            [
1907                ffi::GST_PAD_ALWAYS,
1908                ffi::GST_PAD_SOMETIMES,
1909                ffi::GST_PAD_REQUEST
1910            ]
1911            .contains(&value)
1912        );
1913        unsafe { std::mem::transmute(value) }
1914    }
1915}
1916
1917impl StaticType for PadPresence {
1918    #[inline]
1919    #[doc(alias = "gst_pad_presence_get_type")]
1920    fn static_type() -> glib::Type {
1921        unsafe { from_glib(ffi::gst_pad_presence_get_type()) }
1922    }
1923}
1924
1925impl glib::HasParamSpec for PadPresence {
1926    type ParamSpec = glib::ParamSpecEnum;
1927    type SetValue = Self;
1928    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1929
1930    fn param_spec_builder() -> Self::BuilderFn {
1931        Self::ParamSpec::builder_with_default
1932    }
1933}
1934
1935impl glib::value::ValueType for PadPresence {
1936    type Type = Self;
1937}
1938
1939unsafe impl<'a> glib::value::FromValue<'a> for PadPresence {
1940    type Checker = glib::value::GenericValueTypeChecker<Self>;
1941
1942    #[inline]
1943    unsafe fn from_value(value: &'a glib::Value) -> Self {
1944        skip_assert_initialized!();
1945        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1946    }
1947}
1948
1949impl ToValue for PadPresence {
1950    #[inline]
1951    fn to_value(&self) -> glib::Value {
1952        let mut value = glib::Value::for_value_type::<Self>();
1953        unsafe {
1954            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1955        }
1956        value
1957    }
1958
1959    #[inline]
1960    fn value_type(&self) -> glib::Type {
1961        Self::static_type()
1962    }
1963}
1964
1965impl From<PadPresence> for glib::Value {
1966    #[inline]
1967    fn from(v: PadPresence) -> Self {
1968        skip_assert_initialized!();
1969        ToValue::to_value(&v)
1970    }
1971}
1972
1973/// Different return values for the `GstPadProbeCallback`.
1974#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1975#[repr(i32)]
1976#[doc(alias = "GstPadProbeReturn")]
1977pub enum PadProbeReturn {
1978    /// drop data in data probes. For push mode this means that
1979    ///  the data item is not sent downstream. For pull mode, it means that
1980    ///  the data item is not passed upstream. In both cases, no other probes
1981    ///  are called for this item and [`FlowReturn::Ok`][crate::FlowReturn::Ok] or [`true`] is returned to the
1982    ///  caller.
1983    #[doc(alias = "GST_PAD_PROBE_DROP")]
1984    Drop = ffi::GST_PAD_PROBE_DROP,
1985    /// normal probe return value. This leaves the probe in
1986    ///  place, and defers decisions about dropping or passing data to other
1987    ///  probes, if any. If there are no other probes, the default behaviour
1988    ///  for the probe type applies ('block' for blocking probes,
1989    ///  and 'pass' for non-blocking probes).
1990    #[doc(alias = "GST_PAD_PROBE_OK")]
1991    Ok = ffi::GST_PAD_PROBE_OK,
1992    /// remove this probe, passing the data. For blocking probes
1993    ///  this will cause data flow to unblock, unless there are also other
1994    ///  blocking probes installed.
1995    #[doc(alias = "GST_PAD_PROBE_REMOVE")]
1996    Remove = ffi::GST_PAD_PROBE_REMOVE,
1997    /// pass the data item in the block probe and block on the
1998    ///  next item. Note, that if there are multiple pad probes installed and
1999    ///  any probe returns PASS, the data will be passed.
2000    #[doc(alias = "GST_PAD_PROBE_PASS")]
2001    Pass = ffi::GST_PAD_PROBE_PASS,
2002    /// Data has been handled in the probe and will not be
2003    ///  forwarded further. For events and buffers this is the same behaviour as
2004    ///  [`Drop`][Self::Drop] (except that in this case you need to unref the buffer
2005    ///  or event yourself). For queries it will also return [`true`] to the caller.
2006    ///  The probe can also modify the [`FlowReturn`][crate::FlowReturn] value by using the
2007    ///  `GST_PAD_PROBE_INFO_FLOW_RETURN`() accessor.
2008    ///  Note that the resulting query must contain valid entries.
2009    ///  Since: 1.6
2010    #[doc(alias = "GST_PAD_PROBE_HANDLED")]
2011    Handled = ffi::GST_PAD_PROBE_HANDLED,
2012}
2013
2014#[doc(hidden)]
2015impl IntoGlib for PadProbeReturn {
2016    type GlibType = ffi::GstPadProbeReturn;
2017
2018    #[inline]
2019    fn into_glib(self) -> ffi::GstPadProbeReturn {
2020        self as ffi::GstPadProbeReturn
2021    }
2022}
2023
2024#[doc(hidden)]
2025impl FromGlib<ffi::GstPadProbeReturn> for PadProbeReturn {
2026    #[inline]
2027    unsafe fn from_glib(value: ffi::GstPadProbeReturn) -> Self {
2028        skip_assert_initialized!();
2029
2030        debug_assert!(
2031            [
2032                ffi::GST_PAD_PROBE_DROP,
2033                ffi::GST_PAD_PROBE_OK,
2034                ffi::GST_PAD_PROBE_REMOVE,
2035                ffi::GST_PAD_PROBE_PASS,
2036                ffi::GST_PAD_PROBE_HANDLED
2037            ]
2038            .contains(&value)
2039        );
2040        unsafe { std::mem::transmute(value) }
2041    }
2042}
2043
2044impl StaticType for PadProbeReturn {
2045    #[inline]
2046    #[doc(alias = "gst_pad_probe_return_get_type")]
2047    fn static_type() -> glib::Type {
2048        unsafe { from_glib(ffi::gst_pad_probe_return_get_type()) }
2049    }
2050}
2051
2052impl glib::HasParamSpec for PadProbeReturn {
2053    type ParamSpec = glib::ParamSpecEnum;
2054    type SetValue = Self;
2055    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2056
2057    fn param_spec_builder() -> Self::BuilderFn {
2058        Self::ParamSpec::builder_with_default
2059    }
2060}
2061
2062impl glib::value::ValueType for PadProbeReturn {
2063    type Type = Self;
2064}
2065
2066unsafe impl<'a> glib::value::FromValue<'a> for PadProbeReturn {
2067    type Checker = glib::value::GenericValueTypeChecker<Self>;
2068
2069    #[inline]
2070    unsafe fn from_value(value: &'a glib::Value) -> Self {
2071        skip_assert_initialized!();
2072        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2073    }
2074}
2075
2076impl ToValue for PadProbeReturn {
2077    #[inline]
2078    fn to_value(&self) -> glib::Value {
2079        let mut value = glib::Value::for_value_type::<Self>();
2080        unsafe {
2081            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2082        }
2083        value
2084    }
2085
2086    #[inline]
2087    fn value_type(&self) -> glib::Type {
2088        Self::static_type()
2089    }
2090}
2091
2092impl From<PadProbeReturn> for glib::Value {
2093    #[inline]
2094    fn from(v: PadProbeReturn) -> Self {
2095        skip_assert_initialized!();
2096        ToValue::to_value(&v)
2097    }
2098}
2099
2100/// The different parsing errors that can occur.
2101#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2102#[non_exhaustive]
2103#[doc(alias = "GstParseError")]
2104pub enum ParseError {
2105    /// A syntax error occurred.
2106    #[doc(alias = "GST_PARSE_ERROR_SYNTAX")]
2107    Syntax,
2108    /// The description contained an unknown element
2109    #[doc(alias = "GST_PARSE_ERROR_NO_SUCH_ELEMENT")]
2110    NoSuchElement,
2111    /// An element did not have a specified property
2112    #[doc(alias = "GST_PARSE_ERROR_NO_SUCH_PROPERTY")]
2113    NoSuchProperty,
2114    /// There was an error linking two pads.
2115    #[doc(alias = "GST_PARSE_ERROR_LINK")]
2116    Link,
2117    /// There was an error setting a property
2118    #[doc(alias = "GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY")]
2119    CouldNotSetProperty,
2120    /// An empty bin was specified.
2121    #[doc(alias = "GST_PARSE_ERROR_EMPTY_BIN")]
2122    EmptyBin,
2123    /// An empty description was specified
2124    #[doc(alias = "GST_PARSE_ERROR_EMPTY")]
2125    Empty,
2126    /// A delayed link did not get resolved.
2127    #[doc(alias = "GST_PARSE_ERROR_DELAYED_LINK")]
2128    DelayedLink,
2129    #[doc(hidden)]
2130    __Unknown(i32),
2131}
2132
2133#[doc(hidden)]
2134impl IntoGlib for ParseError {
2135    type GlibType = ffi::GstParseError;
2136
2137    #[inline]
2138    fn into_glib(self) -> ffi::GstParseError {
2139        match self {
2140            Self::Syntax => ffi::GST_PARSE_ERROR_SYNTAX,
2141            Self::NoSuchElement => ffi::GST_PARSE_ERROR_NO_SUCH_ELEMENT,
2142            Self::NoSuchProperty => ffi::GST_PARSE_ERROR_NO_SUCH_PROPERTY,
2143            Self::Link => ffi::GST_PARSE_ERROR_LINK,
2144            Self::CouldNotSetProperty => ffi::GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
2145            Self::EmptyBin => ffi::GST_PARSE_ERROR_EMPTY_BIN,
2146            Self::Empty => ffi::GST_PARSE_ERROR_EMPTY,
2147            Self::DelayedLink => ffi::GST_PARSE_ERROR_DELAYED_LINK,
2148            Self::__Unknown(value) => value,
2149        }
2150    }
2151}
2152
2153#[doc(hidden)]
2154impl FromGlib<ffi::GstParseError> for ParseError {
2155    #[inline]
2156    unsafe fn from_glib(value: ffi::GstParseError) -> Self {
2157        skip_assert_initialized!();
2158
2159        match value {
2160            ffi::GST_PARSE_ERROR_SYNTAX => Self::Syntax,
2161            ffi::GST_PARSE_ERROR_NO_SUCH_ELEMENT => Self::NoSuchElement,
2162            ffi::GST_PARSE_ERROR_NO_SUCH_PROPERTY => Self::NoSuchProperty,
2163            ffi::GST_PARSE_ERROR_LINK => Self::Link,
2164            ffi::GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY => Self::CouldNotSetProperty,
2165            ffi::GST_PARSE_ERROR_EMPTY_BIN => Self::EmptyBin,
2166            ffi::GST_PARSE_ERROR_EMPTY => Self::Empty,
2167            ffi::GST_PARSE_ERROR_DELAYED_LINK => Self::DelayedLink,
2168            value => Self::__Unknown(value),
2169        }
2170    }
2171}
2172
2173impl glib::error::ErrorDomain for ParseError {
2174    #[inline]
2175    fn domain() -> glib::Quark {
2176        skip_assert_initialized!();
2177
2178        unsafe { from_glib(ffi::gst_parse_error_quark()) }
2179    }
2180
2181    #[inline]
2182    fn code(self) -> i32 {
2183        self.into_glib()
2184    }
2185
2186    #[inline]
2187    #[allow(clippy::match_single_binding)]
2188    fn from(code: i32) -> Option<Self> {
2189        skip_assert_initialized!();
2190        match unsafe { from_glib(code) } {
2191            value => Some(value),
2192        }
2193    }
2194}
2195
2196impl StaticType for ParseError {
2197    #[inline]
2198    #[doc(alias = "gst_parse_error_get_type")]
2199    fn static_type() -> glib::Type {
2200        unsafe { from_glib(ffi::gst_parse_error_get_type()) }
2201    }
2202}
2203
2204impl glib::HasParamSpec for ParseError {
2205    type ParamSpec = glib::ParamSpecEnum;
2206    type SetValue = Self;
2207    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2208
2209    fn param_spec_builder() -> Self::BuilderFn {
2210        Self::ParamSpec::builder_with_default
2211    }
2212}
2213
2214impl glib::value::ValueType for ParseError {
2215    type Type = Self;
2216}
2217
2218unsafe impl<'a> glib::value::FromValue<'a> for ParseError {
2219    type Checker = glib::value::GenericValueTypeChecker<Self>;
2220
2221    #[inline]
2222    unsafe fn from_value(value: &'a glib::Value) -> Self {
2223        skip_assert_initialized!();
2224        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2225    }
2226}
2227
2228impl ToValue for ParseError {
2229    #[inline]
2230    fn to_value(&self) -> glib::Value {
2231        let mut value = glib::Value::for_value_type::<Self>();
2232        unsafe {
2233            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2234        }
2235        value
2236    }
2237
2238    #[inline]
2239    fn value_type(&self) -> glib::Type {
2240        Self::static_type()
2241    }
2242}
2243
2244impl From<ParseError> for glib::Value {
2245    #[inline]
2246    fn from(v: ParseError) -> Self {
2247        skip_assert_initialized!();
2248        ToValue::to_value(&v)
2249    }
2250}
2251
2252/// The plugin loading errors
2253#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2254#[non_exhaustive]
2255#[doc(alias = "GstPluginError")]
2256pub enum PluginError {
2257    /// The plugin could not be loaded
2258    #[doc(alias = "GST_PLUGIN_ERROR_MODULE")]
2259    Module,
2260    /// The plugin has unresolved dependencies
2261    #[doc(alias = "GST_PLUGIN_ERROR_DEPENDENCIES")]
2262    Dependencies,
2263    /// The plugin has already be loaded from a different file
2264    #[doc(alias = "GST_PLUGIN_ERROR_NAME_MISMATCH")]
2265    NameMismatch,
2266    #[doc(hidden)]
2267    __Unknown(i32),
2268}
2269
2270#[doc(hidden)]
2271impl IntoGlib for PluginError {
2272    type GlibType = ffi::GstPluginError;
2273
2274    #[inline]
2275    fn into_glib(self) -> ffi::GstPluginError {
2276        match self {
2277            Self::Module => ffi::GST_PLUGIN_ERROR_MODULE,
2278            Self::Dependencies => ffi::GST_PLUGIN_ERROR_DEPENDENCIES,
2279            Self::NameMismatch => ffi::GST_PLUGIN_ERROR_NAME_MISMATCH,
2280            Self::__Unknown(value) => value,
2281        }
2282    }
2283}
2284
2285#[doc(hidden)]
2286impl FromGlib<ffi::GstPluginError> for PluginError {
2287    #[inline]
2288    unsafe fn from_glib(value: ffi::GstPluginError) -> Self {
2289        skip_assert_initialized!();
2290
2291        match value {
2292            ffi::GST_PLUGIN_ERROR_MODULE => Self::Module,
2293            ffi::GST_PLUGIN_ERROR_DEPENDENCIES => Self::Dependencies,
2294            ffi::GST_PLUGIN_ERROR_NAME_MISMATCH => Self::NameMismatch,
2295            value => Self::__Unknown(value),
2296        }
2297    }
2298}
2299
2300impl glib::error::ErrorDomain for PluginError {
2301    #[inline]
2302    fn domain() -> glib::Quark {
2303        skip_assert_initialized!();
2304
2305        unsafe { from_glib(ffi::gst_plugin_error_quark()) }
2306    }
2307
2308    #[inline]
2309    fn code(self) -> i32 {
2310        self.into_glib()
2311    }
2312
2313    #[inline]
2314    #[allow(clippy::match_single_binding)]
2315    fn from(code: i32) -> Option<Self> {
2316        skip_assert_initialized!();
2317        match unsafe { from_glib(code) } {
2318            value => Some(value),
2319        }
2320    }
2321}
2322
2323impl StaticType for PluginError {
2324    #[inline]
2325    #[doc(alias = "gst_plugin_error_get_type")]
2326    fn static_type() -> glib::Type {
2327        unsafe { from_glib(ffi::gst_plugin_error_get_type()) }
2328    }
2329}
2330
2331impl glib::HasParamSpec for PluginError {
2332    type ParamSpec = glib::ParamSpecEnum;
2333    type SetValue = Self;
2334    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2335
2336    fn param_spec_builder() -> Self::BuilderFn {
2337        Self::ParamSpec::builder_with_default
2338    }
2339}
2340
2341impl glib::value::ValueType for PluginError {
2342    type Type = Self;
2343}
2344
2345unsafe impl<'a> glib::value::FromValue<'a> for PluginError {
2346    type Checker = glib::value::GenericValueTypeChecker<Self>;
2347
2348    #[inline]
2349    unsafe fn from_value(value: &'a glib::Value) -> Self {
2350        skip_assert_initialized!();
2351        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2352    }
2353}
2354
2355impl ToValue for PluginError {
2356    #[inline]
2357    fn to_value(&self) -> glib::Value {
2358        let mut value = glib::Value::for_value_type::<Self>();
2359        unsafe {
2360            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2361        }
2362        value
2363    }
2364
2365    #[inline]
2366    fn value_type(&self) -> glib::Type {
2367        Self::static_type()
2368    }
2369}
2370
2371impl From<PluginError> for glib::Value {
2372    #[inline]
2373    fn from(v: PluginError) -> Self {
2374        skip_assert_initialized!();
2375        ToValue::to_value(&v)
2376    }
2377}
2378
2379/// The type of a `GST_MESSAGE_PROGRESS`. The progress messages inform the
2380/// application of the status of asynchronous tasks.
2381#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2382#[non_exhaustive]
2383#[doc(alias = "GstProgressType")]
2384pub enum ProgressType {
2385    /// A new task started.
2386    #[doc(alias = "GST_PROGRESS_TYPE_START")]
2387    Start,
2388    /// A task completed and a new one continues.
2389    #[doc(alias = "GST_PROGRESS_TYPE_CONTINUE")]
2390    Continue,
2391    /// A task completed.
2392    #[doc(alias = "GST_PROGRESS_TYPE_COMPLETE")]
2393    Complete,
2394    /// A task was canceled.
2395    #[doc(alias = "GST_PROGRESS_TYPE_CANCELED")]
2396    Canceled,
2397    /// A task caused an error. An error message is also
2398    ///  posted on the bus.
2399    #[doc(alias = "GST_PROGRESS_TYPE_ERROR")]
2400    Error,
2401    #[doc(hidden)]
2402    __Unknown(i32),
2403}
2404
2405#[doc(hidden)]
2406impl IntoGlib for ProgressType {
2407    type GlibType = ffi::GstProgressType;
2408
2409    #[inline]
2410    fn into_glib(self) -> ffi::GstProgressType {
2411        match self {
2412            Self::Start => ffi::GST_PROGRESS_TYPE_START,
2413            Self::Continue => ffi::GST_PROGRESS_TYPE_CONTINUE,
2414            Self::Complete => ffi::GST_PROGRESS_TYPE_COMPLETE,
2415            Self::Canceled => ffi::GST_PROGRESS_TYPE_CANCELED,
2416            Self::Error => ffi::GST_PROGRESS_TYPE_ERROR,
2417            Self::__Unknown(value) => value,
2418        }
2419    }
2420}
2421
2422#[doc(hidden)]
2423impl FromGlib<ffi::GstProgressType> for ProgressType {
2424    #[inline]
2425    unsafe fn from_glib(value: ffi::GstProgressType) -> Self {
2426        skip_assert_initialized!();
2427
2428        match value {
2429            ffi::GST_PROGRESS_TYPE_START => Self::Start,
2430            ffi::GST_PROGRESS_TYPE_CONTINUE => Self::Continue,
2431            ffi::GST_PROGRESS_TYPE_COMPLETE => Self::Complete,
2432            ffi::GST_PROGRESS_TYPE_CANCELED => Self::Canceled,
2433            ffi::GST_PROGRESS_TYPE_ERROR => Self::Error,
2434            value => Self::__Unknown(value),
2435        }
2436    }
2437}
2438
2439impl StaticType for ProgressType {
2440    #[inline]
2441    #[doc(alias = "gst_progress_type_get_type")]
2442    fn static_type() -> glib::Type {
2443        unsafe { from_glib(ffi::gst_progress_type_get_type()) }
2444    }
2445}
2446
2447impl glib::HasParamSpec for ProgressType {
2448    type ParamSpec = glib::ParamSpecEnum;
2449    type SetValue = Self;
2450    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2451
2452    fn param_spec_builder() -> Self::BuilderFn {
2453        Self::ParamSpec::builder_with_default
2454    }
2455}
2456
2457impl glib::value::ValueType for ProgressType {
2458    type Type = Self;
2459}
2460
2461unsafe impl<'a> glib::value::FromValue<'a> for ProgressType {
2462    type Checker = glib::value::GenericValueTypeChecker<Self>;
2463
2464    #[inline]
2465    unsafe fn from_value(value: &'a glib::Value) -> Self {
2466        skip_assert_initialized!();
2467        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2468    }
2469}
2470
2471impl ToValue for ProgressType {
2472    #[inline]
2473    fn to_value(&self) -> glib::Value {
2474        let mut value = glib::Value::for_value_type::<Self>();
2475        unsafe {
2476            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2477        }
2478        value
2479    }
2480
2481    #[inline]
2482    fn value_type(&self) -> glib::Type {
2483        Self::static_type()
2484    }
2485}
2486
2487impl From<ProgressType> for glib::Value {
2488    #[inline]
2489    fn from(v: ProgressType) -> Self {
2490        skip_assert_initialized!();
2491        ToValue::to_value(&v)
2492    }
2493}
2494
2495/// The result of a [`Promise`][crate::Promise]
2496#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2497#[non_exhaustive]
2498#[doc(alias = "GstPromiseResult")]
2499pub enum PromiseResult {
2500    /// Initial state. Waiting for transition to any
2501    ///     other state.
2502    #[doc(alias = "GST_PROMISE_RESULT_PENDING")]
2503    Pending,
2504    /// Interrupted by the consumer as it doesn't
2505    ///     want the value anymore.
2506    #[doc(alias = "GST_PROMISE_RESULT_INTERRUPTED")]
2507    Interrupted,
2508    /// A producer marked a reply
2509    #[doc(alias = "GST_PROMISE_RESULT_REPLIED")]
2510    Replied,
2511    /// The promise expired (the carrying object
2512    ///     lost all refs) and the promise will never be fulfilled.
2513    #[doc(alias = "GST_PROMISE_RESULT_EXPIRED")]
2514    Expired,
2515    #[doc(hidden)]
2516    __Unknown(i32),
2517}
2518
2519#[doc(hidden)]
2520impl IntoGlib for PromiseResult {
2521    type GlibType = ffi::GstPromiseResult;
2522
2523    #[inline]
2524    fn into_glib(self) -> ffi::GstPromiseResult {
2525        match self {
2526            Self::Pending => ffi::GST_PROMISE_RESULT_PENDING,
2527            Self::Interrupted => ffi::GST_PROMISE_RESULT_INTERRUPTED,
2528            Self::Replied => ffi::GST_PROMISE_RESULT_REPLIED,
2529            Self::Expired => ffi::GST_PROMISE_RESULT_EXPIRED,
2530            Self::__Unknown(value) => value,
2531        }
2532    }
2533}
2534
2535#[doc(hidden)]
2536impl FromGlib<ffi::GstPromiseResult> for PromiseResult {
2537    #[inline]
2538    unsafe fn from_glib(value: ffi::GstPromiseResult) -> Self {
2539        skip_assert_initialized!();
2540
2541        match value {
2542            ffi::GST_PROMISE_RESULT_PENDING => Self::Pending,
2543            ffi::GST_PROMISE_RESULT_INTERRUPTED => Self::Interrupted,
2544            ffi::GST_PROMISE_RESULT_REPLIED => Self::Replied,
2545            ffi::GST_PROMISE_RESULT_EXPIRED => Self::Expired,
2546            value => Self::__Unknown(value),
2547        }
2548    }
2549}
2550
2551impl StaticType for PromiseResult {
2552    #[inline]
2553    #[doc(alias = "gst_promise_result_get_type")]
2554    fn static_type() -> glib::Type {
2555        unsafe { from_glib(ffi::gst_promise_result_get_type()) }
2556    }
2557}
2558
2559impl glib::HasParamSpec for PromiseResult {
2560    type ParamSpec = glib::ParamSpecEnum;
2561    type SetValue = Self;
2562    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2563
2564    fn param_spec_builder() -> Self::BuilderFn {
2565        Self::ParamSpec::builder_with_default
2566    }
2567}
2568
2569impl glib::value::ValueType for PromiseResult {
2570    type Type = Self;
2571}
2572
2573unsafe impl<'a> glib::value::FromValue<'a> for PromiseResult {
2574    type Checker = glib::value::GenericValueTypeChecker<Self>;
2575
2576    #[inline]
2577    unsafe fn from_value(value: &'a glib::Value) -> Self {
2578        skip_assert_initialized!();
2579        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2580    }
2581}
2582
2583impl ToValue for PromiseResult {
2584    #[inline]
2585    fn to_value(&self) -> glib::Value {
2586        let mut value = glib::Value::for_value_type::<Self>();
2587        unsafe {
2588            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2589        }
2590        value
2591    }
2592
2593    #[inline]
2594    fn value_type(&self) -> glib::Type {
2595        Self::static_type()
2596    }
2597}
2598
2599impl From<PromiseResult> for glib::Value {
2600    #[inline]
2601    fn from(v: PromiseResult) -> Self {
2602        skip_assert_initialized!();
2603        ToValue::to_value(&v)
2604    }
2605}
2606
2607/// The different types of QoS events that can be given to the
2608/// `gst_event_new_qos()` method.
2609#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2610#[non_exhaustive]
2611#[doc(alias = "GstQOSType")]
2612pub enum QOSType {
2613    /// The QoS event type that is produced when upstream
2614    ///  elements are producing data too quickly and the element can't keep up
2615    ///  processing the data. Upstream should reduce their production rate. This
2616    ///  type is also used when buffers arrive early or in time.
2617    #[doc(alias = "GST_QOS_TYPE_OVERFLOW")]
2618    Overflow,
2619    /// The QoS event type that is produced when upstream
2620    ///  elements are producing data too slowly and need to speed up their
2621    ///  production rate.
2622    #[doc(alias = "GST_QOS_TYPE_UNDERFLOW")]
2623    Underflow,
2624    /// The QoS event type that is produced when the
2625    ///  application enabled throttling to limit the data rate.
2626    #[doc(alias = "GST_QOS_TYPE_THROTTLE")]
2627    Throttle,
2628    #[doc(hidden)]
2629    __Unknown(i32),
2630}
2631
2632#[doc(hidden)]
2633impl IntoGlib for QOSType {
2634    type GlibType = ffi::GstQOSType;
2635
2636    #[inline]
2637    fn into_glib(self) -> ffi::GstQOSType {
2638        match self {
2639            Self::Overflow => ffi::GST_QOS_TYPE_OVERFLOW,
2640            Self::Underflow => ffi::GST_QOS_TYPE_UNDERFLOW,
2641            Self::Throttle => ffi::GST_QOS_TYPE_THROTTLE,
2642            Self::__Unknown(value) => value,
2643        }
2644    }
2645}
2646
2647#[doc(hidden)]
2648impl FromGlib<ffi::GstQOSType> for QOSType {
2649    #[inline]
2650    unsafe fn from_glib(value: ffi::GstQOSType) -> Self {
2651        skip_assert_initialized!();
2652
2653        match value {
2654            ffi::GST_QOS_TYPE_OVERFLOW => Self::Overflow,
2655            ffi::GST_QOS_TYPE_UNDERFLOW => Self::Underflow,
2656            ffi::GST_QOS_TYPE_THROTTLE => Self::Throttle,
2657            value => Self::__Unknown(value),
2658        }
2659    }
2660}
2661
2662impl StaticType for QOSType {
2663    #[inline]
2664    #[doc(alias = "gst_qos_type_get_type")]
2665    fn static_type() -> glib::Type {
2666        unsafe { from_glib(ffi::gst_qos_type_get_type()) }
2667    }
2668}
2669
2670impl glib::HasParamSpec for QOSType {
2671    type ParamSpec = glib::ParamSpecEnum;
2672    type SetValue = Self;
2673    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2674
2675    fn param_spec_builder() -> Self::BuilderFn {
2676        Self::ParamSpec::builder_with_default
2677    }
2678}
2679
2680impl glib::value::ValueType for QOSType {
2681    type Type = Self;
2682}
2683
2684unsafe impl<'a> glib::value::FromValue<'a> for QOSType {
2685    type Checker = glib::value::GenericValueTypeChecker<Self>;
2686
2687    #[inline]
2688    unsafe fn from_value(value: &'a glib::Value) -> Self {
2689        skip_assert_initialized!();
2690        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2691    }
2692}
2693
2694impl ToValue for QOSType {
2695    #[inline]
2696    fn to_value(&self) -> glib::Value {
2697        let mut value = glib::Value::for_value_type::<Self>();
2698        unsafe {
2699            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2700        }
2701        value
2702    }
2703
2704    #[inline]
2705    fn value_type(&self) -> glib::Type {
2706        Self::static_type()
2707    }
2708}
2709
2710impl From<QOSType> for glib::Value {
2711    #[inline]
2712    fn from(v: QOSType) -> Self {
2713        skip_assert_initialized!();
2714        ToValue::to_value(&v)
2715    }
2716}
2717
2718/// Standard predefined Query types
2719#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
2720#[non_exhaustive]
2721#[doc(alias = "GstQueryType")]
2722pub enum QueryType {
2723    /// unknown query type
2724    #[doc(alias = "GST_QUERY_UNKNOWN")]
2725    Unknown,
2726    /// current position in stream
2727    #[doc(alias = "GST_QUERY_POSITION")]
2728    Position,
2729    /// total duration of the stream
2730    #[doc(alias = "GST_QUERY_DURATION")]
2731    Duration,
2732    /// latency of stream
2733    #[doc(alias = "GST_QUERY_LATENCY")]
2734    Latency,
2735    /// current jitter of stream
2736    #[doc(alias = "GST_QUERY_JITTER")]
2737    Jitter,
2738    /// current rate of the stream
2739    #[doc(alias = "GST_QUERY_RATE")]
2740    Rate,
2741    /// seeking capabilities
2742    #[doc(alias = "GST_QUERY_SEEKING")]
2743    Seeking,
2744    /// segment start/stop positions
2745    #[doc(alias = "GST_QUERY_SEGMENT")]
2746    Segment,
2747    /// convert values between formats
2748    #[doc(alias = "GST_QUERY_CONVERT")]
2749    Convert,
2750    /// query supported formats for convert
2751    #[doc(alias = "GST_QUERY_FORMATS")]
2752    Formats,
2753    /// query available media for efficient seeking.
2754    #[doc(alias = "GST_QUERY_BUFFERING")]
2755    Buffering,
2756    /// a custom application or element defined query.
2757    #[doc(alias = "GST_QUERY_CUSTOM")]
2758    Custom,
2759    /// query the URI of the source or sink.
2760    #[doc(alias = "GST_QUERY_URI")]
2761    Uri,
2762    /// the buffer allocation properties
2763    #[doc(alias = "GST_QUERY_ALLOCATION")]
2764    Allocation,
2765    /// the scheduling properties
2766    #[doc(alias = "GST_QUERY_SCHEDULING")]
2767    Scheduling,
2768    /// the accept caps query
2769    #[doc(alias = "GST_QUERY_ACCEPT_CAPS")]
2770    AcceptCaps,
2771    /// the caps query
2772    #[doc(alias = "GST_QUERY_CAPS")]
2773    Caps,
2774    /// wait till all serialized data is consumed downstream
2775    #[doc(alias = "GST_QUERY_DRAIN")]
2776    Drain,
2777    /// query the pipeline-local context from
2778    ///  downstream or upstream (since 1.2)
2779    #[doc(alias = "GST_QUERY_CONTEXT")]
2780    Context,
2781    /// the bitrate query (since 1.16)
2782    #[doc(alias = "GST_QUERY_BITRATE")]
2783    Bitrate,
2784    /// Query stream selection capability.
2785    #[cfg(feature = "v1_22")]
2786    #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
2787    #[doc(alias = "GST_QUERY_SELECTABLE")]
2788    Selectable,
2789    #[doc(hidden)]
2790    __Unknown(i32),
2791}
2792
2793impl QueryType {
2794    //#[doc(alias = "gst_query_type_get_flags")]
2795    //#[doc(alias = "get_flags")]
2796    //pub fn flags(self) -> /*Ignored*/QueryTypeFlags {
2797    //    unsafe { TODO: call ffi:gst_query_type_get_flags() }
2798    //}
2799
2800    pub fn name<'a>(self) -> &'a GStr {
2801        unsafe {
2802            GStr::from_ptr(
2803                ffi::gst_query_type_get_name(self.into_glib())
2804                    .as_ref()
2805                    .expect("gst_query_type_get_name returned NULL"),
2806            )
2807        }
2808    }
2809
2810    #[doc(alias = "gst_query_type_to_quark")]
2811    pub fn to_quark(self) -> glib::Quark {
2812        assert_initialized_main_thread!();
2813        unsafe { from_glib(ffi::gst_query_type_to_quark(self.into_glib())) }
2814    }
2815}
2816
2817impl std::fmt::Display for QueryType {
2818    #[inline]
2819    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
2820        f.write_str(&self.name())
2821    }
2822}
2823
2824#[doc(hidden)]
2825impl IntoGlib for QueryType {
2826    type GlibType = ffi::GstQueryType;
2827
2828    fn into_glib(self) -> ffi::GstQueryType {
2829        match self {
2830            Self::Unknown => ffi::GST_QUERY_UNKNOWN,
2831            Self::Position => ffi::GST_QUERY_POSITION,
2832            Self::Duration => ffi::GST_QUERY_DURATION,
2833            Self::Latency => ffi::GST_QUERY_LATENCY,
2834            Self::Jitter => ffi::GST_QUERY_JITTER,
2835            Self::Rate => ffi::GST_QUERY_RATE,
2836            Self::Seeking => ffi::GST_QUERY_SEEKING,
2837            Self::Segment => ffi::GST_QUERY_SEGMENT,
2838            Self::Convert => ffi::GST_QUERY_CONVERT,
2839            Self::Formats => ffi::GST_QUERY_FORMATS,
2840            Self::Buffering => ffi::GST_QUERY_BUFFERING,
2841            Self::Custom => ffi::GST_QUERY_CUSTOM,
2842            Self::Uri => ffi::GST_QUERY_URI,
2843            Self::Allocation => ffi::GST_QUERY_ALLOCATION,
2844            Self::Scheduling => ffi::GST_QUERY_SCHEDULING,
2845            Self::AcceptCaps => ffi::GST_QUERY_ACCEPT_CAPS,
2846            Self::Caps => ffi::GST_QUERY_CAPS,
2847            Self::Drain => ffi::GST_QUERY_DRAIN,
2848            Self::Context => ffi::GST_QUERY_CONTEXT,
2849            Self::Bitrate => ffi::GST_QUERY_BITRATE,
2850            #[cfg(feature = "v1_22")]
2851            Self::Selectable => ffi::GST_QUERY_SELECTABLE,
2852            Self::__Unknown(value) => value,
2853        }
2854    }
2855}
2856
2857#[doc(hidden)]
2858impl FromGlib<ffi::GstQueryType> for QueryType {
2859    unsafe fn from_glib(value: ffi::GstQueryType) -> Self {
2860        skip_assert_initialized!();
2861
2862        match value {
2863            ffi::GST_QUERY_UNKNOWN => Self::Unknown,
2864            ffi::GST_QUERY_POSITION => Self::Position,
2865            ffi::GST_QUERY_DURATION => Self::Duration,
2866            ffi::GST_QUERY_LATENCY => Self::Latency,
2867            ffi::GST_QUERY_JITTER => Self::Jitter,
2868            ffi::GST_QUERY_RATE => Self::Rate,
2869            ffi::GST_QUERY_SEEKING => Self::Seeking,
2870            ffi::GST_QUERY_SEGMENT => Self::Segment,
2871            ffi::GST_QUERY_CONVERT => Self::Convert,
2872            ffi::GST_QUERY_FORMATS => Self::Formats,
2873            ffi::GST_QUERY_BUFFERING => Self::Buffering,
2874            ffi::GST_QUERY_CUSTOM => Self::Custom,
2875            ffi::GST_QUERY_URI => Self::Uri,
2876            ffi::GST_QUERY_ALLOCATION => Self::Allocation,
2877            ffi::GST_QUERY_SCHEDULING => Self::Scheduling,
2878            ffi::GST_QUERY_ACCEPT_CAPS => Self::AcceptCaps,
2879            ffi::GST_QUERY_CAPS => Self::Caps,
2880            ffi::GST_QUERY_DRAIN => Self::Drain,
2881            ffi::GST_QUERY_CONTEXT => Self::Context,
2882            ffi::GST_QUERY_BITRATE => Self::Bitrate,
2883            #[cfg(feature = "v1_22")]
2884            ffi::GST_QUERY_SELECTABLE => Self::Selectable,
2885            value => Self::__Unknown(value),
2886        }
2887    }
2888}
2889
2890impl StaticType for QueryType {
2891    #[inline]
2892    #[doc(alias = "gst_query_type_get_type")]
2893    fn static_type() -> glib::Type {
2894        unsafe { from_glib(ffi::gst_query_type_get_type()) }
2895    }
2896}
2897
2898impl glib::HasParamSpec for QueryType {
2899    type ParamSpec = glib::ParamSpecEnum;
2900    type SetValue = Self;
2901    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2902
2903    fn param_spec_builder() -> Self::BuilderFn {
2904        Self::ParamSpec::builder_with_default
2905    }
2906}
2907
2908impl glib::value::ValueType for QueryType {
2909    type Type = Self;
2910}
2911
2912unsafe impl<'a> glib::value::FromValue<'a> for QueryType {
2913    type Checker = glib::value::GenericValueTypeChecker<Self>;
2914
2915    #[inline]
2916    unsafe fn from_value(value: &'a glib::Value) -> Self {
2917        skip_assert_initialized!();
2918        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2919    }
2920}
2921
2922impl ToValue for QueryType {
2923    #[inline]
2924    fn to_value(&self) -> glib::Value {
2925        let mut value = glib::Value::for_value_type::<Self>();
2926        unsafe {
2927            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2928        }
2929        value
2930    }
2931
2932    #[inline]
2933    fn value_type(&self) -> glib::Type {
2934        Self::static_type()
2935    }
2936}
2937
2938impl From<QueryType> for glib::Value {
2939    #[inline]
2940    fn from(v: QueryType) -> Self {
2941        skip_assert_initialized!();
2942        ToValue::to_value(&v)
2943    }
2944}
2945
2946/// Resource errors are for any resource used by an element:
2947/// memory, files, network connections, process space, ...
2948/// They're typically used by source and sink elements.
2949#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2950#[non_exhaustive]
2951#[doc(alias = "GstResourceError")]
2952pub enum ResourceError {
2953    /// a general error which doesn't fit in any other
2954    /// category. Make sure you add a custom message to the error call.
2955    #[doc(alias = "GST_RESOURCE_ERROR_FAILED")]
2956    Failed,
2957    /// do not use this except as a placeholder for
2958    /// deciding where to go while developing code.
2959    #[doc(alias = "GST_RESOURCE_ERROR_TOO_LAZY")]
2960    TooLazy,
2961    /// used when the resource could not be found.
2962    #[doc(alias = "GST_RESOURCE_ERROR_NOT_FOUND")]
2963    NotFound,
2964    /// used when resource is busy.
2965    #[doc(alias = "GST_RESOURCE_ERROR_BUSY")]
2966    Busy,
2967    /// used when resource fails to open for reading.
2968    #[doc(alias = "GST_RESOURCE_ERROR_OPEN_READ")]
2969    OpenRead,
2970    /// used when resource fails to open for writing.
2971    #[doc(alias = "GST_RESOURCE_ERROR_OPEN_WRITE")]
2972    OpenWrite,
2973    /// used when resource cannot be opened for
2974    /// both reading and writing, or either (but unspecified which).
2975    #[doc(alias = "GST_RESOURCE_ERROR_OPEN_READ_WRITE")]
2976    OpenReadWrite,
2977    /// used when the resource can't be closed.
2978    #[doc(alias = "GST_RESOURCE_ERROR_CLOSE")]
2979    Close,
2980    /// used when the resource can't be read from.
2981    #[doc(alias = "GST_RESOURCE_ERROR_READ")]
2982    Read,
2983    /// used when the resource can't be written to.
2984    #[doc(alias = "GST_RESOURCE_ERROR_WRITE")]
2985    Write,
2986    /// used when a seek on the resource fails.
2987    #[doc(alias = "GST_RESOURCE_ERROR_SEEK")]
2988    Seek,
2989    /// used when a synchronize on the resource fails.
2990    #[doc(alias = "GST_RESOURCE_ERROR_SYNC")]
2991    Sync,
2992    /// used when settings can't be manipulated on.
2993    #[doc(alias = "GST_RESOURCE_ERROR_SETTINGS")]
2994    Settings,
2995    /// used when the resource has no space left.
2996    #[doc(alias = "GST_RESOURCE_ERROR_NO_SPACE_LEFT")]
2997    NoSpaceLeft,
2998    /// used when the resource can't be opened
2999    ///  due to missing authorization.
3000    ///  (Since: 1.2.4)
3001    #[doc(alias = "GST_RESOURCE_ERROR_NOT_AUTHORIZED")]
3002    NotAuthorized,
3003    #[doc(hidden)]
3004    __Unknown(i32),
3005}
3006
3007#[doc(hidden)]
3008impl IntoGlib for ResourceError {
3009    type GlibType = ffi::GstResourceError;
3010
3011    fn into_glib(self) -> ffi::GstResourceError {
3012        match self {
3013            Self::Failed => ffi::GST_RESOURCE_ERROR_FAILED,
3014            Self::TooLazy => ffi::GST_RESOURCE_ERROR_TOO_LAZY,
3015            Self::NotFound => ffi::GST_RESOURCE_ERROR_NOT_FOUND,
3016            Self::Busy => ffi::GST_RESOURCE_ERROR_BUSY,
3017            Self::OpenRead => ffi::GST_RESOURCE_ERROR_OPEN_READ,
3018            Self::OpenWrite => ffi::GST_RESOURCE_ERROR_OPEN_WRITE,
3019            Self::OpenReadWrite => ffi::GST_RESOURCE_ERROR_OPEN_READ_WRITE,
3020            Self::Close => ffi::GST_RESOURCE_ERROR_CLOSE,
3021            Self::Read => ffi::GST_RESOURCE_ERROR_READ,
3022            Self::Write => ffi::GST_RESOURCE_ERROR_WRITE,
3023            Self::Seek => ffi::GST_RESOURCE_ERROR_SEEK,
3024            Self::Sync => ffi::GST_RESOURCE_ERROR_SYNC,
3025            Self::Settings => ffi::GST_RESOURCE_ERROR_SETTINGS,
3026            Self::NoSpaceLeft => ffi::GST_RESOURCE_ERROR_NO_SPACE_LEFT,
3027            Self::NotAuthorized => ffi::GST_RESOURCE_ERROR_NOT_AUTHORIZED,
3028            Self::__Unknown(value) => value,
3029        }
3030    }
3031}
3032
3033#[doc(hidden)]
3034impl FromGlib<ffi::GstResourceError> for ResourceError {
3035    unsafe fn from_glib(value: ffi::GstResourceError) -> Self {
3036        skip_assert_initialized!();
3037
3038        match value {
3039            ffi::GST_RESOURCE_ERROR_FAILED => Self::Failed,
3040            ffi::GST_RESOURCE_ERROR_TOO_LAZY => Self::TooLazy,
3041            ffi::GST_RESOURCE_ERROR_NOT_FOUND => Self::NotFound,
3042            ffi::GST_RESOURCE_ERROR_BUSY => Self::Busy,
3043            ffi::GST_RESOURCE_ERROR_OPEN_READ => Self::OpenRead,
3044            ffi::GST_RESOURCE_ERROR_OPEN_WRITE => Self::OpenWrite,
3045            ffi::GST_RESOURCE_ERROR_OPEN_READ_WRITE => Self::OpenReadWrite,
3046            ffi::GST_RESOURCE_ERROR_CLOSE => Self::Close,
3047            ffi::GST_RESOURCE_ERROR_READ => Self::Read,
3048            ffi::GST_RESOURCE_ERROR_WRITE => Self::Write,
3049            ffi::GST_RESOURCE_ERROR_SEEK => Self::Seek,
3050            ffi::GST_RESOURCE_ERROR_SYNC => Self::Sync,
3051            ffi::GST_RESOURCE_ERROR_SETTINGS => Self::Settings,
3052            ffi::GST_RESOURCE_ERROR_NO_SPACE_LEFT => Self::NoSpaceLeft,
3053            ffi::GST_RESOURCE_ERROR_NOT_AUTHORIZED => Self::NotAuthorized,
3054            value => Self::__Unknown(value),
3055        }
3056    }
3057}
3058
3059impl glib::error::ErrorDomain for ResourceError {
3060    #[inline]
3061    fn domain() -> glib::Quark {
3062        skip_assert_initialized!();
3063
3064        unsafe { from_glib(ffi::gst_resource_error_quark()) }
3065    }
3066
3067    #[inline]
3068    fn code(self) -> i32 {
3069        self.into_glib()
3070    }
3071
3072    #[inline]
3073    #[allow(clippy::match_single_binding)]
3074    fn from(code: i32) -> Option<Self> {
3075        skip_assert_initialized!();
3076        match unsafe { from_glib(code) } {
3077            Self::__Unknown(_) => Some(Self::Failed),
3078            value => Some(value),
3079        }
3080    }
3081}
3082
3083impl StaticType for ResourceError {
3084    #[inline]
3085    #[doc(alias = "gst_resource_error_get_type")]
3086    fn static_type() -> glib::Type {
3087        unsafe { from_glib(ffi::gst_resource_error_get_type()) }
3088    }
3089}
3090
3091impl glib::HasParamSpec for ResourceError {
3092    type ParamSpec = glib::ParamSpecEnum;
3093    type SetValue = Self;
3094    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3095
3096    fn param_spec_builder() -> Self::BuilderFn {
3097        Self::ParamSpec::builder_with_default
3098    }
3099}
3100
3101impl glib::value::ValueType for ResourceError {
3102    type Type = Self;
3103}
3104
3105unsafe impl<'a> glib::value::FromValue<'a> for ResourceError {
3106    type Checker = glib::value::GenericValueTypeChecker<Self>;
3107
3108    #[inline]
3109    unsafe fn from_value(value: &'a glib::Value) -> Self {
3110        skip_assert_initialized!();
3111        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3112    }
3113}
3114
3115impl ToValue for ResourceError {
3116    #[inline]
3117    fn to_value(&self) -> glib::Value {
3118        let mut value = glib::Value::for_value_type::<Self>();
3119        unsafe {
3120            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3121        }
3122        value
3123    }
3124
3125    #[inline]
3126    fn value_type(&self) -> glib::Type {
3127        Self::static_type()
3128    }
3129}
3130
3131impl From<ResourceError> for glib::Value {
3132    #[inline]
3133    fn from(v: ResourceError) -> Self {
3134        skip_assert_initialized!();
3135        ToValue::to_value(&v)
3136    }
3137}
3138
3139/// The different types of seek events. When constructing a seek event with
3140/// `gst_event_new_seek()` or when doing gst_segment_do_seek ().
3141#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3142#[repr(i32)]
3143#[doc(alias = "GstSeekType")]
3144pub enum SeekType {
3145    /// no change in position is required
3146    #[doc(alias = "GST_SEEK_TYPE_NONE")]
3147    None = ffi::GST_SEEK_TYPE_NONE,
3148    /// absolute position is requested
3149    #[doc(alias = "GST_SEEK_TYPE_SET")]
3150    Set = ffi::GST_SEEK_TYPE_SET,
3151    /// relative position to duration is requested
3152    #[doc(alias = "GST_SEEK_TYPE_END")]
3153    End = ffi::GST_SEEK_TYPE_END,
3154}
3155
3156#[doc(hidden)]
3157impl IntoGlib for SeekType {
3158    type GlibType = ffi::GstSeekType;
3159
3160    #[inline]
3161    fn into_glib(self) -> ffi::GstSeekType {
3162        self as ffi::GstSeekType
3163    }
3164}
3165
3166#[doc(hidden)]
3167impl FromGlib<ffi::GstSeekType> for SeekType {
3168    #[inline]
3169    unsafe fn from_glib(value: ffi::GstSeekType) -> Self {
3170        skip_assert_initialized!();
3171
3172        debug_assert!(
3173            [
3174                ffi::GST_SEEK_TYPE_NONE,
3175                ffi::GST_SEEK_TYPE_SET,
3176                ffi::GST_SEEK_TYPE_END
3177            ]
3178            .contains(&value)
3179        );
3180        unsafe { std::mem::transmute(value) }
3181    }
3182}
3183
3184impl StaticType for SeekType {
3185    #[inline]
3186    #[doc(alias = "gst_seek_type_get_type")]
3187    fn static_type() -> glib::Type {
3188        unsafe { from_glib(ffi::gst_seek_type_get_type()) }
3189    }
3190}
3191
3192impl glib::HasParamSpec for SeekType {
3193    type ParamSpec = glib::ParamSpecEnum;
3194    type SetValue = Self;
3195    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3196
3197    fn param_spec_builder() -> Self::BuilderFn {
3198        Self::ParamSpec::builder_with_default
3199    }
3200}
3201
3202impl glib::value::ValueType for SeekType {
3203    type Type = Self;
3204}
3205
3206unsafe impl<'a> glib::value::FromValue<'a> for SeekType {
3207    type Checker = glib::value::GenericValueTypeChecker<Self>;
3208
3209    #[inline]
3210    unsafe fn from_value(value: &'a glib::Value) -> Self {
3211        skip_assert_initialized!();
3212        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3213    }
3214}
3215
3216impl ToValue for SeekType {
3217    #[inline]
3218    fn to_value(&self) -> glib::Value {
3219        let mut value = glib::Value::for_value_type::<Self>();
3220        unsafe {
3221            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3222        }
3223        value
3224    }
3225
3226    #[inline]
3227    fn value_type(&self) -> glib::Type {
3228        Self::static_type()
3229    }
3230}
3231
3232impl From<SeekType> for glib::Value {
3233    #[inline]
3234    fn from(v: SeekType) -> Self {
3235        skip_assert_initialized!();
3236        ToValue::to_value(&v)
3237    }
3238}
3239
3240/// The possible states an element can be in. States can be changed using
3241/// [`ElementExt::set_state()`][crate::prelude::ElementExt::set_state()] and checked using [`ElementExt::state()`][crate::prelude::ElementExt::state()].
3242#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3243#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
3244#[repr(i32)]
3245#[doc(alias = "GstState")]
3246pub enum State {
3247    /// no pending state.
3248    #[doc(alias = "GST_STATE_VOID_PENDING")]
3249    VoidPending = ffi::GST_STATE_VOID_PENDING,
3250    /// the NULL state or initial state of an element.
3251    #[doc(alias = "GST_STATE_NULL")]
3252    Null = ffi::GST_STATE_NULL,
3253    /// the element is ready to go to PAUSED.
3254    #[doc(alias = "GST_STATE_READY")]
3255    Ready = ffi::GST_STATE_READY,
3256    /// the element is PAUSED, it is ready to accept and
3257    ///  process data. Sink elements however only accept one
3258    ///  buffer and then block.
3259    #[doc(alias = "GST_STATE_PAUSED")]
3260    Paused = ffi::GST_STATE_PAUSED,
3261    /// the element is PLAYING, the [`Clock`][crate::Clock] is running and
3262    ///  the data is flowing.
3263    #[doc(alias = "GST_STATE_PLAYING")]
3264    Playing = ffi::GST_STATE_PLAYING,
3265}
3266
3267#[doc(hidden)]
3268impl IntoGlib for State {
3269    type GlibType = ffi::GstState;
3270
3271    #[inline]
3272    fn into_glib(self) -> ffi::GstState {
3273        self as ffi::GstState
3274    }
3275}
3276
3277#[doc(hidden)]
3278impl FromGlib<ffi::GstState> for State {
3279    #[inline]
3280    unsafe fn from_glib(value: ffi::GstState) -> Self {
3281        skip_assert_initialized!();
3282
3283        debug_assert!(
3284            [
3285                ffi::GST_STATE_VOID_PENDING,
3286                ffi::GST_STATE_NULL,
3287                ffi::GST_STATE_READY,
3288                ffi::GST_STATE_PAUSED,
3289                ffi::GST_STATE_PLAYING
3290            ]
3291            .contains(&value)
3292        );
3293        unsafe { std::mem::transmute(value) }
3294    }
3295}
3296
3297impl StaticType for State {
3298    #[inline]
3299    #[doc(alias = "gst_state_get_type")]
3300    fn static_type() -> glib::Type {
3301        unsafe { from_glib(ffi::gst_state_get_type()) }
3302    }
3303}
3304
3305impl glib::HasParamSpec for State {
3306    type ParamSpec = glib::ParamSpecEnum;
3307    type SetValue = Self;
3308    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3309
3310    fn param_spec_builder() -> Self::BuilderFn {
3311        Self::ParamSpec::builder_with_default
3312    }
3313}
3314
3315impl glib::value::ValueType for State {
3316    type Type = Self;
3317}
3318
3319unsafe impl<'a> glib::value::FromValue<'a> for State {
3320    type Checker = glib::value::GenericValueTypeChecker<Self>;
3321
3322    #[inline]
3323    unsafe fn from_value(value: &'a glib::Value) -> Self {
3324        skip_assert_initialized!();
3325        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3326    }
3327}
3328
3329impl ToValue for State {
3330    #[inline]
3331    fn to_value(&self) -> glib::Value {
3332        let mut value = glib::Value::for_value_type::<Self>();
3333        unsafe {
3334            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3335        }
3336        value
3337    }
3338
3339    #[inline]
3340    fn value_type(&self) -> glib::Type {
3341        Self::static_type()
3342    }
3343}
3344
3345impl From<State> for glib::Value {
3346    #[inline]
3347    fn from(v: State) -> Self {
3348        skip_assert_initialized!();
3349        ToValue::to_value(&v)
3350    }
3351}
3352
3353/// rArr; [`State::Null`][crate::State::Null] a downwards state change.
3354#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3355#[repr(i32)]
3356#[doc(alias = "GstStateChange")]
3357pub enum StateChange {
3358    /// state change from NULL to READY.
3359    ///  * The element must check if the resources it needs are available. Device
3360    ///  sinks and -sources typically try to probe the device to constrain their
3361    ///  caps.
3362    ///  * The element opens the device (in case feature need to be probed).
3363    #[doc(alias = "GST_STATE_CHANGE_NULL_TO_READY")]
3364    NullToReady = ffi::GST_STATE_CHANGE_NULL_TO_READY,
3365    /// state change from READY to PAUSED.
3366    ///  * The element pads are activated in order to receive data in PAUSED.
3367    ///  Streaming threads are started.
3368    ///  * Some elements might need to return [`StateChangeReturn::Async`][crate::StateChangeReturn::Async] and complete
3369    ///  the state change when they have enough information. It is a requirement
3370    ///  for sinks to return [`StateChangeReturn::Async`][crate::StateChangeReturn::Async] and complete the state change
3371    ///  when they receive the first buffer or [`EventType::Eos`][crate::EventType::Eos] (preroll).
3372    ///  Sinks also block the dataflow when in PAUSED.
3373    ///  * A pipeline resets the running_time to 0.
3374    ///  * Live sources return [`StateChangeReturn::NoPreroll`][crate::StateChangeReturn::NoPreroll] and don't generate data.
3375    #[doc(alias = "GST_STATE_CHANGE_READY_TO_PAUSED")]
3376    ReadyToPaused = ffi::GST_STATE_CHANGE_READY_TO_PAUSED,
3377    /// state change from PAUSED to PLAYING.
3378    ///  * Most elements ignore this state change.
3379    ///  * The pipeline selects a [`Clock`][crate::Clock] and distributes this to all the children
3380    ///  before setting them to PLAYING. This means that it is only allowed to
3381    ///  synchronize on the [`Clock`][crate::Clock] in the PLAYING state.
3382    ///  * The pipeline uses the [`Clock`][crate::Clock] and the running_time to calculate the
3383    ///  base_time. The base_time is distributed to all children when performing
3384    ///  the state change.
3385    ///  * Sink elements stop blocking on the preroll buffer or event and start
3386    ///  rendering the data.
3387    ///  * Sinks can post `GST_MESSAGE_EOS` in the PLAYING state. It is not allowed
3388    ///  to post `GST_MESSAGE_EOS` when not in the PLAYING state.
3389    ///  * While streaming in PAUSED or PLAYING elements can create and remove
3390    ///  sometimes pads.
3391    ///  * Live sources start generating data and return [`StateChangeReturn::Success`][crate::StateChangeReturn::Success].
3392    #[doc(alias = "GST_STATE_CHANGE_PAUSED_TO_PLAYING")]
3393    PausedToPlaying = ffi::GST_STATE_CHANGE_PAUSED_TO_PLAYING,
3394    /// state change from PLAYING to PAUSED.
3395    ///  * Most elements ignore this state change.
3396    ///  * The pipeline calculates the running_time based on the last selected
3397    ///  [`Clock`][crate::Clock] and the base_time. It stores this information to continue
3398    ///  playback when going back to the PLAYING state.
3399    ///  * Sinks unblock any [`Clock`][crate::Clock] wait calls.
3400    ///  * When a sink does not have a pending buffer to play, it returns
3401    ///  [`StateChangeReturn::Async`][crate::StateChangeReturn::Async] from this state change and completes the state
3402    ///  change when it receives a new buffer or an [`EventType::Eos`][crate::EventType::Eos].
3403    ///  * Any queued `GST_MESSAGE_EOS` items are removed since they will be reposted
3404    ///  when going back to the PLAYING state. The EOS messages are queued in
3405    ///  [`Bin`][crate::Bin] containers.
3406    ///  * Live sources stop generating data and return [`StateChangeReturn::NoPreroll`][crate::StateChangeReturn::NoPreroll].
3407    #[doc(alias = "GST_STATE_CHANGE_PLAYING_TO_PAUSED")]
3408    PlayingToPaused = ffi::GST_STATE_CHANGE_PLAYING_TO_PAUSED,
3409    /// state change from PAUSED to READY.
3410    ///  * Sinks unblock any waits in the preroll.
3411    ///  * Elements unblock any waits on devices
3412    ///  * Chain or get_range functions return [`FlowReturn::Flushing`][crate::FlowReturn::Flushing].
3413    ///  * The element pads are deactivated so that streaming becomes impossible and
3414    ///  all streaming threads are stopped.
3415    ///  * The sink forgets all negotiated formats
3416    ///  * Elements remove all sometimes pads
3417    #[doc(alias = "GST_STATE_CHANGE_PAUSED_TO_READY")]
3418    PausedToReady = ffi::GST_STATE_CHANGE_PAUSED_TO_READY,
3419    /// state change from READY to NULL.
3420    ///  * Elements close devices
3421    ///  * Elements reset any internal state.
3422    #[doc(alias = "GST_STATE_CHANGE_READY_TO_NULL")]
3423    ReadyToNull = ffi::GST_STATE_CHANGE_READY_TO_NULL,
3424    /// state change from NULL to NULL. (Since: 1.14)
3425    #[doc(alias = "GST_STATE_CHANGE_NULL_TO_NULL")]
3426    NullToNull = ffi::GST_STATE_CHANGE_NULL_TO_NULL,
3427    /// state change from READY to READY,
3428    /// This might happen when going to PAUSED asynchronously failed, in that case
3429    /// elements should make sure they are in a proper, coherent READY state. (Since: 1.14)
3430    #[doc(alias = "GST_STATE_CHANGE_READY_TO_READY")]
3431    ReadyToReady = ffi::GST_STATE_CHANGE_READY_TO_READY,
3432    /// state change from PAUSED to PAUSED.
3433    /// This might happen when elements were in PLAYING state and 'lost state',
3434    /// they should make sure to go back to real 'PAUSED' state (prerolling for example). (Since: 1.14)
3435    #[doc(alias = "GST_STATE_CHANGE_PAUSED_TO_PAUSED")]
3436    PausedToPaused = ffi::GST_STATE_CHANGE_PAUSED_TO_PAUSED,
3437    /// state change from PLAYING to PLAYING. (Since: 1.14)
3438    #[doc(alias = "GST_STATE_CHANGE_PLAYING_TO_PLAYING")]
3439    PlayingToPlaying = ffi::GST_STATE_CHANGE_PLAYING_TO_PLAYING,
3440}
3441
3442impl StateChange {
3443    pub fn name<'a>(self) -> &'a GStr {
3444        unsafe {
3445            GStr::from_ptr(
3446                ffi::gst_state_change_get_name(self.into_glib())
3447                    .as_ref()
3448                    .expect("gst_state_change_get_name returned NULL"),
3449            )
3450        }
3451    }
3452}
3453
3454impl std::fmt::Display for StateChange {
3455    #[inline]
3456    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
3457        f.write_str(&self.name())
3458    }
3459}
3460
3461#[doc(hidden)]
3462impl IntoGlib for StateChange {
3463    type GlibType = ffi::GstStateChange;
3464
3465    #[inline]
3466    fn into_glib(self) -> ffi::GstStateChange {
3467        self as ffi::GstStateChange
3468    }
3469}
3470
3471#[doc(hidden)]
3472impl FromGlib<ffi::GstStateChange> for StateChange {
3473    #[inline]
3474    unsafe fn from_glib(value: ffi::GstStateChange) -> Self {
3475        skip_assert_initialized!();
3476
3477        debug_assert!(
3478            [
3479                ffi::GST_STATE_CHANGE_NULL_TO_READY,
3480                ffi::GST_STATE_CHANGE_READY_TO_PAUSED,
3481                ffi::GST_STATE_CHANGE_PAUSED_TO_PLAYING,
3482                ffi::GST_STATE_CHANGE_PLAYING_TO_PAUSED,
3483                ffi::GST_STATE_CHANGE_PAUSED_TO_READY,
3484                ffi::GST_STATE_CHANGE_READY_TO_NULL,
3485                ffi::GST_STATE_CHANGE_NULL_TO_NULL,
3486                ffi::GST_STATE_CHANGE_READY_TO_READY,
3487                ffi::GST_STATE_CHANGE_PAUSED_TO_PAUSED,
3488                ffi::GST_STATE_CHANGE_PLAYING_TO_PLAYING
3489            ]
3490            .contains(&value)
3491        );
3492        unsafe { std::mem::transmute(value) }
3493    }
3494}
3495
3496impl StaticType for StateChange {
3497    #[inline]
3498    #[doc(alias = "gst_state_change_get_type")]
3499    fn static_type() -> glib::Type {
3500        unsafe { from_glib(ffi::gst_state_change_get_type()) }
3501    }
3502}
3503
3504impl glib::HasParamSpec for StateChange {
3505    type ParamSpec = glib::ParamSpecEnum;
3506    type SetValue = Self;
3507    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3508
3509    fn param_spec_builder() -> Self::BuilderFn {
3510        Self::ParamSpec::builder_with_default
3511    }
3512}
3513
3514impl glib::value::ValueType for StateChange {
3515    type Type = Self;
3516}
3517
3518unsafe impl<'a> glib::value::FromValue<'a> for StateChange {
3519    type Checker = glib::value::GenericValueTypeChecker<Self>;
3520
3521    #[inline]
3522    unsafe fn from_value(value: &'a glib::Value) -> Self {
3523        skip_assert_initialized!();
3524        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3525    }
3526}
3527
3528impl ToValue for StateChange {
3529    #[inline]
3530    fn to_value(&self) -> glib::Value {
3531        let mut value = glib::Value::for_value_type::<Self>();
3532        unsafe {
3533            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3534        }
3535        value
3536    }
3537
3538    #[inline]
3539    fn value_type(&self) -> glib::Type {
3540        Self::static_type()
3541    }
3542}
3543
3544impl From<StateChange> for glib::Value {
3545    #[inline]
3546    fn from(v: StateChange) -> Self {
3547        skip_assert_initialized!();
3548        ToValue::to_value(&v)
3549    }
3550}
3551
3552/// The possible return values from a state change function such as
3553/// [`ElementExt::set_state()`][crate::prelude::ElementExt::set_state()]. Only [`Failure`][Self::Failure] is a real failure.
3554#[must_use]
3555#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3556#[repr(i32)]
3557#[doc(alias = "GstStateChangeReturn")]
3558pub enum StateChangeReturn {
3559    /// the state change failed
3560    #[doc(alias = "GST_STATE_CHANGE_FAILURE")]
3561    Failure = ffi::GST_STATE_CHANGE_FAILURE,
3562    /// the state change succeeded
3563    #[doc(alias = "GST_STATE_CHANGE_SUCCESS")]
3564    Success = ffi::GST_STATE_CHANGE_SUCCESS,
3565    /// the state change will happen asynchronously
3566    #[doc(alias = "GST_STATE_CHANGE_ASYNC")]
3567    Async = ffi::GST_STATE_CHANGE_ASYNC,
3568    /// the state change succeeded but the element
3569    ///  cannot produce data in [`State::Paused`][crate::State::Paused].
3570    ///  This typically happens with live sources.
3571    #[doc(alias = "GST_STATE_CHANGE_NO_PREROLL")]
3572    NoPreroll = ffi::GST_STATE_CHANGE_NO_PREROLL,
3573}
3574
3575#[doc(hidden)]
3576impl IntoGlib for StateChangeReturn {
3577    type GlibType = ffi::GstStateChangeReturn;
3578
3579    #[inline]
3580    fn into_glib(self) -> ffi::GstStateChangeReturn {
3581        self as ffi::GstStateChangeReturn
3582    }
3583}
3584
3585#[doc(hidden)]
3586impl FromGlib<ffi::GstStateChangeReturn> for StateChangeReturn {
3587    #[inline]
3588    unsafe fn from_glib(value: ffi::GstStateChangeReturn) -> Self {
3589        skip_assert_initialized!();
3590
3591        debug_assert!(
3592            [
3593                ffi::GST_STATE_CHANGE_FAILURE,
3594                ffi::GST_STATE_CHANGE_SUCCESS,
3595                ffi::GST_STATE_CHANGE_ASYNC,
3596                ffi::GST_STATE_CHANGE_NO_PREROLL
3597            ]
3598            .contains(&value)
3599        );
3600        unsafe { std::mem::transmute(value) }
3601    }
3602}
3603
3604impl StaticType for StateChangeReturn {
3605    #[inline]
3606    #[doc(alias = "gst_state_change_return_get_type")]
3607    fn static_type() -> glib::Type {
3608        unsafe { from_glib(ffi::gst_state_change_return_get_type()) }
3609    }
3610}
3611
3612impl glib::HasParamSpec for StateChangeReturn {
3613    type ParamSpec = glib::ParamSpecEnum;
3614    type SetValue = Self;
3615    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3616
3617    fn param_spec_builder() -> Self::BuilderFn {
3618        Self::ParamSpec::builder_with_default
3619    }
3620}
3621
3622impl glib::value::ValueType for StateChangeReturn {
3623    type Type = Self;
3624}
3625
3626unsafe impl<'a> glib::value::FromValue<'a> for StateChangeReturn {
3627    type Checker = glib::value::GenericValueTypeChecker<Self>;
3628
3629    #[inline]
3630    unsafe fn from_value(value: &'a glib::Value) -> Self {
3631        skip_assert_initialized!();
3632        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3633    }
3634}
3635
3636impl ToValue for StateChangeReturn {
3637    #[inline]
3638    fn to_value(&self) -> glib::Value {
3639        let mut value = glib::Value::for_value_type::<Self>();
3640        unsafe {
3641            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3642        }
3643        value
3644    }
3645
3646    #[inline]
3647    fn value_type(&self) -> glib::Type {
3648        Self::static_type()
3649    }
3650}
3651
3652impl From<StateChangeReturn> for glib::Value {
3653    #[inline]
3654    fn from(v: StateChangeReturn) -> Self {
3655        skip_assert_initialized!();
3656        ToValue::to_value(&v)
3657    }
3658}
3659
3660/// Stream errors are for anything related to the stream being processed:
3661/// format errors, media type errors, ...
3662/// They're typically used by decoders, demuxers, converters, ...
3663#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3664#[non_exhaustive]
3665#[doc(alias = "GstStreamError")]
3666pub enum StreamError {
3667    /// a general error which doesn't fit in any other
3668    /// category. Make sure you add a custom message to the error call.
3669    #[doc(alias = "GST_STREAM_ERROR_FAILED")]
3670    Failed,
3671    /// do not use this except as a placeholder for
3672    /// deciding where to go while developing code.
3673    #[doc(alias = "GST_STREAM_ERROR_TOO_LAZY")]
3674    TooLazy,
3675    /// use this when you do not want to implement
3676    /// this functionality yet.
3677    #[doc(alias = "GST_STREAM_ERROR_NOT_IMPLEMENTED")]
3678    NotImplemented,
3679    /// used when the element doesn't know the
3680    /// stream's type.
3681    #[doc(alias = "GST_STREAM_ERROR_TYPE_NOT_FOUND")]
3682    TypeNotFound,
3683    /// used when the element doesn't handle this type
3684    /// of stream.
3685    #[doc(alias = "GST_STREAM_ERROR_WRONG_TYPE")]
3686    WrongType,
3687    /// used when there's no codec to handle the
3688    /// stream's type.
3689    #[doc(alias = "GST_STREAM_ERROR_CODEC_NOT_FOUND")]
3690    CodecNotFound,
3691    /// used when decoding fails.
3692    #[doc(alias = "GST_STREAM_ERROR_DECODE")]
3693    Decode,
3694    /// used when encoding fails.
3695    #[doc(alias = "GST_STREAM_ERROR_ENCODE")]
3696    Encode,
3697    /// used when demuxing fails.
3698    #[doc(alias = "GST_STREAM_ERROR_DEMUX")]
3699    Demux,
3700    /// used when muxing fails.
3701    #[doc(alias = "GST_STREAM_ERROR_MUX")]
3702    Mux,
3703    /// used when the stream is of the wrong format
3704    /// (for example, wrong caps).
3705    #[doc(alias = "GST_STREAM_ERROR_FORMAT")]
3706    Format,
3707    /// used when the stream is encrypted and can't be
3708    /// decrypted because this is not supported by the element.
3709    #[doc(alias = "GST_STREAM_ERROR_DECRYPT")]
3710    Decrypt,
3711    /// used when the stream is encrypted and
3712    /// can't be decrypted because no suitable key is available.
3713    #[doc(alias = "GST_STREAM_ERROR_DECRYPT_NOKEY")]
3714    DecryptNokey,
3715    #[doc(hidden)]
3716    __Unknown(i32),
3717}
3718
3719#[doc(hidden)]
3720impl IntoGlib for StreamError {
3721    type GlibType = ffi::GstStreamError;
3722
3723    fn into_glib(self) -> ffi::GstStreamError {
3724        match self {
3725            Self::Failed => ffi::GST_STREAM_ERROR_FAILED,
3726            Self::TooLazy => ffi::GST_STREAM_ERROR_TOO_LAZY,
3727            Self::NotImplemented => ffi::GST_STREAM_ERROR_NOT_IMPLEMENTED,
3728            Self::TypeNotFound => ffi::GST_STREAM_ERROR_TYPE_NOT_FOUND,
3729            Self::WrongType => ffi::GST_STREAM_ERROR_WRONG_TYPE,
3730            Self::CodecNotFound => ffi::GST_STREAM_ERROR_CODEC_NOT_FOUND,
3731            Self::Decode => ffi::GST_STREAM_ERROR_DECODE,
3732            Self::Encode => ffi::GST_STREAM_ERROR_ENCODE,
3733            Self::Demux => ffi::GST_STREAM_ERROR_DEMUX,
3734            Self::Mux => ffi::GST_STREAM_ERROR_MUX,
3735            Self::Format => ffi::GST_STREAM_ERROR_FORMAT,
3736            Self::Decrypt => ffi::GST_STREAM_ERROR_DECRYPT,
3737            Self::DecryptNokey => ffi::GST_STREAM_ERROR_DECRYPT_NOKEY,
3738            Self::__Unknown(value) => value,
3739        }
3740    }
3741}
3742
3743#[doc(hidden)]
3744impl FromGlib<ffi::GstStreamError> for StreamError {
3745    unsafe fn from_glib(value: ffi::GstStreamError) -> Self {
3746        skip_assert_initialized!();
3747
3748        match value {
3749            ffi::GST_STREAM_ERROR_FAILED => Self::Failed,
3750            ffi::GST_STREAM_ERROR_TOO_LAZY => Self::TooLazy,
3751            ffi::GST_STREAM_ERROR_NOT_IMPLEMENTED => Self::NotImplemented,
3752            ffi::GST_STREAM_ERROR_TYPE_NOT_FOUND => Self::TypeNotFound,
3753            ffi::GST_STREAM_ERROR_WRONG_TYPE => Self::WrongType,
3754            ffi::GST_STREAM_ERROR_CODEC_NOT_FOUND => Self::CodecNotFound,
3755            ffi::GST_STREAM_ERROR_DECODE => Self::Decode,
3756            ffi::GST_STREAM_ERROR_ENCODE => Self::Encode,
3757            ffi::GST_STREAM_ERROR_DEMUX => Self::Demux,
3758            ffi::GST_STREAM_ERROR_MUX => Self::Mux,
3759            ffi::GST_STREAM_ERROR_FORMAT => Self::Format,
3760            ffi::GST_STREAM_ERROR_DECRYPT => Self::Decrypt,
3761            ffi::GST_STREAM_ERROR_DECRYPT_NOKEY => Self::DecryptNokey,
3762            value => Self::__Unknown(value),
3763        }
3764    }
3765}
3766
3767impl glib::error::ErrorDomain for StreamError {
3768    #[inline]
3769    fn domain() -> glib::Quark {
3770        skip_assert_initialized!();
3771
3772        unsafe { from_glib(ffi::gst_stream_error_quark()) }
3773    }
3774
3775    #[inline]
3776    fn code(self) -> i32 {
3777        self.into_glib()
3778    }
3779
3780    #[inline]
3781    #[allow(clippy::match_single_binding)]
3782    fn from(code: i32) -> Option<Self> {
3783        skip_assert_initialized!();
3784        match unsafe { from_glib(code) } {
3785            Self::__Unknown(_) => Some(Self::Failed),
3786            value => Some(value),
3787        }
3788    }
3789}
3790
3791impl StaticType for StreamError {
3792    #[inline]
3793    #[doc(alias = "gst_stream_error_get_type")]
3794    fn static_type() -> glib::Type {
3795        unsafe { from_glib(ffi::gst_stream_error_get_type()) }
3796    }
3797}
3798
3799impl glib::HasParamSpec for StreamError {
3800    type ParamSpec = glib::ParamSpecEnum;
3801    type SetValue = Self;
3802    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3803
3804    fn param_spec_builder() -> Self::BuilderFn {
3805        Self::ParamSpec::builder_with_default
3806    }
3807}
3808
3809impl glib::value::ValueType for StreamError {
3810    type Type = Self;
3811}
3812
3813unsafe impl<'a> glib::value::FromValue<'a> for StreamError {
3814    type Checker = glib::value::GenericValueTypeChecker<Self>;
3815
3816    #[inline]
3817    unsafe fn from_value(value: &'a glib::Value) -> Self {
3818        skip_assert_initialized!();
3819        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3820    }
3821}
3822
3823impl ToValue for StreamError {
3824    #[inline]
3825    fn to_value(&self) -> glib::Value {
3826        let mut value = glib::Value::for_value_type::<Self>();
3827        unsafe {
3828            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3829        }
3830        value
3831    }
3832
3833    #[inline]
3834    fn value_type(&self) -> glib::Type {
3835        Self::static_type()
3836    }
3837}
3838
3839impl From<StreamError> for glib::Value {
3840    #[inline]
3841    fn from(v: StreamError) -> Self {
3842        skip_assert_initialized!();
3843        ToValue::to_value(&v)
3844    }
3845}
3846
3847/// The type of a `GST_MESSAGE_STREAM_STATUS`. The stream status messages inform the
3848/// application of new streaming threads and their status.
3849#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3850#[non_exhaustive]
3851#[doc(alias = "GstStreamStatusType")]
3852pub enum StreamStatusType {
3853    /// A new thread need to be created.
3854    #[doc(alias = "GST_STREAM_STATUS_TYPE_CREATE")]
3855    Create,
3856    /// a thread entered its loop function
3857    #[doc(alias = "GST_STREAM_STATUS_TYPE_ENTER")]
3858    Enter,
3859    /// a thread left its loop function
3860    #[doc(alias = "GST_STREAM_STATUS_TYPE_LEAVE")]
3861    Leave,
3862    /// a thread is destroyed
3863    #[doc(alias = "GST_STREAM_STATUS_TYPE_DESTROY")]
3864    Destroy,
3865    /// a thread is started
3866    #[doc(alias = "GST_STREAM_STATUS_TYPE_START")]
3867    Start,
3868    /// a thread is paused
3869    #[doc(alias = "GST_STREAM_STATUS_TYPE_PAUSE")]
3870    Pause,
3871    /// a thread is stopped
3872    #[doc(alias = "GST_STREAM_STATUS_TYPE_STOP")]
3873    Stop,
3874    #[doc(hidden)]
3875    __Unknown(i32),
3876}
3877
3878#[doc(hidden)]
3879impl IntoGlib for StreamStatusType {
3880    type GlibType = ffi::GstStreamStatusType;
3881
3882    #[inline]
3883    fn into_glib(self) -> ffi::GstStreamStatusType {
3884        match self {
3885            Self::Create => ffi::GST_STREAM_STATUS_TYPE_CREATE,
3886            Self::Enter => ffi::GST_STREAM_STATUS_TYPE_ENTER,
3887            Self::Leave => ffi::GST_STREAM_STATUS_TYPE_LEAVE,
3888            Self::Destroy => ffi::GST_STREAM_STATUS_TYPE_DESTROY,
3889            Self::Start => ffi::GST_STREAM_STATUS_TYPE_START,
3890            Self::Pause => ffi::GST_STREAM_STATUS_TYPE_PAUSE,
3891            Self::Stop => ffi::GST_STREAM_STATUS_TYPE_STOP,
3892            Self::__Unknown(value) => value,
3893        }
3894    }
3895}
3896
3897#[doc(hidden)]
3898impl FromGlib<ffi::GstStreamStatusType> for StreamStatusType {
3899    #[inline]
3900    unsafe fn from_glib(value: ffi::GstStreamStatusType) -> Self {
3901        skip_assert_initialized!();
3902
3903        match value {
3904            ffi::GST_STREAM_STATUS_TYPE_CREATE => Self::Create,
3905            ffi::GST_STREAM_STATUS_TYPE_ENTER => Self::Enter,
3906            ffi::GST_STREAM_STATUS_TYPE_LEAVE => Self::Leave,
3907            ffi::GST_STREAM_STATUS_TYPE_DESTROY => Self::Destroy,
3908            ffi::GST_STREAM_STATUS_TYPE_START => Self::Start,
3909            ffi::GST_STREAM_STATUS_TYPE_PAUSE => Self::Pause,
3910            ffi::GST_STREAM_STATUS_TYPE_STOP => Self::Stop,
3911            value => Self::__Unknown(value),
3912        }
3913    }
3914}
3915
3916impl StaticType for StreamStatusType {
3917    #[inline]
3918    #[doc(alias = "gst_stream_status_type_get_type")]
3919    fn static_type() -> glib::Type {
3920        unsafe { from_glib(ffi::gst_stream_status_type_get_type()) }
3921    }
3922}
3923
3924impl glib::HasParamSpec for StreamStatusType {
3925    type ParamSpec = glib::ParamSpecEnum;
3926    type SetValue = Self;
3927    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
3928
3929    fn param_spec_builder() -> Self::BuilderFn {
3930        Self::ParamSpec::builder_with_default
3931    }
3932}
3933
3934impl glib::value::ValueType for StreamStatusType {
3935    type Type = Self;
3936}
3937
3938unsafe impl<'a> glib::value::FromValue<'a> for StreamStatusType {
3939    type Checker = glib::value::GenericValueTypeChecker<Self>;
3940
3941    #[inline]
3942    unsafe fn from_value(value: &'a glib::Value) -> Self {
3943        skip_assert_initialized!();
3944        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
3945    }
3946}
3947
3948impl ToValue for StreamStatusType {
3949    #[inline]
3950    fn to_value(&self) -> glib::Value {
3951        let mut value = glib::Value::for_value_type::<Self>();
3952        unsafe {
3953            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
3954        }
3955        value
3956    }
3957
3958    #[inline]
3959    fn value_type(&self) -> glib::Type {
3960        Self::static_type()
3961    }
3962}
3963
3964impl From<StreamStatusType> for glib::Value {
3965    #[inline]
3966    fn from(v: StreamStatusType) -> Self {
3967        skip_assert_initialized!();
3968        ToValue::to_value(&v)
3969    }
3970}
3971
3972/// The type of a `GST_MESSAGE_STRUCTURE_CHANGE`.
3973#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
3974#[non_exhaustive]
3975#[doc(alias = "GstStructureChangeType")]
3976pub enum StructureChangeType {
3977    /// Pad linking is starting or done.
3978    #[doc(alias = "GST_STRUCTURE_CHANGE_TYPE_PAD_LINK")]
3979    Link,
3980    /// Pad unlinking is starting or done.
3981    #[doc(alias = "GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK")]
3982    Unlink,
3983    #[doc(hidden)]
3984    __Unknown(i32),
3985}
3986
3987#[doc(hidden)]
3988impl IntoGlib for StructureChangeType {
3989    type GlibType = ffi::GstStructureChangeType;
3990
3991    #[inline]
3992    fn into_glib(self) -> ffi::GstStructureChangeType {
3993        match self {
3994            Self::Link => ffi::GST_STRUCTURE_CHANGE_TYPE_PAD_LINK,
3995            Self::Unlink => ffi::GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK,
3996            Self::__Unknown(value) => value,
3997        }
3998    }
3999}
4000
4001#[doc(hidden)]
4002impl FromGlib<ffi::GstStructureChangeType> for StructureChangeType {
4003    #[inline]
4004    unsafe fn from_glib(value: ffi::GstStructureChangeType) -> Self {
4005        skip_assert_initialized!();
4006
4007        match value {
4008            ffi::GST_STRUCTURE_CHANGE_TYPE_PAD_LINK => Self::Link,
4009            ffi::GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK => Self::Unlink,
4010            value => Self::__Unknown(value),
4011        }
4012    }
4013}
4014
4015impl StaticType for StructureChangeType {
4016    #[inline]
4017    #[doc(alias = "gst_structure_change_type_get_type")]
4018    fn static_type() -> glib::Type {
4019        unsafe { from_glib(ffi::gst_structure_change_type_get_type()) }
4020    }
4021}
4022
4023impl glib::HasParamSpec for StructureChangeType {
4024    type ParamSpec = glib::ParamSpecEnum;
4025    type SetValue = Self;
4026    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4027
4028    fn param_spec_builder() -> Self::BuilderFn {
4029        Self::ParamSpec::builder_with_default
4030    }
4031}
4032
4033impl glib::value::ValueType for StructureChangeType {
4034    type Type = Self;
4035}
4036
4037unsafe impl<'a> glib::value::FromValue<'a> for StructureChangeType {
4038    type Checker = glib::value::GenericValueTypeChecker<Self>;
4039
4040    #[inline]
4041    unsafe fn from_value(value: &'a glib::Value) -> Self {
4042        skip_assert_initialized!();
4043        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4044    }
4045}
4046
4047impl ToValue for StructureChangeType {
4048    #[inline]
4049    fn to_value(&self) -> glib::Value {
4050        let mut value = glib::Value::for_value_type::<Self>();
4051        unsafe {
4052            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4053        }
4054        value
4055    }
4056
4057    #[inline]
4058    fn value_type(&self) -> glib::Type {
4059        Self::static_type()
4060    }
4061}
4062
4063impl From<StructureChangeType> for glib::Value {
4064    #[inline]
4065    fn from(v: StructureChangeType) -> Self {
4066        skip_assert_initialized!();
4067        ToValue::to_value(&v)
4068    }
4069}
4070
4071/// Extra tag flags used when registering tags.
4072#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
4073#[non_exhaustive]
4074#[doc(alias = "GstTagFlag")]
4075pub enum TagFlag {
4076    /// undefined flag
4077    #[doc(alias = "GST_TAG_FLAG_UNDEFINED")]
4078    Undefined,
4079    /// tag is meta data
4080    #[doc(alias = "GST_TAG_FLAG_META")]
4081    Meta,
4082    /// tag is encoded
4083    #[doc(alias = "GST_TAG_FLAG_ENCODED")]
4084    Encoded,
4085    /// tag is decoded
4086    #[doc(alias = "GST_TAG_FLAG_DECODED")]
4087    Decoded,
4088    #[doc(hidden)]
4089    __Unknown(i32),
4090}
4091
4092#[doc(hidden)]
4093impl IntoGlib for TagFlag {
4094    type GlibType = ffi::GstTagFlag;
4095
4096    #[inline]
4097    fn into_glib(self) -> ffi::GstTagFlag {
4098        match self {
4099            Self::Undefined => ffi::GST_TAG_FLAG_UNDEFINED,
4100            Self::Meta => ffi::GST_TAG_FLAG_META,
4101            Self::Encoded => ffi::GST_TAG_FLAG_ENCODED,
4102            Self::Decoded => ffi::GST_TAG_FLAG_DECODED,
4103            Self::__Unknown(value) => value,
4104        }
4105    }
4106}
4107
4108#[doc(hidden)]
4109impl FromGlib<ffi::GstTagFlag> for TagFlag {
4110    #[inline]
4111    unsafe fn from_glib(value: ffi::GstTagFlag) -> Self {
4112        skip_assert_initialized!();
4113
4114        match value {
4115            ffi::GST_TAG_FLAG_UNDEFINED => Self::Undefined,
4116            ffi::GST_TAG_FLAG_META => Self::Meta,
4117            ffi::GST_TAG_FLAG_ENCODED => Self::Encoded,
4118            ffi::GST_TAG_FLAG_DECODED => Self::Decoded,
4119            value => Self::__Unknown(value),
4120        }
4121    }
4122}
4123
4124impl StaticType for TagFlag {
4125    #[inline]
4126    #[doc(alias = "gst_tag_flag_get_type")]
4127    fn static_type() -> glib::Type {
4128        unsafe { from_glib(ffi::gst_tag_flag_get_type()) }
4129    }
4130}
4131
4132impl glib::HasParamSpec for TagFlag {
4133    type ParamSpec = glib::ParamSpecEnum;
4134    type SetValue = Self;
4135    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4136
4137    fn param_spec_builder() -> Self::BuilderFn {
4138        Self::ParamSpec::builder_with_default
4139    }
4140}
4141
4142impl glib::value::ValueType for TagFlag {
4143    type Type = Self;
4144}
4145
4146unsafe impl<'a> glib::value::FromValue<'a> for TagFlag {
4147    type Checker = glib::value::GenericValueTypeChecker<Self>;
4148
4149    #[inline]
4150    unsafe fn from_value(value: &'a glib::Value) -> Self {
4151        skip_assert_initialized!();
4152        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4153    }
4154}
4155
4156impl ToValue for TagFlag {
4157    #[inline]
4158    fn to_value(&self) -> glib::Value {
4159        let mut value = glib::Value::for_value_type::<Self>();
4160        unsafe {
4161            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4162        }
4163        value
4164    }
4165
4166    #[inline]
4167    fn value_type(&self) -> glib::Type {
4168        Self::static_type()
4169    }
4170}
4171
4172impl From<TagFlag> for glib::Value {
4173    #[inline]
4174    fn from(v: TagFlag) -> Self {
4175        skip_assert_initialized!();
4176        ToValue::to_value(&v)
4177    }
4178}
4179
4180///  |
4181#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
4182#[non_exhaustive]
4183#[doc(alias = "GstTagMergeMode")]
4184pub enum TagMergeMode {
4185    /// undefined merge mode
4186    #[doc(alias = "GST_TAG_MERGE_UNDEFINED")]
4187    Undefined,
4188    /// replace all tags (clear list and append)
4189    #[doc(alias = "GST_TAG_MERGE_REPLACE_ALL")]
4190    ReplaceAll,
4191    /// replace tags
4192    #[doc(alias = "GST_TAG_MERGE_REPLACE")]
4193    Replace,
4194    /// append tags
4195    #[doc(alias = "GST_TAG_MERGE_APPEND")]
4196    Append,
4197    /// prepend tags
4198    #[doc(alias = "GST_TAG_MERGE_PREPEND")]
4199    Prepend,
4200    /// keep existing tags
4201    #[doc(alias = "GST_TAG_MERGE_KEEP")]
4202    Keep,
4203    /// keep all existing tags
4204    #[doc(alias = "GST_TAG_MERGE_KEEP_ALL")]
4205    KeepAll,
4206    #[doc(hidden)]
4207    __Unknown(i32),
4208}
4209
4210#[doc(hidden)]
4211impl IntoGlib for TagMergeMode {
4212    type GlibType = ffi::GstTagMergeMode;
4213
4214    #[inline]
4215    fn into_glib(self) -> ffi::GstTagMergeMode {
4216        match self {
4217            Self::Undefined => ffi::GST_TAG_MERGE_UNDEFINED,
4218            Self::ReplaceAll => ffi::GST_TAG_MERGE_REPLACE_ALL,
4219            Self::Replace => ffi::GST_TAG_MERGE_REPLACE,
4220            Self::Append => ffi::GST_TAG_MERGE_APPEND,
4221            Self::Prepend => ffi::GST_TAG_MERGE_PREPEND,
4222            Self::Keep => ffi::GST_TAG_MERGE_KEEP,
4223            Self::KeepAll => ffi::GST_TAG_MERGE_KEEP_ALL,
4224            Self::__Unknown(value) => value,
4225        }
4226    }
4227}
4228
4229#[doc(hidden)]
4230impl FromGlib<ffi::GstTagMergeMode> for TagMergeMode {
4231    #[inline]
4232    unsafe fn from_glib(value: ffi::GstTagMergeMode) -> Self {
4233        skip_assert_initialized!();
4234
4235        match value {
4236            ffi::GST_TAG_MERGE_UNDEFINED => Self::Undefined,
4237            ffi::GST_TAG_MERGE_REPLACE_ALL => Self::ReplaceAll,
4238            ffi::GST_TAG_MERGE_REPLACE => Self::Replace,
4239            ffi::GST_TAG_MERGE_APPEND => Self::Append,
4240            ffi::GST_TAG_MERGE_PREPEND => Self::Prepend,
4241            ffi::GST_TAG_MERGE_KEEP => Self::Keep,
4242            ffi::GST_TAG_MERGE_KEEP_ALL => Self::KeepAll,
4243            value => Self::__Unknown(value),
4244        }
4245    }
4246}
4247
4248impl StaticType for TagMergeMode {
4249    #[inline]
4250    #[doc(alias = "gst_tag_merge_mode_get_type")]
4251    fn static_type() -> glib::Type {
4252        unsafe { from_glib(ffi::gst_tag_merge_mode_get_type()) }
4253    }
4254}
4255
4256impl glib::HasParamSpec for TagMergeMode {
4257    type ParamSpec = glib::ParamSpecEnum;
4258    type SetValue = Self;
4259    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4260
4261    fn param_spec_builder() -> Self::BuilderFn {
4262        Self::ParamSpec::builder_with_default
4263    }
4264}
4265
4266impl glib::value::ValueType for TagMergeMode {
4267    type Type = Self;
4268}
4269
4270unsafe impl<'a> glib::value::FromValue<'a> for TagMergeMode {
4271    type Checker = glib::value::GenericValueTypeChecker<Self>;
4272
4273    #[inline]
4274    unsafe fn from_value(value: &'a glib::Value) -> Self {
4275        skip_assert_initialized!();
4276        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4277    }
4278}
4279
4280impl ToValue for TagMergeMode {
4281    #[inline]
4282    fn to_value(&self) -> glib::Value {
4283        let mut value = glib::Value::for_value_type::<Self>();
4284        unsafe {
4285            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4286        }
4287        value
4288    }
4289
4290    #[inline]
4291    fn value_type(&self) -> glib::Type {
4292        Self::static_type()
4293    }
4294}
4295
4296impl From<TagMergeMode> for glib::Value {
4297    #[inline]
4298    fn from(v: TagMergeMode) -> Self {
4299        skip_assert_initialized!();
4300        ToValue::to_value(&v)
4301    }
4302}
4303
4304/// GstTagScope specifies if a taglist applies to the complete
4305/// medium or only to one single stream.
4306#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4307#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
4308#[non_exhaustive]
4309#[doc(alias = "GstTagScope")]
4310pub enum TagScope {
4311    /// tags specific to this single stream
4312    #[doc(alias = "GST_TAG_SCOPE_STREAM")]
4313    Stream,
4314    /// global tags for the complete medium
4315    #[doc(alias = "GST_TAG_SCOPE_GLOBAL")]
4316    Global,
4317    #[doc(hidden)]
4318    __Unknown(i32),
4319}
4320
4321#[doc(hidden)]
4322impl IntoGlib for TagScope {
4323    type GlibType = ffi::GstTagScope;
4324
4325    #[inline]
4326    fn into_glib(self) -> ffi::GstTagScope {
4327        match self {
4328            Self::Stream => ffi::GST_TAG_SCOPE_STREAM,
4329            Self::Global => ffi::GST_TAG_SCOPE_GLOBAL,
4330            Self::__Unknown(value) => value,
4331        }
4332    }
4333}
4334
4335#[doc(hidden)]
4336impl FromGlib<ffi::GstTagScope> for TagScope {
4337    #[inline]
4338    unsafe fn from_glib(value: ffi::GstTagScope) -> Self {
4339        skip_assert_initialized!();
4340
4341        match value {
4342            ffi::GST_TAG_SCOPE_STREAM => Self::Stream,
4343            ffi::GST_TAG_SCOPE_GLOBAL => Self::Global,
4344            value => Self::__Unknown(value),
4345        }
4346    }
4347}
4348
4349impl StaticType for TagScope {
4350    #[inline]
4351    #[doc(alias = "gst_tag_scope_get_type")]
4352    fn static_type() -> glib::Type {
4353        unsafe { from_glib(ffi::gst_tag_scope_get_type()) }
4354    }
4355}
4356
4357impl glib::HasParamSpec for TagScope {
4358    type ParamSpec = glib::ParamSpecEnum;
4359    type SetValue = Self;
4360    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4361
4362    fn param_spec_builder() -> Self::BuilderFn {
4363        Self::ParamSpec::builder_with_default
4364    }
4365}
4366
4367impl glib::value::ValueType for TagScope {
4368    type Type = Self;
4369}
4370
4371unsafe impl<'a> glib::value::FromValue<'a> for TagScope {
4372    type Checker = glib::value::GenericValueTypeChecker<Self>;
4373
4374    #[inline]
4375    unsafe fn from_value(value: &'a glib::Value) -> Self {
4376        skip_assert_initialized!();
4377        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4378    }
4379}
4380
4381impl ToValue for TagScope {
4382    #[inline]
4383    fn to_value(&self) -> glib::Value {
4384        let mut value = glib::Value::for_value_type::<Self>();
4385        unsafe {
4386            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4387        }
4388        value
4389    }
4390
4391    #[inline]
4392    fn value_type(&self) -> glib::Type {
4393        Self::static_type()
4394    }
4395}
4396
4397impl From<TagScope> for glib::Value {
4398    #[inline]
4399    fn from(v: TagScope) -> Self {
4400        skip_assert_initialized!();
4401        ToValue::to_value(&v)
4402    }
4403}
4404
4405/// The different states a task can be in
4406#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
4407#[non_exhaustive]
4408#[doc(alias = "GstTaskState")]
4409pub enum TaskState {
4410    /// the task is started and running
4411    #[doc(alias = "GST_TASK_STARTED")]
4412    Started,
4413    /// the task is stopped
4414    #[doc(alias = "GST_TASK_STOPPED")]
4415    Stopped,
4416    /// the task is paused
4417    #[doc(alias = "GST_TASK_PAUSED")]
4418    Paused,
4419    #[doc(hidden)]
4420    __Unknown(i32),
4421}
4422
4423#[doc(hidden)]
4424impl IntoGlib for TaskState {
4425    type GlibType = ffi::GstTaskState;
4426
4427    #[inline]
4428    fn into_glib(self) -> ffi::GstTaskState {
4429        match self {
4430            Self::Started => ffi::GST_TASK_STARTED,
4431            Self::Stopped => ffi::GST_TASK_STOPPED,
4432            Self::Paused => ffi::GST_TASK_PAUSED,
4433            Self::__Unknown(value) => value,
4434        }
4435    }
4436}
4437
4438#[doc(hidden)]
4439impl FromGlib<ffi::GstTaskState> for TaskState {
4440    #[inline]
4441    unsafe fn from_glib(value: ffi::GstTaskState) -> Self {
4442        skip_assert_initialized!();
4443
4444        match value {
4445            ffi::GST_TASK_STARTED => Self::Started,
4446            ffi::GST_TASK_STOPPED => Self::Stopped,
4447            ffi::GST_TASK_PAUSED => Self::Paused,
4448            value => Self::__Unknown(value),
4449        }
4450    }
4451}
4452
4453impl StaticType for TaskState {
4454    #[inline]
4455    #[doc(alias = "gst_task_state_get_type")]
4456    fn static_type() -> glib::Type {
4457        unsafe { from_glib(ffi::gst_task_state_get_type()) }
4458    }
4459}
4460
4461impl glib::HasParamSpec for TaskState {
4462    type ParamSpec = glib::ParamSpecEnum;
4463    type SetValue = Self;
4464    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4465
4466    fn param_spec_builder() -> Self::BuilderFn {
4467        Self::ParamSpec::builder_with_default
4468    }
4469}
4470
4471impl glib::value::ValueType for TaskState {
4472    type Type = Self;
4473}
4474
4475unsafe impl<'a> glib::value::FromValue<'a> for TaskState {
4476    type Checker = glib::value::GenericValueTypeChecker<Self>;
4477
4478    #[inline]
4479    unsafe fn from_value(value: &'a glib::Value) -> Self {
4480        skip_assert_initialized!();
4481        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4482    }
4483}
4484
4485impl ToValue for TaskState {
4486    #[inline]
4487    fn to_value(&self) -> glib::Value {
4488        let mut value = glib::Value::for_value_type::<Self>();
4489        unsafe {
4490            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4491        }
4492        value
4493    }
4494
4495    #[inline]
4496    fn value_type(&self) -> glib::Type {
4497        Self::static_type()
4498    }
4499}
4500
4501impl From<TaskState> for glib::Value {
4502    #[inline]
4503    fn from(v: TaskState) -> Self {
4504        skip_assert_initialized!();
4505        ToValue::to_value(&v)
4506    }
4507}
4508
4509/// The different types of TOC entries (see [`TocEntry`][crate::TocEntry]).
4510///
4511/// There are two types of TOC entries: alternatives or parts in a sequence.
4512#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4513#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
4514#[non_exhaustive]
4515#[doc(alias = "GstTocEntryType")]
4516pub enum TocEntryType {
4517    /// entry is an angle (i.e. an alternative)
4518    #[doc(alias = "GST_TOC_ENTRY_TYPE_ANGLE")]
4519    Angle,
4520    /// entry is a version (i.e. alternative)
4521    #[doc(alias = "GST_TOC_ENTRY_TYPE_VERSION")]
4522    Version,
4523    /// entry is an edition (i.e. alternative)
4524    #[doc(alias = "GST_TOC_ENTRY_TYPE_EDITION")]
4525    Edition,
4526    /// invalid entry type value
4527    #[doc(alias = "GST_TOC_ENTRY_TYPE_INVALID")]
4528    Invalid,
4529    /// entry is a title (i.e. a part of a sequence)
4530    #[doc(alias = "GST_TOC_ENTRY_TYPE_TITLE")]
4531    Title,
4532    /// entry is a track (i.e. a part of a sequence)
4533    #[doc(alias = "GST_TOC_ENTRY_TYPE_TRACK")]
4534    Track,
4535    /// entry is a chapter (i.e. a part of a sequence)
4536    #[doc(alias = "GST_TOC_ENTRY_TYPE_CHAPTER")]
4537    Chapter,
4538    #[doc(hidden)]
4539    __Unknown(i32),
4540}
4541
4542impl TocEntryType {
4543    pub fn nick<'a>(self) -> &'a GStr {
4544        unsafe {
4545            GStr::from_ptr(
4546                ffi::gst_toc_entry_type_get_nick(self.into_glib())
4547                    .as_ref()
4548                    .expect("gst_toc_entry_type_get_nick returned NULL"),
4549            )
4550        }
4551    }
4552}
4553
4554#[doc(hidden)]
4555impl IntoGlib for TocEntryType {
4556    type GlibType = ffi::GstTocEntryType;
4557
4558    #[inline]
4559    fn into_glib(self) -> ffi::GstTocEntryType {
4560        match self {
4561            Self::Angle => ffi::GST_TOC_ENTRY_TYPE_ANGLE,
4562            Self::Version => ffi::GST_TOC_ENTRY_TYPE_VERSION,
4563            Self::Edition => ffi::GST_TOC_ENTRY_TYPE_EDITION,
4564            Self::Invalid => ffi::GST_TOC_ENTRY_TYPE_INVALID,
4565            Self::Title => ffi::GST_TOC_ENTRY_TYPE_TITLE,
4566            Self::Track => ffi::GST_TOC_ENTRY_TYPE_TRACK,
4567            Self::Chapter => ffi::GST_TOC_ENTRY_TYPE_CHAPTER,
4568            Self::__Unknown(value) => value,
4569        }
4570    }
4571}
4572
4573#[doc(hidden)]
4574impl FromGlib<ffi::GstTocEntryType> for TocEntryType {
4575    #[inline]
4576    unsafe fn from_glib(value: ffi::GstTocEntryType) -> Self {
4577        skip_assert_initialized!();
4578
4579        match value {
4580            ffi::GST_TOC_ENTRY_TYPE_ANGLE => Self::Angle,
4581            ffi::GST_TOC_ENTRY_TYPE_VERSION => Self::Version,
4582            ffi::GST_TOC_ENTRY_TYPE_EDITION => Self::Edition,
4583            ffi::GST_TOC_ENTRY_TYPE_INVALID => Self::Invalid,
4584            ffi::GST_TOC_ENTRY_TYPE_TITLE => Self::Title,
4585            ffi::GST_TOC_ENTRY_TYPE_TRACK => Self::Track,
4586            ffi::GST_TOC_ENTRY_TYPE_CHAPTER => Self::Chapter,
4587            value => Self::__Unknown(value),
4588        }
4589    }
4590}
4591
4592impl StaticType for TocEntryType {
4593    #[inline]
4594    #[doc(alias = "gst_toc_entry_type_get_type")]
4595    fn static_type() -> glib::Type {
4596        unsafe { from_glib(ffi::gst_toc_entry_type_get_type()) }
4597    }
4598}
4599
4600impl glib::HasParamSpec for TocEntryType {
4601    type ParamSpec = glib::ParamSpecEnum;
4602    type SetValue = Self;
4603    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4604
4605    fn param_spec_builder() -> Self::BuilderFn {
4606        Self::ParamSpec::builder_with_default
4607    }
4608}
4609
4610impl glib::value::ValueType for TocEntryType {
4611    type Type = Self;
4612}
4613
4614unsafe impl<'a> glib::value::FromValue<'a> for TocEntryType {
4615    type Checker = glib::value::GenericValueTypeChecker<Self>;
4616
4617    #[inline]
4618    unsafe fn from_value(value: &'a glib::Value) -> Self {
4619        skip_assert_initialized!();
4620        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4621    }
4622}
4623
4624impl ToValue for TocEntryType {
4625    #[inline]
4626    fn to_value(&self) -> glib::Value {
4627        let mut value = glib::Value::for_value_type::<Self>();
4628        unsafe {
4629            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4630        }
4631        value
4632    }
4633
4634    #[inline]
4635    fn value_type(&self) -> glib::Type {
4636        Self::static_type()
4637    }
4638}
4639
4640impl From<TocEntryType> for glib::Value {
4641    #[inline]
4642    fn from(v: TocEntryType) -> Self {
4643        skip_assert_initialized!();
4644        ToValue::to_value(&v)
4645    }
4646}
4647
4648/// How a [`TocEntry`][crate::TocEntry] should be repeated. By default, entries are played a
4649/// single time.
4650#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4651#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
4652#[non_exhaustive]
4653#[doc(alias = "GstTocLoopType")]
4654pub enum TocLoopType {
4655    /// single forward playback
4656    #[doc(alias = "GST_TOC_LOOP_NONE")]
4657    None,
4658    /// repeat forward
4659    #[doc(alias = "GST_TOC_LOOP_FORWARD")]
4660    Forward,
4661    /// repeat backward
4662    #[doc(alias = "GST_TOC_LOOP_REVERSE")]
4663    Reverse,
4664    /// repeat forward and backward
4665    #[doc(alias = "GST_TOC_LOOP_PING_PONG")]
4666    PingPong,
4667    #[doc(hidden)]
4668    __Unknown(i32),
4669}
4670
4671#[doc(hidden)]
4672impl IntoGlib for TocLoopType {
4673    type GlibType = ffi::GstTocLoopType;
4674
4675    #[inline]
4676    fn into_glib(self) -> ffi::GstTocLoopType {
4677        match self {
4678            Self::None => ffi::GST_TOC_LOOP_NONE,
4679            Self::Forward => ffi::GST_TOC_LOOP_FORWARD,
4680            Self::Reverse => ffi::GST_TOC_LOOP_REVERSE,
4681            Self::PingPong => ffi::GST_TOC_LOOP_PING_PONG,
4682            Self::__Unknown(value) => value,
4683        }
4684    }
4685}
4686
4687#[doc(hidden)]
4688impl FromGlib<ffi::GstTocLoopType> for TocLoopType {
4689    #[inline]
4690    unsafe fn from_glib(value: ffi::GstTocLoopType) -> Self {
4691        skip_assert_initialized!();
4692
4693        match value {
4694            ffi::GST_TOC_LOOP_NONE => Self::None,
4695            ffi::GST_TOC_LOOP_FORWARD => Self::Forward,
4696            ffi::GST_TOC_LOOP_REVERSE => Self::Reverse,
4697            ffi::GST_TOC_LOOP_PING_PONG => Self::PingPong,
4698            value => Self::__Unknown(value),
4699        }
4700    }
4701}
4702
4703impl StaticType for TocLoopType {
4704    #[inline]
4705    #[doc(alias = "gst_toc_loop_type_get_type")]
4706    fn static_type() -> glib::Type {
4707        unsafe { from_glib(ffi::gst_toc_loop_type_get_type()) }
4708    }
4709}
4710
4711impl glib::HasParamSpec for TocLoopType {
4712    type ParamSpec = glib::ParamSpecEnum;
4713    type SetValue = Self;
4714    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4715
4716    fn param_spec_builder() -> Self::BuilderFn {
4717        Self::ParamSpec::builder_with_default
4718    }
4719}
4720
4721impl glib::value::ValueType for TocLoopType {
4722    type Type = Self;
4723}
4724
4725unsafe impl<'a> glib::value::FromValue<'a> for TocLoopType {
4726    type Checker = glib::value::GenericValueTypeChecker<Self>;
4727
4728    #[inline]
4729    unsafe fn from_value(value: &'a glib::Value) -> Self {
4730        skip_assert_initialized!();
4731        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4732    }
4733}
4734
4735impl ToValue for TocLoopType {
4736    #[inline]
4737    fn to_value(&self) -> glib::Value {
4738        let mut value = glib::Value::for_value_type::<Self>();
4739        unsafe {
4740            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4741        }
4742        value
4743    }
4744
4745    #[inline]
4746    fn value_type(&self) -> glib::Type {
4747        Self::static_type()
4748    }
4749}
4750
4751impl From<TocLoopType> for glib::Value {
4752    #[inline]
4753    fn from(v: TocLoopType) -> Self {
4754        skip_assert_initialized!();
4755        ToValue::to_value(&v)
4756    }
4757}
4758
4759/// The scope of a TOC.
4760#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4761#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
4762#[non_exhaustive]
4763#[doc(alias = "GstTocScope")]
4764pub enum TocScope {
4765    /// global TOC representing all selectable options
4766    ///  (this is what applications are usually interested in)
4767    #[doc(alias = "GST_TOC_SCOPE_GLOBAL")]
4768    Global,
4769    /// TOC for the currently active/selected stream
4770    ///  (this is a TOC representing the current stream from start to EOS,
4771    ///  and is what a TOC writer / muxer is usually interested in; it will
4772    ///  usually be a subset of the global TOC, e.g. just the chapters of
4773    ///  the current title, or the chapters selected for playback from the
4774    ///  current title)
4775    #[doc(alias = "GST_TOC_SCOPE_CURRENT")]
4776    Current,
4777    #[doc(hidden)]
4778    __Unknown(i32),
4779}
4780
4781#[doc(hidden)]
4782impl IntoGlib for TocScope {
4783    type GlibType = ffi::GstTocScope;
4784
4785    #[inline]
4786    fn into_glib(self) -> ffi::GstTocScope {
4787        match self {
4788            Self::Global => ffi::GST_TOC_SCOPE_GLOBAL,
4789            Self::Current => ffi::GST_TOC_SCOPE_CURRENT,
4790            Self::__Unknown(value) => value,
4791        }
4792    }
4793}
4794
4795#[doc(hidden)]
4796impl FromGlib<ffi::GstTocScope> for TocScope {
4797    #[inline]
4798    unsafe fn from_glib(value: ffi::GstTocScope) -> Self {
4799        skip_assert_initialized!();
4800
4801        match value {
4802            ffi::GST_TOC_SCOPE_GLOBAL => Self::Global,
4803            ffi::GST_TOC_SCOPE_CURRENT => Self::Current,
4804            value => Self::__Unknown(value),
4805        }
4806    }
4807}
4808
4809impl StaticType for TocScope {
4810    #[inline]
4811    #[doc(alias = "gst_toc_scope_get_type")]
4812    fn static_type() -> glib::Type {
4813        unsafe { from_glib(ffi::gst_toc_scope_get_type()) }
4814    }
4815}
4816
4817impl glib::HasParamSpec for TocScope {
4818    type ParamSpec = glib::ParamSpecEnum;
4819    type SetValue = Self;
4820    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4821
4822    fn param_spec_builder() -> Self::BuilderFn {
4823        Self::ParamSpec::builder_with_default
4824    }
4825}
4826
4827impl glib::value::ValueType for TocScope {
4828    type Type = Self;
4829}
4830
4831unsafe impl<'a> glib::value::FromValue<'a> for TocScope {
4832    type Checker = glib::value::GenericValueTypeChecker<Self>;
4833
4834    #[inline]
4835    unsafe fn from_value(value: &'a glib::Value) -> Self {
4836        skip_assert_initialized!();
4837        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4838    }
4839}
4840
4841impl ToValue for TocScope {
4842    #[inline]
4843    fn to_value(&self) -> glib::Value {
4844        let mut value = glib::Value::for_value_type::<Self>();
4845        unsafe {
4846            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4847        }
4848        value
4849    }
4850
4851    #[inline]
4852    fn value_type(&self) -> glib::Type {
4853        Self::static_type()
4854    }
4855}
4856
4857impl From<TocScope> for glib::Value {
4858    #[inline]
4859    fn from(v: TocScope) -> Self {
4860        skip_assert_initialized!();
4861        ToValue::to_value(&v)
4862    }
4863}
4864
4865/// The probability of the typefind function. Higher values have more certainty
4866/// in doing a reliable typefind.
4867#[derive(Debug, Clone, Copy)]
4868#[non_exhaustive]
4869#[doc(alias = "GstTypeFindProbability")]
4870pub enum TypeFindProbability {
4871    /// type undetected.
4872    #[doc(alias = "GST_TYPE_FIND_NONE")]
4873    None,
4874    /// unlikely typefind.
4875    #[doc(alias = "GST_TYPE_FIND_MINIMUM")]
4876    Minimum,
4877    /// possible type detected.
4878    #[doc(alias = "GST_TYPE_FIND_POSSIBLE")]
4879    Possible,
4880    /// likely a type was detected.
4881    #[doc(alias = "GST_TYPE_FIND_LIKELY")]
4882    Likely,
4883    /// nearly certain that a type was detected.
4884    #[doc(alias = "GST_TYPE_FIND_NEARLY_CERTAIN")]
4885    NearlyCertain,
4886    /// very certain a type was detected.
4887    #[doc(alias = "GST_TYPE_FIND_MAXIMUM")]
4888    Maximum,
4889    #[doc(hidden)]
4890    __Unknown(i32),
4891}
4892
4893#[doc(hidden)]
4894impl IntoGlib for TypeFindProbability {
4895    type GlibType = ffi::GstTypeFindProbability;
4896
4897    #[inline]
4898    fn into_glib(self) -> ffi::GstTypeFindProbability {
4899        match self {
4900            Self::None => ffi::GST_TYPE_FIND_NONE,
4901            Self::Minimum => ffi::GST_TYPE_FIND_MINIMUM,
4902            Self::Possible => ffi::GST_TYPE_FIND_POSSIBLE,
4903            Self::Likely => ffi::GST_TYPE_FIND_LIKELY,
4904            Self::NearlyCertain => ffi::GST_TYPE_FIND_NEARLY_CERTAIN,
4905            Self::Maximum => ffi::GST_TYPE_FIND_MAXIMUM,
4906            Self::__Unknown(value) => value,
4907        }
4908    }
4909}
4910
4911#[doc(hidden)]
4912impl FromGlib<ffi::GstTypeFindProbability> for TypeFindProbability {
4913    #[inline]
4914    unsafe fn from_glib(value: ffi::GstTypeFindProbability) -> Self {
4915        skip_assert_initialized!();
4916
4917        match value {
4918            ffi::GST_TYPE_FIND_NONE => Self::None,
4919            ffi::GST_TYPE_FIND_MINIMUM => Self::Minimum,
4920            ffi::GST_TYPE_FIND_POSSIBLE => Self::Possible,
4921            ffi::GST_TYPE_FIND_LIKELY => Self::Likely,
4922            ffi::GST_TYPE_FIND_NEARLY_CERTAIN => Self::NearlyCertain,
4923            ffi::GST_TYPE_FIND_MAXIMUM => Self::Maximum,
4924            value => Self::__Unknown(value),
4925        }
4926    }
4927}
4928
4929impl StaticType for TypeFindProbability {
4930    #[inline]
4931    #[doc(alias = "gst_type_find_probability_get_type")]
4932    fn static_type() -> glib::Type {
4933        unsafe { from_glib(ffi::gst_type_find_probability_get_type()) }
4934    }
4935}
4936
4937impl glib::HasParamSpec for TypeFindProbability {
4938    type ParamSpec = glib::ParamSpecEnum;
4939    type SetValue = Self;
4940    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
4941
4942    fn param_spec_builder() -> Self::BuilderFn {
4943        Self::ParamSpec::builder_with_default
4944    }
4945}
4946
4947impl glib::value::ValueType for TypeFindProbability {
4948    type Type = Self;
4949}
4950
4951unsafe impl<'a> glib::value::FromValue<'a> for TypeFindProbability {
4952    type Checker = glib::value::GenericValueTypeChecker<Self>;
4953
4954    #[inline]
4955    unsafe fn from_value(value: &'a glib::Value) -> Self {
4956        skip_assert_initialized!();
4957        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
4958    }
4959}
4960
4961impl ToValue for TypeFindProbability {
4962    #[inline]
4963    fn to_value(&self) -> glib::Value {
4964        let mut value = glib::Value::for_value_type::<Self>();
4965        unsafe {
4966            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
4967        }
4968        value
4969    }
4970
4971    #[inline]
4972    fn value_type(&self) -> glib::Type {
4973        Self::static_type()
4974    }
4975}
4976
4977impl From<TypeFindProbability> for glib::Value {
4978    #[inline]
4979    fn from(v: TypeFindProbability) -> Self {
4980        skip_assert_initialized!();
4981        ToValue::to_value(&v)
4982    }
4983}
4984
4985/// Different URI-related errors that can occur.
4986#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
4987#[non_exhaustive]
4988#[doc(alias = "GstURIError")]
4989pub enum URIError {
4990    /// The protocol is not supported
4991    #[doc(alias = "GST_URI_ERROR_UNSUPPORTED_PROTOCOL")]
4992    UnsupportedProtocol,
4993    /// There was a problem with the URI
4994    #[doc(alias = "GST_URI_ERROR_BAD_URI")]
4995    BadUri,
4996    /// Could not set or change the URI because the
4997    ///  URI handler was in a state where that is not possible or not permitted
4998    #[doc(alias = "GST_URI_ERROR_BAD_STATE")]
4999    BadState,
5000    /// There was a problem with the entity that
5001    ///  the URI references
5002    #[doc(alias = "GST_URI_ERROR_BAD_REFERENCE")]
5003    BadReference,
5004    #[doc(hidden)]
5005    __Unknown(i32),
5006}
5007
5008#[doc(hidden)]
5009impl IntoGlib for URIError {
5010    type GlibType = ffi::GstURIError;
5011
5012    #[inline]
5013    fn into_glib(self) -> ffi::GstURIError {
5014        match self {
5015            Self::UnsupportedProtocol => ffi::GST_URI_ERROR_UNSUPPORTED_PROTOCOL,
5016            Self::BadUri => ffi::GST_URI_ERROR_BAD_URI,
5017            Self::BadState => ffi::GST_URI_ERROR_BAD_STATE,
5018            Self::BadReference => ffi::GST_URI_ERROR_BAD_REFERENCE,
5019            Self::__Unknown(value) => value,
5020        }
5021    }
5022}
5023
5024#[doc(hidden)]
5025impl FromGlib<ffi::GstURIError> for URIError {
5026    #[inline]
5027    unsafe fn from_glib(value: ffi::GstURIError) -> Self {
5028        skip_assert_initialized!();
5029
5030        match value {
5031            ffi::GST_URI_ERROR_UNSUPPORTED_PROTOCOL => Self::UnsupportedProtocol,
5032            ffi::GST_URI_ERROR_BAD_URI => Self::BadUri,
5033            ffi::GST_URI_ERROR_BAD_STATE => Self::BadState,
5034            ffi::GST_URI_ERROR_BAD_REFERENCE => Self::BadReference,
5035            value => Self::__Unknown(value),
5036        }
5037    }
5038}
5039
5040impl glib::error::ErrorDomain for URIError {
5041    #[inline]
5042    fn domain() -> glib::Quark {
5043        skip_assert_initialized!();
5044
5045        unsafe { from_glib(ffi::gst_uri_error_quark()) }
5046    }
5047
5048    #[inline]
5049    fn code(self) -> i32 {
5050        self.into_glib()
5051    }
5052
5053    #[inline]
5054    #[allow(clippy::match_single_binding)]
5055    fn from(code: i32) -> Option<Self> {
5056        skip_assert_initialized!();
5057        match unsafe { from_glib(code) } {
5058            value => Some(value),
5059        }
5060    }
5061}
5062
5063impl StaticType for URIError {
5064    #[inline]
5065    #[doc(alias = "gst_uri_error_get_type")]
5066    fn static_type() -> glib::Type {
5067        unsafe { from_glib(ffi::gst_uri_error_get_type()) }
5068    }
5069}
5070
5071impl glib::HasParamSpec for URIError {
5072    type ParamSpec = glib::ParamSpecEnum;
5073    type SetValue = Self;
5074    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
5075
5076    fn param_spec_builder() -> Self::BuilderFn {
5077        Self::ParamSpec::builder_with_default
5078    }
5079}
5080
5081impl glib::value::ValueType for URIError {
5082    type Type = Self;
5083}
5084
5085unsafe impl<'a> glib::value::FromValue<'a> for URIError {
5086    type Checker = glib::value::GenericValueTypeChecker<Self>;
5087
5088    #[inline]
5089    unsafe fn from_value(value: &'a glib::Value) -> Self {
5090        skip_assert_initialized!();
5091        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
5092    }
5093}
5094
5095impl ToValue for URIError {
5096    #[inline]
5097    fn to_value(&self) -> glib::Value {
5098        let mut value = glib::Value::for_value_type::<Self>();
5099        unsafe {
5100            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
5101        }
5102        value
5103    }
5104
5105    #[inline]
5106    fn value_type(&self) -> glib::Type {
5107        Self::static_type()
5108    }
5109}
5110
5111impl From<URIError> for glib::Value {
5112    #[inline]
5113    fn from(v: URIError) -> Self {
5114        skip_assert_initialized!();
5115        ToValue::to_value(&v)
5116    }
5117}
5118
5119/// The different types of URI direction.
5120#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5121#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
5122#[repr(i32)]
5123#[doc(alias = "GstURIType")]
5124pub enum URIType {
5125    /// The URI direction is unknown
5126    #[doc(alias = "GST_URI_UNKNOWN")]
5127    Unknown = ffi::GST_URI_UNKNOWN,
5128    /// The URI is a consumer.
5129    #[doc(alias = "GST_URI_SINK")]
5130    Sink = ffi::GST_URI_SINK,
5131    /// The URI is a producer.
5132    #[doc(alias = "GST_URI_SRC")]
5133    Src = ffi::GST_URI_SRC,
5134}
5135
5136#[doc(hidden)]
5137impl IntoGlib for URIType {
5138    type GlibType = ffi::GstURIType;
5139
5140    #[inline]
5141    fn into_glib(self) -> ffi::GstURIType {
5142        self as ffi::GstURIType
5143    }
5144}
5145
5146#[doc(hidden)]
5147impl FromGlib<ffi::GstURIType> for URIType {
5148    #[inline]
5149    unsafe fn from_glib(value: ffi::GstURIType) -> Self {
5150        skip_assert_initialized!();
5151
5152        debug_assert!([ffi::GST_URI_UNKNOWN, ffi::GST_URI_SINK, ffi::GST_URI_SRC].contains(&value));
5153        unsafe { std::mem::transmute(value) }
5154    }
5155}
5156
5157impl StaticType for URIType {
5158    #[inline]
5159    #[doc(alias = "gst_uri_type_get_type")]
5160    fn static_type() -> glib::Type {
5161        unsafe { from_glib(ffi::gst_uri_type_get_type()) }
5162    }
5163}
5164
5165impl glib::HasParamSpec for URIType {
5166    type ParamSpec = glib::ParamSpecEnum;
5167    type SetValue = Self;
5168    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
5169
5170    fn param_spec_builder() -> Self::BuilderFn {
5171        Self::ParamSpec::builder_with_default
5172    }
5173}
5174
5175impl glib::value::ValueType for URIType {
5176    type Type = Self;
5177}
5178
5179unsafe impl<'a> glib::value::FromValue<'a> for URIType {
5180    type Checker = glib::value::GenericValueTypeChecker<Self>;
5181
5182    #[inline]
5183    unsafe fn from_value(value: &'a glib::Value) -> Self {
5184        skip_assert_initialized!();
5185        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
5186    }
5187}
5188
5189impl ToValue for URIType {
5190    #[inline]
5191    fn to_value(&self) -> glib::Value {
5192        let mut value = glib::Value::for_value_type::<Self>();
5193        unsafe {
5194            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
5195        }
5196        value
5197    }
5198
5199    #[inline]
5200    fn value_type(&self) -> glib::Type {
5201        Self::static_type()
5202    }
5203}
5204
5205impl From<URIType> for glib::Value {
5206    #[inline]
5207    fn from(v: URIType) -> Self {
5208        skip_assert_initialized!();
5209        ToValue::to_value(&v)
5210    }
5211}