mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-22 01:21:05 +00:00
Finish appsink bindings
This commit is contained in:
parent
ffa474e1e9
commit
7ff8a5c460
4 changed files with 106 additions and 24 deletions
|
@ -32,6 +32,16 @@ name = "GstApp.AppSink"
|
||||||
status = "generate"
|
status = "generate"
|
||||||
trait = false
|
trait = false
|
||||||
|
|
||||||
|
[[object.property]]
|
||||||
|
name = "buffer-list"
|
||||||
|
# Has getter function
|
||||||
|
ignore = true
|
||||||
|
|
||||||
|
[[object.property]]
|
||||||
|
name = "eos"
|
||||||
|
# Has getter function
|
||||||
|
ignore = true
|
||||||
|
|
||||||
[[object]]
|
[[object]]
|
||||||
name = "GstApp.AppSrc"
|
name = "GstApp.AppSrc"
|
||||||
status = "generate"
|
status = "generate"
|
||||||
|
@ -82,7 +92,6 @@ trait = false
|
||||||
# Has getter function
|
# Has getter function
|
||||||
ignore = true
|
ignore = true
|
||||||
|
|
||||||
|
|
||||||
[[object]]
|
[[object]]
|
||||||
name = "Gst.Caps"
|
name = "Gst.Caps"
|
||||||
status = "manual"
|
status = "manual"
|
||||||
|
|
95
gstreamer-app/src/app_sink.rs
Normal file
95
gstreamer-app/src/app_sink.rs
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
// Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<Fn(&AppSink) + Send + Sync + 'static>,
|
||||||
|
new_preroll: Box<Fn(&AppSink) -> gst::FlowReturn + Send + Sync + 'static>,
|
||||||
|
new_sample: Box<Fn(&AppSink) -> gst::FlowReturn + Send + Sync + 'static>,
|
||||||
|
callbacks: ffi::GstAppSinkCallbacks,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AppSinkCallbacks {
|
||||||
|
pub fn new<F, G, H>(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::<Box<AppSinkCallbacks>>::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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,6 @@
|
||||||
// DO NOT EDIT
|
// DO NOT EDIT
|
||||||
|
|
||||||
use ffi;
|
use ffi;
|
||||||
use glib::Value;
|
|
||||||
use glib::signal::connect;
|
use glib::signal::connect;
|
||||||
use glib::translate::*;
|
use glib::translate::*;
|
||||||
use glib_ffi;
|
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<F: Fn(&AppSink) + Send + Sync + 'static>(&self, f: F) -> u64 {
|
pub fn connect_eos<F: Fn(&AppSink) + Send + Sync + 'static>(&self, f: F) -> u64 {
|
||||||
unsafe {
|
unsafe {
|
||||||
let f: Box_<Box_<Fn(&AppSink) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
|
let f: Box_<Box_<Fn(&AppSink) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
|
||||||
|
|
|
@ -35,3 +35,4 @@ pub use auto::*;
|
||||||
pub use auto::traits::*;
|
pub use auto::traits::*;
|
||||||
|
|
||||||
mod app_src;
|
mod app_src;
|
||||||
|
mod app_sink;
|
||||||
|
|
Loading…
Reference in a new issue