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