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