diff --git a/Gir_GstApp.toml b/Gir_GstApp.toml index f60101b55..c416bd7d9 100644 --- a/Gir_GstApp.toml +++ b/Gir_GstApp.toml @@ -32,6 +32,16 @@ name = "GstApp.AppSink" status = "generate" trait = false + [[object.property]] + name = "buffer-list" + # Has getter function + ignore = true + + [[object.property]] + name = "eos" + # Has getter function + ignore = true + [[object]] name = "GstApp.AppSrc" status = "generate" @@ -82,7 +92,6 @@ trait = false # Has getter function ignore = true - [[object]] name = "Gst.Caps" status = "manual" diff --git a/gstreamer-app/src/app_sink.rs b/gstreamer-app/src/app_sink.rs new file mode 100644 index 000000000..b4f3770e6 --- /dev/null +++ b/gstreamer-app/src/app_sink.rs @@ -0,0 +1,95 @@ +// Copyright (C) 2017 Sebastian Dröge +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use AppSink; +use ffi; +use gst_ffi; +use glib::translate::*; +use gst; +use std::mem::transmute; +use glib::source::CallbackGuard; +use glib_ffi::gpointer; +use std::ptr; + +pub struct AppSinkCallbacks { + eos: Box, + new_preroll: Box gst::FlowReturn + Send + Sync + 'static>, + new_sample: Box gst::FlowReturn + Send + Sync + 'static>, + callbacks: ffi::GstAppSinkCallbacks, +} + +impl AppSinkCallbacks { + pub fn new(eos: F, new_preroll: G, new_sample: H) -> Self + where + F: Fn(&AppSink) + Send + Sync + 'static, + G: Fn(&AppSink) -> gst::FlowReturn + Send + Sync + 'static, + H: Fn(&AppSink) -> gst::FlowReturn + Send + Sync + 'static, + { + AppSinkCallbacks { + eos: Box::new(eos), + new_preroll: Box::new(new_preroll), + new_sample: Box::new(new_sample), + callbacks: ffi::GstAppSinkCallbacks { + eos: Some(trampoline_eos), + new_preroll: Some(trampoline_new_preroll), + new_sample: Some(trampoline_new_sample), + _gst_reserved: [ + ptr::null_mut(), + ptr::null_mut(), + ptr::null_mut(), + ptr::null_mut(), + ], + }, + } + } +} + +unsafe extern "C" fn trampoline_eos(appsink: *mut ffi::GstAppSink, callbacks: gpointer) { + let _guard = CallbackGuard::new(); + let callbacks: &AppSinkCallbacks = transmute(callbacks); + + (callbacks.eos)(&from_glib_none(appsink)); +} + +unsafe extern "C" fn trampoline_new_preroll( + appsink: *mut ffi::GstAppSink, + callbacks: gpointer, +) -> gst_ffi::GstFlowReturn { + let _guard = CallbackGuard::new(); + let callbacks: &AppSinkCallbacks = transmute(callbacks); + + (callbacks.new_preroll)(&from_glib_none(appsink)).to_glib() +} + +unsafe extern "C" fn trampoline_new_sample( + appsink: *mut ffi::GstAppSink, + callbacks: gpointer, +) -> gst_ffi::GstFlowReturn { + let _guard = CallbackGuard::new(); + let callbacks: &AppSinkCallbacks = transmute(callbacks); + + (callbacks.new_sample)(&from_glib_none(appsink)).to_glib() +} + +unsafe extern "C" fn destroy_callbacks(ptr: gpointer) { + let _guard = CallbackGuard::new(); + Box::>::from_raw(ptr as *mut _); +} + +impl AppSink { + pub fn set_callbacks(&self, callbacks: AppSinkCallbacks) { + unsafe { + ffi::gst_app_sink_set_callbacks( + self.to_glib_none().0, + mut_override(&callbacks.callbacks), + Box::into_raw(Box::new(callbacks)) as *mut _, + Some(destroy_callbacks), + ); + } + } +} diff --git a/gstreamer-app/src/auto/app_sink.rs b/gstreamer-app/src/auto/app_sink.rs index 7896be02b..51f0d1a84 100644 --- a/gstreamer-app/src/auto/app_sink.rs +++ b/gstreamer-app/src/auto/app_sink.rs @@ -2,7 +2,6 @@ // DO NOT EDIT use ffi; -use glib::Value; use glib::signal::connect; use glib::translate::*; use glib_ffi; @@ -136,28 +135,6 @@ impl AppSink { } } - pub fn get_property_buffer_list(&self) -> bool { - let mut value = Value::from(&false); - unsafe { - gobject_ffi::g_object_get_property(self.to_glib_none().0, "buffer-list".to_glib_none().0, value.to_glib_none_mut().0); - } - value.get().unwrap() - } - - pub fn set_property_buffer_list(&self, buffer_list: bool) { - unsafe { - gobject_ffi::g_object_set_property(self.to_glib_none().0, "buffer-list".to_glib_none().0, Value::from(&buffer_list).to_glib_none().0); - } - } - - pub fn get_property_eos(&self) -> bool { - let mut value = Value::from(&false); - unsafe { - gobject_ffi::g_object_get_property(self.to_glib_none().0, "eos".to_glib_none().0, value.to_glib_none_mut().0); - } - value.get().unwrap() - } - pub fn connect_eos(&self, f: F) -> u64 { unsafe { let f: Box_> = Box_::new(Box_::new(f)); diff --git a/gstreamer-app/src/lib.rs b/gstreamer-app/src/lib.rs index db4723048..ac67f2666 100644 --- a/gstreamer-app/src/lib.rs +++ b/gstreamer-app/src/lib.rs @@ -35,3 +35,4 @@ pub use auto::*; pub use auto::traits::*; mod app_src; +mod app_sink;