gstreamer-base: fix parent vfunc invocations when needed

Fixes #180
This commit is contained in:
François Laignel 2019-02-01 15:07:42 +01:00 committed by Sebastian Dröge
parent 56c00d9250
commit ac00608b7e
4 changed files with 148 additions and 152 deletions

View file

@ -1,4 +1,4 @@
// Copyright (C) 2017,2018 Sebastian Dröge <sebastian@centricular.com> // Copyright (C) 2017-2019 Sebastian Dröge <sebastian@centricular.com>
// //
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
@ -170,10 +170,10 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.finish_buffer .finish_buffer
.map(|f| from_glib(f(aggregator.to_glib_none().0, buffer.into_ptr()))) .expect("Missing parent function `finish_buffer`");
.unwrap_or(gst::FlowReturn::Ok) gst::FlowReturn::from_glib(f(aggregator.to_glib_none().0, buffer.into_ptr()))
.into_result() .into_result()
} }
} }
@ -187,16 +187,14 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.sink_event .sink_event
.map(|f| { .expect("Missing parent function `sink_event`");
from_glib(f( from_glib(f(
aggregator.to_glib_none().0, aggregator.to_glib_none().0,
aggregator_pad.to_glib_none().0, aggregator_pad.to_glib_none().0,
event.into_ptr(), event.into_ptr(),
)) ))
})
.unwrap_or(false)
} }
} }
@ -209,16 +207,14 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.sink_query .sink_query
.map(|f| { .expect("Missing parent function `sink_query`");
from_glib(f( from_glib(f(
aggregator.to_glib_none().0, aggregator.to_glib_none().0,
aggregator_pad.to_glib_none().0, aggregator_pad.to_glib_none().0,
query.as_mut_ptr(), query.as_mut_ptr(),
)) ))
})
.unwrap_or(false)
} }
} }
@ -226,10 +222,10 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.src_event .src_event
.map(|f| from_glib(f(aggregator.to_glib_none().0, event.into_ptr()))) .expect("Missing parent function `src_event`");
.unwrap_or(false) from_glib(f(aggregator.to_glib_none().0, event.into_ptr()))
} }
} }
@ -237,10 +233,10 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.src_query .src_query
.map(|f| from_glib(f(aggregator.to_glib_none().0, query.as_mut_ptr()))) .expect("Missing parent function `src_query`");
.unwrap_or(false) from_glib(f(aggregator.to_glib_none().0, query.as_mut_ptr()))
} }
} }
@ -253,21 +249,18 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
let f = (*parent_class).src_activate.ok_or_else(|| { match (*parent_class).src_activate {
gst_loggable_error!( None => Ok(()),
Some(f) => gst_result_from_gboolean!(
f(
aggregator.to_glib_none().0,
mode.to_glib(),
active.to_glib()
),
gst::CAT_RUST, gst::CAT_RUST,
"Parent function `src_activate` is not defined" "Parent function `src_activate` failed"
)
})?;
gst_result_from_gboolean!(
f(
aggregator.to_glib_none().0,
mode.to_glib(),
active.to_glib()
), ),
gst::CAT_RUST, }
"Parent function `src_activate` failed"
)
} }
} }
@ -279,10 +272,10 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.aggregate .aggregate
.map(|f| from_glib(f(aggregator.to_glib_none().0, timeout.to_glib()))) .expect("Missing parent function `aggregate`");
.unwrap_or(gst::FlowReturn::Error) gst::FlowReturn::from_glib(f(aggregator.to_glib_none().0, timeout.to_glib()))
.into_result() .into_result()
} }
} }
@ -291,20 +284,19 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
let f = (*parent_class).start.ok_or_else(|| { (*parent_class)
gst_error_msg!( .start
gst::CoreError::Failed, .map(|f| {
["Parent function `start` is not defined"] if from_glib(f(aggregator.to_glib_none().0)) {
) Ok(())
})?; } else {
if from_glib(f(aggregator.to_glib_none().0)) { Err(gst_error_msg!(
Ok(()) gst::CoreError::Failed,
} else { ["Parent function `start` failed"]
Err(gst_error_msg!( ))
gst::CoreError::Failed, }
["Parent function `start` failed"] })
)) .unwrap_or(Ok(()))
}
} }
} }
@ -312,20 +304,19 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
let f = (*parent_class).stop.ok_or_else(|| { (*parent_class)
gst_error_msg!( .stop
gst::CoreError::Failed, .map(|f| {
["Parent function `stop` is not defined"] if from_glib(f(aggregator.to_glib_none().0)) {
) Ok(())
})?; } else {
if from_glib(f(aggregator.to_glib_none().0)) { Err(gst_error_msg!(
Ok(()) gst::CoreError::Failed,
} else { ["Parent function `stop` failed"]
Err(gst_error_msg!( ))
gst::CoreError::Failed, }
["Parent function `stop` failed"] })
)) .unwrap_or(Ok(()))
}
} }
} }
@ -350,17 +341,15 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.create_new_pad .create_new_pad
.map(|f| { .expect("Missing parent function `create_new_pad`");
from_glib_full(f( from_glib_full(f(
aggregator.to_glib_none().0, aggregator.to_glib_none().0,
templ.to_glib_none().0, templ.to_glib_none().0,
req_name.to_glib_none().0, req_name.to_glib_none().0,
caps.map(|c| c.as_ptr()).unwrap_or(ptr::null()), caps.map(|c| c.as_ptr()).unwrap_or(ptr::null()),
)) ))
})
.unwrap_or(None)
} }
} }
@ -372,18 +361,17 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
(*parent_class) let f = (*parent_class)
.update_src_caps .update_src_caps
.map(|f| { .expect("Missing parent function `update_src_caps`");
let mut out_caps = ptr::null_mut();
let flow_ret: gst::FlowReturn = from_glib(f( let mut out_caps = ptr::null_mut();
aggregator.to_glib_none().0, gst::FlowReturn::from_glib(f(
caps.as_mut_ptr(), aggregator.to_glib_none().0,
&mut out_caps, caps.as_mut_ptr(),
)); &mut out_caps,
flow_ret.into_result_value(|| from_glib_full(out_caps)) ))
}) .into_result_value(|| from_glib_full(out_caps))
.unwrap_or(Err(gst::FlowError::Error))
} }
} }
@ -392,10 +380,10 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
match (*parent_class).fixate_src_caps { let f = (*parent_class)
Some(ref f) => from_glib_full(f(aggregator.to_glib_none().0, caps.into_ptr())), .fixate_src_caps
None => caps, .expect("Missing parent function `fixate_src_caps`");
} from_glib_full(f(aggregator.to_glib_none().0, caps.into_ptr()))
} }
} }
@ -407,17 +395,16 @@ pub trait AggregatorImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstAggregatorClass;
let f = (*parent_class).negotiated_src_caps.ok_or_else(|| { (*parent_class)
gst_loggable_error!( .negotiated_src_caps
gst::CAT_RUST, .map(|f| {
"Parent function `negotiated_src_caps` is not defined" gst_result_from_gboolean!(
) f(aggregator.to_glib_none().0, caps.as_mut_ptr()),
})?; gst::CAT_RUST,
gst_result_from_gboolean!( "Parent function `negotiated_src_caps` failed"
f(aggregator.to_glib_none().0, caps.as_mut_ptr()), )
gst::CAT_RUST, })
"Parent function `negotiated_src_caps` failed" .unwrap_or(Ok(()))
)
} }
} }
} }

