gstreamer/auto/
object.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
4// DO NOT EDIT
5
6use crate::{ffi, ClockTime, ControlBinding};
7use glib::{
8    prelude::*,
9    signal::{connect_raw, SignalHandlerId},
10    translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15    /// [`Object`][crate::Object] provides a root for the object hierarchy tree filed in by the
16    /// GStreamer library. It is currently a thin wrapper on top of
17    /// `GInitiallyUnowned`. It is an abstract class that is not very usable on its own.
18    ///
19    /// [`Object`][crate::Object] gives us basic refcounting, parenting functionality and locking.
20    /// Most of the functions are just extended for special GStreamer needs and can be
21    /// found under the same name in the base class of [`Object`][crate::Object] which is [`glib::Object`][crate::glib::Object]
22    /// (e.g. `g_object_ref()` becomes `gst_object_ref()`).
23    ///
24    /// Since [`Object`][crate::Object] derives from `GInitiallyUnowned`, it also inherits the
25    /// floating reference. Be aware that functions such as [`GstBinExt::add()`][crate::prelude::GstBinExt::add()] and
26    /// [`ElementExt::add_pad()`][crate::prelude::ElementExt::add_pad()] take ownership of the floating reference.
27    ///
28    /// In contrast to [`glib::Object`][crate::glib::Object] instances, [`Object`][crate::Object] adds a name property. The functions
29    /// `gst_object_set_name()` and [`GstObjectExt::name()`][crate::prelude::GstObjectExt::name()] are used to set/get the name
30    /// of the object.
31    ///
32    /// ## controlled properties
33    ///
34    /// Controlled properties offers a lightweight way to adjust gobject properties
35    /// over stream-time. It works by using time-stamped value pairs that are queued
36    /// for element-properties. At run-time the elements continuously pull value
37    /// changes for the current stream-time.
38    ///
39    /// What needs to be changed in a [`Element`][crate::Element]?
40    /// Very little - it is just two steps to make a plugin controllable!
41    ///
42    ///  * mark gobject-properties paramspecs that make sense to be controlled,
43    ///  by GST_PARAM_CONTROLLABLE.
44    ///
45    ///  * when processing data (get, chain, loop function) at the beginning call
46    ///  gst_object_sync_values(element,timestamp).
47    ///  This will make the controller update all GObject properties that are
48    ///  under its control with the current values based on the timestamp.
49    ///
50    /// What needs to be done in applications? Again it's not a lot to change.
51    ///
52    ///  * create a [`ControlSource`][crate::ControlSource].
53    ///  csource = gst_interpolation_control_source_new ();
54    ///  g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
55    ///
56    ///  * Attach the [`ControlSource`][crate::ControlSource] on the controller to a property.
57    ///  gst_object_add_control_binding (object, gst_direct_control_binding_new (object, "prop1", csource));
58    ///
59    ///  * Set the control values
60    ///  gst_timed_value_control_source_set ((GstTimedValueControlSource *)csource,0 * GST_SECOND, value1);
61    ///  gst_timed_value_control_source_set ((GstTimedValueControlSource *)csource,1 * GST_SECOND, value2);
62    ///
63    ///  * start your pipeline
64    ///
65    /// This is an Abstract Base Class, you cannot instantiate it.
66    ///
67    /// ## Properties
68    ///
69    ///
70    /// #### `name`
71    ///  Readable | Writeable | Construct
72    ///
73    ///
74    /// #### `parent`
75    ///  The parent of the object. Please note, that when changing the 'parent'
76    /// property, we don't emit [`notify`][struct@crate::glib::Object#notify] and [`deep-notify`][struct@crate::Object#deep-notify]
77    /// signals due to locking issues. In some cases one can use
78    /// [`element-added`][struct@crate::Bin#element-added] or [`element-removed`][struct@crate::Bin#element-removed] signals on the parent to
79    /// achieve a similar effect.
80    ///
81    /// Readable | Writeable
82    ///
83    /// ## Signals
84    ///
85    ///
86    /// #### `deep-notify`
87    ///  The deep notify signal is used to be notified of property changes. It is
88    /// typically attached to the toplevel bin to receive notifications from all
89    /// the elements contained in that bin.
90    ///
91    /// Detailed
92    ///
93    /// # Implements
94    ///
95    /// [`GstObjectExt`][trait@crate::prelude::GstObjectExt], [`trait@glib::ObjectExt`]
96    #[doc(alias = "GstObject")]
97    pub struct Object(Object<ffi::GstObject, ffi::GstObjectClass>);
98
99    match fn {
100        type_ => || ffi::gst_object_get_type(),
101    }
102}
103
104impl Object {
105    pub const NONE: Option<&'static Object> = None;
106
107    /// Checks to see if there is any object named `name` in `list`. This function
108    /// does not do any locking of any kind. You might want to protect the
109    /// provided list with the lock of the owner of the list. This function
110    /// will lock each [`Object`][crate::Object] in the list to compare the name, so be
111    /// careful when passing a list with a locked object.
112    /// ## `list`
113    /// a list of [`Object`][crate::Object] to
114    ///  check through
115    /// ## `name`
116    /// the name to search for
117    ///
118    /// # Returns
119    ///
120    /// [`true`] if a [`Object`][crate::Object] named `name` does not appear in `list`,
121    /// [`false`] if it does.
122    ///
123    /// MT safe. Grabs and releases the LOCK of each object in the list.
124    #[doc(alias = "gst_object_check_uniqueness")]
125    pub fn check_uniqueness(list: &[Object], name: &str) -> bool {
126        assert_initialized_main_thread!();
127        unsafe {
128            from_glib(ffi::gst_object_check_uniqueness(
129                list.to_glib_none().0,
130                name.to_glib_none().0,
131            ))
132        }
133    }
134
135    //#[doc(alias = "gst_object_default_deep_notify")]
136    //pub fn default_deep_notify(object: &impl IsA<glib::Object>, orig: &impl IsA<Object>, pspec: /*Ignored*/&glib::ParamSpec, excluded_props: &[&str]) {
137    //    unsafe { TODO: call ffi:gst_object_default_deep_notify() }
138    //}
139
140    //#[doc(alias = "gst_object_replace")]
141    //pub fn replace(oldobj: Option<impl IsA<Object>>, newobj: Option<&impl IsA<Object>>) -> bool {
142    //    unsafe { TODO: call ffi:gst_object_replace() }
143    //}
144}
145
146impl std::fmt::Display for Object {
147    #[inline]
148    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
149        f.write_str(&GstObjectExt::name(self))
150    }
151}
152
153unsafe impl Send for Object {}
154unsafe impl Sync for Object {}
155
156mod sealed {
157    pub trait Sealed {}
158    impl<T: super::IsA<super::Object>> Sealed for T {}
159}
160
161/// Trait containing all [`struct@Object`] methods.
162///
163/// # Implementors
164///
165/// [`Allocator`][struct@crate::Allocator], [`BufferPool`][struct@crate::BufferPool], [`Bus`][struct@crate::Bus], [`Clock`][struct@crate::Clock], [`ControlBinding`][struct@crate::ControlBinding], [`ControlSource`][struct@crate::ControlSource], [`DeviceMonitor`][struct@crate::DeviceMonitor], [`DeviceProvider`][struct@crate::DeviceProvider], [`Device`][struct@crate::Device], [`Element`][struct@crate::Element], [`Object`][struct@crate::Object], [`PadTemplate`][struct@crate::PadTemplate], [`Pad`][struct@crate::Pad], [`PluginFeature`][struct@crate::PluginFeature], [`Plugin`][struct@crate::Plugin], [`Registry`][struct@crate::Registry], [`StreamCollection`][struct@crate::StreamCollection], [`Stream`][struct@crate::Stream], [`TaskPool`][struct@crate::TaskPool], [`Task`][struct@crate::Task], [`Tracer`][struct@crate::Tracer]
166pub trait GstObjectExt: IsA<Object> + sealed::Sealed + 'static {
167    /// Attach the [`ControlBinding`][crate::ControlBinding] to the object. If there already was a
168    /// [`ControlBinding`][crate::ControlBinding] for this property it will be replaced.
169    ///
170    /// The object's reference count will be incremented, and any floating
171    /// reference will be removed (see `gst_object_ref_sink()`)
172    /// ## `binding`
173    /// the [`ControlBinding`][crate::ControlBinding] that should be used
174    ///
175    /// # Returns
176    ///
177    /// [`false`] if the given `binding` has not been setup for this object or
178    /// has been setup for a non suitable property, [`true`] otherwise.
179    #[doc(alias = "gst_object_add_control_binding")]
180    fn add_control_binding(
181        &self,
182        binding: &impl IsA<ControlBinding>,
183    ) -> Result<(), glib::error::BoolError> {
184        unsafe {
185            glib::result_from_gboolean!(
186                ffi::gst_object_add_control_binding(
187                    self.as_ref().to_glib_none().0,
188                    binding.as_ref().to_glib_none().0
189                ),
190                "Failed to add control binding"
191            )
192        }
193    }
194
195    /// A default error function that uses `g_printerr()` to display the error message
196    /// and the optional debug string..
197    ///
198    /// The default handler will simply print the error string using g_print.
199    /// ## `error`
200    /// the GError.
201    /// ## `debug`
202    /// an additional debug information string, or [`None`]
203    #[doc(alias = "gst_object_default_error")]
204    fn default_error(&self, error: &glib::Error, debug: Option<&str>) {
205        unsafe {
206            ffi::gst_object_default_error(
207                self.as_ref().to_glib_none().0,
208                error.to_glib_none().0,
209                debug.to_glib_none().0,
210            );
211        }
212    }
213
214    /// Gets the corresponding [`ControlBinding`][crate::ControlBinding] for the property. This should be
215    /// unreferenced again after use.
216    /// ## `property_name`
217    /// name of the property
218    ///
219    /// # Returns
220    ///
221    /// the [`ControlBinding`][crate::ControlBinding] for
222    /// `property_name` or [`None`] if the property is not controlled.
223    #[doc(alias = "gst_object_get_control_binding")]
224    #[doc(alias = "get_control_binding")]
225    fn control_binding(&self, property_name: &str) -> Option<ControlBinding> {
226        unsafe {
227            from_glib_full(ffi::gst_object_get_control_binding(
228                self.as_ref().to_glib_none().0,
229                property_name.to_glib_none().0,
230            ))
231        }
232    }
233
234    /// Obtain the control-rate for this `self`. Audio processing [`Element`][crate::Element]
235    /// objects will use this rate to sub-divide their processing loop and call
236    /// [`sync_values()`][Self::sync_values()] in between. The length of the processing segment
237    /// should be up to `control`-rate nanoseconds.
238    ///
239    /// If the `self` is not under property control, this will return
240    /// `GST_CLOCK_TIME_NONE`. This allows the element to avoid the sub-dividing.
241    ///
242    /// The control-rate is not expected to change if the element is in
243    /// [`State::Paused`][crate::State::Paused] or [`State::Playing`][crate::State::Playing].
244    ///
245    /// # Returns
246    ///
247    /// the control rate in nanoseconds
248    #[doc(alias = "gst_object_get_control_rate")]
249    #[doc(alias = "get_control_rate")]
250    fn control_rate(&self) -> Option<ClockTime> {
251        unsafe {
252            from_glib(ffi::gst_object_get_control_rate(
253                self.as_ref().to_glib_none().0,
254            ))
255        }
256    }
257
258    /// Returns a copy of the name of `self`.
259    /// Caller should `g_free()` the return value after usage.
260    /// For a nameless object, this returns [`None`], which you can safely `g_free()`
261    /// as well.
262    ///
263    /// Free-function: g_free
264    ///
265    /// # Returns
266    ///
267    /// the name of `self`. `g_free()`
268    /// after usage.
269    ///
270    /// MT safe. This function grabs and releases `self`'s LOCK.
271    #[doc(alias = "gst_object_get_name")]
272    #[doc(alias = "get_name")]
273    fn name(&self) -> glib::GString {
274        unsafe { from_glib_full(ffi::gst_object_get_name(self.as_ref().to_glib_none().0)) }
275    }
276
277    /// Returns the parent of `self`. This function increases the refcount
278    /// of the parent object so you should `gst_object_unref()` it after usage.
279    ///
280    /// # Returns
281    ///
282    /// parent of `self`, this can be
283    ///  [`None`] if `self` has no parent. unref after usage.
284    ///
285    /// MT safe. Grabs and releases `self`'s LOCK.
286    #[doc(alias = "gst_object_get_parent")]
287    #[doc(alias = "get_parent")]
288    #[must_use]
289    fn parent(&self) -> Option<Object> {
290        unsafe { from_glib_full(ffi::gst_object_get_parent(self.as_ref().to_glib_none().0)) }
291    }
292
293    /// Generates a string describing the path of `self` in
294    /// the object hierarchy. Only useful (or used) for debugging.
295    ///
296    /// Free-function: g_free
297    ///
298    /// # Returns
299    ///
300    /// a string describing the path of `self`. You must
301    ///  `g_free()` the string after usage.
302    ///
303    /// MT safe. Grabs and releases the [`Object`][crate::Object]'s LOCK for all objects
304    ///  in the hierarchy.
305    #[doc(alias = "gst_object_get_path_string")]
306    #[doc(alias = "get_path_string")]
307    fn path_string(&self) -> glib::GString {
308        unsafe {
309            from_glib_full(ffi::gst_object_get_path_string(
310                self.as_ref().to_glib_none().0,
311            ))
312        }
313    }
314
315    /// Gets the value for the given controlled property at the requested time.
316    /// ## `property_name`
317    /// the name of the property to get
318    /// ## `timestamp`
319    /// the time the control-change should be read from
320    ///
321    /// # Returns
322    ///
323    /// the GValue of the property at the given time,
324    /// or [`None`] if the property isn't controlled.
325    #[doc(alias = "gst_object_get_value")]
326    #[doc(alias = "get_value")]
327    fn value(
328        &self,
329        property_name: &str,
330        timestamp: impl Into<Option<ClockTime>>,
331    ) -> Option<glib::Value> {
332        unsafe {
333            from_glib_full(ffi::gst_object_get_value(
334                self.as_ref().to_glib_none().0,
335                property_name.to_glib_none().0,
336                timestamp.into().into_glib(),
337            ))
338        }
339    }
340
341    //#[doc(alias = "gst_object_get_value_array")]
342    //#[doc(alias = "get_value_array")]
343    //fn is_value_array(&self, property_name: &str, timestamp: impl Into<Option<ClockTime>>, interval: impl Into<Option<ClockTime>>, values: /*Unimplemented*/&[&Basic: Pointer]) -> bool {
344    //    unsafe { TODO: call ffi:gst_object_get_value_array() }
345    //}
346
347    /// Check if the `self` has active controlled properties.
348    ///
349    /// # Returns
350    ///
351    /// [`true`] if the object has active controlled properties
352    #[doc(alias = "gst_object_has_active_control_bindings")]
353    fn has_active_control_bindings(&self) -> bool {
354        unsafe {
355            from_glib(ffi::gst_object_has_active_control_bindings(
356                self.as_ref().to_glib_none().0,
357            ))
358        }
359    }
360
361    /// Check if `self` has an ancestor `ancestor` somewhere up in
362    /// the hierarchy. One can e.g. check if a [`Element`][crate::Element] is inside a [`Pipeline`][crate::Pipeline].
363    ///
364    /// # Deprecated
365    ///
366    /// Use [`has_as_ancestor()`][Self::has_as_ancestor()] instead.
367    ///
368    /// MT safe. Grabs and releases `self`'s locks.
369    /// ## `ancestor`
370    /// a [`Object`][crate::Object] to check as ancestor
371    ///
372    /// # Returns
373    ///
374    /// [`true`] if `ancestor` is an ancestor of `self`.
375    #[doc(alias = "gst_object_has_ancestor")]
376    fn has_ancestor(&self, ancestor: &impl IsA<Object>) -> bool {
377        unsafe {
378            from_glib(ffi::gst_object_has_ancestor(
379                self.as_ref().to_glib_none().0,
380                ancestor.as_ref().to_glib_none().0,
381            ))
382        }
383    }
384
385    /// Check if `self` has an ancestor `ancestor` somewhere up in
386    /// the hierarchy. One can e.g. check if a [`Element`][crate::Element] is inside a [`Pipeline`][crate::Pipeline].
387    /// ## `ancestor`
388    /// a [`Object`][crate::Object] to check as ancestor
389    ///
390    /// # Returns
391    ///
392    /// [`true`] if `ancestor` is an ancestor of `self`.
393    ///
394    /// MT safe. Grabs and releases `self`'s locks.
395    #[doc(alias = "gst_object_has_as_ancestor")]
396    fn has_as_ancestor(&self, ancestor: &impl IsA<Object>) -> bool {
397        unsafe {
398            from_glib(ffi::gst_object_has_as_ancestor(
399                self.as_ref().to_glib_none().0,
400                ancestor.as_ref().to_glib_none().0,
401            ))
402        }
403    }
404
405    /// Check if `parent` is the parent of `self`.
406    /// E.g. a [`Element`][crate::Element] can check if it owns a given [`Pad`][crate::Pad].
407    /// ## `parent`
408    /// a [`Object`][crate::Object] to check as parent
409    ///
410    /// # Returns
411    ///
412    /// [`false`] if either `self` or `parent` is [`None`]. [`true`] if `parent` is
413    ///  the parent of `self`. Otherwise [`false`].
414    ///
415    /// MT safe. Grabs and releases `self`'s locks.
416    #[doc(alias = "gst_object_has_as_parent")]
417    fn has_as_parent(&self, parent: &impl IsA<Object>) -> bool {
418        unsafe {
419            from_glib(ffi::gst_object_has_as_parent(
420                self.as_ref().to_glib_none().0,
421                parent.as_ref().to_glib_none().0,
422            ))
423        }
424    }
425
426    /// Removes the corresponding [`ControlBinding`][crate::ControlBinding]. If it was the
427    /// last ref of the binding, it will be disposed.
428    /// ## `binding`
429    /// the binding
430    ///
431    /// # Returns
432    ///
433    /// [`true`] if the binding could be removed.
434    #[doc(alias = "gst_object_remove_control_binding")]
435    fn remove_control_binding(&self, binding: &impl IsA<ControlBinding>) -> bool {
436        unsafe {
437            from_glib(ffi::gst_object_remove_control_binding(
438                self.as_ref().to_glib_none().0,
439                binding.as_ref().to_glib_none().0,
440            ))
441        }
442    }
443
444    /// This function is used to disable the control bindings on a property for
445    /// some time, i.e. [`sync_values()`][Self::sync_values()] will do nothing for the
446    /// property.
447    /// ## `property_name`
448    /// property to disable
449    /// ## `disabled`
450    /// boolean that specifies whether to disable the controller
451    /// or not.
452    #[doc(alias = "gst_object_set_control_binding_disabled")]
453    fn set_control_binding_disabled(&self, property_name: &str, disabled: bool) {
454        unsafe {
455            ffi::gst_object_set_control_binding_disabled(
456                self.as_ref().to_glib_none().0,
457                property_name.to_glib_none().0,
458                disabled.into_glib(),
459            );
460        }
461    }
462
463    /// This function is used to disable all controlled properties of the `self` for
464    /// some time, i.e. [`sync_values()`][Self::sync_values()] will do nothing.
465    /// ## `disabled`
466    /// boolean that specifies whether to disable the controller
467    /// or not.
468    #[doc(alias = "gst_object_set_control_bindings_disabled")]
469    fn set_control_bindings_disabled(&self, disabled: bool) {
470        unsafe {
471            ffi::gst_object_set_control_bindings_disabled(
472                self.as_ref().to_glib_none().0,
473                disabled.into_glib(),
474            );
475        }
476    }
477
478    /// Change the control-rate for this `self`. Audio processing [`Element`][crate::Element]
479    /// objects will use this rate to sub-divide their processing loop and call
480    /// [`sync_values()`][Self::sync_values()] in between. The length of the processing segment
481    /// should be up to `control`-rate nanoseconds.
482    ///
483    /// The control-rate should not change if the element is in [`State::Paused`][crate::State::Paused] or
484    /// [`State::Playing`][crate::State::Playing].
485    /// ## `control_rate`
486    /// the new control-rate in nanoseconds.
487    #[doc(alias = "gst_object_set_control_rate")]
488    fn set_control_rate(&self, control_rate: impl Into<Option<ClockTime>>) {
489        unsafe {
490            ffi::gst_object_set_control_rate(
491                self.as_ref().to_glib_none().0,
492                control_rate.into().into_glib(),
493            );
494        }
495    }
496
497    /// Sets the parent of `self` to `parent`. The object's reference count will
498    /// be incremented, and any floating reference will be removed (see `gst_object_ref_sink()`).
499    /// ## `parent`
500    /// new parent of object
501    ///
502    /// # Returns
503    ///
504    /// [`true`] if `parent` could be set or [`false`] when `self`
505    /// already had a parent or `self` and `parent` are the same.
506    ///
507    /// MT safe. Grabs and releases `self`'s LOCK.
508    #[doc(alias = "gst_object_set_parent")]
509    #[doc(alias = "parent")]
510    fn set_parent(&self, parent: &impl IsA<Object>) -> Result<(), glib::error::BoolError> {
511        unsafe {
512            glib::result_from_gboolean!(
513                ffi::gst_object_set_parent(
514                    self.as_ref().to_glib_none().0,
515                    parent.as_ref().to_glib_none().0
516                ),
517                "Failed to set parent object"
518            )
519        }
520    }
521
522    /// Returns a suggestion for timestamps where buffers should be split
523    /// to get best controller results.
524    ///
525    /// # Returns
526    ///
527    /// Returns the suggested timestamp or `GST_CLOCK_TIME_NONE`
528    /// if no control-rate was set.
529    #[doc(alias = "gst_object_suggest_next_sync")]
530    fn suggest_next_sync(&self) -> Option<ClockTime> {
531        unsafe {
532            from_glib(ffi::gst_object_suggest_next_sync(
533                self.as_ref().to_glib_none().0,
534            ))
535        }
536    }
537
538    /// Sets the properties of the object, according to the `GstControlSources` that
539    /// (maybe) handle them and for the given timestamp.
540    ///
541    /// If this function fails, it is most likely the application developers fault.
542    /// Most probably the control sources are not setup correctly.
543    /// ## `timestamp`
544    /// the time that should be processed
545    ///
546    /// # Returns
547    ///
548    /// [`true`] if the controller values could be applied to the object
549    /// properties, [`false`] otherwise
550    #[doc(alias = "gst_object_sync_values")]
551    fn sync_values(&self, timestamp: ClockTime) -> Result<(), glib::error::BoolError> {
552        unsafe {
553            glib::result_from_gboolean!(
554                ffi::gst_object_sync_values(self.as_ref().to_glib_none().0, timestamp.into_glib()),
555                "Failed to sync values"
556            )
557        }
558    }
559
560    /// Clear the parent of `self`, removing the associated reference.
561    /// This function decreases the refcount of `self`.
562    ///
563    /// MT safe. Grabs and releases `self`'s lock.
564    #[doc(alias = "gst_object_unparent")]
565    fn unparent(&self) {
566        unsafe {
567            ffi::gst_object_unparent(self.as_ref().to_glib_none().0);
568        }
569    }
570
571    //#[doc(alias = "deep-notify")]
572    //fn connect_deep_notify<Unsupported or ignored types>(&self, detail: Option<&str>, f: F) -> SignalHandlerId {
573    //    Ignored prop: GObject.ParamSpec
574    //}
575
576    #[doc(alias = "parent")]
577    fn connect_parent_notify<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> SignalHandlerId {
578        unsafe extern "C" fn notify_parent_trampoline<
579            P: IsA<Object>,
580            F: Fn(&P) + Send + Sync + 'static,
581        >(
582            this: *mut ffi::GstObject,
583            _param_spec: glib::ffi::gpointer,
584            f: glib::ffi::gpointer,
585        ) {
586            let f: &F = &*(f as *const F);
587            f(Object::from_glib_borrow(this).unsafe_cast_ref())
588        }
589        unsafe {
590            let f: Box_<F> = Box_::new(f);
591            connect_raw(
592                self.as_ptr() as *mut _,
593                b"notify::parent\0".as_ptr() as *const _,
594                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
595                    notify_parent_trampoline::<Self, F> as *const (),
596                )),
597                Box_::into_raw(f),
598            )
599        }
600    }
601}
602
603impl<O: IsA<Object>> GstObjectExt for O {}