video: Implement non-fallible constructor and FromIterator for VideoOverlayComposition when building for 1.20

Previous versions needed at least one rectangle for successfull
construction.
This commit is contained in:
Sebastian Dröge 2021-10-17 11:31:49 +03:00
parent 7037f6d836
commit 3d39faac28

View file

@ -213,6 +213,29 @@ impl fmt::Debug for VideoOverlayCompositionRef {
} }
impl VideoOverlayComposition { impl VideoOverlayComposition {
#[cfg(any(feature = "v1_20", feature = "dox"))]
#[doc(alias = "gst_video_overlay_composition_new")]
pub fn new<'a>(rects: impl IntoIterator<Item = &'a VideoOverlayRectangle>) -> 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")] #[doc(alias = "gst_video_overlay_composition_new")]
pub fn new<'a>( pub fn new<'a>(
rects: impl IntoIterator<Item = &'a VideoOverlayRectangle>, rects: impl IntoIterator<Item = &'a VideoOverlayRectangle>,
@ -306,6 +329,37 @@ impl<'a> IntoIterator for &'a VideoOverlayComposition {
} }
} }
#[cfg(any(feature = "v1_20", feature = "dox"))]
impl std::iter::FromIterator<VideoOverlayRectangle> for VideoOverlayComposition {
fn from_iter<T: IntoIterator<Item = VideoOverlayRectangle>>(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<T: IntoIterator<Item = &'a VideoOverlayRectangle>>(iter: T) -> Self {
assert_initialized_main_thread!();
VideoOverlayComposition::new(iter.into_iter())
}
}
pub struct Iter<'a> { pub struct Iter<'a> {
composition: &'a VideoOverlayCompositionRef, composition: &'a VideoOverlayCompositionRef,
idx: u32, idx: u32,