View file

@ -1,4 +1,4 @@
// Copyright (C) 2017,2018 Sebastian Dröge <sebastian@centricular.com> // Copyright (C) 2017-2019 Sebastian Dröge <sebastian@centricular.com>
// //
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
@ -113,7 +113,7 @@ pub trait BaseSinkImpl: ElementImpl + Send + Sync + 'static {
(*parent_class) (*parent_class)
.event .event
.map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr()))) .map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr())))
.unwrap_or(false) .unwrap_or(true)
} }
} }
@ -146,14 +146,16 @@ pub trait BaseSinkImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSinkClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSinkClass;
let f = (*parent_class).set_caps.ok_or_else(|| { (*parent_class)
gst_loggable_error!(gst::CAT_RUST, "Parent function `set_caps` is not defined") .set_caps
})?; .map(|f| {
gst_result_from_gboolean!( gst_result_from_gboolean!(
f(element.to_glib_none().0, caps.as_mut_ptr()), f(element.to_glib_none().0, caps.as_mut_ptr()),
gst::CAT_RUST, gst::CAT_RUST,
"Parent function `set_caps` failed" "Parent function `set_caps` failed"
) )
})
.unwrap_or(Ok(()))
} }
} }

View file

@ -1,4 +1,4 @@
// Copyright (C) 2017,2018 Sebastian Dröge <sebastian@centricular.com> // Copyright (C) 2017-2019 Sebastian Dröge <sebastian@centricular.com>
// //
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
@ -115,7 +115,7 @@ pub trait BaseSrcImpl: ElementImpl + Send + Sync + 'static {
ret.into_result_value(|| from_glib_full(buffer)) ret.into_result_value(|| from_glib_full(buffer))
}) })
.unwrap_or(Err(gst::FlowError::Error)) .unwrap_or(Err(gst::FlowError::NotSupported))
} }
} }
@ -177,14 +177,16 @@ pub trait BaseSrcImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSrcClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSrcClass;
let f = (*parent_class).negotiate.ok_or_else(|| { (*parent_class)
gst_loggable_error!(gst::CAT_RUST, "Parent function `negotiate` is not defined") .negotiate
})?; .map(|f| {
gst_result_from_gboolean!( gst_result_from_gboolean!(
f(element.to_glib_none().0), f(element.to_glib_none().0),
gst::CAT_RUST, gst::CAT_RUST,
"Parent function `negotiate` failed" "Parent function `negotiate` failed"
) )
})
.unwrap_or(Ok(()))
} }
} }
@ -196,14 +198,16 @@ pub trait BaseSrcImpl: ElementImpl + Send + Sync + 'static {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSrcClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseSrcClass;
let f = (*parent_class).set_caps.ok_or_else(|| { (*parent_class)
gst_loggable_error!(gst::CAT_RUST, "Parent function `set_caps` is not defined") .set_caps
})?; .map(|f| {
gst_result_from_gboolean!( gst_result_from_gboolean!(
f(element.to_glib_none().0, caps.as_mut_ptr()), f(element.to_glib_none().0, caps.as_mut_ptr()),
gst::CAT_RUST, gst::CAT_RUST,
"Parent function `set_caps` failed" "Parent function `set_caps` failed"
) )
})
.unwrap_or(Ok(()))
} }
} }

