gstreamer/
message.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::{borrow::Borrow, ffi::CStr, fmt, mem, num::NonZeroU32, ops::Deref, ops::DerefMut, ptr};
4
5use glib::{
6    translate::*,
7    value::{SendValue, ValueType},
8};
9use smallvec::SmallVec;
10
11use crate::{
12    GenericFormattedValue, GroupId, MessageType, Object, Seqnum, TagList, ffi,
13    format::{CompatibleFormattedValue, FormattedValue},
14    prelude::*,
15    structure::*,
16};
17
18mini_object_wrapper!(Message, MessageRef, ffi::GstMessage, || {
19    ffi::gst_message_get_type()
20});
21
22impl MessageRef {
23    #[doc(alias = "get_src")]
24    #[inline]
25    pub fn src(&self) -> Option<&Object> {
26        unsafe {
27            if (*self.as_ptr()).src.is_null() {
28                None
29            } else {
30                Some(Object::from_glib_ptr_borrow(&(*self.as_ptr()).src))
31            }
32        }
33    }
34
35    #[doc(alias = "get_seqnum")]
36    #[doc(alias = "gst_message_get_seqnum")]
37    pub fn seqnum(&self) -> Seqnum {
38        unsafe {
39            let seqnum = ffi::gst_message_get_seqnum(self.as_mut_ptr());
40
41            if seqnum == 0 {
42                // seqnum for this message is invalid. This can happen with buggy elements
43                // overriding the seqnum with GST_SEQNUM_INVALID instead of the expected seqnum.
44                // As a workaround, let's generate an unused valid seqnum.
45                let next = Seqnum::next();
46
47                crate::warning!(
48                    crate::CAT_RUST,
49                    "get_seqnum detected invalid seqnum, returning next {:?}",
50                    next
51                );
52
53                return next;
54            }
55
56            Seqnum(NonZeroU32::new_unchecked(seqnum))
57        }
58    }
59
60    #[doc(alias = "gst_message_set_seqnum")]
61    pub fn set_seqnum(&self, seqnum: Seqnum) {
62        unsafe {
63            ffi::gst_message_set_seqnum(self.as_mut_ptr(), seqnum.0.get());
64        }
65    }
66
67    #[doc(alias = "get_structure")]
68    #[doc(alias = "gst_message_get_structure")]
69    #[inline]
70    pub fn structure(&self) -> Option<&StructureRef> {
71        unsafe {
72            let structure = ffi::gst_message_get_structure(self.as_mut_ptr());
73            if structure.is_null() {
74                None
75            } else {
76                Some(StructureRef::from_glib_borrow(structure))
77            }
78        }
79    }
80
81    #[doc(alias = "gst_message_writable_structure")]
82    #[inline]
83    pub fn structure_mut(&mut self) -> &mut StructureRef {
84        unsafe {
85            StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_structure(
86                self.as_mut_ptr(),
87            ))
88        }
89    }
90
91    #[cfg(feature = "v1_26")]
92    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
93    #[doc(alias = "gst_message_writable_details")]
94    #[inline]
95    pub fn details(&self) -> Option<&StructureRef> {
96        unsafe {
97            let structure = ffi::gst_message_writable_details(self.as_mut_ptr());
98            if structure.is_null() {
99                None
100            } else {
101                Some(StructureRef::from_glib_borrow(structure))
102            }
103        }
104    }
105
106    #[cfg(feature = "v1_26")]
107    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
108    #[doc(alias = "gst_message_writable_details")]
109    #[inline]
110    pub fn details_mut(&mut self) -> &mut StructureRef {
111        unsafe {
112            StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_details(self.as_mut_ptr()))
113        }
114    }
115
116    #[cfg(feature = "v1_26")]
117    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
118    #[doc(alias = "gst_message_set_details")]
119    #[inline]
120    pub fn set_details(&mut self, structure: Structure) {
121        unsafe {
122            ffi::gst_message_set_details(self.as_mut_ptr(), structure.into_glib_ptr());
123        }
124    }
125
126    #[doc(alias = "gst_message_has_name")]
127    #[inline]
128    pub fn has_name(&self, name: &str) -> bool {
129        self.structure().is_some_and(|s| s.has_name(name))
130    }
131
132    pub fn view(&self) -> MessageView<'_> {
133        unsafe {
134            let type_ = (*self.as_ptr()).type_;
135
136            match type_ {
137                ffi::GST_MESSAGE_EOS => Eos::view(self),
138                ffi::GST_MESSAGE_ERROR => Error::view(self),
139                ffi::GST_MESSAGE_WARNING => Warning::view(self),
140                ffi::GST_MESSAGE_INFO => Info::view(self),
141                ffi::GST_MESSAGE_TAG => Tag::view(self),
142                ffi::GST_MESSAGE_BUFFERING => Buffering::view(self),
143                ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view(self),
144                ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view(self),
145                ffi::GST_MESSAGE_STEP_DONE => StepDone::view(self),
146                ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view(self),
147                ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view(self),
148                ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view(self),
149                ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view(self),
150                ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view(self),
151                ffi::GST_MESSAGE_APPLICATION => Application::view(self),
152                ffi::GST_MESSAGE_ELEMENT => Element::view(self),
153                ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view(self),
154                ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view(self),
155                ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view(self),
156                ffi::GST_MESSAGE_LATENCY => Latency::view(self),
157                ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view(self),
158                ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view(self),
159                ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view(self),
160                ffi::GST_MESSAGE_STEP_START => StepStart::view(self),
161                ffi::GST_MESSAGE_QOS => Qos::view(self),
162                ffi::GST_MESSAGE_PROGRESS => Progress::view(self),
163                ffi::GST_MESSAGE_TOC => Toc::view(self),
164                ffi::GST_MESSAGE_RESET_TIME => ResetTime::view(self),
165                ffi::GST_MESSAGE_STREAM_START => StreamStart::view(self),
166                ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view(self),
167                ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view(self),
168                ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view(self),
169                ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view(self),
170                ffi::GST_MESSAGE_REDIRECT => Redirect::view(self),
171                ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view(self),
172                ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view(self),
173                ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view(self),
174                #[cfg(feature = "v1_16")]
175                ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view(self),
176                #[cfg(feature = "v1_18")]
177                ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view(self),
178                #[cfg(feature = "v1_28")]
179                ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view(self),
180                _ => Other::view(self),
181            }
182        }
183    }
184
185    pub fn view_mut(&mut self) -> MessageViewMut<'_> {
186        unsafe {
187            let type_ = (*self.as_ptr()).type_;
188
189            match type_ {
190                ffi::GST_MESSAGE_EOS => Eos::view_mut(self),
191                ffi::GST_MESSAGE_ERROR => Error::view_mut(self),
192                ffi::GST_MESSAGE_WARNING => Warning::view_mut(self),
193                ffi::GST_MESSAGE_INFO => Info::view_mut(self),
194                ffi::GST_MESSAGE_TAG => Tag::view_mut(self),
195                ffi::GST_MESSAGE_BUFFERING => Buffering::view_mut(self),
196                ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view_mut(self),
197                ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view_mut(self),
198                ffi::GST_MESSAGE_STEP_DONE => StepDone::view_mut(self),
199                ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view_mut(self),
200                ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view_mut(self),
201                ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view_mut(self),
202                ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view_mut(self),
203                ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view_mut(self),
204                ffi::GST_MESSAGE_APPLICATION => Application::view_mut(self),
205                ffi::GST_MESSAGE_ELEMENT => Element::view_mut(self),
206                ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view_mut(self),
207                ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view_mut(self),
208                ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view_mut(self),
209                ffi::GST_MESSAGE_LATENCY => Latency::view_mut(self),
210                ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view_mut(self),
211                ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view_mut(self),
212                ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view_mut(self),
213                ffi::GST_MESSAGE_STEP_START => StepStart::view_mut(self),
214                ffi::GST_MESSAGE_QOS => Qos::view_mut(self),
215                ffi::GST_MESSAGE_PROGRESS => Progress::view_mut(self),
216                ffi::GST_MESSAGE_TOC => Toc::view_mut(self),
217                ffi::GST_MESSAGE_RESET_TIME => ResetTime::view_mut(self),
218                ffi::GST_MESSAGE_STREAM_START => StreamStart::view_mut(self),
219                ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view_mut(self),
220                ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view_mut(self),
221                ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view_mut(self),
222                ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view_mut(self),
223                ffi::GST_MESSAGE_REDIRECT => Redirect::view_mut(self),
224                ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view_mut(self),
225                ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view_mut(self),
226                ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view_mut(self),
227                #[cfg(feature = "v1_16")]
228                ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view_mut(self),
229                #[cfg(feature = "v1_18")]
230                ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view_mut(self),
231                #[cfg(feature = "v1_28")]
232                ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view_mut(self),
233                _ => Other::view_mut(self),
234            }
235        }
236    }
237
238    #[doc(alias = "get_type")]
239    #[inline]
240    pub fn type_(&self) -> MessageType {
241        unsafe { from_glib((*self.as_ptr()).type_) }
242    }
243}
244
245impl fmt::Debug for Message {
246    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
247        MessageRef::fmt(self, f)
248    }
249}
250
251impl fmt::Debug for MessageRef {
252    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
253        // Don't retrieve `seqnum` using `MessageRef::get_seqnum`
254        // because it would generate a new seqnum if a buggy `Element`
255        // emitted a `Message` with an invalid `seqnum`.
256        // We want to help the user find out there is something wrong here,
257        // so they can investigate the origin.
258        let seqnum = unsafe { ffi::gst_message_get_seqnum(self.as_mut_ptr()) };
259        let seqnum = if seqnum != 0 {
260            &seqnum as &dyn fmt::Debug
261        } else {
262            &"INVALID (0)" as &dyn fmt::Debug
263        };
264
265        f.debug_struct("Message")
266            .field("ptr", &self.as_ptr())
267            .field("type", &unsafe {
268                let type_ = ffi::gst_message_type_get_name((*self.as_ptr()).type_);
269                CStr::from_ptr(type_).to_str().unwrap()
270            })
271            .field("seqnum", seqnum)
272            .field(
273                "src",
274                &self
275                    .src()
276                    .map(|s| s.name())
277                    .as_ref()
278                    .map(glib::GString::as_str),
279            )
280            .field("structure", &self.structure())
281            .finish()
282    }
283}
284
285#[derive(Debug)]
286#[non_exhaustive]
287pub enum MessageView<'a> {
288    Eos(&'a Eos),
289    Error(&'a Error),
290    Warning(&'a Warning),
291    Info(&'a Info),
292    Tag(&'a Tag),
293    Buffering(&'a Buffering),
294    StateChanged(&'a StateChanged),
295    StateDirty(&'a StateDirty),
296    StepDone(&'a StepDone),
297    ClockProvide(&'a ClockProvide),
298    ClockLost(&'a ClockLost),
299    NewClock(&'a NewClock),
300    StructureChange(&'a StructureChange),
301    StreamStatus(&'a StreamStatus),
302    Application(&'a Application),
303    Element(&'a Element),
304    SegmentStart(&'a SegmentStart),
305    SegmentDone(&'a SegmentDone),
306    DurationChanged(&'a DurationChanged),
307    Latency(&'a Latency),
308    AsyncStart(&'a AsyncStart),
309    AsyncDone(&'a AsyncDone),
310    RequestState(&'a RequestState),
311    StepStart(&'a StepStart),
312    Qos(&'a Qos),
313    Progress(&'a Progress),
314    Toc(&'a Toc),
315    ResetTime(&'a ResetTime),
316    StreamStart(&'a StreamStart),
317    NeedContext(&'a NeedContext),
318    HaveContext(&'a HaveContext),
319    DeviceAdded(&'a DeviceAdded),
320    DeviceRemoved(&'a DeviceRemoved),
321    PropertyNotify(&'a PropertyNotify),
322    StreamCollection(&'a StreamCollection),
323    StreamsSelected(&'a StreamsSelected),
324    Redirect(&'a Redirect),
325    #[cfg(feature = "v1_16")]
326    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
327    DeviceChanged(&'a DeviceChanged),
328    #[cfg(feature = "v1_18")]
329    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
330    InstantRateRequest(&'a InstantRateRequest),
331    #[cfg(feature = "v1_28")]
332    #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
333    DeviceMonitorStarted(&'a DeviceMonitorStarted),
334    Other(&'a Other),
335}
336
337#[derive(Debug)]
338#[non_exhaustive]
339pub enum MessageViewMut<'a> {
340    Eos(&'a mut Eos),
341    Error(&'a mut Error),
342    Warning(&'a mut Warning),
343    Info(&'a mut Info),
344    Tag(&'a mut Tag),
345    Buffering(&'a mut Buffering),
346    StateChanged(&'a mut StateChanged),
347    StateDirty(&'a mut StateDirty),
348    StepDone(&'a mut StepDone),
349    ClockProvide(&'a mut ClockProvide),
350    ClockLost(&'a mut ClockLost),
351    NewClock(&'a mut NewClock),
352    StructureChange(&'a mut StructureChange),
353    StreamStatus(&'a mut StreamStatus),
354    Application(&'a mut Application),
355    Element(&'a mut Element),
356    SegmentStart(&'a mut SegmentStart),
357    SegmentDone(&'a mut SegmentDone),
358    DurationChanged(&'a mut DurationChanged),
359    Latency(&'a mut Latency),
360    AsyncStart(&'a mut AsyncStart),
361    AsyncDone(&'a mut AsyncDone),
362    RequestState(&'a mut RequestState),
363    StepStart(&'a mut StepStart),
364    Qos(&'a mut Qos),
365    Progress(&'a mut Progress),
366    Toc(&'a mut Toc),
367    ResetTime(&'a mut ResetTime),
368    StreamStart(&'a mut StreamStart),
369    NeedContext(&'a mut NeedContext),
370    HaveContext(&'a mut HaveContext),
371    DeviceAdded(&'a mut DeviceAdded),
372    DeviceRemoved(&'a mut DeviceRemoved),
373    PropertyNotify(&'a mut PropertyNotify),
374    StreamCollection(&'a mut StreamCollection),
375    StreamsSelected(&'a mut StreamsSelected),
376    Redirect(&'a mut Redirect),
377    #[cfg(feature = "v1_16")]
378    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
379    DeviceChanged(&'a mut DeviceChanged),
380    #[cfg(feature = "v1_18")]
381    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
382    InstantRateRequest(&'a mut InstantRateRequest),
383    #[cfg(feature = "v1_28")]
384    #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
385    DeviceMonitorStarted(&'a mut DeviceMonitorStarted),
386    Other(&'a mut Other),
387}
388
389macro_rules! declare_concrete_message(
390    ($name:ident, $param:ident) => {
391        #[repr(transparent)]
392        pub struct $name<$param = MessageRef>($param);
393
394        impl $name {
395            #[inline]
396            pub fn message(&self) -> &MessageRef {
397                unsafe { &*(self as *const Self as *const MessageRef) }
398            }
399
400            #[inline]
401            pub fn message_mut(&mut self) -> &mut MessageRef {
402                unsafe { &mut *(self as *mut Self as *mut MessageRef) }
403            }
404
405            #[inline]
406            unsafe fn view(message: &MessageRef) -> MessageView<'_> { unsafe {
407                let message = &*(message as *const MessageRef as *const Self);
408                MessageView::$name(message)
409            }}
410
411            #[inline]
412            unsafe fn view_mut(message: &mut MessageRef) -> MessageViewMut<'_> { unsafe {
413                let message = &mut *(message as *mut MessageRef as *mut Self);
414                MessageViewMut::$name(message)
415            }}
416        }
417
418        impl Deref for $name {
419            type Target = MessageRef;
420
421            #[inline]
422            fn deref(&self) -> &Self::Target {
423                unsafe {
424                    &*(self as *const Self as *const Self::Target)
425                }
426            }
427        }
428
429        impl DerefMut for $name {
430            #[inline]
431            fn deref_mut(&mut self) -> &mut Self::Target {
432                self.message_mut()
433            }
434        }
435
436        impl ToOwned for $name {
437            type Owned = $name<Message>;
438
439            #[inline]
440            fn to_owned(&self) -> Self::Owned {
441                $name::<Message>(self.copy())
442            }
443        }
444
445        impl $name<Message> {
446            #[inline]
447            pub fn get_mut(&mut self) -> Option<&mut $name> {
448                self.0.get_mut().map(|message| unsafe {
449                    &mut *(message as *mut MessageRef as *mut $name)
450                })
451            }
452        }
453
454        impl Deref for $name<Message> {
455            type Target = $name;
456
457            #[inline]
458            fn deref(&self) -> &Self::Target {
459                unsafe { &*(self.0.as_ptr() as *const Self::Target) }
460            }
461        }
462
463        impl DerefMut for $name<Message> {
464            #[inline]
465            fn deref_mut(&mut self) -> &mut Self::Target {
466                debug_assert!(self.0.is_writable());
467                unsafe { &mut *(self.0.as_mut_ptr() as *mut Self::Target) }
468            }
469        }
470
471        impl Borrow<$name> for $name<Message> {
472            #[inline]
473            fn borrow(&self) -> &$name {
474                &*self
475            }
476        }
477
478        impl From<$name<Message>> for Message {
479            #[inline]
480            fn from(concrete: $name<Message>) -> Self {
481                skip_assert_initialized!();
482                concrete.0
483            }
484        }
485    }
486);
487
488declare_concrete_message!(Eos, T);
489impl Eos {
490    #[doc(alias = "gst_message_new_eos")]
491    #[allow(clippy::new_ret_no_self)]
492    pub fn new() -> Message {
493        skip_assert_initialized!();
494        Self::builder().build()
495    }
496
497    pub fn builder<'a>() -> EosBuilder<'a> {
498        assert_initialized_main_thread!();
499        EosBuilder::new()
500    }
501}
502
503impl std::fmt::Debug for Eos {
504    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
505        f.debug_struct("Eos")
506            .field("structure", &self.message().structure())
507            .field("source", &self.src().map(|obj| (obj, obj.name())))
508            .finish()
509    }
510}
511
512impl std::fmt::Debug for Eos<Message> {
513    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
514        Eos::<MessageRef>::fmt(self, f)
515    }
516}
517
518declare_concrete_message!(Error, T);
519impl Error {
520    #[doc(alias = "gst_message_new_error")]
521    #[allow(clippy::new_ret_no_self)]
522    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
523        skip_assert_initialized!();
524        Self::builder(error, message).build()
525    }
526
527    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> ErrorBuilder<'_> {
528        assert_initialized_main_thread!();
529        ErrorBuilder::new(glib::Error::new(error, message))
530    }
531
532    pub fn builder_from_error<'a>(error: glib::Error) -> ErrorBuilder<'a> {
533        assert_initialized_main_thread!();
534
535        assert!(
536            [
537                crate::CoreError::domain(),
538                crate::ResourceError::domain(),
539                crate::StreamError::domain(),
540                crate::LibraryError::domain(),
541            ]
542            .contains(&error.domain())
543        );
544        ErrorBuilder::new(error)
545    }
546
547    #[doc(alias = "get_error")]
548    #[doc(alias = "gst_message_parse_error")]
549    pub fn error(&self) -> glib::Error {
550        unsafe {
551            let mut error = ptr::null_mut();
552
553            ffi::gst_message_parse_error(self.as_mut_ptr(), &mut error, ptr::null_mut());
554
555            from_glib_full(error)
556        }
557    }
558
559    #[doc(alias = "get_debug")]
560    #[doc(alias = "gst_message_parse_error")]
561    pub fn debug(&self) -> Option<glib::GString> {
562        unsafe {
563            let mut debug = ptr::null_mut();
564
565            ffi::gst_message_parse_error(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
566
567            from_glib_full(debug)
568        }
569    }
570
571    #[doc(alias = "get_details")]
572    #[doc(alias = "gst_message_parse_error_details")]
573    pub fn details(&self) -> Option<&StructureRef> {
574        unsafe {
575            let mut details = ptr::null();
576
577            ffi::gst_message_parse_error_details(self.as_mut_ptr(), &mut details);
578
579            if details.is_null() {
580                None
581            } else {
582                Some(StructureRef::from_glib_borrow(details))
583            }
584        }
585    }
586
587    #[cfg(feature = "v1_26")]
588    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
589    #[doc(alias = "gst_message_parse_error_writable_details")]
590    pub fn writable_details(&mut self) -> &mut StructureRef {
591        unsafe {
592            let mut details = ptr::null_mut();
593
594            ffi::gst_message_parse_error_writable_details(self.as_mut_ptr(), &mut details);
595
596            StructureRef::from_glib_borrow_mut(details)
597        }
598    }
599}
600
601impl std::fmt::Display for Error {
602    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
603        write!(f, "{}", self.error())
604    }
605}
606
607impl std::fmt::Debug for Error {
608    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
609        f.debug_struct("Error")
610            .field("structure", &self.message().structure())
611            .field("source", &self.src().map(|obj| (obj, obj.name())))
612            .field("error", &self.error())
613            .field("debug", &self.debug())
614            .field("details", &self.details())
615            .finish()
616    }
617}
618
619impl std::fmt::Debug for Error<Message> {
620    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
621        Error::<MessageRef>::fmt(self, f)
622    }
623}
624
625declare_concrete_message!(Warning, T);
626impl Warning {
627    #[doc(alias = "gst_message_new_warning")]
628    #[allow(clippy::new_ret_no_self)]
629    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
630        skip_assert_initialized!();
631        Self::builder(error, message).build()
632    }
633
634    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> WarningBuilder<'_> {
635        assert_initialized_main_thread!();
636        WarningBuilder::new(glib::Error::new(error, message))
637    }
638
639    pub fn builder_from_error<'a>(error: glib::Error) -> WarningBuilder<'a> {
640        assert_initialized_main_thread!();
641
642        assert!(
643            [
644                crate::CoreError::domain(),
645                crate::ResourceError::domain(),
646                crate::StreamError::domain(),
647                crate::LibraryError::domain(),
648            ]
649            .contains(&error.domain())
650        );
651        WarningBuilder::new(error)
652    }
653
654    #[doc(alias = "get_error")]
655    #[doc(alias = "gst_message_parse_warning")]
656    pub fn error(&self) -> glib::Error {
657        unsafe {
658            let mut error = ptr::null_mut();
659
660            ffi::gst_message_parse_warning(self.as_mut_ptr(), &mut error, ptr::null_mut());
661
662            from_glib_full(error)
663        }
664    }
665
666    #[doc(alias = "get_debug")]
667    #[doc(alias = "gst_message_parse_warning")]
668    pub fn debug(&self) -> Option<glib::GString> {
669        unsafe {
670            let mut debug = ptr::null_mut();
671
672            ffi::gst_message_parse_warning(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
673
674            from_glib_full(debug)
675        }
676    }
677
678    #[doc(alias = "get_details")]
679    #[doc(alias = "gst_message_parse_warning_details")]
680    pub fn details(&self) -> Option<&StructureRef> {
681        unsafe {
682            let mut details = ptr::null();
683
684            ffi::gst_message_parse_warning_details(self.as_mut_ptr(), &mut details);
685
686            if details.is_null() {
687                None
688            } else {
689                Some(StructureRef::from_glib_borrow(details))
690            }
691        }
692    }
693
694    #[cfg(feature = "v1_26")]
695    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
696    #[doc(alias = "gst_message_parse_warning_writable_details")]
697    pub fn writable_details(&mut self) -> &mut StructureRef {
698        unsafe {
699            let mut details = ptr::null_mut();
700
701            ffi::gst_message_parse_warning_writable_details(self.as_mut_ptr(), &mut details);
702
703            StructureRef::from_glib_borrow_mut(details)
704        }
705    }
706}
707
708impl std::fmt::Display for Warning {
709    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
710        write!(f, "{}", self.error())
711    }
712}
713
714impl std::fmt::Debug for Warning {
715    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
716        f.debug_struct("Warning")
717            .field("structure", &self.message().structure())
718            .field("source", &self.src().map(|obj| (obj, obj.name())))
719            .field("error", &self.error())
720            .field("debug", &self.debug())
721            .field("details", &self.details())
722            .finish()
723    }
724}
725
726impl std::fmt::Debug for Warning<Message> {
727    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
728        Warning::<MessageRef>::fmt(self, f)
729    }
730}
731
732declare_concrete_message!(Info, T);
733impl Info {
734    #[doc(alias = "gst_message_new_info")]
735    #[allow(clippy::new_ret_no_self)]
736    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
737        skip_assert_initialized!();
738        Self::builder(error, message).build()
739    }
740
741    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> InfoBuilder<'_> {
742        assert_initialized_main_thread!();
743        InfoBuilder::new(glib::Error::new(error, message))
744    }
745
746    pub fn builder_from_error<'a>(error: glib::Error) -> InfoBuilder<'a> {
747        assert_initialized_main_thread!();
748
749        assert!(
750            [
751                crate::CoreError::domain(),
752                crate::ResourceError::domain(),
753                crate::StreamError::domain(),
754                crate::LibraryError::domain(),
755            ]
756            .contains(&error.domain())
757        );
758        InfoBuilder::new(error)
759    }
760
761    #[doc(alias = "get_error")]
762    #[doc(alias = "gst_message_parse_info")]
763    pub fn error(&self) -> glib::Error {
764        unsafe {
765            let mut error = ptr::null_mut();
766
767            ffi::gst_message_parse_info(self.as_mut_ptr(), &mut error, ptr::null_mut());
768
769            from_glib_full(error)
770        }
771    }
772
773    #[doc(alias = "get_debug")]
774    #[doc(alias = "gst_message_parse_info")]
775    pub fn debug(&self) -> Option<glib::GString> {
776        unsafe {
777            let mut debug = ptr::null_mut();
778
779            ffi::gst_message_parse_info(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
780
781            from_glib_full(debug)
782        }
783    }
784
785    #[doc(alias = "get_details")]
786    #[doc(alias = "gst_message_parse_info_details")]
787    pub fn details(&self) -> Option<&StructureRef> {
788        unsafe {
789            let mut details = ptr::null();
790
791            ffi::gst_message_parse_info_details(self.as_mut_ptr(), &mut details);
792
793            if details.is_null() {
794                None
795            } else {
796                Some(StructureRef::from_glib_borrow(details))
797            }
798        }
799    }
800
801    #[cfg(feature = "v1_26")]
802    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
803    #[doc(alias = "gst_message_parse_info_writable_details")]
804    pub fn writable_details(&mut self) -> &mut StructureRef {
805        unsafe {
806            let mut details = ptr::null_mut();
807
808            ffi::gst_message_parse_info_writable_details(self.as_mut_ptr(), &mut details);
809
810            StructureRef::from_glib_borrow_mut(details)
811        }
812    }
813}
814
815impl std::fmt::Display for Info {
816    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
817        write!(f, "{}", self.error())
818    }
819}
820
821impl std::fmt::Debug for Info {
822    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
823        f.debug_struct("Info")
824            .field("structure", &self.message().structure())
825            .field("source", &self.src().map(|obj| (obj, obj.name())))
826            .field("error", &self.error())
827            .field("debug", &self.debug())
828            .field("details", &self.details())
829            .finish()
830    }
831}
832
833impl std::fmt::Debug for Info<Message> {
834    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
835        Info::<MessageRef>::fmt(self, f)
836    }
837}
838
839declare_concrete_message!(Tag, T);
840impl Tag {
841    #[doc(alias = "gst_message_new_tag")]
842    #[allow(clippy::new_ret_no_self)]
843    pub fn new(tags: TagList) -> Message {
844        skip_assert_initialized!();
845        Self::builder(tags).build()
846    }
847
848    pub fn builder<'a>(tags: TagList) -> TagBuilder<'a> {
849        assert_initialized_main_thread!();
850        TagBuilder::new(tags)
851    }
852
853    #[doc(alias = "get_tags")]
854    #[doc(alias = "gst_message_parse_tag")]
855    pub fn tags(&self) -> TagList {
856        unsafe {
857            let mut tags = ptr::null_mut();
858            ffi::gst_message_parse_tag(self.as_mut_ptr(), &mut tags);
859            from_glib_full(tags)
860        }
861    }
862}
863
864impl std::fmt::Debug for Tag {
865    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
866        f.debug_struct("Tag")
867            .field("structure", &self.message().structure())
868            .field("source", &self.src().map(|obj| (obj, obj.name())))
869            .field("tags", &self.tags())
870            .finish()
871    }
872}
873
874impl std::fmt::Debug for Tag<Message> {
875    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
876        Tag::<MessageRef>::fmt(self, f)
877    }
878}
879
880declare_concrete_message!(Buffering, T);
881impl Buffering {
882    #[doc(alias = "gst_message_new_buffering")]
883    #[allow(clippy::new_ret_no_self)]
884    pub fn new(percent: i32) -> Message {
885        skip_assert_initialized!();
886        Self::builder(percent).build()
887    }
888
889    pub fn builder<'a>(percent: i32) -> BufferingBuilder<'a> {
890        assert_initialized_main_thread!();
891        BufferingBuilder::new(percent)
892    }
893
894    #[doc(alias = "get_percent")]
895    #[doc(alias = "gst_message_parse_buffering")]
896    pub fn percent(&self) -> i32 {
897        unsafe {
898            let mut p = mem::MaybeUninit::uninit();
899            ffi::gst_message_parse_buffering(self.as_mut_ptr(), p.as_mut_ptr());
900            p.assume_init()
901        }
902    }
903
904    #[doc(alias = "get_buffering_stats")]
905    #[doc(alias = "gst_message_parse_buffering_stats")]
906    pub fn buffering_stats(&self) -> (crate::BufferingMode, i32, i32, i64) {
907        unsafe {
908            let mut mode = mem::MaybeUninit::uninit();
909            let mut avg_in = mem::MaybeUninit::uninit();
910            let mut avg_out = mem::MaybeUninit::uninit();
911            let mut buffering_left = mem::MaybeUninit::uninit();
912
913            ffi::gst_message_parse_buffering_stats(
914                self.as_mut_ptr(),
915                mode.as_mut_ptr(),
916                avg_in.as_mut_ptr(),
917                avg_out.as_mut_ptr(),
918                buffering_left.as_mut_ptr(),
919            );
920
921            (
922                from_glib(mode.assume_init()),
923                avg_in.assume_init(),
924                avg_out.assume_init(),
925                buffering_left.assume_init(),
926            )
927        }
928    }
929
930    #[doc(alias = "get_buffering_stats")]
931    #[doc(alias = "gst_message_parse_buffering_stats")]
932    pub fn mode(&self) -> crate::BufferingMode {
933        self.buffering_stats().0
934    }
935
936    #[doc(alias = "get_buffering_stats")]
937    #[doc(alias = "gst_message_parse_buffering_stats")]
938    pub fn avg_in(&self) -> i32 {
939        self.buffering_stats().1
940    }
941
942    #[doc(alias = "get_buffering_stats")]
943    #[doc(alias = "gst_message_parse_buffering_stats")]
944    pub fn avg_out(&self) -> i32 {
945        self.buffering_stats().2
946    }
947
948    #[doc(alias = "get_buffering_stats")]
949    #[doc(alias = "gst_message_parse_buffering_stats")]
950    pub fn buffering_left(&self) -> i64 {
951        self.buffering_stats().3
952    }
953}
954
955impl std::fmt::Debug for Buffering {
956    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
957        f.debug_struct("Buffering")
958            .field("structure", &self.message().structure())
959            .field("source", &self.src().map(|obj| (obj, obj.name())))
960            .field("percent", &self.percent())
961            .field("buffering-stats", &self.buffering_stats())
962            .finish()
963    }
964}
965
966impl std::fmt::Debug for Buffering<Message> {
967    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
968        Buffering::<MessageRef>::fmt(self, f)
969    }
970}
971
972declare_concrete_message!(StateChanged, T);
973impl StateChanged {
974    #[doc(alias = "gst_message_new_state_changed")]
975    #[allow(clippy::new_ret_no_self)]
976    pub fn new(old: crate::State, new: crate::State, pending: crate::State) -> Message {
977        skip_assert_initialized!();
978        Self::builder(old, new, pending).build()
979    }
980
981    pub fn builder<'a>(
982        old: crate::State,
983        new: crate::State,
984        pending: crate::State,
985    ) -> StateChangedBuilder<'a> {
986        assert_initialized_main_thread!();
987        StateChangedBuilder::new(old, new, pending)
988    }
989
990    #[doc(alias = "get_old")]
991    #[doc(alias = "gst_message_parse_state_changed")]
992    pub fn old(&self) -> crate::State {
993        unsafe {
994            let mut state = mem::MaybeUninit::uninit();
995
996            ffi::gst_message_parse_state_changed(
997                self.as_mut_ptr(),
998                state.as_mut_ptr(),
999                ptr::null_mut(),
1000                ptr::null_mut(),
1001            );
1002
1003            from_glib(state.assume_init())
1004        }
1005    }
1006
1007    #[doc(alias = "get_current")]
1008    #[doc(alias = "gst_message_parse_state_changed")]
1009    pub fn current(&self) -> crate::State {
1010        unsafe {
1011            let mut state = mem::MaybeUninit::uninit();
1012
1013            ffi::gst_message_parse_state_changed(
1014                self.as_mut_ptr(),
1015                ptr::null_mut(),
1016                state.as_mut_ptr(),
1017                ptr::null_mut(),
1018            );
1019
1020            from_glib(state.assume_init())
1021        }
1022    }
1023
1024    #[doc(alias = "get_pending")]
1025    #[doc(alias = "gst_message_parse_state_changed")]
1026    pub fn pending(&self) -> crate::State {
1027        unsafe {
1028            let mut state = mem::MaybeUninit::uninit();
1029
1030            ffi::gst_message_parse_state_changed(
1031                self.as_mut_ptr(),
1032                ptr::null_mut(),
1033                ptr::null_mut(),
1034                state.as_mut_ptr(),
1035            );
1036
1037            from_glib(state.assume_init())
1038        }
1039    }
1040}
1041
1042impl std::fmt::Debug for StateChanged {
1043    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1044        f.debug_struct("StateChanged")
1045            .field("structure", &self.message().structure())
1046            .field("source", &self.src().map(|obj| (obj, obj.name())))
1047            .field("old", &self.old())
1048            .field("current", &self.current())
1049            .field("pending", &self.pending())
1050            .finish()
1051    }
1052}
1053
1054impl std::fmt::Debug for StateChanged<Message> {
1055    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1056        StateChanged::<MessageRef>::fmt(self, f)
1057    }
1058}
1059
1060declare_concrete_message!(StateDirty, T);
1061impl StateDirty {
1062    #[doc(alias = "gst_message_new_state_dirty")]
1063    #[allow(clippy::new_ret_no_self)]
1064    pub fn new() -> Message {
1065        skip_assert_initialized!();
1066        Self::builder().build()
1067    }
1068
1069    pub fn builder<'a>() -> StateDirtyBuilder<'a> {
1070        assert_initialized_main_thread!();
1071        StateDirtyBuilder::new()
1072    }
1073}
1074
1075impl std::fmt::Debug for StateDirty {
1076    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1077        f.debug_struct("StateDirty")
1078            .field("structure", &self.message().structure())
1079            .field("source", &self.src().map(|obj| (obj, obj.name())))
1080            .finish()
1081    }
1082}
1083
1084impl std::fmt::Debug for StateDirty<Message> {
1085    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1086        StateDirty::<MessageRef>::fmt(self, f)
1087    }
1088}
1089
1090declare_concrete_message!(StepDone, T);
1091impl StepDone {
1092    #[doc(alias = "gst_message_new_step_done")]
1093    #[allow(clippy::new_ret_no_self)]
1094    pub fn new(
1095        amount: impl FormattedValue,
1096        rate: f64,
1097        flush: bool,
1098        intermediate: bool,
1099        duration: impl Into<Option<crate::ClockTime>>,
1100        eos: bool,
1101    ) -> Message {
1102        skip_assert_initialized!();
1103        Self::builder(amount, rate, flush, intermediate, duration, eos).build()
1104    }
1105
1106    pub fn builder<'a>(
1107        amount: impl FormattedValue,
1108        rate: f64,
1109        flush: bool,
1110        intermediate: bool,
1111        duration: impl Into<Option<crate::ClockTime>>,
1112        eos: bool,
1113    ) -> StepDoneBuilder<'a> {
1114        assert_initialized_main_thread!();
1115        StepDoneBuilder::new(
1116            amount.into(),
1117            rate,
1118            flush,
1119            intermediate,
1120            duration.into(),
1121            eos,
1122        )
1123    }
1124
1125    #[doc(alias = "gst_message_parse_step_done")]
1126    pub fn get(
1127        &self,
1128    ) -> (
1129        GenericFormattedValue,
1130        f64,
1131        bool,
1132        bool,
1133        Option<crate::ClockTime>,
1134        bool,
1135    ) {
1136        unsafe {
1137            let mut format = mem::MaybeUninit::uninit();
1138            let mut amount = mem::MaybeUninit::uninit();
1139            let mut rate = mem::MaybeUninit::uninit();
1140            let mut flush = mem::MaybeUninit::uninit();
1141            let mut intermediate = mem::MaybeUninit::uninit();
1142            let mut duration = mem::MaybeUninit::uninit();
1143            let mut eos = mem::MaybeUninit::uninit();
1144
1145            ffi::gst_message_parse_step_done(
1146                self.as_mut_ptr(),
1147                format.as_mut_ptr(),
1148                amount.as_mut_ptr(),
1149                rate.as_mut_ptr(),
1150                flush.as_mut_ptr(),
1151                intermediate.as_mut_ptr(),
1152                duration.as_mut_ptr(),
1153                eos.as_mut_ptr(),
1154            );
1155
1156            (
1157                GenericFormattedValue::new(
1158                    from_glib(format.assume_init()),
1159                    amount.assume_init() as i64,
1160                ),
1161                rate.assume_init(),
1162                from_glib(flush.assume_init()),
1163                from_glib(intermediate.assume_init()),
1164                from_glib(duration.assume_init()),
1165                from_glib(eos.assume_init()),
1166            )
1167        }
1168    }
1169
1170    #[doc(alias = "gst_message_parse_step_done")]
1171    pub fn format(&self) -> GenericFormattedValue {
1172        self.get().0
1173    }
1174
1175    #[doc(alias = "gst_message_parse_step_done")]
1176    pub fn rate(&self) -> f64 {
1177        self.get().1
1178    }
1179
1180    #[doc(alias = "gst_message_parse_step_done")]
1181    pub fn flush(&self) -> bool {
1182        self.get().2
1183    }
1184
1185    #[doc(alias = "gst_message_parse_step_done")]
1186    pub fn intermediate(&self) -> bool {
1187        self.get().3
1188    }
1189
1190    #[doc(alias = "gst_message_parse_step_done")]
1191    pub fn duration(&self) -> Option<crate::ClockTime> {
1192        self.get().4
1193    }
1194
1195    #[doc(alias = "gst_message_parse_step_done")]
1196    pub fn eos(&self) -> bool {
1197        self.get().5
1198    }
1199}
1200
1201impl std::fmt::Debug for StepDone {
1202    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1203        let (format, rate, flush, intermediate, duration, eos) = self.get();
1204        f.debug_struct("StepDone")
1205            .field("structure", &self.message().structure())
1206            .field("source", &self.src().map(|obj| (obj, obj.name())))
1207            .field("format", &format)
1208            .field("rate", &rate)
1209            .field("flush", &flush)
1210            .field("intermediate", &intermediate)
1211            .field("duration", &duration)
1212            .field("eos", &eos)
1213            .finish()
1214    }
1215}
1216
1217impl std::fmt::Debug for StepDone<Message> {
1218    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1219        StepDone::<MessageRef>::fmt(self, f)
1220    }
1221}
1222
1223declare_concrete_message!(ClockProvide, T);
1224impl ClockProvide {
1225    #[doc(alias = "gst_message_new_clock_provide")]
1226    #[allow(clippy::new_ret_no_self)]
1227    pub fn new(clock: &crate::Clock, ready: bool) -> Message {
1228        skip_assert_initialized!();
1229        Self::builder(clock, ready).build()
1230    }
1231
1232    pub fn builder(clock: &crate::Clock, ready: bool) -> ClockProvideBuilder<'_> {
1233        assert_initialized_main_thread!();
1234        ClockProvideBuilder::new(clock, ready)
1235    }
1236
1237    #[doc(alias = "get_clock")]
1238    #[doc(alias = "gst_message_parse_clock_provide")]
1239    pub fn clock(&self) -> Option<crate::Clock> {
1240        let mut clock = ptr::null_mut();
1241
1242        unsafe {
1243            ffi::gst_message_parse_clock_provide(self.as_mut_ptr(), &mut clock, ptr::null_mut());
1244
1245            from_glib_none(clock)
1246        }
1247    }
1248
1249    #[doc(alias = "get_ready")]
1250    #[doc(alias = "gst_message_parse_clock_provide")]
1251    pub fn is_ready(&self) -> bool {
1252        unsafe {
1253            let mut ready = mem::MaybeUninit::uninit();
1254
1255            ffi::gst_message_parse_clock_provide(
1256                self.as_mut_ptr(),
1257                ptr::null_mut(),
1258                ready.as_mut_ptr(),
1259            );
1260
1261            from_glib(ready.assume_init())
1262        }
1263    }
1264}
1265
1266impl std::fmt::Debug for ClockProvide {
1267    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1268        f.debug_struct("ClockProvide")
1269            .field("structure", &self.message().structure())
1270            .field("source", &self.src().map(|obj| (obj, obj.name())))
1271            .field("clock", &self.clock())
1272            .field("is-ready", &self.is_ready())
1273            .finish()
1274    }
1275}
1276
1277impl std::fmt::Debug for ClockProvide<Message> {
1278    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1279        ClockProvide::<MessageRef>::fmt(self, f)
1280    }
1281}
1282
1283declare_concrete_message!(ClockLost, T);
1284impl ClockLost {
1285    #[doc(alias = "gst_message_new_clock_lost")]
1286    #[allow(clippy::new_ret_no_self)]
1287    pub fn new(clock: &crate::Clock) -> Message {
1288        skip_assert_initialized!();
1289        Self::builder(clock).build()
1290    }
1291
1292    pub fn builder(clock: &crate::Clock) -> ClockLostBuilder<'_> {
1293        assert_initialized_main_thread!();
1294        ClockLostBuilder::new(clock)
1295    }
1296
1297    #[doc(alias = "get_clock")]
1298    #[doc(alias = "gst_message_parse_clock_lost")]
1299    pub fn clock(&self) -> Option<crate::Clock> {
1300        let mut clock = ptr::null_mut();
1301
1302        unsafe {
1303            ffi::gst_message_parse_clock_lost(self.as_mut_ptr(), &mut clock);
1304
1305            from_glib_none(clock)
1306        }
1307    }
1308}
1309
1310impl std::fmt::Debug for ClockLost {
1311    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1312        f.debug_struct("ClockLost")
1313            .field("structure", &self.message().structure())
1314            .field("source", &self.src().map(|obj| (obj, obj.name())))
1315            .field("clock", &self.clock())
1316            .finish()
1317    }
1318}
1319
1320impl std::fmt::Debug for ClockLost<Message> {
1321    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1322        ClockLost::<MessageRef>::fmt(self, f)
1323    }
1324}
1325
1326declare_concrete_message!(NewClock, T);
1327impl NewClock {
1328    #[doc(alias = "gst_message_new_new_clock")]
1329    #[allow(clippy::new_ret_no_self)]
1330    pub fn new(clock: &crate::Clock) -> Message {
1331        skip_assert_initialized!();
1332        Self::builder(clock).build()
1333    }
1334
1335    pub fn builder(clock: &crate::Clock) -> NewClockBuilder<'_> {
1336        assert_initialized_main_thread!();
1337        NewClockBuilder::new(clock)
1338    }
1339
1340    #[doc(alias = "get_clock")]
1341    #[doc(alias = "gst_message_parse_new_clock")]
1342    pub fn clock(&self) -> Option<crate::Clock> {
1343        let mut clock = ptr::null_mut();
1344
1345        unsafe {
1346            ffi::gst_message_parse_new_clock(self.as_mut_ptr(), &mut clock);
1347
1348            from_glib_none(clock)
1349        }
1350    }
1351}
1352
1353impl std::fmt::Debug for NewClock {
1354    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1355        f.debug_struct("NewClock")
1356            .field("structure", &self.message().structure())
1357            .field("source", &self.src().map(|obj| (obj, obj.name())))
1358            .field("clock", &self.clock())
1359            .finish()
1360    }
1361}
1362
1363impl std::fmt::Debug for NewClock<Message> {
1364    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1365        NewClock::<MessageRef>::fmt(self, f)
1366    }
1367}
1368
1369declare_concrete_message!(StructureChange, T);
1370impl StructureChange {
1371    #[doc(alias = "gst_message_new_structure_change")]
1372    #[allow(clippy::new_ret_no_self)]
1373    pub fn new(type_: crate::StructureChangeType, owner: &crate::Element, busy: bool) -> Message {
1374        skip_assert_initialized!();
1375        Self::builder(type_, owner, busy).build()
1376    }
1377
1378    pub fn builder(
1379        type_: crate::StructureChangeType,
1380        owner: &crate::Element,
1381        busy: bool,
1382    ) -> StructureChangeBuilder<'_> {
1383        assert_initialized_main_thread!();
1384        StructureChangeBuilder::new(type_, owner, busy)
1385    }
1386
1387    #[doc(alias = "gst_message_parse_structure_change")]
1388    pub fn get(&self) -> (crate::StructureChangeType, crate::Element, bool) {
1389        unsafe {
1390            let mut type_ = mem::MaybeUninit::uninit();
1391            let mut owner = ptr::null_mut();
1392            let mut busy = mem::MaybeUninit::uninit();
1393
1394            ffi::gst_message_parse_structure_change(
1395                self.as_mut_ptr(),
1396                type_.as_mut_ptr(),
1397                &mut owner,
1398                busy.as_mut_ptr(),
1399            );
1400
1401            (
1402                from_glib(type_.assume_init()),
1403                from_glib_none(owner),
1404                from_glib(busy.assume_init()),
1405            )
1406        }
1407    }
1408
1409    #[doc(alias = "gst_message_parse_structure_change")]
1410    pub fn type_(&self) -> crate::StructureChangeType {
1411        self.get().0
1412    }
1413
1414    #[doc(alias = "gst_message_parse_structure_change")]
1415    pub fn owner(&self) -> crate::Element {
1416        self.get().1
1417    }
1418
1419    #[doc(alias = "gst_message_parse_structure_change")]
1420    pub fn busy(&self) -> bool {
1421        self.get().2
1422    }
1423}
1424
1425impl std::fmt::Debug for StructureChange {
1426    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1427        let (type_, owner, busy) = self.get();
1428
1429        f.debug_struct("StructureChange")
1430            .field("structure", &self.message().structure())
1431            .field("source", &self.src().map(|obj| (obj, obj.name())))
1432            .field("type", &type_)
1433            .field("owner", &owner)
1434            .field("busy", &busy)
1435            .finish()
1436    }
1437}
1438
1439impl std::fmt::Debug for StructureChange<Message> {
1440    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1441        StructureChange::<MessageRef>::fmt(self, f)
1442    }
1443}
1444
1445declare_concrete_message!(StreamStatus, T);
1446impl StreamStatus {
1447    #[doc(alias = "gst_message_new_stream_status")]
1448    #[allow(clippy::new_ret_no_self)]
1449    pub fn new(type_: crate::StreamStatusType, owner: &crate::Element) -> Message {
1450        skip_assert_initialized!();
1451        Self::builder(type_, owner).build()
1452    }
1453
1454    pub fn builder(
1455        type_: crate::StreamStatusType,
1456        owner: &crate::Element,
1457    ) -> StreamStatusBuilder<'_> {
1458        assert_initialized_main_thread!();
1459        StreamStatusBuilder::new(type_, owner)
1460    }
1461
1462    #[doc(alias = "gst_message_parse_stream_status")]
1463    pub fn get(&self) -> (crate::StreamStatusType, crate::Element) {
1464        unsafe {
1465            let mut type_ = mem::MaybeUninit::uninit();
1466            let mut owner = ptr::null_mut();
1467
1468            ffi::gst_message_parse_stream_status(self.as_mut_ptr(), type_.as_mut_ptr(), &mut owner);
1469
1470            (from_glib(type_.assume_init()), from_glib_none(owner))
1471        }
1472    }
1473
1474    #[doc(alias = "gst_message_parse_stream_status")]
1475    pub fn type_(&self) -> crate::StreamStatusType {
1476        self.get().0
1477    }
1478
1479    #[doc(alias = "gst_message_parse_stream_status")]
1480    pub fn owner(&self) -> crate::Element {
1481        self.get().1
1482    }
1483
1484    #[doc(alias = "get_stream_status_object")]
1485    #[doc(alias = "gst_message_get_stream_status_object")]
1486    pub fn stream_status_object(&self) -> Option<glib::Value> {
1487        unsafe {
1488            let value = ffi::gst_message_get_stream_status_object(self.as_mut_ptr());
1489
1490            from_glib_none(value)
1491        }
1492    }
1493}
1494
1495impl std::fmt::Debug for StreamStatus {
1496    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1497        f.debug_struct("StreamStatus")
1498            .field("structure", &self.message().structure())
1499            .field("source", &self.src().map(|obj| (obj, obj.name())))
1500            .field("status", &self.stream_status_object())
1501            .finish()
1502    }
1503}
1504
1505impl std::fmt::Debug for StreamStatus<Message> {
1506    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1507        StreamStatus::<MessageRef>::fmt(self, f)
1508    }
1509}
1510
1511declare_concrete_message!(Application, T);
1512impl Application {
1513    #[doc(alias = "gst_message_new_application")]
1514    #[allow(clippy::new_ret_no_self)]
1515    pub fn new(structure: crate::Structure) -> Message {
1516        skip_assert_initialized!();
1517        Self::builder(structure).build()
1518    }
1519
1520    pub fn builder<'a>(structure: crate::Structure) -> ApplicationBuilder<'a> {
1521        assert_initialized_main_thread!();
1522        ApplicationBuilder::new(structure)
1523    }
1524}
1525
1526impl std::fmt::Debug for Application {
1527    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1528        f.debug_struct("Application")
1529            .field("structure", &self.message().structure())
1530            .field("source", &self.src().map(|obj| (obj, obj.name())))
1531            .finish()
1532    }
1533}
1534
1535impl std::fmt::Debug for Application<Message> {
1536    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1537        Application::<MessageRef>::fmt(self, f)
1538    }
1539}
1540
1541declare_concrete_message!(Element, T);
1542impl Element {
1543    #[doc(alias = "gst_message_new_element")]
1544    #[allow(clippy::new_ret_no_self)]
1545    pub fn new(structure: crate::Structure) -> Message {
1546        skip_assert_initialized!();
1547        Self::builder(structure).build()
1548    }
1549
1550    pub fn builder<'a>(structure: crate::Structure) -> ElementBuilder<'a> {
1551        assert_initialized_main_thread!();
1552        ElementBuilder::new(structure)
1553    }
1554}
1555
1556impl std::fmt::Debug for Element {
1557    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1558        f.debug_struct("Element")
1559            .field("structure", &self.message().structure())
1560            .field("source", &self.src().map(|obj| (obj, obj.name())))
1561            .finish()
1562    }
1563}
1564
1565impl std::fmt::Debug for Element<Message> {
1566    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1567        Element::<MessageRef>::fmt(self, f)
1568    }
1569}
1570
1571declare_concrete_message!(SegmentStart, T);
1572impl SegmentStart {
1573    #[doc(alias = "gst_message_new_segment_start")]
1574    #[allow(clippy::new_ret_no_self)]
1575    pub fn new(position: impl FormattedValue) -> Message {
1576        skip_assert_initialized!();
1577        Self::builder(position).build()
1578    }
1579
1580    pub fn builder<'a>(position: impl FormattedValue) -> SegmentStartBuilder<'a> {
1581        assert_initialized_main_thread!();
1582        SegmentStartBuilder::new(position.into())
1583    }
1584
1585    #[doc(alias = "gst_message_parse_segment_start")]
1586    pub fn get(&self) -> GenericFormattedValue {
1587        unsafe {
1588            let mut format = mem::MaybeUninit::uninit();
1589            let mut position = mem::MaybeUninit::uninit();
1590
1591            ffi::gst_message_parse_segment_start(
1592                self.as_mut_ptr(),
1593                format.as_mut_ptr(),
1594                position.as_mut_ptr(),
1595            );
1596
1597            GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1598        }
1599    }
1600}
1601
1602impl std::fmt::Debug for SegmentStart {
1603    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1604        f.debug_struct("SegmentStart")
1605            .field("structure", &self.message().structure())
1606            .field("source", &self.src().map(|obj| (obj, obj.name())))
1607            .field("segment", &self.get())
1608            .finish()
1609    }
1610}
1611
1612impl std::fmt::Debug for SegmentStart<Message> {
1613    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1614        SegmentStart::<MessageRef>::fmt(self, f)
1615    }
1616}
1617
1618declare_concrete_message!(SegmentDone, T);
1619impl SegmentDone {
1620    #[doc(alias = "gst_message_new_segment_done")]
1621    #[allow(clippy::new_ret_no_self)]
1622    pub fn new(position: impl FormattedValue) -> Message {
1623        skip_assert_initialized!();
1624        Self::builder(position).build()
1625    }
1626
1627    pub fn builder<'a>(position: impl FormattedValue) -> SegmentDoneBuilder<'a> {
1628        assert_initialized_main_thread!();
1629        SegmentDoneBuilder::new(position.into())
1630    }
1631
1632    #[doc(alias = "gst_message_parse_segment_done")]
1633    pub fn get(&self) -> GenericFormattedValue {
1634        unsafe {
1635            let mut format = mem::MaybeUninit::uninit();
1636            let mut position = mem::MaybeUninit::uninit();
1637
1638            ffi::gst_message_parse_segment_done(
1639                self.as_mut_ptr(),
1640                format.as_mut_ptr(),
1641                position.as_mut_ptr(),
1642            );
1643
1644            GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1645        }
1646    }
1647}
1648
1649impl std::fmt::Debug for SegmentDone {
1650    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1651        f.debug_struct("SegmentDone")
1652            .field("structure", &self.message().structure())
1653            .field("source", &self.src().map(|obj| (obj, obj.name())))
1654            .field("segment", &self.get())
1655            .finish()
1656    }
1657}
1658
1659impl std::fmt::Debug for SegmentDone<Message> {
1660    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1661        SegmentDone::<MessageRef>::fmt(self, f)
1662    }
1663}
1664
1665declare_concrete_message!(DurationChanged, T);
1666impl DurationChanged {
1667    #[doc(alias = "gst_message_new_duration_changed")]
1668    #[allow(clippy::new_ret_no_self)]
1669    pub fn new() -> Message {
1670        skip_assert_initialized!();
1671        Self::builder().build()
1672    }
1673
1674    pub fn builder<'a>() -> DurationChangedBuilder<'a> {
1675        assert_initialized_main_thread!();
1676        DurationChangedBuilder::new()
1677    }
1678}
1679
1680impl std::fmt::Debug for DurationChanged {
1681    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1682        f.debug_struct("DurationChanged")
1683            .field("structure", &self.message().structure())
1684            .field("source", &self.src().map(|obj| (obj, obj.name())))
1685            .finish()
1686    }
1687}
1688
1689impl std::fmt::Debug for DurationChanged<Message> {
1690    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1691        DurationChanged::<MessageRef>::fmt(self, f)
1692    }
1693}
1694
1695declare_concrete_message!(Latency, T);
1696impl Latency {
1697    #[doc(alias = "gst_message_new_latency")]
1698    #[allow(clippy::new_ret_no_self)]
1699    pub fn new() -> Message {
1700        skip_assert_initialized!();
1701        Self::builder().build()
1702    }
1703
1704    pub fn builder<'a>() -> LatencyBuilder<'a> {
1705        assert_initialized_main_thread!();
1706        LatencyBuilder::new()
1707    }
1708}
1709
1710impl std::fmt::Debug for Latency {
1711    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1712        f.debug_struct("Latency")
1713            .field("structure", &self.message().structure())
1714            .field("source", &self.src().map(|obj| (obj, obj.name())))
1715            .finish()
1716    }
1717}
1718
1719impl std::fmt::Debug for Latency<Message> {
1720    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1721        Latency::<MessageRef>::fmt(self, f)
1722    }
1723}
1724
1725declare_concrete_message!(AsyncStart, T);
1726impl AsyncStart {
1727    #[doc(alias = "gst_message_new_async_start")]
1728    #[allow(clippy::new_ret_no_self)]
1729    pub fn new() -> Message {
1730        skip_assert_initialized!();
1731        Self::builder().build()
1732    }
1733
1734    pub fn builder<'a>() -> AsyncStartBuilder<'a> {
1735        assert_initialized_main_thread!();
1736        AsyncStartBuilder::new()
1737    }
1738}
1739
1740impl std::fmt::Debug for AsyncStart {
1741    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1742        f.debug_struct("AsyncStart")
1743            .field("structure", &self.message().structure())
1744            .field("source", &self.src().map(|obj| (obj, obj.name())))
1745            .finish()
1746    }
1747}
1748
1749impl std::fmt::Debug for AsyncStart<Message> {
1750    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1751        AsyncStart::<MessageRef>::fmt(self, f)
1752    }
1753}
1754
1755declare_concrete_message!(AsyncDone, T);
1756impl AsyncDone {
1757    #[doc(alias = "gst_message_new_async_done")]
1758    #[allow(clippy::new_ret_no_self)]
1759    pub fn new(running_time: impl Into<Option<crate::ClockTime>>) -> Message {
1760        skip_assert_initialized!();
1761        Self::builder().running_time(running_time).build()
1762    }
1763
1764    pub fn builder<'a>() -> AsyncDoneBuilder<'a> {
1765        assert_initialized_main_thread!();
1766        AsyncDoneBuilder::new()
1767    }
1768
1769    #[doc(alias = "get_running_time")]
1770    #[doc(alias = "gst_message_parse_async_done")]
1771    pub fn running_time(&self) -> Option<crate::ClockTime> {
1772        unsafe {
1773            let mut running_time = mem::MaybeUninit::uninit();
1774
1775            ffi::gst_message_parse_async_done(self.as_mut_ptr(), running_time.as_mut_ptr());
1776
1777            from_glib(running_time.assume_init())
1778        }
1779    }
1780}
1781
1782impl std::fmt::Debug for AsyncDone {
1783    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1784        f.debug_struct("AsyncDone")
1785            .field("structure", &self.message().structure())
1786            .field("source", &self.src().map(|obj| (obj, obj.name())))
1787            .field("running-time", &self.running_time())
1788            .finish()
1789    }
1790}
1791
1792impl std::fmt::Debug for AsyncDone<Message> {
1793    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1794        AsyncDone::<MessageRef>::fmt(self, f)
1795    }
1796}
1797
1798declare_concrete_message!(RequestState, T);
1799impl RequestState {
1800    #[doc(alias = "gst_message_new_request_state")]
1801    #[allow(clippy::new_ret_no_self)]
1802    pub fn new(state: crate::State) -> Message {
1803        skip_assert_initialized!();
1804        Self::builder(state).build()
1805    }
1806
1807    pub fn builder<'a>(state: crate::State) -> RequestStateBuilder<'a> {
1808        assert_initialized_main_thread!();
1809        RequestStateBuilder::new(state)
1810    }
1811
1812    #[doc(alias = "get_requested_state")]
1813    #[doc(alias = "gst_message_parse_request_state")]
1814    pub fn requested_state(&self) -> crate::State {
1815        unsafe {
1816            let mut state = mem::MaybeUninit::uninit();
1817
1818            ffi::gst_message_parse_request_state(self.as_mut_ptr(), state.as_mut_ptr());
1819
1820            from_glib(state.assume_init())
1821        }
1822    }
1823}
1824
1825impl std::fmt::Debug for RequestState {
1826    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1827        f.debug_struct("RequestState")
1828            .field("structure", &self.message().structure())
1829            .field("source", &self.src().map(|obj| (obj, obj.name())))
1830            .field("requested-state", &self.requested_state())
1831            .finish()
1832    }
1833}
1834
1835impl std::fmt::Debug for RequestState<Message> {
1836    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1837        RequestState::<MessageRef>::fmt(self, f)
1838    }
1839}
1840
1841declare_concrete_message!(StepStart, T);
1842impl StepStart {
1843    #[doc(alias = "gst_message_new_step_start")]
1844    #[allow(clippy::new_ret_no_self)]
1845    pub fn new(
1846        active: bool,
1847        amount: impl FormattedValue,
1848        rate: f64,
1849        flush: bool,
1850        intermediate: bool,
1851    ) -> Message {
1852        skip_assert_initialized!();
1853        Self::builder(active, amount, rate, flush, intermediate).build()
1854    }
1855
1856    pub fn builder<'a>(
1857        active: bool,
1858        amount: impl FormattedValue,
1859        rate: f64,
1860        flush: bool,
1861        intermediate: bool,
1862    ) -> StepStartBuilder<'a> {
1863        assert_initialized_main_thread!();
1864        StepStartBuilder::new(active, amount.into(), rate, flush, intermediate)
1865    }
1866
1867    #[doc(alias = "gst_message_parse_step_start")]
1868    pub fn get(&self) -> (bool, GenericFormattedValue, f64, bool, bool) {
1869        unsafe {
1870            let mut active = mem::MaybeUninit::uninit();
1871            let mut format = mem::MaybeUninit::uninit();
1872            let mut amount = mem::MaybeUninit::uninit();
1873            let mut rate = mem::MaybeUninit::uninit();
1874            let mut flush = mem::MaybeUninit::uninit();
1875            let mut intermediate = mem::MaybeUninit::uninit();
1876
1877            ffi::gst_message_parse_step_start(
1878                self.as_mut_ptr(),
1879                active.as_mut_ptr(),
1880                format.as_mut_ptr(),
1881                amount.as_mut_ptr(),
1882                rate.as_mut_ptr(),
1883                flush.as_mut_ptr(),
1884                intermediate.as_mut_ptr(),
1885            );
1886
1887            (
1888                from_glib(active.assume_init()),
1889                GenericFormattedValue::new(
1890                    from_glib(format.assume_init()),
1891                    amount.assume_init() as i64,
1892                ),
1893                rate.assume_init(),
1894                from_glib(flush.assume_init()),
1895                from_glib(intermediate.assume_init()),
1896            )
1897        }
1898    }
1899
1900    #[doc(alias = "gst_message_parse_step_start")]
1901    pub fn active(&self) -> bool {
1902        self.get().0
1903    }
1904
1905    #[doc(alias = "gst_message_parse_step_start")]
1906    pub fn amount(&self) -> GenericFormattedValue {
1907        self.get().1
1908    }
1909
1910    #[doc(alias = "gst_message_parse_step_start")]
1911    pub fn rate(&self) -> f64 {
1912        self.get().2
1913    }
1914
1915    #[doc(alias = "gst_message_parse_step_start")]
1916    pub fn flush(&self) -> bool {
1917        self.get().3
1918    }
1919
1920    #[doc(alias = "gst_message_parse_step_start")]
1921    pub fn intermediate(&self) -> bool {
1922        self.get().4
1923    }
1924}
1925
1926impl std::fmt::Debug for StepStart {
1927    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1928        let (active, amount, rate, flush, intermediate) = self.get();
1929        f.debug_struct("StepStart")
1930            .field("structure", &self.message().structure())
1931            .field("source", &self.src().map(|obj| (obj, obj.name())))
1932            .field("active", &active)
1933            .field("amount", &amount)
1934            .field("rate", &rate)
1935            .field("flush", &flush)
1936            .field("intermediate", &intermediate)
1937            .finish()
1938    }
1939}
1940
1941impl std::fmt::Debug for StepStart<Message> {
1942    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1943        StepStart::<MessageRef>::fmt(self, f)
1944    }
1945}
1946
1947declare_concrete_message!(Qos, T);
1948impl Qos {
1949    #[doc(alias = "gst_message_new_qos")]
1950    #[allow(clippy::new_ret_no_self)]
1951    pub fn new(
1952        live: bool,
1953        running_time: impl Into<Option<crate::ClockTime>>,
1954        stream_time: impl Into<Option<crate::ClockTime>>,
1955        timestamp: impl Into<Option<crate::ClockTime>>,
1956        duration: impl Into<Option<crate::ClockTime>>,
1957    ) -> Message {
1958        skip_assert_initialized!();
1959        Self::builder(live)
1960            .running_time(running_time)
1961            .stream_time(stream_time)
1962            .timestamp(timestamp)
1963            .duration(duration)
1964            .build()
1965    }
1966
1967    pub fn builder<'a>(live: bool) -> QosBuilder<'a> {
1968        assert_initialized_main_thread!();
1969        QosBuilder::new(live)
1970    }
1971
1972    #[doc(alias = "gst_message_parse_qos")]
1973    pub fn get(
1974        &self,
1975    ) -> (
1976        bool,
1977        Option<crate::ClockTime>,
1978        Option<crate::ClockTime>,
1979        Option<crate::ClockTime>,
1980        Option<crate::ClockTime>,
1981    ) {
1982        unsafe {
1983            let mut live = mem::MaybeUninit::uninit();
1984            let mut running_time = mem::MaybeUninit::uninit();
1985            let mut stream_time = mem::MaybeUninit::uninit();
1986            let mut timestamp = mem::MaybeUninit::uninit();
1987            let mut duration = mem::MaybeUninit::uninit();
1988
1989            ffi::gst_message_parse_qos(
1990                self.as_mut_ptr(),
1991                live.as_mut_ptr(),
1992                running_time.as_mut_ptr(),
1993                stream_time.as_mut_ptr(),
1994                timestamp.as_mut_ptr(),
1995                duration.as_mut_ptr(),
1996            );
1997
1998            (
1999                from_glib(live.assume_init()),
2000                from_glib(running_time.assume_init()),
2001                from_glib(stream_time.assume_init()),
2002                from_glib(timestamp.assume_init()),
2003                from_glib(duration.assume_init()),
2004            )
2005        }
2006    }
2007
2008    #[doc(alias = "gst_message_parse_qos")]
2009    pub fn live(&self) -> bool {
2010        self.get().0
2011    }
2012
2013    #[doc(alias = "gst_message_parse_qos")]
2014    pub fn running_time(&self) -> Option<crate::ClockTime> {
2015        self.get().1
2016    }
2017
2018    #[doc(alias = "gst_message_parse_qos")]
2019    pub fn stream_time(&self) -> Option<crate::ClockTime> {
2020        self.get().2
2021    }
2022
2023    #[doc(alias = "gst_message_parse_qos")]
2024    pub fn timestamp(&self) -> Option<crate::ClockTime> {
2025        self.get().3
2026    }
2027
2028    #[doc(alias = "gst_message_parse_qos")]
2029    pub fn duration(&self) -> Option<crate::ClockTime> {
2030        self.get().4
2031    }
2032
2033    #[doc(alias = "get_values")]
2034    #[doc(alias = "gst_message_parse_qos_values")]
2035    pub fn values(&self) -> (i64, f64, i32) {
2036        unsafe {
2037            let mut jitter = mem::MaybeUninit::uninit();
2038            let mut proportion = mem::MaybeUninit::uninit();
2039            let mut quality = mem::MaybeUninit::uninit();
2040
2041            ffi::gst_message_parse_qos_values(
2042                self.as_mut_ptr(),
2043                jitter.as_mut_ptr(),
2044                proportion.as_mut_ptr(),
2045                quality.as_mut_ptr(),
2046            );
2047
2048            (
2049                jitter.assume_init(),
2050                proportion.assume_init(),
2051                quality.assume_init(),
2052            )
2053        }
2054    }
2055
2056    #[doc(alias = "get_values")]
2057    #[doc(alias = "gst_message_parse_qos_values")]
2058    pub fn jitter(&self) -> i64 {
2059        self.values().0
2060    }
2061
2062    #[doc(alias = "get_values")]
2063    #[doc(alias = "gst_message_parse_qos_values")]
2064    pub fn proportion(&self) -> f64 {
2065        self.values().1
2066    }
2067
2068    #[doc(alias = "get_values")]
2069    #[doc(alias = "gst_message_parse_qos_values")]
2070    pub fn quality(&self) -> i32 {
2071        self.values().2
2072    }
2073
2074    #[doc(alias = "get_stats")]
2075    #[doc(alias = "gst_message_parse_qos_stats")]
2076    pub fn stats(&self) -> (GenericFormattedValue, GenericFormattedValue) {
2077        unsafe {
2078            let mut format = mem::MaybeUninit::uninit();
2079            let mut processed = mem::MaybeUninit::uninit();
2080            let mut dropped = mem::MaybeUninit::uninit();
2081
2082            ffi::gst_message_parse_qos_stats(
2083                self.as_mut_ptr(),
2084                format.as_mut_ptr(),
2085                processed.as_mut_ptr(),
2086                dropped.as_mut_ptr(),
2087            );
2088
2089            (
2090                GenericFormattedValue::new(
2091                    from_glib(format.assume_init()),
2092                    processed.assume_init() as i64,
2093                ),
2094                GenericFormattedValue::new(
2095                    from_glib(format.assume_init()),
2096                    dropped.assume_init() as i64,
2097                ),
2098            )
2099        }
2100    }
2101
2102    #[doc(alias = "get_stats")]
2103    #[doc(alias = "gst_message_parse_qos_stats")]
2104    pub fn processed(&self) -> GenericFormattedValue {
2105        self.stats().0
2106    }
2107
2108    #[doc(alias = "get_stats")]
2109    #[doc(alias = "gst_message_parse_qos_stats")]
2110    pub fn dropped(&self) -> GenericFormattedValue {
2111        self.stats().1
2112    }
2113}
2114
2115impl std::fmt::Debug for Qos {
2116    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2117        let (live, running_time, stream_time, timestamp, duration) = self.get();
2118        let (jitter, proportion, quality) = self.values();
2119        let (processed, dropped) = self.stats();
2120
2121        f.debug_struct("Qos")
2122            .field("structure", &self.message().structure())
2123            .field("source", &self.src().map(|obj| (obj, obj.name())))
2124            .field("live", &live)
2125            .field("running-time", &running_time)
2126            .field("stream-time", &stream_time)
2127            .field("timestamp", &timestamp)
2128            .field("duration", &duration)
2129            .field("jitter", &jitter)
2130            .field("proportion", &proportion)
2131            .field("quality", &quality)
2132            .field("processed", &processed)
2133            .field("dropped", &dropped)
2134            .finish()
2135    }
2136}
2137
2138impl std::fmt::Debug for Qos<Message> {
2139    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2140        Qos::<MessageRef>::fmt(self, f)
2141    }
2142}
2143
2144declare_concrete_message!(Progress, T);
2145impl Progress {
2146    #[doc(alias = "gst_message_new_progress")]
2147    #[allow(clippy::new_ret_no_self)]
2148    pub fn new(type_: crate::ProgressType, code: &str, text: &str) -> Message {
2149        skip_assert_initialized!();
2150        Self::builder(type_, code, text).build()
2151    }
2152
2153    pub fn builder<'a>(
2154        type_: crate::ProgressType,
2155        code: &'a str,
2156        text: &'a str,
2157    ) -> ProgressBuilder<'a> {
2158        assert_initialized_main_thread!();
2159        ProgressBuilder::new(type_, code, text)
2160    }
2161
2162    #[doc(alias = "gst_message_parse_progress")]
2163    pub fn get(&self) -> (crate::ProgressType, &str, &str) {
2164        unsafe {
2165            let mut type_ = mem::MaybeUninit::uninit();
2166            let mut code = ptr::null_mut();
2167            let mut text = ptr::null_mut();
2168
2169            ffi::gst_message_parse_progress(
2170                self.as_mut_ptr(),
2171                type_.as_mut_ptr(),
2172                &mut code,
2173                &mut text,
2174            );
2175
2176            let code = CStr::from_ptr(code).to_str().unwrap();
2177            let text = CStr::from_ptr(text).to_str().unwrap();
2178
2179            (from_glib(type_.assume_init()), code, text)
2180        }
2181    }
2182
2183    #[doc(alias = "gst_message_parse_progress")]
2184    pub fn type_(&self) -> crate::ProgressType {
2185        self.get().0
2186    }
2187
2188    #[doc(alias = "gst_message_parse_progress")]
2189    pub fn code(&self) -> &str {
2190        self.get().1
2191    }
2192
2193    #[doc(alias = "gst_message_parse_progress")]
2194    pub fn text(&self) -> &str {
2195        self.get().2
2196    }
2197}
2198
2199impl std::fmt::Debug for Progress {
2200    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2201        let (type_, code, text) = self.get();
2202        f.debug_struct("Progress")
2203            .field("structure", &self.message().structure())
2204            .field("source", &self.src().map(|obj| (obj, obj.name())))
2205            .field("type", &type_)
2206            .field("code", &code)
2207            .field("text", &text)
2208            .finish()
2209    }
2210}
2211
2212impl std::fmt::Debug for Progress<Message> {
2213    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2214        Progress::<MessageRef>::fmt(self, f)
2215    }
2216}
2217
2218declare_concrete_message!(Toc, T);
2219impl Toc {
2220    // FIXME could use false for updated as default
2221    // Even better: use an enum for updated so that it is more explicit than true / false
2222    #[doc(alias = "gst_message_new_toc")]
2223    #[allow(clippy::new_ret_no_self)]
2224    pub fn new(toc: &crate::Toc, updated: bool) -> Message {
2225        skip_assert_initialized!();
2226        Self::builder(toc, updated).build()
2227    }
2228
2229    pub fn builder(toc: &crate::Toc, updated: bool) -> TocBuilder<'_> {
2230        assert_initialized_main_thread!();
2231        TocBuilder::new(toc, updated)
2232    }
2233
2234    #[doc(alias = "get_toc")]
2235    #[doc(alias = "gst_message_parse_toc")]
2236    pub fn toc(&self) -> (crate::Toc, bool) {
2237        unsafe {
2238            let mut toc = ptr::null_mut();
2239            let mut updated = mem::MaybeUninit::uninit();
2240            ffi::gst_message_parse_toc(self.as_mut_ptr(), &mut toc, updated.as_mut_ptr());
2241            (from_glib_full(toc), from_glib(updated.assume_init()))
2242        }
2243    }
2244
2245    #[doc(alias = "get_toc")]
2246    #[doc(alias = "gst_message_parse_toc")]
2247    pub fn toc_object(&self) -> crate::Toc {
2248        self.toc().0
2249    }
2250
2251    #[doc(alias = "get_toc")]
2252    #[doc(alias = "gst_message_parse_toc")]
2253    pub fn updated(&self) -> bool {
2254        self.toc().1
2255    }
2256}
2257
2258impl std::fmt::Debug for Toc {
2259    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2260        f.debug_struct("Toc")
2261            .field("structure", &self.message().structure())
2262            .field("source", &self.src().map(|obj| (obj, obj.name())))
2263            .field("toc", &self.toc())
2264            .finish()
2265    }
2266}
2267
2268impl std::fmt::Debug for Toc<Message> {
2269    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2270        Toc::<MessageRef>::fmt(self, f)
2271    }
2272}
2273
2274declare_concrete_message!(ResetTime, T);
2275impl ResetTime {
2276    #[doc(alias = "gst_message_new_reset_time")]
2277    #[allow(clippy::new_ret_no_self)]
2278    pub fn new(running_time: crate::ClockTime) -> Message {
2279        skip_assert_initialized!();
2280        Self::builder(running_time).build()
2281    }
2282
2283    pub fn builder<'a>(running_time: crate::ClockTime) -> ResetTimeBuilder<'a> {
2284        assert_initialized_main_thread!();
2285        ResetTimeBuilder::new(running_time)
2286    }
2287
2288    #[doc(alias = "get_running_time")]
2289    #[doc(alias = "gst_message_parse_reset_time")]
2290    pub fn running_time(&self) -> crate::ClockTime {
2291        unsafe {
2292            let mut running_time = mem::MaybeUninit::uninit();
2293
2294            ffi::gst_message_parse_reset_time(self.as_mut_ptr(), running_time.as_mut_ptr());
2295
2296            try_from_glib(running_time.assume_init()).expect("undefined running_time")
2297        }
2298    }
2299}
2300
2301impl std::fmt::Debug for ResetTime {
2302    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2303        f.debug_struct("ResetTime")
2304            .field("structure", &self.message().structure())
2305            .field("source", &self.src().map(|obj| (obj, obj.name())))
2306            .field("running-time", &self.running_time())
2307            .finish()
2308    }
2309}
2310
2311impl std::fmt::Debug for ResetTime<Message> {
2312    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2313        ResetTime::<MessageRef>::fmt(self, f)
2314    }
2315}
2316
2317declare_concrete_message!(StreamStart, T);
2318impl StreamStart {
2319    #[doc(alias = "gst_message_new_stream_start")]
2320    #[allow(clippy::new_ret_no_self)]
2321    pub fn new() -> Message {
2322        skip_assert_initialized!();
2323        Self::builder().build()
2324    }
2325
2326    pub fn builder<'a>() -> StreamStartBuilder<'a> {
2327        assert_initialized_main_thread!();
2328        StreamStartBuilder::new()
2329    }
2330
2331    #[doc(alias = "get_group_id")]
2332    #[doc(alias = "gst_message_parse_group_id")]
2333    pub fn group_id(&self) -> Option<GroupId> {
2334        unsafe {
2335            let mut group_id = mem::MaybeUninit::uninit();
2336
2337            if from_glib(ffi::gst_message_parse_group_id(
2338                self.as_mut_ptr(),
2339                group_id.as_mut_ptr(),
2340            )) {
2341                let group_id = group_id.assume_init();
2342                if group_id == 0 {
2343                    None
2344                } else {
2345                    Some(GroupId(NonZeroU32::new_unchecked(group_id)))
2346                }
2347            } else {
2348                None
2349            }
2350        }
2351    }
2352
2353    #[doc(alias = "gst_message_set_group_id")]
2354    pub fn set_group_id(&mut self, group_id: GroupId) {
2355        unsafe {
2356            ffi::gst_message_set_group_id(self.as_mut_ptr(), group_id.0.get());
2357        }
2358    }
2359}
2360
2361impl std::fmt::Debug for StreamStart {
2362    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2363        f.debug_struct("StreamStart")
2364            .field("structure", &self.message().structure())
2365            .field("source", &self.src().map(|obj| (obj, obj.name())))
2366            .field("group-id", &self.group_id())
2367            .finish()
2368    }
2369}
2370
2371impl std::fmt::Debug for StreamStart<Message> {
2372    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2373        StreamStart::<MessageRef>::fmt(self, f)
2374    }
2375}
2376
2377declare_concrete_message!(NeedContext, T);
2378impl NeedContext {
2379    #[doc(alias = "gst_message_new_need_context")]
2380    #[allow(clippy::new_ret_no_self)]
2381    pub fn new(context_type: &str) -> Message {
2382        skip_assert_initialized!();
2383        Self::builder(context_type).build()
2384    }
2385
2386    pub fn builder(context_type: &str) -> NeedContextBuilder<'_> {
2387        assert_initialized_main_thread!();
2388        NeedContextBuilder::new(context_type)
2389    }
2390
2391    #[doc(alias = "get_context_type")]
2392    #[doc(alias = "gst_message_parse_context_type")]
2393    pub fn context_type(&self) -> &str {
2394        unsafe {
2395            let mut context_type = ptr::null();
2396
2397            ffi::gst_message_parse_context_type(self.as_mut_ptr(), &mut context_type);
2398
2399            CStr::from_ptr(context_type).to_str().unwrap()
2400        }
2401    }
2402}
2403
2404impl std::fmt::Debug for NeedContext {
2405    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2406        f.debug_struct("NeedContext")
2407            .field("structure", &self.message().structure())
2408            .field("source", &self.src().map(|obj| (obj, obj.name())))
2409            .field("context-type", &self.context_type())
2410            .finish()
2411    }
2412}
2413
2414impl std::fmt::Debug for NeedContext<Message> {
2415    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2416        NeedContext::<MessageRef>::fmt(self, f)
2417    }
2418}
2419
2420declare_concrete_message!(HaveContext, T);
2421impl HaveContext {
2422    #[doc(alias = "gst_message_new_have_context")]
2423    #[allow(clippy::new_ret_no_self)]
2424    pub fn new(context: crate::Context) -> Message {
2425        skip_assert_initialized!();
2426        Self::builder(context).build()
2427    }
2428
2429    pub fn builder<'a>(context: crate::Context) -> HaveContextBuilder<'a> {
2430        assert_initialized_main_thread!();
2431        HaveContextBuilder::new(context)
2432    }
2433
2434    #[doc(alias = "get_context")]
2435    #[doc(alias = "gst_message_parse_have_context")]
2436    pub fn context(&self) -> crate::Context {
2437        unsafe {
2438            let mut context = ptr::null_mut();
2439            ffi::gst_message_parse_have_context(self.as_mut_ptr(), &mut context);
2440            from_glib_full(context)
2441        }
2442    }
2443}
2444
2445impl std::fmt::Debug for HaveContext {
2446    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2447        f.debug_struct("HaveContext")
2448            .field("structure", &self.message().structure())
2449            .field("source", &self.src().map(|obj| (obj, obj.name())))
2450            .field("context", &self.context())
2451            .finish()
2452    }
2453}
2454
2455impl std::fmt::Debug for HaveContext<Message> {
2456    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2457        HaveContext::<MessageRef>::fmt(self, f)
2458    }
2459}
2460
2461declare_concrete_message!(DeviceAdded, T);
2462impl DeviceAdded {
2463    #[doc(alias = "gst_message_new_device_added")]
2464    #[allow(clippy::new_ret_no_self)]
2465    pub fn new(device: &crate::Device) -> Message {
2466        skip_assert_initialized!();
2467        Self::builder(device).build()
2468    }
2469
2470    pub fn builder(device: &crate::Device) -> DeviceAddedBuilder<'_> {
2471        assert_initialized_main_thread!();
2472        DeviceAddedBuilder::new(device)
2473    }
2474
2475    #[doc(alias = "get_device")]
2476    #[doc(alias = "gst_message_parse_device_added")]
2477    pub fn device(&self) -> crate::Device {
2478        unsafe {
2479            let mut device = ptr::null_mut();
2480
2481            ffi::gst_message_parse_device_added(self.as_mut_ptr(), &mut device);
2482
2483            from_glib_full(device)
2484        }
2485    }
2486}
2487
2488impl std::fmt::Debug for DeviceAdded {
2489    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2490        f.debug_struct("DeviceAdded")
2491            .field("structure", &self.message().structure())
2492            .field("source", &self.src().map(|obj| (obj, obj.name())))
2493            .field("device", &self.device())
2494            .finish()
2495    }
2496}
2497
2498impl std::fmt::Debug for DeviceAdded<Message> {
2499    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2500        DeviceAdded::<MessageRef>::fmt(self, f)
2501    }
2502}
2503
2504declare_concrete_message!(DeviceRemoved, T);
2505impl DeviceRemoved {
2506    #[doc(alias = "gst_message_new_device_removed")]
2507    #[allow(clippy::new_ret_no_self)]
2508    pub fn new(device: &crate::Device) -> Message {
2509        skip_assert_initialized!();
2510        Self::builder(device).build()
2511    }
2512
2513    pub fn builder(device: &crate::Device) -> DeviceRemovedBuilder<'_> {
2514        assert_initialized_main_thread!();
2515        DeviceRemovedBuilder::new(device)
2516    }
2517
2518    #[doc(alias = "get_device")]
2519    #[doc(alias = "gst_message_parse_device_removed")]
2520    pub fn device(&self) -> crate::Device {
2521        unsafe {
2522            let mut device = ptr::null_mut();
2523
2524            ffi::gst_message_parse_device_removed(self.as_mut_ptr(), &mut device);
2525
2526            from_glib_full(device)
2527        }
2528    }
2529}
2530
2531impl std::fmt::Debug for DeviceRemoved {
2532    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2533        f.debug_struct("DeviceRemoved")
2534            .field("structure", &self.message().structure())
2535            .field("source", &self.src().map(|obj| (obj, obj.name())))
2536            .field("device", &self.device())
2537            .finish()
2538    }
2539}
2540
2541impl std::fmt::Debug for DeviceRemoved<Message> {
2542    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2543        DeviceRemoved::<MessageRef>::fmt(self, f)
2544    }
2545}
2546
2547declare_concrete_message!(PropertyNotify, T);
2548impl PropertyNotify {
2549    #[doc(alias = "gst_message_new_property_notify")]
2550    #[allow(clippy::new_ret_no_self)]
2551    pub fn new(object: &impl IsA<crate::Object>, property_name: &str) -> Message {
2552        skip_assert_initialized!();
2553        Self::builder(object, property_name).build()
2554    }
2555
2556    pub fn builder<'a>(
2557        object: &'a impl IsA<crate::Object>,
2558        property_name: &'a str,
2559    ) -> PropertyNotifyBuilder<'a> {
2560        assert_initialized_main_thread!();
2561        PropertyNotifyBuilder::new(property_name).src(object)
2562    }
2563
2564    #[doc(alias = "gst_message_parse_property_notify")]
2565    pub fn get(&self) -> (Object, &str, Option<&glib::Value>) {
2566        unsafe {
2567            let mut object = ptr::null_mut();
2568            let mut property_name = ptr::null();
2569            let mut value = ptr::null();
2570
2571            ffi::gst_message_parse_property_notify(
2572                self.as_mut_ptr(),
2573                &mut object,
2574                &mut property_name,
2575                &mut value,
2576            );
2577
2578            (
2579                from_glib_none(object),
2580                CStr::from_ptr(property_name).to_str().unwrap(),
2581                if value.is_null() {
2582                    None
2583                } else {
2584                    Some(&*(value as *const glib::Value))
2585                },
2586            )
2587        }
2588    }
2589
2590    #[doc(alias = "gst_message_parse_property_notify")]
2591    pub fn object(&self) -> Object {
2592        self.get().0
2593    }
2594
2595    #[doc(alias = "gst_message_parse_property_notify")]
2596    pub fn property_name(&self) -> &str {
2597        self.get().1
2598    }
2599
2600    #[doc(alias = "gst_message_parse_property_notify")]
2601    pub fn value(&self) -> Option<&glib::Value> {
2602        self.get().2
2603    }
2604}
2605
2606impl std::fmt::Debug for PropertyNotify {
2607    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2608        let (object, property_name, value) = self.get();
2609        f.debug_struct("PropertyNotify")
2610            .field("structure", &self.message().structure())
2611            .field("source", &self.src().map(|obj| (obj, obj.name())))
2612            .field("object", &object)
2613            .field("property-name", &property_name)
2614            .field("value", &value)
2615            .finish()
2616    }
2617}
2618
2619impl std::fmt::Debug for PropertyNotify<Message> {
2620    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2621        PropertyNotify::<MessageRef>::fmt(self, f)
2622    }
2623}
2624
2625declare_concrete_message!(StreamCollection, T);
2626impl StreamCollection {
2627    #[doc(alias = "gst_message_new_stream_collection")]
2628    #[allow(clippy::new_ret_no_self)]
2629    pub fn new(collection: &crate::StreamCollection) -> Message {
2630        skip_assert_initialized!();
2631        Self::builder(collection).build()
2632    }
2633
2634    pub fn builder(collection: &crate::StreamCollection) -> StreamCollectionBuilder<'_> {
2635        assert_initialized_main_thread!();
2636        StreamCollectionBuilder::new(collection)
2637    }
2638
2639    #[doc(alias = "get_stream_collection")]
2640    #[doc(alias = "gst_message_parse_stream_collection")]
2641    pub fn stream_collection(&self) -> crate::StreamCollection {
2642        unsafe {
2643            let mut collection = ptr::null_mut();
2644
2645            ffi::gst_message_parse_stream_collection(self.as_mut_ptr(), &mut collection);
2646
2647            from_glib_full(collection)
2648        }
2649    }
2650}
2651
2652impl std::fmt::Debug for StreamCollection {
2653    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2654        f.debug_struct("StreamCollection")
2655            .field("structure", &self.message().structure())
2656            .field("source", &self.src().map(|obj| (obj, obj.name())))
2657            .field("stream-collection", &self.stream_collection())
2658            .finish()
2659    }
2660}
2661
2662impl std::fmt::Debug for StreamCollection<Message> {
2663    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2664        StreamCollection::<MessageRef>::fmt(self, f)
2665    }
2666}
2667
2668declare_concrete_message!(StreamsSelected, T);
2669impl StreamsSelected {
2670    #[doc(alias = "gst_message_new_streams_selected")]
2671    #[allow(clippy::new_ret_no_self)]
2672    pub fn new(collection: &crate::StreamCollection) -> Message {
2673        skip_assert_initialized!();
2674        Self::builder(collection).build()
2675    }
2676
2677    pub fn builder(collection: &crate::StreamCollection) -> StreamsSelectedBuilder<'_> {
2678        assert_initialized_main_thread!();
2679        StreamsSelectedBuilder::new(collection)
2680    }
2681
2682    #[doc(alias = "get_stream_collection")]
2683    #[doc(alias = "gst_message_parse_streams_selected")]
2684    pub fn stream_collection(&self) -> crate::StreamCollection {
2685        unsafe {
2686            let mut collection = ptr::null_mut();
2687
2688            ffi::gst_message_parse_streams_selected(self.as_mut_ptr(), &mut collection);
2689
2690            from_glib_full(collection)
2691        }
2692    }
2693
2694    #[doc(alias = "get_streams")]
2695    #[doc(alias = "gst_message_streams_selected_get_size")]
2696    #[doc(alias = "gst_message_streams_selected_get_stream")]
2697    pub fn streams(&self) -> StreamsSelectedIter<'_> {
2698        StreamsSelectedIter::new(self)
2699    }
2700}
2701
2702impl std::fmt::Debug for StreamsSelected {
2703    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2704        struct StreamsDebug<'a>(&'a StreamsSelected);
2705
2706        impl std::fmt::Debug for StreamsDebug<'_> {
2707            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2708                f.debug_list().entries(self.0.streams()).finish()
2709            }
2710        }
2711
2712        f.debug_struct("StreamsSelected")
2713            .field("structure", &self.message().structure())
2714            .field("source", &self.src().map(|obj| (obj, obj.name())))
2715            .field("stream-collection", &self.stream_collection())
2716            .field("streams", &StreamsDebug(self))
2717            .finish()
2718    }
2719}
2720
2721impl std::fmt::Debug for StreamsSelected<Message> {
2722    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2723        StreamsSelected::<MessageRef>::fmt(self, f)
2724    }
2725}
2726
2727crate::utils::define_fixed_size_iter!(
2728    StreamsSelectedIter,
2729    &'a StreamsSelected,
2730    crate::Stream,
2731    |collection: &StreamsSelected| unsafe {
2732        ffi::gst_message_streams_selected_get_size(collection.as_mut_ptr()) as usize
2733    },
2734    |collection: &StreamsSelected, idx: usize| unsafe {
2735        from_glib_full(ffi::gst_message_streams_selected_get_stream(
2736            collection.as_mut_ptr(),
2737            idx as u32,
2738        ))
2739    }
2740);
2741
2742declare_concrete_message!(Redirect, T);
2743impl Redirect {
2744    #[doc(alias = "gst_message_new_redirect")]
2745    #[allow(clippy::new_ret_no_self)]
2746    pub fn new(location: &str) -> Message {
2747        skip_assert_initialized!();
2748        Self::builder(location).build()
2749    }
2750
2751    pub fn builder(location: &str) -> RedirectBuilder<'_> {
2752        assert_initialized_main_thread!();
2753        RedirectBuilder::new(location)
2754    }
2755
2756    #[doc(alias = "get_entries")]
2757    #[doc(alias = "gst_message_get_num_redirect_entries")]
2758    #[doc(alias = "gst_message_parse_redirect_entry")]
2759    pub fn entries(&self) -> RedirectEntriesIter<'_> {
2760        RedirectEntriesIter::new(self)
2761    }
2762}
2763
2764impl std::fmt::Debug for Redirect {
2765    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2766        struct EntriesDebug<'a>(&'a Redirect);
2767
2768        impl std::fmt::Debug for EntriesDebug<'_> {
2769            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2770                f.debug_list().entries(self.0.entries()).finish()
2771            }
2772        }
2773
2774        f.debug_struct("Redirect")
2775            .field("structure", &self.message().structure())
2776            .field("source", &self.src().map(|obj| (obj, obj.name())))
2777            .field("entries", &EntriesDebug(self))
2778            .finish()
2779    }
2780}
2781
2782impl std::fmt::Debug for Redirect<Message> {
2783    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2784        Redirect::<MessageRef>::fmt(self, f)
2785    }
2786}
2787
2788crate::utils::define_fixed_size_iter!(
2789    RedirectEntriesIter,
2790    &'a Redirect,
2791    (&'a str, Option<TagList>, Option<&'a StructureRef>),
2792    |collection: &Redirect| unsafe {
2793        ffi::gst_message_get_num_redirect_entries(collection.as_mut_ptr()) as usize
2794    },
2795    |collection: &Redirect, idx: usize| unsafe {
2796        let mut location = ptr::null();
2797        let mut tags = ptr::null_mut();
2798        let mut structure = ptr::null();
2799
2800        ffi::gst_message_parse_redirect_entry(
2801            collection.as_mut_ptr(),
2802            idx,
2803            &mut location,
2804            &mut tags,
2805            &mut structure,
2806        );
2807
2808        let structure = if structure.is_null() {
2809            None
2810        } else {
2811            Some(StructureRef::from_glib_borrow(structure))
2812        };
2813
2814        (
2815            CStr::from_ptr(location).to_str().unwrap(),
2816            from_glib_none(tags),
2817            structure,
2818        )
2819    }
2820);
2821
2822#[cfg(feature = "v1_16")]
2823#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2824declare_concrete_message!(DeviceChanged, T);
2825#[cfg(feature = "v1_16")]
2826#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2827impl DeviceChanged {
2828    #[doc(alias = "gst_message_new_device_changed")]
2829    #[allow(clippy::new_ret_no_self)]
2830    pub fn new(device: &crate::Device, changed_device: &crate::Device) -> Message {
2831        skip_assert_initialized!();
2832        Self::builder(device, changed_device).build()
2833    }
2834
2835    pub fn builder<'a>(
2836        device: &'a crate::Device,
2837        changed_device: &'a crate::Device,
2838    ) -> DeviceChangedBuilder<'a> {
2839        assert_initialized_main_thread!();
2840        DeviceChangedBuilder::new(device, changed_device)
2841    }
2842
2843    #[doc(alias = "get_device_changed")]
2844    #[doc(alias = "gst_message_parse_device_changed")]
2845    pub fn device_changed(&self) -> (crate::Device, crate::Device) {
2846        unsafe {
2847            let mut device = ptr::null_mut();
2848            let mut changed_device = ptr::null_mut();
2849
2850            ffi::gst_message_parse_device_changed(
2851                self.as_mut_ptr(),
2852                &mut device,
2853                &mut changed_device,
2854            );
2855
2856            (from_glib_full(device), from_glib_full(changed_device))
2857        }
2858    }
2859
2860    #[doc(alias = "get_device_changed")]
2861    #[doc(alias = "gst_message_parse_device_changed")]
2862    pub fn device(&self) -> crate::Device {
2863        self.device_changed().0
2864    }
2865
2866    #[doc(alias = "get_device_changed")]
2867    #[doc(alias = "gst_message_parse_device_changed")]
2868    pub fn device_changed_(&self) -> crate::Device {
2869        self.device_changed().1
2870    }
2871}
2872
2873#[cfg(feature = "v1_16")]
2874impl std::fmt::Debug for DeviceChanged {
2875    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2876        f.debug_struct("DeviceChanged")
2877            .field("structure", &self.message().structure())
2878            .field("source", &self.src().map(|obj| (obj, obj.name())))
2879            .field("device-changed", &self.device_changed())
2880            .finish()
2881    }
2882}
2883
2884#[cfg(feature = "v1_16")]
2885impl std::fmt::Debug for DeviceChanged<Message> {
2886    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2887        DeviceChanged::<MessageRef>::fmt(self, f)
2888    }
2889}
2890
2891#[cfg(feature = "v1_18")]
2892#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2893declare_concrete_message!(InstantRateRequest, T);
2894#[cfg(feature = "v1_18")]
2895#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2896impl InstantRateRequest {
2897    #[doc(alias = "gst_message_new_instant_rate_request")]
2898    #[allow(clippy::new_ret_no_self)]
2899    pub fn new(rate_multiplier: f64) -> Message {
2900        skip_assert_initialized!();
2901        Self::builder(rate_multiplier).build()
2902    }
2903
2904    pub fn builder<'a>(rate_multiplier: f64) -> InstantRateRequestBuilder<'a> {
2905        assert_initialized_main_thread!();
2906        InstantRateRequestBuilder::new(rate_multiplier)
2907    }
2908
2909    #[doc(alias = "parse_instant_rate_request")]
2910    #[doc(alias = "gst_message_parse_instant_rate_request")]
2911    pub fn rate_multiplier(&self) -> f64 {
2912        unsafe {
2913            let mut rate_multiplier = mem::MaybeUninit::uninit();
2914
2915            ffi::gst_message_parse_instant_rate_request(
2916                self.as_mut_ptr(),
2917                rate_multiplier.as_mut_ptr(),
2918            );
2919
2920            rate_multiplier.assume_init()
2921        }
2922    }
2923}
2924
2925#[cfg(feature = "v1_18")]
2926impl std::fmt::Debug for InstantRateRequest {
2927    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2928        f.debug_struct("InstantRateRequest")
2929            .field("structure", &self.message().structure())
2930            .field("source", &self.src().map(|obj| (obj, obj.name())))
2931            .field("rate-multiplier", &self.rate_multiplier())
2932            .finish()
2933    }
2934}
2935
2936#[cfg(feature = "v1_18")]
2937impl std::fmt::Debug for InstantRateRequest<Message> {
2938    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2939        InstantRateRequest::<MessageRef>::fmt(self, f)
2940    }
2941}
2942
2943#[cfg(feature = "v1_28")]
2944#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2945declare_concrete_message!(DeviceMonitorStarted, T);
2946#[cfg(feature = "v1_28")]
2947#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2948impl DeviceMonitorStarted {
2949    #[doc(alias = "gst_message_new_device_monitor_started")]
2950    #[allow(clippy::new_ret_no_self)]
2951    pub fn new(started: bool) -> Message {
2952        skip_assert_initialized!();
2953        Self::builder(started).build()
2954    }
2955
2956    pub fn builder<'a>(started: bool) -> DeviceMonitorStartedBuilder<'a> {
2957        assert_initialized_main_thread!();
2958        DeviceMonitorStartedBuilder::new(started)
2959    }
2960
2961    #[doc(alias = "gst_message_parse_device_monitor_started")]
2962    pub fn started(&self) -> bool {
2963        unsafe {
2964            let mut started = mem::MaybeUninit::uninit();
2965
2966            ffi::gst_message_parse_device_monitor_started(self.as_mut_ptr(), started.as_mut_ptr());
2967
2968            from_glib(started.assume_init())
2969        }
2970    }
2971}
2972
2973#[cfg(feature = "v1_28")]
2974impl std::fmt::Debug for DeviceMonitorStarted {
2975    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2976        f.debug_struct("DeviceMonitorStarted")
2977            .field("structure", &self.message().structure())
2978            .field("source", &self.src().map(|obj| (obj, obj.name())))
2979            .field("started", &self.started())
2980            .finish()
2981    }
2982}
2983
2984#[cfg(feature = "v1_28")]
2985impl std::fmt::Debug for DeviceMonitorStarted<Message> {
2986    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2987        DeviceMonitorStarted::<MessageRef>::fmt(self, f)
2988    }
2989}
2990
2991declare_concrete_message!(Other, T);
2992
2993impl std::fmt::Debug for Other {
2994    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2995        f.debug_struct("Other")
2996            .field("structure", &self.message().structure())
2997            .finish()
2998    }
2999}
3000
3001impl std::fmt::Debug for Other<Message> {
3002    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3003        Other::<MessageRef>::fmt(self, f)
3004    }
3005}
3006
3007struct MessageBuilder<'a> {
3008    src: Option<Object>,
3009    seqnum: Option<Seqnum>,
3010    #[cfg(feature = "v1_26")]
3011    details: Option<Structure>,
3012    other_fields: Vec<(&'a str, glib::SendValue)>,
3013}
3014
3015impl<'a> MessageBuilder<'a> {
3016    fn new() -> Self {
3017        Self {
3018            src: None,
3019            seqnum: None,
3020            #[cfg(feature = "v1_26")]
3021            details: None,
3022            other_fields: Vec::new(),
3023        }
3024    }
3025
3026    pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
3027        Self {
3028            src: Some(src.clone().upcast::<Object>()),
3029            ..self
3030        }
3031    }
3032
3033    fn seqnum(self, seqnum: Seqnum) -> Self {
3034        Self {
3035            seqnum: Some(seqnum),
3036            ..self
3037        }
3038    }
3039
3040    #[cfg(feature = "v1_26")]
3041    fn details(self, details: Structure) -> Self {
3042        Self {
3043            details: Some(details),
3044            ..self
3045        }
3046    }
3047
3048    fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
3049        let mut other_fields = self.other_fields;
3050        other_fields.push((name, value.to_send_value()));
3051
3052        Self {
3053            other_fields,
3054            ..self
3055        }
3056    }
3057}
3058
3059macro_rules! message_builder_generic_impl {
3060    ($new_fn:expr) => {
3061        #[allow(clippy::needless_update)]
3062        pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
3063            Self {
3064                builder: self.builder.src(src),
3065                ..self
3066            }
3067        }
3068
3069        #[allow(clippy::needless_update)]
3070        pub fn src_if<O: IsA<Object> + Cast + Clone>(self, src: &O, predicate: bool) -> Self {
3071            if predicate { self.src(src) } else { self }
3072        }
3073
3074        #[allow(clippy::needless_update)]
3075        pub fn src_if_some<O: IsA<Object> + Cast + Clone>(self, src: Option<&O>) -> Self {
3076            if let Some(src) = src {
3077                self.src(src)
3078            } else {
3079                self
3080            }
3081        }
3082
3083        #[doc(alias = "gst_message_set_seqnum")]
3084        #[allow(clippy::needless_update)]
3085        pub fn seqnum(self, seqnum: Seqnum) -> Self {
3086            Self {
3087                builder: self.builder.seqnum(seqnum),
3088                ..self
3089            }
3090        }
3091
3092        #[doc(alias = "gst_message_set_seqnum")]
3093        #[allow(clippy::needless_update)]
3094        pub fn seqnum_if(self, seqnum: Seqnum, predicate: bool) -> Self {
3095            if predicate { self.seqnum(seqnum) } else { self }
3096        }
3097
3098        #[doc(alias = "gst_message_set_seqnum")]
3099        #[allow(clippy::needless_update)]
3100        pub fn seqnum_if_some(self, seqnum: Option<Seqnum>) -> Self {
3101            if let Some(seqnum) = seqnum {
3102                self.seqnum(seqnum)
3103            } else {
3104                self
3105            }
3106        }
3107
3108        #[cfg(feature = "v1_26")]
3109        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
3110        #[doc(alias = "gst_message_set_details")]
3111        #[allow(clippy::needless_update)]
3112        pub fn details(self, details: Structure) -> Self {
3113            Self {
3114                builder: self.builder.details(details),
3115                ..self
3116            }
3117        }
3118
3119        #[cfg(feature = "v1_26")]
3120        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
3121        #[doc(alias = "gst_message_set_details")]
3122        #[allow(clippy::needless_update)]
3123        pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3124            if predicate {
3125                self.details(details)
3126            } else {
3127                self
3128            }
3129        }
3130
3131        #[cfg(feature = "v1_26")]
3132        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
3133        #[doc(alias = "gst_message_set_details")]
3134        #[allow(clippy::needless_update)]
3135        pub fn details_if_some(self, details: Option<Structure>) -> Self {
3136            if let Some(details) = details {
3137                self.details(details)
3138            } else {
3139                self
3140            }
3141        }
3142
3143        // rustdoc-stripper-ignore-next
3144        /// Sets field `name` to the given value `value`.
3145        ///
3146        /// Overrides any default or previously defined value for `name`.
3147        #[allow(clippy::needless_update)]
3148        pub fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
3149            Self {
3150                builder: self.builder.other_field(name, value),
3151                ..self
3152            }
3153        }
3154
3155        impl_builder_gvalue_extra_setters!(other_field);
3156
3157        #[must_use = "Building the message without using it has no effect"]
3158        #[allow(clippy::redundant_closure_call)]
3159        pub fn build(mut self) -> Message {
3160            unsafe {
3161                let src = self.builder.src.to_glib_none().0;
3162                let msg = $new_fn(&mut self, src);
3163                if let Some(seqnum) = self.builder.seqnum {
3164                    ffi::gst_message_set_seqnum(msg, seqnum.0.get());
3165                }
3166
3167                #[cfg(feature = "v1_26")]
3168                if let Some(details) = self.builder.details {
3169                    ffi::gst_message_set_details(msg, details.into_glib_ptr());
3170                }
3171
3172                if !self.builder.other_fields.is_empty() {
3173                    let structure = ffi::gst_message_writable_structure(msg);
3174
3175                    if !structure.is_null() {
3176                        let structure = StructureRef::from_glib_borrow_mut(structure as *mut _);
3177
3178                        for (k, v) in self.builder.other_fields {
3179                            structure.set_value(k, v);
3180                        }
3181                    }
3182                }
3183
3184                from_glib_full(msg)
3185            }
3186        }
3187    };
3188}
3189
3190#[must_use = "The builder must be built to be used"]
3191pub struct EosBuilder<'a> {
3192    builder: MessageBuilder<'a>,
3193}
3194
3195impl<'a> EosBuilder<'a> {
3196    fn new() -> Self {
3197        skip_assert_initialized!();
3198        Self {
3199            builder: MessageBuilder::new(),
3200        }
3201    }
3202
3203    message_builder_generic_impl!(|_, src| ffi::gst_message_new_eos(src));
3204}
3205
3206pub trait MessageErrorDomain: glib::error::ErrorDomain {}
3207
3208impl MessageErrorDomain for crate::CoreError {}
3209impl MessageErrorDomain for crate::ResourceError {}
3210impl MessageErrorDomain for crate::StreamError {}
3211impl MessageErrorDomain for crate::LibraryError {}
3212
3213#[must_use = "The builder must be built to be used"]
3214pub struct ErrorBuilder<'a> {
3215    builder: MessageBuilder<'a>,
3216    error: glib::Error,
3217    debug: Option<&'a str>,
3218    #[allow(unused)]
3219    details: Option<Structure>,
3220}
3221
3222impl<'a> ErrorBuilder<'a> {
3223    fn new(error: glib::Error) -> Self {
3224        skip_assert_initialized!();
3225        Self {
3226            builder: MessageBuilder::new(),
3227            error,
3228            debug: None,
3229            details: None,
3230        }
3231    }
3232
3233    pub fn debug(self, debug: &'a str) -> Self {
3234        Self {
3235            debug: Some(debug),
3236            ..self
3237        }
3238    }
3239
3240    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
3241        if predicate { self.debug(debug) } else { self }
3242    }
3243
3244    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
3245        if let Some(debug) = debug {
3246            self.debug(debug)
3247        } else {
3248            self
3249        }
3250    }
3251
3252    #[cfg(not(feature = "v1_26"))]
3253    pub fn details(self, details: Structure) -> Self {
3254        Self {
3255            details: Some(details),
3256            ..self
3257        }
3258    }
3259
3260    #[cfg(not(feature = "v1_26"))]
3261    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3262        if predicate {
3263            self.details(details)
3264        } else {
3265            self
3266        }
3267    }
3268
3269    #[cfg(not(feature = "v1_26"))]
3270    pub fn details_if_some(self, details: Option<Structure>) -> Self {
3271        if let Some(details) = details {
3272            self.details(details)
3273        } else {
3274            self
3275        }
3276    }
3277
3278    message_builder_generic_impl!(|s: &mut Self, src| {
3279        let details = match s.details.take() {
3280            None => ptr::null_mut(),
3281            Some(details) => details.into_glib_ptr(),
3282        };
3283
3284        ffi::gst_message_new_error_with_details(
3285            src,
3286            mut_override(s.error.to_glib_none().0),
3287            s.debug.to_glib_none().0,
3288            details,
3289        )
3290    });
3291}
3292
3293#[must_use = "The builder must be built to be used"]
3294pub struct WarningBuilder<'a> {
3295    builder: MessageBuilder<'a>,
3296    error: glib::Error,
3297    debug: Option<&'a str>,
3298    #[allow(unused)]
3299    details: Option<Structure>,
3300}
3301
3302impl<'a> WarningBuilder<'a> {
3303    fn new(error: glib::Error) -> Self {
3304        skip_assert_initialized!();
3305        Self {
3306            builder: MessageBuilder::new(),
3307            error,
3308            debug: None,
3309            details: None,
3310        }
3311    }
3312
3313    pub fn debug(self, debug: &'a str) -> Self {
3314        Self {
3315            debug: Some(debug),
3316            ..self
3317        }
3318    }
3319
3320    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
3321        if predicate { self.debug(debug) } else { self }
3322    }
3323
3324    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
3325        if let Some(debug) = debug {
3326            self.debug(debug)
3327        } else {
3328            self
3329        }
3330    }
3331
3332    #[cfg(not(feature = "v1_26"))]
3333    pub fn details(self, details: Structure) -> Self {
3334        Self {
3335            details: Some(details),
3336            ..self
3337        }
3338    }
3339
3340    #[cfg(not(feature = "v1_26"))]
3341    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3342        if predicate {
3343            self.details(details)
3344        } else {
3345            self
3346        }
3347    }
3348
3349    #[cfg(not(feature = "v1_26"))]
3350    pub fn details_if_some(self, details: Option<Structure>) -> Self {
3351        if let Some(details) = details {
3352            self.details(details)
3353        } else {
3354            self
3355        }
3356    }
3357
3358    message_builder_generic_impl!(|s: &mut Self, src| {
3359        let details = match s.details.take() {
3360            None => ptr::null_mut(),
3361            Some(details) => details.into_glib_ptr(),
3362        };
3363
3364        ffi::gst_message_new_warning_with_details(
3365            src,
3366            mut_override(s.error.to_glib_none().0),
3367            s.debug.to_glib_none().0,
3368            details,
3369        )
3370    });
3371}
3372
3373#[must_use = "The builder must be built to be used"]
3374pub struct InfoBuilder<'a> {
3375    builder: MessageBuilder<'a>,
3376    error: glib::Error,
3377    debug: Option<&'a str>,
3378    #[allow(unused)]
3379    details: Option<Structure>,
3380}
3381
3382impl<'a> InfoBuilder<'a> {
3383    fn new(error: glib::Error) -> Self {
3384        skip_assert_initialized!();
3385        Self {
3386            builder: MessageBuilder::new(),
3387            error,
3388            debug: None,
3389            details: None,
3390        }
3391    }
3392
3393    pub fn debug(self, debug: &'a str) -> Self {
3394        Self {
3395            debug: Some(debug),
3396            ..self
3397        }
3398    }
3399
3400    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
3401        if predicate { self.debug(debug) } else { self }
3402    }
3403
3404    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
3405        if let Some(debug) = debug {
3406            self.debug(debug)
3407        } else {
3408            self
3409        }
3410    }
3411
3412    #[cfg(not(feature = "v1_26"))]
3413    pub fn details(self, details: Structure) -> Self {
3414        Self {
3415            details: Some(details),
3416            ..self
3417        }
3418    }
3419
3420    #[cfg(not(feature = "v1_26"))]
3421    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3422        if predicate {
3423            self.details(details)
3424        } else {
3425            self
3426        }
3427    }
3428
3429    #[cfg(not(feature = "v1_26"))]
3430    pub fn details_if_some(self, details: Option<Structure>) -> Self {
3431        if let Some(details) = details {
3432            self.details(details)
3433        } else {
3434            self
3435        }
3436    }
3437
3438    message_builder_generic_impl!(|s: &mut Self, src| {
3439        let details = match s.details.take() {
3440            None => ptr::null_mut(),
3441            Some(details) => details.into_glib_ptr(),
3442        };
3443
3444        ffi::gst_message_new_info_with_details(
3445            src,
3446            mut_override(s.error.to_glib_none().0),
3447            s.debug.to_glib_none().0,
3448            details,
3449        )
3450    });
3451}
3452
3453#[must_use = "The builder must be built to be used"]
3454pub struct TagBuilder<'a> {
3455    builder: MessageBuilder<'a>,
3456    tags: Option<TagList>,
3457}
3458
3459impl<'a> TagBuilder<'a> {
3460    fn new(tags: TagList) -> Self {
3461        skip_assert_initialized!();
3462        Self {
3463            builder: MessageBuilder::new(),
3464            tags: Some(tags),
3465        }
3466    }
3467
3468    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_tag(
3469        src,
3470        s.tags.take().into_glib_ptr()
3471    ));
3472}
3473
3474#[must_use = "The builder must be built to be used"]
3475pub struct BufferingBuilder<'a> {
3476    builder: MessageBuilder<'a>,
3477    percent: i32,
3478    stats: Option<(crate::BufferingMode, i32, i32, i64)>,
3479}
3480
3481impl<'a> BufferingBuilder<'a> {
3482    fn new(percent: i32) -> Self {
3483        skip_assert_initialized!();
3484        Self {
3485            builder: MessageBuilder::new(),
3486            percent,
3487            stats: None,
3488        }
3489    }
3490
3491    pub fn stats(
3492        self,
3493        mode: crate::BufferingMode,
3494        avg_in: i32,
3495        avg_out: i32,
3496        buffering_left: i64,
3497    ) -> Self {
3498        skip_assert_initialized!();
3499        Self {
3500            stats: Some((mode, avg_in, avg_out, buffering_left)),
3501            ..self
3502        }
3503    }
3504
3505    message_builder_generic_impl!(|s: &mut Self, src| {
3506        let msg = ffi::gst_message_new_buffering(src, s.percent);
3507
3508        if let Some((mode, avg_in, avg_out, buffering_left)) = s.stats {
3509            ffi::gst_message_set_buffering_stats(
3510                msg,
3511                mode.into_glib(),
3512                avg_in,
3513                avg_out,
3514                buffering_left,
3515            );
3516        }
3517
3518        msg
3519    });
3520}
3521
3522#[must_use = "The builder must be built to be used"]
3523pub struct StateChangedBuilder<'a> {
3524    builder: MessageBuilder<'a>,
3525    old: crate::State,
3526    new: crate::State,
3527    pending: crate::State,
3528}
3529
3530impl<'a> StateChangedBuilder<'a> {
3531    fn new(old: crate::State, new: crate::State, pending: crate::State) -> Self {
3532        skip_assert_initialized!();
3533        Self {
3534            builder: MessageBuilder::new(),
3535            old,
3536            new,
3537            pending,
3538        }
3539    }
3540
3541    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_state_changed(
3542        src,
3543        s.old.into_glib(),
3544        s.new.into_glib(),
3545        s.pending.into_glib(),
3546    ));
3547}
3548
3549#[must_use = "The builder must be built to be used"]
3550pub struct StateDirtyBuilder<'a> {
3551    builder: MessageBuilder<'a>,
3552}
3553
3554impl<'a> StateDirtyBuilder<'a> {
3555    fn new() -> Self {
3556        skip_assert_initialized!();
3557        Self {
3558            builder: MessageBuilder::new(),
3559        }
3560    }
3561
3562    message_builder_generic_impl!(|_, src| ffi::gst_message_new_state_dirty(src));
3563}
3564
3565#[must_use = "The builder must be built to be used"]
3566pub struct StepDoneBuilder<'a> {
3567    builder: MessageBuilder<'a>,
3568    amount: GenericFormattedValue,
3569    rate: f64,
3570    flush: bool,
3571    intermediate: bool,
3572    duration: Option<crate::ClockTime>,
3573    eos: bool,
3574}
3575
3576impl<'a> StepDoneBuilder<'a> {
3577    fn new(
3578        amount: GenericFormattedValue,
3579        rate: f64,
3580        flush: bool,
3581        intermediate: bool,
3582        duration: Option<crate::ClockTime>,
3583        eos: bool,
3584    ) -> Self {
3585        skip_assert_initialized!();
3586        assert_eq!(amount.format(), duration.format());
3587        Self {
3588            builder: MessageBuilder::new(),
3589            amount,
3590            rate,
3591            flush,
3592            intermediate,
3593            duration,
3594            eos,
3595        }
3596    }
3597
3598    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_done(
3599        src,
3600        s.amount.format().into_glib(),
3601        s.amount.value() as u64,
3602        s.rate,
3603        s.flush.into_glib(),
3604        s.intermediate.into_glib(),
3605        s.duration.into_raw_value() as u64,
3606        s.eos.into_glib(),
3607    ));
3608}
3609
3610#[must_use = "The builder must be built to be used"]
3611pub struct ClockProvideBuilder<'a> {
3612    builder: MessageBuilder<'a>,
3613    clock: &'a crate::Clock,
3614    ready: bool,
3615}
3616
3617impl<'a> ClockProvideBuilder<'a> {
3618    fn new(clock: &'a crate::Clock, ready: bool) -> Self {
3619        skip_assert_initialized!();
3620        Self {
3621            builder: MessageBuilder::new(),
3622            clock,
3623            ready,
3624        }
3625    }
3626
3627    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_provide(
3628        src,
3629        s.clock.to_glib_none().0,
3630        s.ready.into_glib()
3631    ));
3632}
3633
3634#[must_use = "The builder must be built to be used"]
3635pub struct ClockLostBuilder<'a> {
3636    builder: MessageBuilder<'a>,
3637    clock: &'a crate::Clock,
3638}
3639
3640impl<'a> ClockLostBuilder<'a> {
3641    fn new(clock: &'a crate::Clock) -> Self {
3642        skip_assert_initialized!();
3643        Self {
3644            builder: MessageBuilder::new(),
3645            clock,
3646        }
3647    }
3648
3649    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_lost(
3650        src,
3651        s.clock.to_glib_none().0
3652    ));
3653}
3654
3655#[must_use = "The builder must be built to be used"]
3656pub struct NewClockBuilder<'a> {
3657    builder: MessageBuilder<'a>,
3658    clock: &'a crate::Clock,
3659}
3660
3661impl<'a> NewClockBuilder<'a> {
3662    fn new(clock: &'a crate::Clock) -> Self {
3663        skip_assert_initialized!();
3664        Self {
3665            builder: MessageBuilder::new(),
3666            clock,
3667        }
3668    }
3669
3670    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_new_clock(
3671        src,
3672        s.clock.to_glib_none().0
3673    ));
3674}
3675
3676#[must_use = "The builder must be built to be used"]
3677pub struct StructureChangeBuilder<'a> {
3678    builder: MessageBuilder<'a>,
3679    type_: crate::StructureChangeType,
3680    owner: &'a crate::Element,
3681    busy: bool,
3682}
3683
3684impl<'a> StructureChangeBuilder<'a> {
3685    fn new(type_: crate::StructureChangeType, owner: &'a crate::Element, busy: bool) -> Self {
3686        skip_assert_initialized!();
3687        Self {
3688            builder: MessageBuilder::new(),
3689            type_,
3690            owner,
3691            busy,
3692        }
3693    }
3694
3695    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_structure_change(
3696        src,
3697        s.type_.into_glib(),
3698        s.owner.to_glib_none().0,
3699        s.busy.into_glib(),
3700    ));
3701}
3702
3703#[must_use = "The builder must be built to be used"]
3704pub struct StreamStatusBuilder<'a> {
3705    builder: MessageBuilder<'a>,
3706    type_: crate::StreamStatusType,
3707    owner: &'a crate::Element,
3708    status_object: Option<glib::SendValue>,
3709}
3710
3711impl<'a> StreamStatusBuilder<'a> {
3712    fn new(type_: crate::StreamStatusType, owner: &'a crate::Element) -> Self {
3713        skip_assert_initialized!();
3714        Self {
3715            builder: MessageBuilder::new(),
3716            type_,
3717            owner,
3718            status_object: None,
3719        }
3720    }
3721
3722    pub fn status_object(self, status_object: impl ToSendValue) -> Self {
3723        Self {
3724            status_object: Some(status_object.to_send_value()),
3725            ..self
3726        }
3727    }
3728
3729    pub fn status_object_if(self, status_object: impl ToSendValue, predicate: bool) -> Self {
3730        if predicate {
3731            self.status_object(status_object)
3732        } else {
3733            self
3734        }
3735    }
3736
3737    pub fn status_object_if_some(self, status_object: Option<impl ToSendValue>) -> Self {
3738        if let Some(status_object) = status_object {
3739            self.status_object(status_object)
3740        } else {
3741            self
3742        }
3743    }
3744
3745    message_builder_generic_impl!(|s: &mut Self, src| {
3746        let msg =
3747            ffi::gst_message_new_stream_status(src, s.type_.into_glib(), s.owner.to_glib_none().0);
3748        if let Some(ref status_object) = s.status_object {
3749            ffi::gst_message_set_stream_status_object(msg, status_object.to_glib_none().0);
3750        }
3751        msg
3752    });
3753}
3754
3755#[must_use = "The builder must be built to be used"]
3756pub struct ApplicationBuilder<'a> {
3757    builder: MessageBuilder<'a>,
3758    structure: Option<crate::Structure>,
3759}
3760
3761impl<'a> ApplicationBuilder<'a> {
3762    fn new(structure: crate::Structure) -> Self {
3763        skip_assert_initialized!();
3764        Self {
3765            builder: MessageBuilder::new(),
3766            structure: Some(structure),
3767        }
3768    }
3769
3770    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_application(
3771        src,
3772        s.structure.take().unwrap().into_glib_ptr()
3773    ));
3774}
3775
3776#[must_use = "The builder must be built to be used"]
3777pub struct ElementBuilder<'a> {
3778    builder: MessageBuilder<'a>,
3779    structure: Option<crate::Structure>,
3780}
3781
3782impl<'a> ElementBuilder<'a> {
3783    fn new(structure: crate::Structure) -> Self {
3784        skip_assert_initialized!();
3785        Self {
3786            builder: MessageBuilder::new(),
3787            structure: Some(structure),
3788        }
3789    }
3790
3791    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_element(
3792        src,
3793        s.structure.take().unwrap().into_glib_ptr()
3794    ));
3795}
3796
3797#[must_use = "The builder must be built to be used"]
3798pub struct SegmentStartBuilder<'a> {
3799    builder: MessageBuilder<'a>,
3800    position: GenericFormattedValue,
3801}
3802
3803impl<'a> SegmentStartBuilder<'a> {
3804    fn new(position: GenericFormattedValue) -> Self {
3805        skip_assert_initialized!();
3806        Self {
3807            builder: MessageBuilder::new(),
3808            position,
3809        }
3810    }
3811
3812    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_start(
3813        src,
3814        s.position.format().into_glib(),
3815        s.position.value(),
3816    ));
3817}
3818
3819#[must_use = "The builder must be built to be used"]
3820pub struct SegmentDoneBuilder<'a> {
3821    builder: MessageBuilder<'a>,
3822    position: GenericFormattedValue,
3823}
3824
3825impl<'a> SegmentDoneBuilder<'a> {
3826    fn new(position: GenericFormattedValue) -> Self {
3827        skip_assert_initialized!();
3828        Self {
3829            builder: MessageBuilder::new(),
3830            position,
3831        }
3832    }
3833
3834    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_done(
3835        src,
3836        s.position.format().into_glib(),
3837        s.position.value(),
3838    ));
3839}
3840
3841#[must_use = "The builder must be built to be used"]
3842pub struct DurationChangedBuilder<'a> {
3843    builder: MessageBuilder<'a>,
3844}
3845
3846impl<'a> DurationChangedBuilder<'a> {
3847    fn new() -> Self {
3848        skip_assert_initialized!();
3849        Self {
3850            builder: MessageBuilder::new(),
3851        }
3852    }
3853
3854    message_builder_generic_impl!(|_, src| ffi::gst_message_new_duration_changed(src));
3855}
3856
3857#[must_use = "The builder must be built to be used"]
3858pub struct LatencyBuilder<'a> {
3859    builder: MessageBuilder<'a>,
3860}
3861
3862impl<'a> LatencyBuilder<'a> {
3863    fn new() -> Self {
3864        skip_assert_initialized!();
3865        Self {
3866            builder: MessageBuilder::new(),
3867        }
3868    }
3869
3870    message_builder_generic_impl!(|_, src| ffi::gst_message_new_latency(src));
3871}
3872
3873#[must_use = "The builder must be built to be used"]
3874pub struct AsyncStartBuilder<'a> {
3875    builder: MessageBuilder<'a>,
3876}
3877
3878impl<'a> AsyncStartBuilder<'a> {
3879    fn new() -> Self {
3880        skip_assert_initialized!();
3881        Self {
3882            builder: MessageBuilder::new(),
3883        }
3884    }
3885
3886    message_builder_generic_impl!(|_, src| ffi::gst_message_new_async_start(src));
3887}
3888
3889#[must_use = "The builder must be built to be used"]
3890pub struct AsyncDoneBuilder<'a> {
3891    builder: MessageBuilder<'a>,
3892    running_time: Option<crate::ClockTime>,
3893}
3894
3895impl<'a> AsyncDoneBuilder<'a> {
3896    fn new() -> Self {
3897        skip_assert_initialized!();
3898        Self {
3899            builder: MessageBuilder::new(),
3900            running_time: None,
3901        }
3902    }
3903
3904    pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
3905        self.running_time = running_time.into();
3906        self
3907    }
3908
3909    pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
3910        if predicate {
3911            self.running_time(running_time)
3912        } else {
3913            self
3914        }
3915    }
3916
3917    pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
3918        if let Some(running_time) = running_time {
3919            self.running_time(running_time)
3920        } else {
3921            self
3922        }
3923    }
3924
3925    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_async_done(
3926        src,
3927        s.running_time.into_glib()
3928    ));
3929}
3930
3931#[must_use = "The builder must be built to be used"]
3932pub struct RequestStateBuilder<'a> {
3933    builder: MessageBuilder<'a>,
3934    state: crate::State,
3935}
3936
3937impl<'a> RequestStateBuilder<'a> {
3938    fn new(state: crate::State) -> Self {
3939        skip_assert_initialized!();
3940        Self {
3941            builder: MessageBuilder::new(),
3942            state,
3943        }
3944    }
3945
3946    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_request_state(
3947        src,
3948        s.state.into_glib()
3949    ));
3950}
3951
3952#[must_use = "The builder must be built to be used"]
3953pub struct StepStartBuilder<'a> {
3954    builder: MessageBuilder<'a>,
3955    active: bool,
3956    amount: GenericFormattedValue,
3957    rate: f64,
3958    flush: bool,
3959    intermediate: bool,
3960}
3961
3962impl<'a> StepStartBuilder<'a> {
3963    fn new(
3964        active: bool,
3965        amount: GenericFormattedValue,
3966        rate: f64,
3967        flush: bool,
3968        intermediate: bool,
3969    ) -> Self {
3970        skip_assert_initialized!();
3971        Self {
3972            builder: MessageBuilder::new(),
3973            active,
3974            amount,
3975            rate,
3976            flush,
3977            intermediate,
3978        }
3979    }
3980
3981    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_start(
3982        src,
3983        s.active.into_glib(),
3984        s.amount.format().into_glib(),
3985        s.amount.value() as u64,
3986        s.rate,
3987        s.flush.into_glib(),
3988        s.intermediate.into_glib(),
3989    ));
3990}
3991
3992#[must_use = "The builder must be built to be used"]
3993pub struct QosBuilder<'a> {
3994    builder: MessageBuilder<'a>,
3995    live: bool,
3996    running_time: Option<crate::ClockTime>,
3997    stream_time: Option<crate::ClockTime>,
3998    timestamp: Option<crate::ClockTime>,
3999    duration: Option<crate::ClockTime>,
4000    values: Option<(i64, f64, i32)>,
4001    stats: Option<(GenericFormattedValue, GenericFormattedValue)>,
4002}
4003
4004impl<'a> QosBuilder<'a> {
4005    fn new(live: bool) -> Self {
4006        skip_assert_initialized!();
4007        Self {
4008            builder: MessageBuilder::new(),
4009            live,
4010            running_time: None,
4011            stream_time: None,
4012            timestamp: None,
4013            duration: None,
4014            values: None,
4015            stats: None,
4016        }
4017    }
4018
4019    pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
4020        self.running_time = running_time.into();
4021        self
4022    }
4023
4024    pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
4025        if predicate {
4026            self.running_time(running_time)
4027        } else {
4028            self
4029        }
4030    }
4031
4032    pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
4033        if let Some(running_time) = running_time {
4034            self.running_time(running_time)
4035        } else {
4036            self
4037        }
4038    }
4039
4040    pub fn stream_time(mut self, stream_time: impl Into<Option<crate::ClockTime>>) -> Self {
4041        self.stream_time = stream_time.into();
4042        self
4043    }
4044
4045    pub fn stream_time_if(self, stream_time: crate::ClockTime, predicate: bool) -> Self {
4046        if predicate {
4047            self.stream_time(stream_time)
4048        } else {
4049            self
4050        }
4051    }
4052
4053    pub fn stream_time_if_some(self, stream_time: Option<crate::ClockTime>) -> Self {
4054        if let Some(stream_time) = stream_time {
4055            self.stream_time(stream_time)
4056        } else {
4057            self
4058        }
4059    }
4060
4061    pub fn timestamp(mut self, timestamp: impl Into<Option<crate::ClockTime>>) -> Self {
4062        self.timestamp = timestamp.into();
4063        self
4064    }
4065
4066    pub fn timestamp_if(self, timestamp: crate::ClockTime, predicate: bool) -> Self {
4067        if predicate {
4068            self.timestamp(timestamp)
4069        } else {
4070            self
4071        }
4072    }
4073
4074    pub fn timestamp_if_some(self, timestamp: Option<crate::ClockTime>) -> Self {
4075        if let Some(timestamp) = timestamp {
4076            self.timestamp(timestamp)
4077        } else {
4078            self
4079        }
4080    }
4081
4082    pub fn duration(mut self, duration: impl Into<Option<crate::ClockTime>>) -> Self {
4083        self.duration = duration.into();
4084        self
4085    }
4086
4087    pub fn duration_if(self, duration: crate::ClockTime, predicate: bool) -> Self {
4088        if predicate {
4089            self.duration(duration)
4090        } else {
4091            self
4092        }
4093    }
4094
4095    pub fn duration_if_some(self, duration: Option<crate::ClockTime>) -> Self {
4096        if let Some(duration) = duration {
4097            self.duration(duration)
4098        } else {
4099            self
4100        }
4101    }
4102
4103    pub fn values(self, jitter: i64, proportion: f64, quality: i32) -> Self {
4104        Self {
4105            values: Some((jitter, proportion, quality)),
4106            ..self
4107        }
4108    }
4109
4110    pub fn stats<V: FormattedValue>(
4111        self,
4112        processed: V,
4113        dropped: impl CompatibleFormattedValue<V>,
4114    ) -> Self {
4115        let dropped = dropped.try_into_checked(processed).unwrap();
4116        Self {
4117            stats: Some((processed.into(), dropped.into())),
4118            ..self
4119        }
4120    }
4121
4122    message_builder_generic_impl!(|s: &mut Self, src| {
4123        let msg = ffi::gst_message_new_qos(
4124            src,
4125            s.live.into_glib(),
4126            s.running_time.into_glib(),
4127            s.stream_time.into_glib(),
4128            s.timestamp.into_glib(),
4129            s.duration.into_glib(),
4130        );
4131        if let Some((jitter, proportion, quality)) = s.values {
4132            ffi::gst_message_set_qos_values(msg, jitter, proportion, quality);
4133        }
4134        if let Some((processed, dropped)) = s.stats {
4135            ffi::gst_message_set_qos_stats(
4136                msg,
4137                processed.format().into_glib(),
4138                processed.value() as u64,
4139                dropped.value() as u64,
4140            );
4141        }
4142        msg
4143    });
4144}
4145
4146#[must_use = "The builder must be built to be used"]
4147pub struct ProgressBuilder<'a> {
4148    builder: MessageBuilder<'a>,
4149    type_: crate::ProgressType,
4150    code: &'a str,
4151    text: &'a str,
4152}
4153
4154impl<'a> ProgressBuilder<'a> {
4155    fn new(type_: crate::ProgressType, code: &'a str, text: &'a str) -> Self {
4156        skip_assert_initialized!();
4157        Self {
4158            builder: MessageBuilder::new(),
4159            type_,
4160            code,
4161            text,
4162        }
4163    }
4164
4165    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_progress(
4166        src,
4167        s.type_.into_glib(),
4168        s.code.to_glib_none().0,
4169        s.text.to_glib_none().0,
4170    ));
4171}
4172
4173#[must_use = "The builder must be built to be used"]
4174pub struct TocBuilder<'a> {
4175    builder: MessageBuilder<'a>,
4176    toc: &'a crate::Toc,
4177    updated: bool,
4178}
4179
4180impl<'a> TocBuilder<'a> {
4181    fn new(toc: &'a crate::Toc, updated: bool) -> Self {
4182        skip_assert_initialized!();
4183        Self {
4184            builder: MessageBuilder::new(),
4185            toc,
4186            updated,
4187        }
4188    }
4189
4190    message_builder_generic_impl!(|s: &Self, src| ffi::gst_message_new_toc(
4191        src,
4192        s.toc.to_glib_none().0,
4193        s.updated.into_glib()
4194    ));
4195}
4196
4197#[must_use = "The builder must be built to be used"]
4198pub struct ResetTimeBuilder<'a> {
4199    builder: MessageBuilder<'a>,
4200    running_time: crate::ClockTime,
4201}
4202
4203impl<'a> ResetTimeBuilder<'a> {
4204    fn new(running_time: crate::ClockTime) -> Self {
4205        skip_assert_initialized!();
4206        Self {
4207            builder: MessageBuilder::new(),
4208            running_time,
4209        }
4210    }
4211
4212    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_reset_time(
4213        src,
4214        s.running_time.into_glib()
4215    ));
4216}
4217
4218#[must_use = "The builder must be built to be used"]
4219pub struct StreamStartBuilder<'a> {
4220    builder: MessageBuilder<'a>,
4221    group_id: Option<GroupId>,
4222}
4223
4224impl<'a> StreamStartBuilder<'a> {
4225    fn new() -> Self {
4226        skip_assert_initialized!();
4227        Self {
4228            builder: MessageBuilder::new(),
4229            group_id: None,
4230        }
4231    }
4232
4233    pub fn group_id(self, group_id: GroupId) -> Self {
4234        Self {
4235            group_id: Some(group_id),
4236            ..self
4237        }
4238    }
4239
4240    pub fn group_id_if(self, group_id: GroupId, predicate: bool) -> Self {
4241        if predicate {
4242            self.group_id(group_id)
4243        } else {
4244            self
4245        }
4246    }
4247
4248    pub fn group_id_if_some(self, group_id: Option<GroupId>) -> Self {
4249        if let Some(group_id) = group_id {
4250            self.group_id(group_id)
4251        } else {
4252            self
4253        }
4254    }
4255
4256    message_builder_generic_impl!(|s: &mut Self, src| {
4257        let msg = ffi::gst_message_new_stream_start(src);
4258        if let Some(group_id) = s.group_id {
4259            ffi::gst_message_set_group_id(msg, group_id.0.get());
4260        }
4261        msg
4262    });
4263}
4264
4265#[must_use = "The builder must be built to be used"]
4266pub struct NeedContextBuilder<'a> {
4267    builder: MessageBuilder<'a>,
4268    context_type: &'a str,
4269}
4270
4271impl<'a> NeedContextBuilder<'a> {
4272    fn new(context_type: &'a str) -> Self {
4273        skip_assert_initialized!();
4274        Self {
4275            builder: MessageBuilder::new(),
4276            context_type,
4277        }
4278    }
4279
4280    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_need_context(
4281        src,
4282        s.context_type.to_glib_none().0
4283    ));
4284}
4285
4286#[must_use = "The builder must be built to be used"]
4287pub struct HaveContextBuilder<'a> {
4288    builder: MessageBuilder<'a>,
4289    context: Option<crate::Context>,
4290}
4291
4292impl<'a> HaveContextBuilder<'a> {
4293    fn new(context: crate::Context) -> Self {
4294        skip_assert_initialized!();
4295        Self {
4296            builder: MessageBuilder::new(),
4297            context: Some(context),
4298        }
4299    }
4300
4301    message_builder_generic_impl!(|s: &mut Self, src| {
4302        let context = s.context.take().unwrap();
4303        ffi::gst_message_new_have_context(src, context.into_glib_ptr())
4304    });
4305}
4306
4307#[must_use = "The builder must be built to be used"]
4308pub struct DeviceAddedBuilder<'a> {
4309    builder: MessageBuilder<'a>,
4310    device: &'a crate::Device,
4311}
4312
4313impl<'a> DeviceAddedBuilder<'a> {
4314    fn new(device: &'a crate::Device) -> Self {
4315        skip_assert_initialized!();
4316        Self {
4317            builder: MessageBuilder::new(),
4318            device,
4319        }
4320    }
4321
4322    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_added(
4323        src,
4324        s.device.to_glib_none().0
4325    ));
4326}
4327
4328#[must_use = "The builder must be built to be used"]
4329pub struct DeviceRemovedBuilder<'a> {
4330    builder: MessageBuilder<'a>,
4331    device: &'a crate::Device,
4332}
4333
4334impl<'a> DeviceRemovedBuilder<'a> {
4335    fn new(device: &'a crate::Device) -> Self {
4336        skip_assert_initialized!();
4337        Self {
4338            builder: MessageBuilder::new(),
4339            device,
4340        }
4341    }
4342
4343    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_removed(
4344        src,
4345        s.device.to_glib_none().0
4346    ));
4347}
4348
4349#[must_use = "The builder must be built to be used"]
4350pub struct PropertyNotifyBuilder<'a> {
4351    builder: MessageBuilder<'a>,
4352    property_name: &'a str,
4353    value: Option<glib::SendValue>,
4354}
4355
4356impl<'a> PropertyNotifyBuilder<'a> {
4357    fn new(property_name: &'a str) -> Self {
4358        skip_assert_initialized!();
4359        Self {
4360            builder: MessageBuilder::new(),
4361            property_name,
4362            value: None,
4363        }
4364    }
4365
4366    pub fn value(self, value: impl ToSendValue) -> Self {
4367        Self {
4368            value: Some(value.to_send_value()),
4369            ..self
4370        }
4371    }
4372
4373    pub fn value_if(self, value: impl ToSendValue, predicate: bool) -> Self {
4374        if predicate { self.value(value) } else { self }
4375    }
4376
4377    pub fn value_if_some(self, value: Option<impl ToSendValue>) -> Self {
4378        if let Some(value) = value {
4379            self.value(value)
4380        } else {
4381            self
4382        }
4383    }
4384
4385    pub fn value_from_iter<V: ValueType + ToSendValue + FromIterator<SendValue>, I: ToSendValue>(
4386        self,
4387        name: &'a str,
4388        iter: impl IntoIterator<Item = I>,
4389    ) -> Self {
4390        let iter = iter.into_iter().map(|item| item.to_send_value());
4391        self.other_field(name, V::from_iter(iter))
4392    }
4393
4394    pub fn value_field_if_not_empty<
4395        V: ValueType + ToSendValue + FromIterator<SendValue>,
4396        I: ToSendValue,
4397    >(
4398        self,
4399        name: &'a str,
4400        iter: impl IntoIterator<Item = I>,
4401    ) -> Self {
4402        let mut iter = iter.into_iter().peekable();
4403        if iter.peek().is_some() {
4404            let iter = iter.map(|item| item.to_send_value());
4405            self.other_field(name, V::from_iter(iter))
4406        } else {
4407            self
4408        }
4409    }
4410
4411    message_builder_generic_impl!(|s: &mut Self, src| {
4412        let v = s.value.take();
4413        ffi::gst_message_new_property_notify(
4414            src,
4415            s.property_name.to_glib_none().0,
4416            v.as_ref().map(|v| v.as_ptr()).unwrap_or(ptr::null_mut()),
4417        )
4418    });
4419}
4420
4421#[must_use = "The builder must be built to be used"]
4422pub struct StreamCollectionBuilder<'a> {
4423    builder: MessageBuilder<'a>,
4424    collection: &'a crate::StreamCollection,
4425}
4426
4427impl<'a> StreamCollectionBuilder<'a> {
4428    fn new(collection: &'a crate::StreamCollection) -> Self {
4429        skip_assert_initialized!();
4430        Self {
4431            builder: MessageBuilder::new(),
4432            collection,
4433        }
4434    }
4435
4436    message_builder_generic_impl!(|s: &mut Self, src| {
4437        ffi::gst_message_new_stream_collection(src, s.collection.to_glib_none().0)
4438    });
4439}
4440
4441#[must_use = "The builder must be built to be used"]
4442pub struct StreamsSelectedBuilder<'a> {
4443    builder: MessageBuilder<'a>,
4444    collection: &'a crate::StreamCollection,
4445    streams: SmallVec<[crate::Stream; 8]>,
4446}
4447
4448impl<'a> StreamsSelectedBuilder<'a> {
4449    fn new(collection: &'a crate::StreamCollection) -> Self {
4450        skip_assert_initialized!();
4451        Self {
4452            builder: MessageBuilder::new(),
4453            collection,
4454            streams: SmallVec::default(),
4455        }
4456    }
4457
4458    pub fn streams<S: std::borrow::Borrow<crate::Stream>>(
4459        self,
4460        streams: impl IntoIterator<Item = S>,
4461    ) -> Self {
4462        Self {
4463            streams: streams
4464                .into_iter()
4465                .map(|s| s.borrow().clone())
4466                .collect::<SmallVec<_>>(),
4467            ..self
4468        }
4469    }
4470
4471    pub fn streams_if<S: std::borrow::Borrow<crate::Stream>>(
4472        self,
4473        streams: impl IntoIterator<Item = S>,
4474        predicate: bool,
4475    ) -> Self {
4476        if predicate {
4477            self.streams(streams)
4478        } else {
4479            self
4480        }
4481    }
4482
4483    pub fn streams_if_some<S: std::borrow::Borrow<crate::Stream>>(
4484        self,
4485        streams: Option<impl IntoIterator<Item = S>>,
4486    ) -> Self {
4487        if let Some(streams) = streams {
4488            self.streams(streams)
4489        } else {
4490            self
4491        }
4492    }
4493
4494    pub fn streams_if_not_empty<S: std::borrow::Borrow<crate::Stream>>(
4495        self,
4496        streams: impl IntoIterator<Item = S>,
4497    ) -> Self {
4498        let mut streams = streams.into_iter().peekable();
4499        if streams.peek().is_some() {
4500            self.streams(streams)
4501        } else {
4502            self
4503        }
4504    }
4505
4506    message_builder_generic_impl!(|s: &mut Self, src| {
4507        let msg = ffi::gst_message_new_streams_selected(src, s.collection.to_glib_none().0);
4508        for stream in &s.streams {
4509            ffi::gst_message_streams_selected_add(msg, stream.to_glib_none().0);
4510        }
4511        msg
4512    });
4513}
4514
4515#[must_use = "The builder must be built to be used"]
4516pub struct RedirectBuilder<'a> {
4517    builder: MessageBuilder<'a>,
4518    location: &'a str,
4519    tag_list: Option<TagList>,
4520    entry_struct: Option<Structure>,
4521    #[allow(clippy::type_complexity)]
4522    entries: SmallVec<[(&'a str, Option<TagList>, Option<Structure>); 4]>,
4523}
4524
4525impl<'a> RedirectBuilder<'a> {
4526    fn new(location: &'a str) -> Self {
4527        skip_assert_initialized!();
4528        Self {
4529            builder: MessageBuilder::new(),
4530            location,
4531            tag_list: None,
4532            entry_struct: None,
4533            entries: SmallVec::default(),
4534        }
4535    }
4536
4537    pub fn tag_list(self, tag_list: TagList) -> Self {
4538        Self {
4539            tag_list: Some(tag_list),
4540            ..self
4541        }
4542    }
4543
4544    pub fn tag_list_if(self, tag_list: TagList, predicate: bool) -> Self {
4545        if predicate {
4546            self.tag_list(tag_list)
4547        } else {
4548            self
4549        }
4550    }
4551
4552    pub fn tag_list_if_some(self, tag_list: Option<TagList>) -> Self {
4553        if let Some(tag_list) = tag_list {
4554            self.tag_list(tag_list)
4555        } else {
4556            self
4557        }
4558    }
4559
4560    pub fn entry_struct(self, entry_struct: Structure) -> Self {
4561        Self {
4562            entry_struct: Some(entry_struct),
4563            ..self
4564        }
4565    }
4566
4567    pub fn entry_struct_if(self, entry_struct: Structure, predicate: bool) -> Self {
4568        if predicate {
4569            self.entry_struct(entry_struct)
4570        } else {
4571            self
4572        }
4573    }
4574
4575    pub fn entry_struct_if_some(self, entry_struct: Option<Structure>) -> Self {
4576        if let Some(entry_struct) = entry_struct {
4577            self.entry_struct(entry_struct)
4578        } else {
4579            self
4580        }
4581    }
4582
4583    pub fn entries(
4584        self,
4585        entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4586    ) -> Self {
4587        skip_assert_initialized!();
4588        Self {
4589            entries: entries.into_iter().collect(),
4590            ..self
4591        }
4592    }
4593
4594    #[allow(clippy::type_complexity)]
4595    pub fn entries_if(
4596        self,
4597        entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4598        predicate: bool,
4599    ) -> Self {
4600        if predicate {
4601            self.entries(entries)
4602        } else {
4603            self
4604        }
4605    }
4606
4607    #[allow(clippy::type_complexity)]
4608    pub fn entries_if_some(
4609        self,
4610        entries: Option<impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>>,
4611    ) -> Self {
4612        if let Some(entries) = entries {
4613            self.entries(entries)
4614        } else {
4615            self
4616        }
4617    }
4618
4619    message_builder_generic_impl!(|s: &mut Self, src| {
4620        let entry_struct = s.entry_struct.take();
4621        let tag_list = s.tag_list.take();
4622
4623        let msg = ffi::gst_message_new_redirect(
4624            src,
4625            s.location.to_glib_none().0,
4626            tag_list.into_glib_ptr(),
4627            entry_struct.into_glib_ptr(),
4628        );
4629        for (location, tag_list, entry_struct) in mem::take(&mut s.entries) {
4630            ffi::gst_message_add_redirect_entry(
4631                msg,
4632                location.to_glib_none().0,
4633                tag_list.into_glib_ptr(),
4634                entry_struct.into_glib_ptr(),
4635            );
4636        }
4637        msg
4638    });
4639}
4640
4641#[cfg(feature = "v1_16")]
4642#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4643#[must_use = "The builder must be built to be used"]
4644pub struct DeviceChangedBuilder<'a> {
4645    builder: MessageBuilder<'a>,
4646    device: &'a crate::Device,
4647    changed_device: &'a crate::Device,
4648}
4649
4650#[cfg(feature = "v1_16")]
4651#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4652impl<'a> DeviceChangedBuilder<'a> {
4653    fn new(device: &'a crate::Device, changed_device: &'a crate::Device) -> Self {
4654        skip_assert_initialized!();
4655        Self {
4656            builder: MessageBuilder::new(),
4657            device,
4658            changed_device,
4659        }
4660    }
4661
4662    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_changed(
4663        src,
4664        s.device.to_glib_none().0,
4665        s.changed_device.to_glib_none().0,
4666    ));
4667}
4668
4669#[cfg(feature = "v1_18")]
4670#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4671#[must_use = "The builder must be built to be used"]
4672pub struct InstantRateRequestBuilder<'a> {
4673    builder: MessageBuilder<'a>,
4674    rate_multiplier: f64,
4675}
4676
4677#[cfg(feature = "v1_18")]
4678#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4679impl<'a> InstantRateRequestBuilder<'a> {
4680    fn new(rate_multiplier: f64) -> Self {
4681        skip_assert_initialized!();
4682        Self {
4683            builder: MessageBuilder::new(),
4684            rate_multiplier,
4685        }
4686    }
4687
4688    message_builder_generic_impl!(
4689        |s: &mut Self, src| ffi::gst_message_new_instant_rate_request(src, s.rate_multiplier,)
4690    );
4691}
4692
4693#[cfg(feature = "v1_28")]
4694#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4695#[must_use = "The builder must be built to be used"]
4696pub struct DeviceMonitorStartedBuilder<'a> {
4697    builder: MessageBuilder<'a>,
4698    started: bool,
4699}
4700
4701#[cfg(feature = "v1_28")]
4702#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4703impl<'a> DeviceMonitorStartedBuilder<'a> {
4704    fn new(started: bool) -> Self {
4705        skip_assert_initialized!();
4706        Self {
4707            builder: MessageBuilder::new(),
4708            started,
4709        }
4710    }
4711
4712    message_builder_generic_impl!(
4713        |s: &mut Self, src| ffi::gst_message_new_device_monitor_started(src, s.started.into_glib(),)
4714    );
4715}
4716
4717#[cfg(test)]
4718mod tests {
4719    use super::*;
4720
4721    #[test]
4722    fn test_simple() {
4723        crate::init().unwrap();
4724
4725        // Message without arguments
4726        let seqnum = Seqnum::next();
4727        let eos_msg = Eos::builder().seqnum(seqnum).build();
4728        match eos_msg.view() {
4729            MessageView::Eos(eos_msg) => {
4730                assert_eq!(eos_msg.seqnum(), seqnum);
4731                assert!(eos_msg.structure().is_none());
4732            }
4733            _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4734        }
4735
4736        // Message with arguments
4737        let buffering_msg = Buffering::new(42);
4738        match buffering_msg.view() {
4739            MessageView::Buffering(buffering_msg) => {
4740                assert_eq!(buffering_msg.percent(), 42);
4741            }
4742            _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4743        }
4744    }
4745
4746    #[test]
4747    #[allow(deprecated)]
4748    fn test_other_fields() {
4749        crate::init().unwrap();
4750
4751        let seqnum = Seqnum::next();
4752        let eos_msg = Eos::builder()
4753            .other_field("extra-field", true)
4754            .seqnum(seqnum)
4755            .build();
4756        match eos_msg.view() {
4757            MessageView::Eos(eos_msg) => {
4758                assert_eq!(eos_msg.seqnum(), seqnum);
4759                if let Some(other_fields) = eos_msg.structure() {
4760                    assert!(other_fields.has_field("extra-field"));
4761                }
4762            }
4763            _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4764        }
4765
4766        let buffering_msg = Buffering::builder(42)
4767            .other_field("extra-field", true)
4768            .build();
4769        match buffering_msg.view() {
4770            MessageView::Buffering(buffering_msg) => {
4771                assert_eq!(buffering_msg.percent(), 42);
4772                if let Some(other_fields) = buffering_msg.structure() {
4773                    assert!(other_fields.has_field("extra-field"));
4774                }
4775            }
4776            _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4777        }
4778    }
4779
4780    #[test]
4781    fn test_get_seqnum_valid() {
4782        crate::init().unwrap();
4783
4784        let msg = StreamStart::new();
4785        let seqnum = Seqnum(
4786            NonZeroU32::new(unsafe { ffi::gst_message_get_seqnum(msg.as_mut_ptr()) }).unwrap(),
4787        );
4788
4789        match msg.view() {
4790            MessageView::StreamStart(stream_start) => assert_eq!(seqnum, stream_start.seqnum()),
4791            _ => panic!(),
4792        }
4793    }
4794
4795    #[test]
4796    fn test_get_seqnum_invalid() {
4797        crate::init().unwrap();
4798
4799        let msg = StreamStart::new();
4800        let seqnum_init = msg.seqnum();
4801
4802        // Invalid the seqnum
4803        unsafe {
4804            (*msg.as_mut_ptr()).seqnum = ffi::GST_SEQNUM_INVALID as u32;
4805            assert_eq!(0, (*msg.as_ptr()).seqnum);
4806        };
4807
4808        match msg.view() {
4809            MessageView::StreamStart(stream_start) => {
4810                // get_seqnum is expected to return a new Seqnum,
4811                // further in the sequence than the last known seqnum.
4812                assert!(seqnum_init < stream_start.seqnum());
4813            }
4814            _ => panic!(),
4815        }
4816    }
4817}