aggregator: Implement set_position

This commit is contained in:
Jimmi Holst Christensen 2021-11-24 10:44:04 +01:00
parent f31aa2efee
commit 14dadf4c62

View file

@ -6,6 +6,7 @@ use glib::prelude::*;
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_16")))]
use glib::signal::{connect_raw, SignalHandlerId};
use glib::translate::*;
use gst::FormattedValue;
#[cfg(any(feature = "v1_16", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_16")))]
use std::boxed::Box as Box_;
@ -54,6 +55,8 @@ pub trait AggregatorExtManual: 'static {
#[doc(alias = "gst_aggregator_update_segment")]
fn update_segment<F: gst::FormattedValueIntrinsic>(&self, segment: &gst::FormattedSegment<F>);
fn set_position<V: FormattedValue>(&self, position: V);
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_aggregator_selected_samples")]
@ -165,6 +168,21 @@ impl<O: IsA<Aggregator>> AggregatorExtManual for O {
}
}
fn set_position<V: FormattedValue>(&self, position: V) {
unsafe {
let ptr: *mut ffi::GstAggregator = self.as_ref().to_glib_none().0;
let ptr = &mut *ptr;
let _guard = crate::utils::MutexGuard::lock(&ptr.parent.object.lock);
// gstaggregator.c asserts that the src pad is always of type GST_TYPE_AGGREGATOR_PAD,
// so the pointer cast here should be safe.
let srcpad = &mut *(ptr.srcpad as *mut ffi::GstAggregatorPad);
assert_eq!(srcpad.segment.format, position.format().into_glib());
srcpad.segment.position = position.into_raw_value() as u64;
}
}
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
fn selected_samples(