View file

@ -1,4 +1,4 @@
// Copyright (C) 2017,2018 Sebastian Dröge <sebastian@centricular.com> // Copyright (C) 2017-2019 Sebastian Dröge <sebastian@centricular.com>
// //
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
@ -35,7 +35,7 @@ pub trait BaseTransformImpl: ElementImpl + Send + Sync + 'static {
direction: gst::PadDirection, direction: gst::PadDirection,
caps: &gst::Caps, caps: &gst::Caps,
filter: Option<&gst::Caps>, filter: Option<&gst::Caps>,
) -> gst::Caps { ) -> Option<gst::Caps> {
self.parent_transform_caps(element, direction, caps, filter) self.parent_transform_caps(element, direction, caps, filter)
} }
@ -130,19 +130,21 @@ pub trait BaseTransformImpl: ElementImpl + Send + Sync + 'static {
direction: gst::PadDirection, direction: gst::PadDirection,
caps: &gst::Caps, caps: &gst::Caps,
filter: Option<&gst::Caps>, filter: Option<&gst::Caps>,
) -> gst::Caps { ) -> Option<gst::Caps> {
unsafe { unsafe {
let data = self.get_type_data(); let data = self.get_type_data();
let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseTransformClass; let parent_class = data.as_ref().get_parent_class() as *mut ffi::GstBaseTransformClass;
match (*parent_class).transform_caps { (*parent_class)
Some(f) => from_glib_full(f( .transform_caps
element.to_glib_none().0, .map(|f| {
direction.to_glib(), from_glib_full(f(
caps.to_glib_none().0, element.to_glib_none().0,
filter.to_glib_none().0, direction.to_glib(),
)), caps.to_glib_none().0,
None => caps.clone(), filter.to_glib_none().0,
} ))
})
.unwrap_or(None)
} }
} }
@ -252,7 +254,7 @@ pub trait BaseTransformImpl: ElementImpl + Send + Sync + 'static {
(*parent_class) (*parent_class)
.sink_event .sink_event
.map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr()))) .map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr())))
.unwrap_or(false) .unwrap_or(true)
} }
} }
@ -263,7 +265,7 @@ pub trait BaseTransformImpl: ElementImpl + Send + Sync + 'static {
(*parent_class) (*parent_class)
.src_event .src_event
.map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr()))) .map(|f| from_glib(f(element.to_glib_none().0, event.into_ptr())))
.unwrap_or(false) .unwrap_or(true)
} }
} }
} }
@ -400,7 +402,7 @@ where
let imp = instance.get_impl(); let imp = instance.get_impl();
let wrap: BaseTransform = from_glib_borrow(ptr); let wrap: BaseTransform = from_glib_borrow(ptr);
gst_panic_to_error!(&wrap, &instance.panicked(), gst::Caps::new_empty(), { gst_panic_to_error!(&wrap, &instance.panicked(), None, {
let filter = if filter.is_null() { let filter = if filter.is_null() {
None None
} else { } else {
@ -414,7 +416,8 @@ where
filter.as_ref(), filter.as_ref(),
) )
}) })
.into_ptr() .map(|caps| caps.into_ptr())
.unwrap_or(std::ptr::null_mut())
} }
unsafe extern "C" fn base_transform_fixate_caps<T: ObjectSubclass>( unsafe extern "C" fn base_transform_fixate_caps<T: ObjectSubclass>(