From eecce101da38d054cf2fd9d15579247ad9b29203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 24 Jan 2022 14:28:13 +0200 Subject: [PATCH] gstreamer: Implement `FromValue` for mini object references --- gstreamer/src/miniobject.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gstreamer/src/miniobject.rs b/gstreamer/src/miniobject.rs index 24c1d6612..62a445896 100644 --- a/gstreamer/src/miniobject.rs +++ b/gstreamer/src/miniobject.rs @@ -477,6 +477,19 @@ macro_rules! mini_object_wrapper ( } } + unsafe impl<'a> $crate::glib::value::FromValue<'a> for &'a $name { + type Checker = $crate::glib::value::GenericValueTypeOrNoneChecker; + + unsafe fn from_value(value: &'a $crate::glib::Value) -> Self { + skip_assert_initialized!(); + assert_eq!(std::mem::size_of::<$name>(), std::mem::size_of::<$crate::glib::ffi::gpointer>()); + let value = &*(value as *const $crate::glib::Value as *const $crate::glib::gobject_ffi::GValue); + let ptr = &value.data[0].v_pointer as *const $crate::glib::ffi::gpointer as *const *const $ffi_name; + assert!(!(*ptr).is_null()); + &*(ptr as *const $name) + } + } + impl $crate::glib::value::ToValue for $name { fn to_value(&self) -> $crate::glib::Value { let mut value = $crate::glib::Value::for_value_type::();