From 7f0ca0011c472bcaceddcf350982ed838c855040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 24 Aug 2021 09:12:27 +0300 Subject: [PATCH] Add gst::GstObjectImpl, gst::ProxyPadImpl, gst_audio::AudioBaseSrc, gst_audio::AudioBaseSink subclassing traits These were missing from the type hierarchy previously and are now required because of more strict checks in the GLib bindings. --- examples/src/bin/glfilter.rs | 1 + examples/src/bin/subclass.rs | 2 ++ gstreamer-audio/src/subclass/audio_base_sink.rs | 9 +++++++++ gstreamer-audio/src/subclass/audio_base_src.rs | 9 +++++++++ gstreamer-audio/src/subclass/audio_sink.rs | 3 ++- gstreamer-audio/src/subclass/audio_src.rs | 3 ++- gstreamer-audio/src/subclass/mod.rs | 4 ++++ gstreamer-gl/src/subclass/gl_filter.rs | 1 - gstreamer/src/subclass/child_proxy.rs | 3 ++- gstreamer/src/subclass/clock.rs | 3 ++- gstreamer/src/subclass/device.rs | 3 ++- gstreamer/src/subclass/device_provider.rs | 3 ++- gstreamer/src/subclass/element.rs | 5 ++++- gstreamer/src/subclass/ghost_pad.rs | 2 +- gstreamer/src/subclass/mod.rs | 4 ++++ gstreamer/src/subclass/object.rs | 7 +++++++ gstreamer/src/subclass/pad.rs | 5 ++++- gstreamer/src/subclass/proxy_pad.rs | 10 ++++++++++ gstreamer/src/subclass/tracer.rs | 3 ++- 19 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 gstreamer-audio/src/subclass/audio_base_sink.rs create mode 100644 gstreamer-audio/src/subclass/audio_base_src.rs create mode 100644 gstreamer/src/subclass/object.rs create mode 100644 gstreamer/src/subclass/proxy_pad.rs diff --git a/examples/src/bin/glfilter.rs b/examples/src/bin/glfilter.rs index 0fe7f377e..4cc4c37c7 100644 --- a/examples/src/bin/glfilter.rs +++ b/examples/src/bin/glfilter.rs @@ -117,6 +117,7 @@ mod mirror { } impl ElementImpl for GLMirrorFilter {} + impl GstObjectImpl for GLMirrorFilter {} impl ObjectImpl for GLMirrorFilter {} impl BaseTransformImpl for GLMirrorFilter { const MODE: BaseTransformMode = BaseTransformMode::NeverInPlace; diff --git a/examples/src/bin/subclass.rs b/examples/src/bin/subclass.rs index 7256faef9..4481c809d 100644 --- a/examples/src/bin/subclass.rs +++ b/examples/src/bin/subclass.rs @@ -61,6 +61,8 @@ mod fir_filter { // Implementation of glib::Object virtual methods impl ObjectImpl for FirFilter {} + impl GstObjectImpl for FirFilter {} + // Implementation of gst::Element virtual methods impl ElementImpl for FirFilter { // The element specific metadata. This information is what is visible from diff --git a/gstreamer-audio/src/subclass/audio_base_sink.rs b/gstreamer-audio/src/subclass/audio_base_sink.rs new file mode 100644 index 000000000..01506ad03 --- /dev/null +++ b/gstreamer-audio/src/subclass/audio_base_sink.rs @@ -0,0 +1,9 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use gst_base::subclass::prelude::*; + +use crate::AudioBaseSink; + +pub trait AudioBaseSinkImpl: BaseSinkImpl {} + +unsafe impl IsSubclassable for AudioBaseSink {} diff --git a/gstreamer-audio/src/subclass/audio_base_src.rs b/gstreamer-audio/src/subclass/audio_base_src.rs new file mode 100644 index 000000000..abc295ac1 --- /dev/null +++ b/gstreamer-audio/src/subclass/audio_base_src.rs @@ -0,0 +1,9 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use gst_base::subclass::prelude::*; + +use crate::AudioBaseSrc; + +pub trait AudioBaseSrcImpl: BaseSrcImpl {} + +unsafe impl IsSubclassable for AudioBaseSrc {} diff --git a/gstreamer-audio/src/subclass/audio_sink.rs b/gstreamer-audio/src/subclass/audio_sink.rs index 69dcf7293..d85227401 100644 --- a/gstreamer-audio/src/subclass/audio_sink.rs +++ b/gstreamer-audio/src/subclass/audio_sink.rs @@ -3,13 +3,14 @@ use glib::prelude::*; use glib::translate::*; +use super::prelude::*; use gst::LoggableError; use gst_base::subclass::prelude::*; use crate::AudioRingBufferSpec; use crate::AudioSink; -pub trait AudioSinkImpl: AudioSinkImplExt + BaseSinkImpl { +pub trait AudioSinkImpl: AudioSinkImplExt + AudioBaseSinkImpl { fn close(&self, sink: &Self::Type) -> Result<(), LoggableError> { self.parent_close(sink) } diff --git a/gstreamer-audio/src/subclass/audio_src.rs b/gstreamer-audio/src/subclass/audio_src.rs index d250f59ee..1cb52f93a 100644 --- a/gstreamer-audio/src/subclass/audio_src.rs +++ b/gstreamer-audio/src/subclass/audio_src.rs @@ -5,13 +5,14 @@ use std::mem; use glib::prelude::*; use glib::translate::*; +use super::prelude::*; use gst::LoggableError; use gst_base::subclass::prelude::*; use crate::AudioRingBufferSpec; use crate::AudioSrc; -pub trait AudioSrcImpl: AudioSrcImplExt + BaseSrcImpl { +pub trait AudioSrcImpl: AudioSrcImplExt + AudioBaseSrcImpl { fn close(&self, src: &Self::Type) -> Result<(), LoggableError> { self.parent_close(src) } diff --git a/gstreamer-audio/src/subclass/mod.rs b/gstreamer-audio/src/subclass/mod.rs index 825ef9ed8..a5c31ee92 100644 --- a/gstreamer-audio/src/subclass/mod.rs +++ b/gstreamer-audio/src/subclass/mod.rs @@ -2,6 +2,8 @@ #![allow(clippy::cast_ptr_alignment)] +mod audio_base_sink; +mod audio_base_src; mod audio_decoder; mod audio_encoder; mod audio_sink; @@ -11,6 +13,8 @@ pub mod prelude { #[doc(hidden)] pub use gst_base::subclass::prelude::*; + pub use super::audio_base_sink::AudioBaseSinkImpl; + pub use super::audio_base_src::AudioBaseSrcImpl; pub use super::audio_decoder::{AudioDecoderImpl, AudioDecoderImplExt}; pub use super::audio_encoder::{AudioEncoderImpl, AudioEncoderImplExt}; pub use super::audio_sink::{AudioSinkImpl, AudioSinkImplExt}; diff --git a/gstreamer-gl/src/subclass/gl_filter.rs b/gstreamer-gl/src/subclass/gl_filter.rs index b3b5913cc..34b83932e 100644 --- a/gstreamer-gl/src/subclass/gl_filter.rs +++ b/gstreamer-gl/src/subclass/gl_filter.rs @@ -8,7 +8,6 @@ use glib::translate::*; use gst::{result_from_gboolean, Buffer, Caps, LoggableError, PadDirection, CAT_RUST}; -use crate::GLBaseFilter; use crate::GLFilter; use crate::GLMemory; diff --git a/gstreamer/src/subclass/child_proxy.rs b/gstreamer/src/subclass/child_proxy.rs index 969052286..54f6a0c07 100644 --- a/gstreamer/src/subclass/child_proxy.rs +++ b/gstreamer/src/subclass/child_proxy.rs @@ -1,12 +1,13 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use glib::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; use crate::ChildProxy; -pub trait ChildProxyImpl: ObjectImpl + Send + Sync { +pub trait ChildProxyImpl: GstObjectImpl + Send + Sync { fn child_by_name(&self, object: &Self::Type, name: &str) -> Option { self.parent_child_by_name(object, name) } diff --git a/gstreamer/src/subclass/clock.rs b/gstreamer/src/subclass/clock.rs index a06705cc4..6a40e68be 100644 --- a/gstreamer/src/subclass/clock.rs +++ b/gstreamer/src/subclass/clock.rs @@ -1,5 +1,6 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use glib::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; @@ -12,7 +13,7 @@ use crate::ClockSuccess; use crate::ClockTime; use crate::ClockTimeDiff; -pub trait ClockImpl: ClockImplExt + ObjectImpl + Send + Sync { +pub trait ClockImpl: ClockImplExt + GstObjectImpl + Send + Sync { fn change_resolution( &self, clock: &Self::Type, diff --git a/gstreamer/src/subclass/device.rs b/gstreamer/src/subclass/device.rs index e4b1ebb26..7f7102314 100644 --- a/gstreamer/src/subclass/device.rs +++ b/gstreamer/src/subclass/device.rs @@ -1,5 +1,6 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use glib::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; @@ -10,7 +11,7 @@ use crate::LoggableError; use std::ptr; -pub trait DeviceImpl: DeviceImplExt + ObjectImpl + Send + Sync { +pub trait DeviceImpl: DeviceImplExt + GstObjectImpl + Send + Sync { fn create_element( &self, device: &Self::Type, diff --git a/gstreamer/src/subclass/device_provider.rs b/gstreamer/src/subclass/device_provider.rs index 66b442b45..b67f2af2e 100644 --- a/gstreamer/src/subclass/device_provider.rs +++ b/gstreamer/src/subclass/device_provider.rs @@ -1,5 +1,6 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use glib::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; @@ -67,7 +68,7 @@ impl DeviceProviderMetadata { } } -pub trait DeviceProviderImpl: DeviceProviderImplExt + ObjectImpl + Send + Sync { +pub trait DeviceProviderImpl: DeviceProviderImplExt + GstObjectImpl + Send + Sync { fn metadata() -> Option<&'static DeviceProviderMetadata> { None } diff --git a/gstreamer/src/subclass/element.rs b/gstreamer/src/subclass/element.rs index f47afaa4e..85520a869 100644 --- a/gstreamer/src/subclass/element.rs +++ b/gstreamer/src/subclass/element.rs @@ -1,5 +1,6 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use crate::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; @@ -73,7 +74,7 @@ impl ElementMetadata { } } -pub trait ElementImpl: ElementImplExt + ObjectImpl + Send + Sync { +pub trait ElementImpl: ElementImplExt + GstObjectImpl + Send + Sync { fn metadata() -> Option<&'static ElementMetadata> { None } @@ -717,6 +718,8 @@ mod tests { } } + impl GstObjectImpl for TestElement {} + impl ElementImpl for TestElement { fn metadata() -> Option<&'static ElementMetadata> { use once_cell::sync::Lazy; diff --git a/gstreamer/src/subclass/ghost_pad.rs b/gstreamer/src/subclass/ghost_pad.rs index 30e04f34c..267c2a278 100644 --- a/gstreamer/src/subclass/ghost_pad.rs +++ b/gstreamer/src/subclass/ghost_pad.rs @@ -5,6 +5,6 @@ use glib::subclass::prelude::*; use crate::GhostPad; -pub trait GhostPadImpl: PadImpl {} +pub trait GhostPadImpl: ProxyPadImpl {} unsafe impl IsSubclassable for GhostPad {} diff --git a/gstreamer/src/subclass/mod.rs b/gstreamer/src/subclass/mod.rs index 980d5863e..55d9aad9a 100644 --- a/gstreamer/src/subclass/mod.rs +++ b/gstreamer/src/subclass/mod.rs @@ -19,8 +19,10 @@ mod bin; mod child_proxy; mod element; mod ghost_pad; +mod object; mod pad; mod pipeline; +mod proxy_pad; mod tracer; mod device; @@ -50,9 +52,11 @@ pub mod prelude { pub use super::device_provider::{DeviceProviderImpl, DeviceProviderImplExt}; pub use super::element::{ElementImpl, ElementImplExt}; pub use super::ghost_pad::GhostPadImpl; + pub use super::object::GstObjectImpl; pub use super::pad::{PadImpl, PadImplExt}; pub use super::pipeline::PipelineImpl; pub use super::preset::PresetImpl; + pub use super::proxy_pad::ProxyPadImpl; pub use super::system_clock::SystemClockImpl; pub use super::tag_setter::TagSetterImpl; pub use super::tracer::{TracerHook, TracerImpl, TracerImplExt}; diff --git a/gstreamer/src/subclass/object.rs b/gstreamer/src/subclass/object.rs new file mode 100644 index 000000000..82d307013 --- /dev/null +++ b/gstreamer/src/subclass/object.rs @@ -0,0 +1,7 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use glib::subclass::prelude::*; + +pub trait GstObjectImpl: ObjectImpl {} + +unsafe impl IsSubclassable for crate::Object {} diff --git a/gstreamer/src/subclass/pad.rs b/gstreamer/src/subclass/pad.rs index 9be39ed49..9d51d9726 100644 --- a/gstreamer/src/subclass/pad.rs +++ b/gstreamer/src/subclass/pad.rs @@ -1,12 +1,13 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use glib::prelude::*; use glib::subclass::prelude::*; use glib::translate::*; use crate::Pad; -pub trait PadImpl: PadImplExt + ObjectImpl + Send + Sync { +pub trait PadImpl: PadImplExt + GstObjectImpl + Send + Sync { fn linked(&self, pad: &Self::Type, peer: &Pad) { self.parent_linked(pad, peer) } @@ -109,6 +110,8 @@ mod tests { impl ObjectImpl for TestPad {} + impl GstObjectImpl for TestPad {} + impl PadImpl for TestPad { fn linked(&self, pad: &Self::Type, peer: &Pad) { self.linked.store(true, atomic::Ordering::SeqCst); diff --git a/gstreamer/src/subclass/proxy_pad.rs b/gstreamer/src/subclass/proxy_pad.rs new file mode 100644 index 000000000..1a1d686f6 --- /dev/null +++ b/gstreamer/src/subclass/proxy_pad.rs @@ -0,0 +1,10 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use super::prelude::*; +use glib::subclass::prelude::*; + +use crate::ProxyPad; + +pub trait ProxyPadImpl: PadImpl {} + +unsafe impl IsSubclassable for ProxyPad {} diff --git a/gstreamer/src/subclass/tracer.rs b/gstreamer/src/subclass/tracer.rs index 9f8b40893..5c8430e24 100644 --- a/gstreamer/src/subclass/tracer.rs +++ b/gstreamer/src/subclass/tracer.rs @@ -1,5 +1,6 @@ // Take a look at the license at the top of the repository in the LICENSE file. +use super::prelude::*; use crate::ffi; use crate::{ Bin, Buffer, BufferList, Element, Event, FlowReturn, Message, MiniObject, Object, Pad, @@ -8,7 +9,7 @@ use crate::{ use glib::{prelude::*, subclass::prelude::*, translate::*}; #[allow(unused_variables)] -pub trait TracerImpl: TracerImplExt + ObjectImpl + Send + Sync { +pub trait TracerImpl: TracerImplExt + GstObjectImpl + Send + Sync { fn bin_add_post(&self, ts: u64, bin: &Bin, element: &Element, success: bool) {} fn bin_add_pre(&self, ts: u64, bin: &Bin, element: &Element) {} fn bin_remove_post(&self, ts: u64, bin: &Bin, success: bool) {}