From a7be9ea9d99c99bc49811b1d78fecff26ccae81d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 20 Oct 2021 13:53:23 +0300 Subject: [PATCH] gstreamer: Implement Extend trait for buffer, buffer list, caps, caps features and structure And also implement FromIterator for buffer. --- gstreamer/src/buffer.rs | 23 ++++++++++++++++++++++ gstreamer/src/bufferlist.rs | 6 ++++++ gstreamer/src/caps.rs | 35 ++++++++++++++++++++++++++++++++++ gstreamer/src/caps_features.rs | 6 ++++++ gstreamer/src/structure.rs | 6 ++++++ 5 files changed, 76 insertions(+) diff --git a/gstreamer/src/buffer.rs b/gstreamer/src/buffer.rs index 85e936447..433e607e0 100644 --- a/gstreamer/src/buffer.rs +++ b/gstreamer/src/buffer.rs @@ -912,6 +912,29 @@ impl<'a> IntoIterator for &'a BufferRef { } } +impl std::iter::FromIterator for Buffer { + fn from_iter>(iter: T) -> Self { + assert_initialized_main_thread!(); + + let iter = iter.into_iter(); + + let mut buffer = Buffer::new(); + + { + let buffer = buffer.get_mut().unwrap(); + iter.for_each(|m| buffer.append_memory(m)); + } + + buffer + } +} + +impl std::iter::Extend for BufferRef { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(|m| self.append_memory(m)); + } +} + define_iter!( IterOwned, &'a BufferRef, diff --git a/gstreamer/src/bufferlist.rs b/gstreamer/src/bufferlist.rs index 7f9fb5c61..a1ddb14d4 100644 --- a/gstreamer/src/bufferlist.rs +++ b/gstreamer/src/bufferlist.rs @@ -298,6 +298,12 @@ impl std::iter::FromIterator for BufferList { } } +impl std::iter::Extend for BufferListRef { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(|b| self.add(b)); + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/gstreamer/src/caps.rs b/gstreamer/src/caps.rs index 497c918a4..9fb3a109e 100644 --- a/gstreamer/src/caps.rs +++ b/gstreamer/src/caps.rs @@ -173,6 +173,41 @@ impl std::iter::FromIterator<(Structure, CapsFeatures)> for Caps { } } +impl std::iter::FromIterator<(Structure, Option)> for Caps { + fn from_iter)>>(iter: T) -> Self { + assert_initialized_main_thread!(); + let mut caps = Caps::new_empty(); + + { + let caps = caps.get_mut().unwrap(); + iter.into_iter() + .for_each(|(s, f)| caps.append_structure_full(s, f)); + } + + caps + } +} + +impl std::iter::Extend for CapsRef { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(|s| self.append_structure(s)); + } +} + +impl std::iter::Extend<(Structure, CapsFeatures)> for CapsRef { + fn extend>(&mut self, iter: T) { + iter.into_iter() + .for_each(|(s, f)| self.append_structure_full(s, Some(f))); + } +} + +impl std::iter::Extend<(Structure, Option)> for CapsRef { + fn extend)>>(&mut self, iter: T) { + iter.into_iter() + .for_each(|(s, f)| self.append_structure_full(s, f)); + } +} + impl CapsRef { pub fn set_simple(&mut self, values: &[(&str, &(dyn ToSendValue + Sync))]) { for &(name, value) in values { diff --git a/gstreamer/src/caps_features.rs b/gstreamer/src/caps_features.rs index f776b37d8..a0dbd3883 100644 --- a/gstreamer/src/caps_features.rs +++ b/gstreamer/src/caps_features.rs @@ -407,6 +407,12 @@ impl glib::types::StaticType for CapsFeaturesRef { } } +impl<'a> std::iter::Extend<&'a str> for CapsFeaturesRef { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(|f| self.add(f)); + } +} + unsafe impl<'a> glib::value::FromValue<'a> for &'a CapsFeaturesRef { type Checker = glib::value::GenericValueTypeOrNoneChecker; diff --git a/gstreamer/src/structure.rs b/gstreamer/src/structure.rs index 4faa5933e..dc52cd7a0 100644 --- a/gstreamer/src/structure.rs +++ b/gstreamer/src/structure.rs @@ -844,6 +844,12 @@ impl<'a> IntoIterator for &'a StructureRef { } } +impl<'a> std::iter::Extend<(&'a str, SendValue)> for StructureRef { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(|(f, v)| self.set_value(f, v)); + } +} + #[derive(Debug)] pub struct Builder { s: Structure,