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 {}