diff --git a/gstreamer/src/context.rs b/gstreamer/src/context.rs new file mode 100644 index 000000000..69bfddff2 --- /dev/null +++ b/gstreamer/src/context.rs @@ -0,0 +1,88 @@ +// Copyright (C) 2017 Sebastian Dröge +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::ffi::CStr; + +use ffi; + +use glib; +use glib::StaticType; +use glib::translate::{from_glib, from_glib_full, from_glib_none, ToGlib, ToGlibPtr}; + +use miniobject::*; +use StructureRef; + +pub type Context = GstRc; +pub struct ContextRef(ffi::GstContext); + +unsafe impl MiniObject for ContextRef { + type GstType = ffi::GstContext; +} + +impl GstRc { + pub fn new(context_type: &str, persistent: bool) -> Self { + assert_initialized_main_thread!(); + unsafe { + from_glib_full(ffi::gst_context_new( + context_type.to_glib_none().0, + persistent.to_glib(), + )) + } + } +} + +impl ContextRef { + pub fn get_context_type(&self) -> &str { + unsafe { + let raw = ffi::gst_context_get_context_type(self.as_mut_ptr()); + CStr::from_ptr(raw).to_str().unwrap() + } + } + + pub fn has_context_type(&self, context_type: &str) -> bool { + unsafe { + from_glib(ffi::gst_context_has_context_type( + self.as_mut_ptr(), + context_type.to_glib_none().0, + )) + } + } + + pub fn is_persistent(&self) -> bool { + unsafe { from_glib(ffi::gst_context_is_persistent(self.as_mut_ptr())) } + } + + pub fn get_structure(&self) -> &StructureRef { + unsafe { StructureRef::from_glib_borrow(ffi::gst_context_get_structure(self.as_mut_ptr())) } + } + + pub fn get_mut_structure(&mut self) -> &mut StructureRef { + unsafe { + StructureRef::from_glib_borrow_mut( + ffi::gst_context_writable_structure(self.as_mut_ptr()), + ) + } + } +} + +impl StaticType for ContextRef { + fn static_type() -> glib::Type { + unsafe { from_glib(ffi::gst_context_get_type()) } + } +} + +impl ToOwned for ContextRef { + type Owned = GstRc; + + fn to_owned(&self) -> GstRc { + unsafe { from_glib_none(self.as_ptr()) } + } +} + +unsafe impl Sync for ContextRef {} +unsafe impl Send for ContextRef {} diff --git a/gstreamer/src/lib.rs b/gstreamer/src/lib.rs index 7fe1fd5aa..da56d3df3 100644 --- a/gstreamer/src/lib.rs +++ b/gstreamer/src/lib.rs @@ -69,6 +69,8 @@ pub mod query; pub use query::{Query, QueryRef, QueryView}; pub mod event; pub use event::{Event, EventRef, EventView}; +pub mod context; +pub use context::{Context, ContextRef}; mod object; mod element;