Store pointers for static caps and pad templates

We don't own them, we don't want to copy them. They're *statically*
allocated things in C.
This commit is contained in:
Sebastian Dröge 2017-10-15 11:27:08 +03:00
parent 9206ddba61
commit 9a6713b901
2 changed files with 22 additions and 30 deletions

View file

@ -12,17 +12,15 @@ use ffi;
use glib_ffi; use glib_ffi;
use gobject_ffi; use gobject_ffi;
use std::ptr;
use glib; use glib;
use glib::translate::{from_glib_full, from_glib_none, mut_override, FromGlibPtrNone, ToGlibPtr, use glib::translate::{from_glib_full, FromGlibPtrNone, ToGlibPtr, ToGlibPtrMut};
ToGlibPtrMut};
#[repr(C)] #[repr(C)]
pub struct StaticCaps(ffi::GstStaticCaps); pub struct StaticCaps(*mut ffi::GstStaticCaps);
impl StaticCaps { impl StaticCaps {
pub fn get(&self) -> Caps { pub fn get(&self) -> Caps {
unsafe { from_glib_full(ffi::gst_static_caps_get(mut_override(&self.0))) } unsafe { from_glib_full(ffi::gst_static_caps_get(self.0)) }
} }
} }
@ -76,7 +74,7 @@ impl<'a> glib::translate::ToGlibPtr<'a, *const ffi::GstStaticCaps> for StaticCap
type Storage = &'a StaticCaps; type Storage = &'a StaticCaps;
fn to_glib_none(&'a self) -> glib::translate::Stash<'a, *const ffi::GstStaticCaps, Self> { fn to_glib_none(&'a self) -> glib::translate::Stash<'a, *const ffi::GstStaticCaps, Self> {
glib::translate::Stash(&self.0, self) glib::translate::Stash(self.0, self)
} }
fn to_glib_full(&self) -> *const ffi::GstStaticCaps { fn to_glib_full(&self) -> *const ffi::GstStaticCaps {
@ -88,7 +86,7 @@ impl<'a> glib::translate::ToGlibPtr<'a, *const ffi::GstStaticCaps> for StaticCap
impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticCaps> for StaticCaps { impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticCaps> for StaticCaps {
#[inline] #[inline]
unsafe fn from_glib_none(ptr: *const ffi::GstStaticCaps) -> Self { unsafe fn from_glib_none(ptr: *const ffi::GstStaticCaps) -> Self {
StaticCaps(ptr::read(ptr)) StaticCaps(ptr as *mut _)
} }
} }
@ -96,7 +94,7 @@ impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticCaps> for StaticCaps
impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticCaps> for StaticCaps { impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticCaps> for StaticCaps {
#[inline] #[inline]
unsafe fn from_glib_none(ptr: *mut ffi::GstStaticCaps) -> Self { unsafe fn from_glib_none(ptr: *mut ffi::GstStaticCaps) -> Self {
StaticCaps(ptr::read(ptr)) StaticCaps(ptr)
} }
} }
@ -104,16 +102,14 @@ impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticCaps> for StaticCaps {
impl glib::translate::FromGlibPtrBorrow<*mut ffi::GstStaticCaps> for StaticCaps { impl glib::translate::FromGlibPtrBorrow<*mut ffi::GstStaticCaps> for StaticCaps {
#[inline] #[inline]
unsafe fn from_glib_borrow(ptr: *mut ffi::GstStaticCaps) -> Self { unsafe fn from_glib_borrow(ptr: *mut ffi::GstStaticCaps) -> Self {
StaticCaps(ptr::read(ptr)) StaticCaps(ptr)
} }
} }
#[doc(hidden)] #[doc(hidden)]
impl glib::translate::FromGlibPtrFull<*mut ffi::GstStaticCaps> for StaticCaps { impl glib::translate::FromGlibPtrFull<*mut ffi::GstStaticCaps> for StaticCaps {
#[inline] #[inline]
unsafe fn from_glib_full(ptr: *mut ffi::GstStaticCaps) -> Self { unsafe fn from_glib_full(_ptr: *mut ffi::GstStaticCaps) -> Self {
let caps = from_glib_none(ptr); unimplemented!();
glib_ffi::g_free(ptr as *mut _);
caps
} }
} }

View file

@ -14,33 +14,31 @@ use glib_ffi;
use gobject_ffi; use gobject_ffi;
use std::ffi::CStr; use std::ffi::CStr;
use std::ptr;
use glib; use glib;
use glib::translate::{from_glib, from_glib_full, from_glib_none, mut_override, FromGlibPtrNone, use glib::translate::{from_glib, from_glib_full, FromGlibPtrNone, ToGlibPtr, ToGlibPtrMut};
ToGlibPtr, ToGlibPtrMut};
#[repr(C)] #[repr(C)]
pub struct StaticPadTemplate(ffi::GstStaticPadTemplate); pub struct StaticPadTemplate(*mut ffi::GstStaticPadTemplate);
impl StaticPadTemplate { impl StaticPadTemplate {
pub fn get(&self) -> PadTemplate { pub fn get(&self) -> PadTemplate {
unsafe { from_glib_full(ffi::gst_static_pad_template_get(mut_override(&self.0))) } unsafe { from_glib_full(ffi::gst_static_pad_template_get(self.0)) }
} }
pub fn get_caps(&self) -> Caps { pub fn get_caps(&self) -> Caps {
unsafe { from_glib_full(ffi::gst_static_pad_template_get_caps(mut_override(&self.0))) } unsafe { from_glib_full(ffi::gst_static_pad_template_get_caps(self.0)) }
} }
pub fn name_template<'a>(&self) -> &'a str { pub fn name_template<'a>(&self) -> &'a str {
unsafe { CStr::from_ptr(self.0.name_template).to_str().unwrap() } unsafe { CStr::from_ptr((*self.0).name_template).to_str().unwrap() }
} }
pub fn direction(&self) -> ::PadDirection { pub fn direction(&self) -> ::PadDirection {
from_glib(self.0.direction) unsafe { from_glib((*self.0).direction) }
} }
pub fn presence(&self) -> ::PadPresence { pub fn presence(&self) -> ::PadPresence {
from_glib(self.0.presence) unsafe { from_glib((*self.0).presence) }
} }
} }
@ -97,7 +95,7 @@ impl<'a> glib::translate::ToGlibPtr<'a, *const ffi::GstStaticPadTemplate> for St
fn to_glib_none( fn to_glib_none(
&'a self, &'a self,
) -> glib::translate::Stash<'a, *const ffi::GstStaticPadTemplate, Self> { ) -> glib::translate::Stash<'a, *const ffi::GstStaticPadTemplate, Self> {
glib::translate::Stash(&self.0, self) glib::translate::Stash(self.0, self)
} }
fn to_glib_full(&self) -> *const ffi::GstStaticPadTemplate { fn to_glib_full(&self) -> *const ffi::GstStaticPadTemplate {
@ -109,7 +107,7 @@ impl<'a> glib::translate::ToGlibPtr<'a, *const ffi::GstStaticPadTemplate> for St
impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticPadTemplate> for StaticPadTemplate { impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticPadTemplate> for StaticPadTemplate {
#[inline] #[inline]
unsafe fn from_glib_none(ptr: *const ffi::GstStaticPadTemplate) -> Self { unsafe fn from_glib_none(ptr: *const ffi::GstStaticPadTemplate) -> Self {
StaticPadTemplate(ptr::read(ptr)) StaticPadTemplate(ptr as *mut _)
} }
} }
@ -117,7 +115,7 @@ impl glib::translate::FromGlibPtrNone<*const ffi::GstStaticPadTemplate> for Stat
impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate { impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate {
#[inline] #[inline]
unsafe fn from_glib_none(ptr: *mut ffi::GstStaticPadTemplate) -> Self { unsafe fn from_glib_none(ptr: *mut ffi::GstStaticPadTemplate) -> Self {
StaticPadTemplate(ptr::read(ptr)) StaticPadTemplate(ptr)
} }
} }
@ -125,16 +123,14 @@ impl glib::translate::FromGlibPtrNone<*mut ffi::GstStaticPadTemplate> for Static
impl glib::translate::FromGlibPtrBorrow<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate { impl glib::translate::FromGlibPtrBorrow<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate {
#[inline] #[inline]
unsafe fn from_glib_borrow(ptr: *mut ffi::GstStaticPadTemplate) -> Self { unsafe fn from_glib_borrow(ptr: *mut ffi::GstStaticPadTemplate) -> Self {
StaticPadTemplate(ptr::read(ptr)) StaticPadTemplate(ptr)
} }
} }
#[doc(hidden)] #[doc(hidden)]
impl glib::translate::FromGlibPtrFull<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate { impl glib::translate::FromGlibPtrFull<*mut ffi::GstStaticPadTemplate> for StaticPadTemplate {
#[inline] #[inline]
unsafe fn from_glib_full(ptr: *mut ffi::GstStaticPadTemplate) -> Self { unsafe fn from_glib_full(_ptr: *mut ffi::GstStaticPadTemplate) -> Self {
let templ = from_glib_none(ptr); unimplemented!();
glib_ffi::g_free(ptr as *mut _);
templ
} }
} }