From 5df360a9832be40e38eed4e33ded8cd13d14b35c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 30 Jul 2018 11:54:06 +0300 Subject: [PATCH] Add bindings for aggregator and aggregagor pad --- Gir_GstBase.toml | 11 ++ gstreamer-base/Cargo.toml | 1 + gstreamer-base/src/aggregator.rs | 28 +++++ gstreamer-base/src/auto/aggregator.rs | 127 ++++++++++++++++++++++ gstreamer-base/src/auto/aggregator_pad.rs | 73 +++++++++++++ gstreamer-base/src/auto/mod.rs | 10 ++ gstreamer-base/src/lib.rs | 2 + 7 files changed, 252 insertions(+) create mode 100644 gstreamer-base/src/aggregator.rs create mode 100644 gstreamer-base/src/auto/aggregator.rs create mode 100644 gstreamer-base/src/auto/aggregator_pad.rs diff --git a/Gir_GstBase.toml b/Gir_GstBase.toml index 54a86cf76..ba530b612 100644 --- a/Gir_GstBase.toml +++ b/Gir_GstBase.toml @@ -19,6 +19,7 @@ generate = [ "GstBase.BaseSink", "GstBase.BaseTransform", "GstBase.PushSrc", + "GstBase.AggregatorPad", ] manual = [ @@ -26,6 +27,7 @@ manual = [ "GLib.Bytes", "Gst.Object", "Gst.Element", + "Gst.BufferPool", "Gst.ClockTimeDiff", "Gst.ClockReturn", "Gst.FlowReturn", @@ -81,6 +83,15 @@ status = "generate" # Pass by value, to be added manually ignore = true +[[object]] +name = "GstBase.Aggregator" +status = "generate" + + [[object.function]] + name = "finish_buffer" + # Takes ownership + ignore = true + [[object]] name = "GstBase.*" status = "generate" diff --git a/gstreamer-base/Cargo.toml b/gstreamer-base/Cargo.toml index 671ff3c82..1a0c096ef 100644 --- a/gstreamer-base/Cargo.toml +++ b/gstreamer-base/Cargo.toml @@ -29,6 +29,7 @@ optional = true v1_10 = ["gstreamer-sys/v1_10", "gstreamer-base-sys/v1_10"] v1_12 = ["gstreamer-sys/v1_12", "gstreamer-base-sys/v1_12", "v1_10"] v1_14 = ["gstreamer-sys/v1_14", "gstreamer-base-sys/v1_14", "v1_12"] +v1_14_1 = ["gstreamer-sys/v1_14", "gstreamer-base-sys/v1_14_1", "v1_14"] embed-lgpl-docs = ["rustdoc-stripper"] purge-lgpl-docs = ["rustdoc-stripper"] dox = ["gstreamer-base-sys/dox", "glib/dox", "gstreamer/dox"] diff --git a/gstreamer-base/src/aggregator.rs b/gstreamer-base/src/aggregator.rs new file mode 100644 index 000000000..91e322128 --- /dev/null +++ b/gstreamer-base/src/aggregator.rs @@ -0,0 +1,28 @@ +// Copyright (C) 2018 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 ffi; +use glib::translate::*; +use glib::IsA; +use gst; +use Aggregator; + +pub trait AggregatorExtManual { + fn finish_buffer(&self, buffer: gst::Buffer) -> gst::FlowReturn; +} + +impl> AggregatorExtManual for O { + fn finish_buffer(&self, buffer: gst::Buffer) -> gst::FlowReturn { + unsafe { + from_glib(ffi::gst_aggregator_finish_buffer( + self.to_glib_none().0, + buffer.into_ptr(), + )) + } + } +} diff --git a/gstreamer-base/src/auto/aggregator.rs b/gstreamer-base/src/auto/aggregator.rs new file mode 100644 index 000000000..670da140e --- /dev/null +++ b/gstreamer-base/src/auto/aggregator.rs @@ -0,0 +1,127 @@ +// This file was generated by gir (https://github.com/gtk-rs/gir) +// from gir-files (https://github.com/gtk-rs/gir-files) +// DO NOT EDIT + +use ffi; +use glib; +use glib::StaticType; +use glib::Value; +use glib::object::Downcast; +use glib::object::IsA; +use glib::signal::SignalHandlerId; +use glib::signal::connect; +use glib::translate::*; +use glib_ffi; +use gobject_ffi; +use gst; +use gst_ffi; +use std::boxed::Box as Box_; +use std::mem; +use std::mem::transmute; +use std::ptr; + +glib_wrapper! { + pub struct Aggregator(Object): [ + gst::Element => gst_ffi::GstElement, + gst::Object => gst_ffi::GstObject, + ]; + + match fn { + get_type => || ffi::gst_aggregator_get_type(), + } +} + +unsafe impl Send for Aggregator {} +unsafe impl Sync for Aggregator {} + +pub trait AggregatorExt { + //fn get_allocator(&self, allocator: /*Ignored*/gst::Allocator, params: /*Ignored*/gst::AllocationParams); + + fn get_buffer_pool(&self) -> Option; + + fn get_latency(&self) -> gst::ClockTime; + + fn set_latency(&self, min_latency: gst::ClockTime, max_latency: gst::ClockTime); + + fn set_src_caps(&self, caps: &gst::Caps); + + fn get_property_start_time(&self) -> u64; + + fn set_property_start_time(&self, start_time: u64); + + fn connect_property_latency_notify(&self, f: F) -> SignalHandlerId; + + fn connect_property_start_time_notify(&self, f: F) -> SignalHandlerId; +} + +impl + IsA> AggregatorExt for O { + //fn get_allocator(&self, allocator: /*Ignored*/gst::Allocator, params: /*Ignored*/gst::AllocationParams) { + // unsafe { TODO: call ffi::gst_aggregator_get_allocator() } + //} + + fn get_buffer_pool(&self) -> Option { + unsafe { + from_glib_full(ffi::gst_aggregator_get_buffer_pool(self.to_glib_none().0)) + } + } + + fn get_latency(&self) -> gst::ClockTime { + unsafe { + from_glib(ffi::gst_aggregator_get_latency(self.to_glib_none().0)) + } + } + + fn set_latency(&self, min_latency: gst::ClockTime, max_latency: gst::ClockTime) { + unsafe { + ffi::gst_aggregator_set_latency(self.to_glib_none().0, min_latency.to_glib(), max_latency.to_glib()); + } + } + + fn set_src_caps(&self, caps: &gst::Caps) { + unsafe { + ffi::gst_aggregator_set_src_caps(self.to_glib_none().0, caps.to_glib_none().0); + } + } + + fn get_property_start_time(&self) -> u64 { + unsafe { + let mut value = Value::from_type(::static_type()); + gobject_ffi::g_object_get_property(self.to_glib_none().0, "start-time".to_glib_none().0, value.to_glib_none_mut().0); + value.get().unwrap() + } + } + + fn set_property_start_time(&self, start_time: u64) { + unsafe { + gobject_ffi::g_object_set_property(self.to_glib_none().0, "start-time".to_glib_none().0, Value::from(&start_time).to_glib_none().0); + } + } + + fn connect_property_latency_notify(&self, f: F) -> SignalHandlerId { + unsafe { + let f: Box_> = Box_::new(Box_::new(f)); + connect(self.to_glib_none().0, "notify::latency", + transmute(notify_latency_trampoline:: as usize), Box_::into_raw(f) as *mut _) + } + } + + fn connect_property_start_time_notify(&self, f: F) -> SignalHandlerId { + unsafe { + let f: Box_> = Box_::new(Box_::new(f)); + connect(self.to_glib_none().0, "notify::start-time", + transmute(notify_start_time_trampoline:: as usize), Box_::into_raw(f) as *mut _) + } + } +} + +unsafe extern "C" fn notify_latency_trampoline

(this: *mut ffi::GstAggregator, _param_spec: glib_ffi::gpointer, f: glib_ffi::gpointer) +where P: IsA { + let f: &&(Fn(&P) + Send + Sync + 'static) = transmute(f); + f(&Aggregator::from_glib_borrow(this).downcast_unchecked()) +} + +unsafe extern "C" fn notify_start_time_trampoline

(this: *mut ffi::GstAggregator, _param_spec: glib_ffi::gpointer, f: glib_ffi::gpointer) +where P: IsA { + let f: &&(Fn(&P) + Send + Sync + 'static) = transmute(f); + f(&Aggregator::from_glib_borrow(this).downcast_unchecked()) +} diff --git a/gstreamer-base/src/auto/aggregator_pad.rs b/gstreamer-base/src/auto/aggregator_pad.rs new file mode 100644 index 000000000..9925362e1 --- /dev/null +++ b/gstreamer-base/src/auto/aggregator_pad.rs @@ -0,0 +1,73 @@ +// This file was generated by gir (https://github.com/gtk-rs/gir) +// from gir-files (https://github.com/gtk-rs/gir-files) +// DO NOT EDIT + +use ffi; +use glib::object::IsA; +use glib::translate::*; +use glib_ffi; +use gobject_ffi; +use gst; +use gst_ffi; +use std::mem; +use std::ptr; + +glib_wrapper! { + pub struct AggregatorPad(Object): [ + gst::Pad => gst_ffi::GstPad, + gst::Object => gst_ffi::GstObject, + ]; + + match fn { + get_type => || ffi::gst_aggregator_pad_get_type(), + } +} + +unsafe impl Send for AggregatorPad {} +unsafe impl Sync for AggregatorPad {} + +pub trait AggregatorPadExt { + fn drop_buffer(&self) -> bool; + + #[cfg(any(feature = "v1_14_1", feature = "dox"))] + fn has_buffer(&self) -> bool; + + fn is_eos(&self) -> bool; + + fn peek_buffer(&self) -> Option; + + fn pop_buffer(&self) -> Option; +} + +impl> AggregatorPadExt for O { + fn drop_buffer(&self) -> bool { + unsafe { + from_glib(ffi::gst_aggregator_pad_drop_buffer(self.to_glib_none().0)) + } + } + + #[cfg(any(feature = "v1_14_1", feature = "dox"))] + fn has_buffer(&self) -> bool { + unsafe { + from_glib(ffi::gst_aggregator_pad_has_buffer(self.to_glib_none().0)) + } + } + + fn is_eos(&self) -> bool { + unsafe { + from_glib(ffi::gst_aggregator_pad_is_eos(self.to_glib_none().0)) + } + } + + fn peek_buffer(&self) -> Option { + unsafe { + from_glib_full(ffi::gst_aggregator_pad_peek_buffer(self.to_glib_none().0)) + } + } + + fn pop_buffer(&self) -> Option { + unsafe { + from_glib_full(ffi::gst_aggregator_pad_pop_buffer(self.to_glib_none().0)) + } + } +} diff --git a/gstreamer-base/src/auto/mod.rs b/gstreamer-base/src/auto/mod.rs index 4ca4fe60c..a2c9ee430 100644 --- a/gstreamer-base/src/auto/mod.rs +++ b/gstreamer-base/src/auto/mod.rs @@ -5,6 +5,14 @@ mod adapter; pub use self::adapter::Adapter; +mod aggregator; +pub use self::aggregator::Aggregator; +pub use self::aggregator::AggregatorExt; + +mod aggregator_pad; +pub use self::aggregator_pad::AggregatorPad; +pub use self::aggregator_pad::AggregatorPadExt; + mod base_sink; pub use self::base_sink::BaseSink; pub use self::base_sink::BaseSinkExt; @@ -24,6 +32,8 @@ pub mod functions; #[doc(hidden)] pub mod traits { + pub use super::AggregatorExt; + pub use super::AggregatorPadExt; pub use super::BaseSinkExt; pub use super::BaseSrcExt; pub use super::BaseTransformExt; diff --git a/gstreamer-base/src/lib.rs b/gstreamer-base/src/lib.rs index 415b1d588..e928dd379 100644 --- a/gstreamer-base/src/lib.rs +++ b/gstreamer-base/src/lib.rs @@ -40,6 +40,7 @@ pub use functions::*; mod adapter; mod flow_combiner; pub use flow_combiner::*; +mod aggregator; mod base_sink; mod base_src; mod base_transform; @@ -50,6 +51,7 @@ pub mod prelude { pub use glib::prelude::*; pub use gst::prelude::*; + pub use aggregator::AggregatorExtManual; pub use auto::traits::*; pub use base_sink::BaseSinkExtManual; pub use base_src::BaseSrcExtManual;