diff --git a/gstreamer-video/src/video_overlay_composition.rs b/gstreamer-video/src/video_overlay_composition.rs index d88f9a636..41b36db7e 100644 --- a/gstreamer-video/src/video_overlay_composition.rs +++ b/gstreamer-video/src/video_overlay_composition.rs @@ -213,6 +213,29 @@ impl fmt::Debug for VideoOverlayCompositionRef { } impl VideoOverlayComposition { + #[cfg(any(feature = "v1_20", feature = "dox"))] + #[doc(alias = "gst_video_overlay_composition_new")] + pub fn new<'a>(rects: impl IntoIterator) -> Self { + assert_initialized_main_thread!(); + + use std::ptr; + + unsafe { + let composition = + Self::from_glib_full(ffi::gst_video_overlay_composition_new(ptr::null_mut())); + + rects.into_iter().for_each(|rect| { + ffi::gst_video_overlay_composition_add_rectangle( + composition.as_mut_ptr(), + rect.as_mut_ptr(), + ); + }); + + composition + } + } + + #[cfg(not(any(feature = "v1_20", feature = "dox")))] #[doc(alias = "gst_video_overlay_composition_new")] pub fn new<'a>( rects: impl IntoIterator, @@ -306,6 +329,37 @@ impl<'a> IntoIterator for &'a VideoOverlayComposition { } } +#[cfg(any(feature = "v1_20", feature = "dox"))] +impl std::iter::FromIterator for VideoOverlayComposition { + fn from_iter>(iter: T) -> Self { + assert_initialized_main_thread!(); + + use std::ptr; + + unsafe { + let composition = + Self::from_glib_full(ffi::gst_video_overlay_composition_new(ptr::null_mut())); + + iter.into_iter().for_each(|rect| { + ffi::gst_video_overlay_composition_add_rectangle( + composition.as_mut_ptr(), + rect.as_mut_ptr(), + ); + }); + + composition + } + } +} + +#[cfg(any(feature = "v1_20", feature = "dox"))] +impl<'a> std::iter::FromIterator<&'a VideoOverlayRectangle> for VideoOverlayComposition { + fn from_iter>(iter: T) -> Self { + assert_initialized_main_thread!(); + VideoOverlayComposition::new(iter.into_iter()) + } +} + pub struct Iter<'a> { composition: &'a VideoOverlayCompositionRef, idx: u32,