From d9a06b31de3134d705bda4ba5eb4a9bac7b9a51d Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Fri, 10 Apr 2020 09:52:32 -0500 Subject: [PATCH] gstreamer-audio: Add support for GstAudioClippingMeta --- gstreamer-audio/src/audio_meta.rs | 96 +++++++++++++++++++++++++++++++ gstreamer-audio/src/lib.rs | 2 + 2 files changed, 98 insertions(+) create mode 100644 gstreamer-audio/src/audio_meta.rs diff --git a/gstreamer-audio/src/audio_meta.rs b/gstreamer-audio/src/audio_meta.rs new file mode 100644 index 000000000..b1f924b9c --- /dev/null +++ b/gstreamer-audio/src/audio_meta.rs @@ -0,0 +1,96 @@ +// Copyright (C) 2018-2020 Sebastian Dröge +// Copyright (C) 2020 Andrew Eikum for CodeWeavers +// +// 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 std::fmt; + +use glib; +use glib::translate::{from_glib, ToGlib}; +use gst; +use gst::prelude::*; +use gst_audio_sys; + +#[repr(C)] +pub struct AudioClippingMeta(gst_audio_sys::GstAudioClippingMeta); + +unsafe impl Send for AudioClippingMeta {} +unsafe impl Sync for AudioClippingMeta {} + +impl AudioClippingMeta { + pub fn add>( + buffer: &mut gst::BufferRef, + start: V, + end: V, + ) -> gst::MetaRefMut { + let start = start.into(); + let end = end.into(); + assert_eq!(start.get_format(), end.get_format()); + unsafe { + let meta = gst_audio_sys::gst_buffer_add_audio_clipping_meta( + buffer.as_mut_ptr(), + start.get_format().to_glib(), + start.get_value() as u64, + end.get_value() as u64, + ); + + Self::from_mut_ptr(buffer, meta) + } + } + + pub fn get_start(&self) -> gst::GenericFormattedValue { + gst::GenericFormattedValue::new(from_glib(self.0.format), self.0.start as i64) + } + + pub fn get_end(&self) -> gst::GenericFormattedValue { + gst::GenericFormattedValue::new(from_glib(self.0.format), self.0.end as i64) + } +} + +unsafe impl MetaAPI for AudioClippingMeta { + type GstType = gst_audio_sys::GstAudioClippingMeta; + + fn get_meta_api() -> glib::Type { + unsafe { from_glib(gst_audio_sys::gst_audio_clipping_meta_api_get_type()) } + } +} + +impl fmt::Debug for AudioClippingMeta { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("AudioClippingMeta") + .field("start", &self.get_start()) + .field("end", &self.get_end()) + .finish() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_add_get_meta() { + gst::init().unwrap(); + + let mut buffer = gst::Buffer::with_size(1024).unwrap(); + + { + let cmeta = + AudioClippingMeta::add(buffer.get_mut().unwrap(), gst::Format::Default, 1, 2); + assert_eq!(cmeta.get_format(), gst::Format::Default); + assert_eq!(cmeta.get_start(), 1); + assert_eq!(cmeta.get_end(), 2); + } + + { + let cmeta = buffer.get_meta::().unwrap(); + assert_eq!(cmeta.get_format(), gst::Format::Default); + assert_eq!(cmeta.get_start(), 1); + assert_eq!(cmeta.get_end(), 2); + } + } +} diff --git a/gstreamer-audio/src/lib.rs b/gstreamer-audio/src/lib.rs index 8fd581192..f102b99e6 100644 --- a/gstreamer-audio/src/lib.rs +++ b/gstreamer-audio/src/lib.rs @@ -47,6 +47,8 @@ mod audio_ring_buffer_spec; pub use audio_ring_buffer_spec::*; mod audio_info; pub use audio_info::*; +mod audio_meta; +pub use audio_meta::*; mod audio_channel_position; pub use audio_channel_position::*; #[cfg(any(feature = "v1_14", feature = "dox"))]