feat(iced-video): added video format to the video frame
This commit is contained in:
@@ -6,9 +6,71 @@ pub use gstreamer_app::AppSinkCallbacks;
|
||||
wrap_gst!(AppSink, gstreamer::Element);
|
||||
parent_child!(Element, AppSink);
|
||||
|
||||
pub struct AppSinkBuilder {
|
||||
inner: AppSink,
|
||||
callbacks: Option<gstreamer_app::app_sink::AppSinkCallbacksBuilder>,
|
||||
}
|
||||
|
||||
impl AppSinkBuilder {
|
||||
pub fn on_new_sample<F>(mut self, mut f: F) -> Self
|
||||
where
|
||||
F: FnMut(&AppSink) -> Result<(), gstreamer::FlowError> + Send + 'static,
|
||||
{
|
||||
let mut callbacks_builder = self
|
||||
.callbacks
|
||||
.take()
|
||||
.unwrap_or_else(gstreamer_app::app_sink::AppSinkCallbacks::builder);
|
||||
callbacks_builder = callbacks_builder.new_sample(move |appsink| {
|
||||
use glib::object::Cast;
|
||||
let element = appsink.upcast_ref::<gstreamer::Element>();
|
||||
let appsink = AppSink::from_gst_ref(element);
|
||||
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| f(appsink)))
|
||||
.unwrap_or(Err(gstreamer::FlowError::Error))
|
||||
.map(|_| gstreamer::FlowSuccess::Ok)
|
||||
});
|
||||
self.callbacks = Some(callbacks_builder);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn on_new_preroll<F>(mut self, mut f: F) -> Self
|
||||
where
|
||||
F: FnMut(&AppSink) -> Result<(), gstreamer::FlowError> + Send + 'static,
|
||||
{
|
||||
let mut callbacks_builder = self
|
||||
.callbacks
|
||||
.take()
|
||||
.unwrap_or_else(gstreamer_app::app_sink::AppSinkCallbacks::builder);
|
||||
callbacks_builder = callbacks_builder.new_preroll(move |appsink| {
|
||||
use glib::object::Cast;
|
||||
let element = appsink.upcast_ref::<gstreamer::Element>();
|
||||
let appsink = AppSink::from_gst_ref(element);
|
||||
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| f(appsink)))
|
||||
.unwrap_or(Err(gstreamer::FlowError::Error))
|
||||
.map(|_| gstreamer::FlowSuccess::Ok)
|
||||
});
|
||||
self.callbacks = Some(callbacks_builder);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn build(self) -> AppSink {
|
||||
let AppSinkBuilder { inner, callbacks } = self;
|
||||
if let Some(callbacks) = callbacks {
|
||||
inner.appsink().set_callbacks(callbacks.build());
|
||||
}
|
||||
inner
|
||||
}
|
||||
}
|
||||
|
||||
impl Sink for AppSink {}
|
||||
|
||||
impl AppSink {
|
||||
pub fn builder(name: impl AsRef<str>) -> AppSinkBuilder {
|
||||
let inner = AppSink::new(name).expect("Failed to create AppSink");
|
||||
AppSinkBuilder {
|
||||
inner,
|
||||
callbacks: None,
|
||||
}
|
||||
}
|
||||
fn appsink(&self) -> &gstreamer_app::AppSink {
|
||||
self.inner
|
||||
.downcast_ref::<gstreamer_app::AppSink>()
|
||||
@@ -54,7 +116,7 @@ impl AppSink {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn on_new_frame<F>(&mut self, mut f: F) -> &mut Self
|
||||
pub fn on_new_sample<F>(&mut self, mut f: F) -> &mut Self
|
||||
where
|
||||
F: FnMut(&AppSink) -> Result<(), gstreamer::FlowError> + Send + 'static,
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user