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