From c66fc90566d276fb23459e4185b2aaeded9fff87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 5 Jan 2024 15:35:40 +0200 Subject: [PATCH] Add accessors for various base class fields And fix some other existing accessors to use the correct mutex. Part-of: --- gstreamer-audio/src/audio_decoder.rs | 20 +++++++++++ gstreamer-audio/src/audio_encoder.rs | 20 +++++++++++ gstreamer-audio/src/audio_filter.rs | 30 ++++++++++++++++ gstreamer-audio/src/lib.rs | 5 +-- gstreamer-base/src/base_parse.rs | 32 ++++++++++++++++- gstreamer-base/src/base_sink.rs | 5 +-- gstreamer-base/src/base_src.rs | 2 ++ gstreamer-base/src/base_transform.rs | 3 +- gstreamer-video/src/lib.rs | 5 +-- gstreamer-video/src/video_decoder.rs | 20 +++++++++++ gstreamer-video/src/video_encoder.rs | 20 +++++++++++ gstreamer-video/src/video_filter.rs | 52 ++++++++++++++++++++++++++++ 12 files changed, 206 insertions(+), 8 deletions(-) create mode 100644 gstreamer-audio/src/audio_filter.rs create mode 100644 gstreamer-video/src/video_filter.rs diff --git a/gstreamer-audio/src/audio_decoder.rs b/gstreamer-audio/src/audio_decoder.rs index 17b928998..95cd74e56 100644 --- a/gstreamer-audio/src/audio_decoder.rs +++ b/gstreamer-audio/src/audio_decoder.rs @@ -126,6 +126,26 @@ pub trait AudioDecoderExtManual: sealed::Sealed + IsA + 'static { &*(&elt.srcpad as *const *mut gst::ffi::GstPad as *const gst::Pad) } } + + fn input_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstAudioDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.input_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } + + fn output_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstAudioDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.output_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } } impl> AudioDecoderExtManual for O {} diff --git a/gstreamer-audio/src/audio_encoder.rs b/gstreamer-audio/src/audio_encoder.rs index 65fdcfa40..261994dd8 100644 --- a/gstreamer-audio/src/audio_encoder.rs +++ b/gstreamer-audio/src/audio_encoder.rs @@ -82,6 +82,26 @@ pub trait AudioEncoderExtManual: sealed::Sealed + IsA + 'static { &*(&elt.srcpad as *const *mut gst::ffi::GstPad as *const gst::Pad) } } + + fn input_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstAudioDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.input_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } + + fn output_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstAudioDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.output_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } } impl> AudioEncoderExtManual for O {} diff --git a/gstreamer-audio/src/audio_filter.rs b/gstreamer-audio/src/audio_filter.rs new file mode 100644 index 000000000..18545c571 --- /dev/null +++ b/gstreamer-audio/src/audio_filter.rs @@ -0,0 +1,30 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use glib::{prelude::*, translate::*}; +use gst_base::prelude::*; + +use crate::{AudioFilter, AudioInfo}; + +mod sealed { + pub trait Sealed {} + impl> Sealed for T {} +} + +pub trait AudioFilterExtManual: sealed::Sealed + IsA + 'static { + fn audio_info(&self) -> Option { + unsafe { + let ptr: &ffi::GstAudioFilter = &*(self.as_ptr() as *const _); + let sinkpad = self.as_ref().sink_pad(); + let _guard = sinkpad.stream_lock(); + + let info = &ptr.info; + + if !info.finfo.is_null() && info.channels > 0 && info.rate > 0 && info.bpf > 0 { + return None; + } + Some(from_glib_none(info as *const ffi::GstAudioInfo)) + } + } +} + +impl> AudioFilterExtManual for O {} diff --git a/gstreamer-audio/src/lib.rs b/gstreamer-audio/src/lib.rs index d5b0fc023..8968a95f5 100644 --- a/gstreamer-audio/src/lib.rs +++ b/gstreamer-audio/src/lib.rs @@ -58,6 +58,7 @@ pub use audio_buffer::{AudioBuffer, AudioBufferRef}; mod audio_decoder; mod audio_encoder; +mod audio_filter; mod audio_converter; pub use crate::audio_converter::AudioConverterConfig; @@ -72,8 +73,8 @@ pub mod prelude { pub use crate::{ audio_aggregator::AudioAggregatorExtManual, audio_aggregator_convert_pad::AudioAggregatorConvertPadExtManual, - audio_aggregator_pad::AudioAggregatorPadExtManual, audio_format::AudioFormatIteratorExt, - auto::traits::*, + audio_aggregator_pad::AudioAggregatorPadExtManual, audio_filter::AudioFilterExtManual, + audio_format::AudioFormatIteratorExt, auto::traits::*, }; } diff --git a/gstreamer-base/src/base_parse.rs b/gstreamer-base/src/base_parse.rs index d8166cb61..415e69e21 100644 --- a/gstreamer-base/src/base_parse.rs +++ b/gstreamer-base/src/base_parse.rs @@ -3,7 +3,10 @@ use std::mem; use glib::{prelude::*, translate::*}; -use gst::format::{FormattedValue, SpecificFormattedValueFullRange}; +use gst::{ + format::{FormattedValue, SpecificFormattedValueFullRange}, + prelude::*, +}; use crate::{BaseParse, BaseParseFrame}; @@ -29,6 +32,33 @@ pub trait BaseParseExtManual: sealed::Sealed + IsA + 'static { } } + fn segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstBaseParse = &*(self.as_ptr() as *const _); + let sinkpad = self.sink_pad(); + let _guard = sinkpad.stream_lock(); + from_glib_none(&ptr.segment as *const gst::ffi::GstSegment) + } + } + + fn lost_sync(&self) -> bool { + unsafe { + let ptr: &ffi::GstBaseParse = &*(self.as_ptr() as *const _); + let sinkpad = self.sink_pad(); + let _guard = sinkpad.stream_lock(); + ptr.flags & ffi::GST_BASE_PARSE_FLAG_LOST_SYNC as u32 != 0 + } + } + + fn is_draining(&self) -> bool { + unsafe { + let ptr: &ffi::GstBaseParse = &*(self.as_ptr() as *const _); + let sinkpad = self.sink_pad(); + let _guard = sinkpad.stream_lock(); + ptr.flags & ffi::GST_BASE_PARSE_FLAG_DRAINING as u32 != 0 + } + } + #[doc(alias = "gst_base_parse_set_duration")] fn set_duration(&self, duration: impl FormattedValue, interval: u32) { unsafe { diff --git a/gstreamer-base/src/base_sink.rs b/gstreamer-base/src/base_sink.rs index 5b4c6ab99..b65c8add2 100644 --- a/gstreamer-base/src/base_sink.rs +++ b/gstreamer-base/src/base_sink.rs @@ -17,8 +17,9 @@ pub trait BaseSinkExtManual: sealed::Sealed + IsA + 'static { fn segment(&self) -> gst::Segment { unsafe { let sink: &ffi::GstBaseSink = &*(self.as_ptr() as *const _); - let _guard = self.as_ref().object_lock(); - from_glib_none(&sink.segment as *const _) + let sinkpad = self.sink_pad(); + let _guard = sinkpad.stream_lock(); + from_glib_none(&sink.segment as *const gst::ffi::GstSegment) } } diff --git a/gstreamer-base/src/base_src.rs b/gstreamer-base/src/base_src.rs index d1c290e95..a2b2ff625 100644 --- a/gstreamer-base/src/base_src.rs +++ b/gstreamer-base/src/base_src.rs @@ -32,6 +32,8 @@ pub trait BaseSrcExtManual: sealed::Sealed + IsA + 'static { fn segment(&self) -> gst::Segment { unsafe { let src: &ffi::GstBaseSrc = &*(self.as_ptr() as *const _); + let srcpad = self.src_pad(); + let _guard = srcpad.stream_lock(); let _guard = self.as_ref().object_lock(); from_glib_none(&src.segment as *const _) } diff --git a/gstreamer-base/src/base_transform.rs b/gstreamer-base/src/base_transform.rs index a960f9542..57441a048 100644 --- a/gstreamer-base/src/base_transform.rs +++ b/gstreamer-base/src/base_transform.rs @@ -32,7 +32,8 @@ pub trait BaseTransformExtManual: sealed::Sealed + IsA + 'static fn segment(&self) -> gst::Segment { unsafe { let trans: &ffi::GstBaseTransform = &*(self.as_ptr() as *const _); - let _guard = self.as_ref().object_lock(); + let sinkpad = self.sink_pad(); + let _guard = sinkpad.stream_lock(); from_glib_none(&trans.segment as *const _) } } diff --git a/gstreamer-video/src/lib.rs b/gstreamer-video/src/lib.rs index 6780ce188..7f40ac386 100644 --- a/gstreamer-video/src/lib.rs +++ b/gstreamer-video/src/lib.rs @@ -108,6 +108,7 @@ pub use crate::video_converter::{VideoConverter, VideoConverterConfig}; mod video_codec_frame; mod video_decoder; mod video_encoder; +mod video_filter; pub use crate::video_codec_frame::VideoCodecFrame; pub mod video_codec_state; pub use crate::video_codec_state::{VideoCodecState, VideoCodecStateContext}; @@ -175,8 +176,8 @@ pub mod prelude { pub use crate::{ auto::traits::*, video_buffer_pool::VideoBufferPoolConfig, video_decoder::VideoDecoderExtManual, video_encoder::VideoEncoderExtManual, - video_format::VideoFormatIteratorExt, video_frame::VideoBufferExt, - video_overlay::VideoOverlayExtManual, + video_filter::VideoFilterExtManual, video_format::VideoFormatIteratorExt, + video_frame::VideoBufferExt, video_overlay::VideoOverlayExtManual, }; } diff --git a/gstreamer-video/src/video_decoder.rs b/gstreamer-video/src/video_decoder.rs index f68a0e7cd..918449018 100644 --- a/gstreamer-video/src/video_decoder.rs +++ b/gstreamer-video/src/video_decoder.rs @@ -281,6 +281,26 @@ pub trait VideoDecoderExtManual: sealed::Sealed + IsA + 'static { &*(&elt.srcpad as *const *mut gst::ffi::GstPad as *const gst::Pad) } } + + fn input_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstVideoDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.input_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } + + fn output_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstVideoDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.output_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } } impl> VideoDecoderExtManual for O {} diff --git a/gstreamer-video/src/video_encoder.rs b/gstreamer-video/src/video_encoder.rs index 3af3b0b7e..ae2c7f36e 100644 --- a/gstreamer-video/src/video_encoder.rs +++ b/gstreamer-video/src/video_encoder.rs @@ -224,6 +224,26 @@ pub trait VideoEncoderExtManual: sealed::Sealed + IsA + 'static { &*(&elt.srcpad as *const *mut gst::ffi::GstPad as *const gst::Pad) } } + + fn input_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstVideoDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.input_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } + + fn output_segment(&self) -> gst::Segment { + unsafe { + let ptr: &ffi::GstVideoDecoder = &*(self.as_ptr() as *const _); + glib::ffi::g_rec_mutex_lock(mut_override(&ptr.stream_lock)); + let segment = ptr.output_segment; + glib::ffi::g_rec_mutex_unlock(mut_override(&ptr.stream_lock)); + from_glib_none(&segment as *const gst::ffi::GstSegment) + } + } } impl> VideoEncoderExtManual for O {} diff --git a/gstreamer-video/src/video_filter.rs b/gstreamer-video/src/video_filter.rs new file mode 100644 index 000000000..9bc4b5c7a --- /dev/null +++ b/gstreamer-video/src/video_filter.rs @@ -0,0 +1,52 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +use glib::{prelude::*, translate::*}; +use gst::prelude::*; +use gst_base::prelude::*; + +use crate::VideoFilter; + +mod sealed { + pub trait Sealed {} + impl> Sealed for T {} +} + +pub trait VideoFilterExtManual: sealed::Sealed + IsA + 'static { + fn input_video_info(&self) -> Option { + unsafe { + let ptr = self.as_ptr() as *mut ffi::GstVideoFilter; + let sinkpad = self.as_ref().sink_pad(); + let _guard = sinkpad.stream_lock(); + + let info = &(*ptr).in_info; + + if info.finfo.is_null() || info.width <= 0 || info.height <= 0 { + return None; + } + + Some(from_glib_none(mut_override( + info as *const ffi::GstVideoInfo, + ))) + } + } + + fn output_video_info(&self) -> Option { + unsafe { + let ptr = self.as_ptr() as *mut ffi::GstVideoFilter; + let sinkpad = self.as_ref().sink_pad(); + let _guard = sinkpad.stream_lock(); + + let info = &(*ptr).out_info; + + if info.finfo.is_null() || info.width <= 0 || info.height <= 0 { + return None; + } + + Some(from_glib_none(mut_override( + info as *const ffi::GstVideoInfo, + ))) + } + } +} + +impl> VideoFilterExtManual for O {}