mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-01-03 05:48:43 +00:00
Implement all remaining GstValue API
This commit is contained in:
parent
ad03e1e5a1
commit
3bc0687025
1 changed files with 160 additions and 2 deletions
|
@ -14,7 +14,7 @@ use std::slice;
|
||||||
|
|
||||||
use glib;
|
use glib;
|
||||||
use glib::value::{Value, FromValue, FromValueOptional, SetValue, ToValue};
|
use glib::value::{Value, FromValue, FromValueOptional, SetValue, ToValue};
|
||||||
use glib::translate::{from_glib, ToGlibPtr, ToGlibPtrMut};
|
use glib::translate::{from_glib, from_glib_full, ToGlibPtr, ToGlibPtrMut, FromGlib, ToGlib, Uninitialized};
|
||||||
|
|
||||||
use ffi;
|
use ffi;
|
||||||
use glib_ffi;
|
use glib_ffi;
|
||||||
|
@ -528,4 +528,162 @@ impl<'a> glib::types::StaticType for List<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: GStreamer value operations
|
pub enum ValueOrder {
|
||||||
|
LessThan,
|
||||||
|
Equal,
|
||||||
|
GreaterThan,
|
||||||
|
Unordered,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToGlib for ValueOrder {
|
||||||
|
type GlibType = i32;
|
||||||
|
|
||||||
|
fn to_glib(&self) -> Self::GlibType {
|
||||||
|
match *self {
|
||||||
|
ValueOrder::LessThan => ffi::GST_VALUE_LESS_THAN,
|
||||||
|
ValueOrder::Equal => ffi::GST_VALUE_EQUAL,
|
||||||
|
ValueOrder::GreaterThan => ffi::GST_VALUE_GREATER_THAN,
|
||||||
|
ValueOrder::Unordered => ffi::GST_VALUE_UNORDERED,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromGlib<i32> for ValueOrder {
|
||||||
|
fn from_glib(v: i32) -> Self {
|
||||||
|
match v {
|
||||||
|
ffi::GST_VALUE_LESS_THAN => ValueOrder::LessThan,
|
||||||
|
ffi::GST_VALUE_EQUAL => ValueOrder::Equal,
|
||||||
|
ffi::GST_VALUE_GREATER_THAN => ValueOrder::GreaterThan,
|
||||||
|
ffi::GST_VALUE_UNORDERED => ValueOrder::Unordered,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait GstValueExt: Sized {
|
||||||
|
fn can_compare(&self, other: &Self) -> bool;
|
||||||
|
fn compare(&self, other: &Self) -> ValueOrder;
|
||||||
|
fn can_intersect(&self, other: &Self) -> bool;
|
||||||
|
fn intersect(&self, other: &Self) -> Option<Self>;
|
||||||
|
fn can_subtract(&self, other: &Self) -> bool;
|
||||||
|
fn subtract(&self, other: &Self) -> Option<Self>;
|
||||||
|
fn can_union(&self, other: &Self) -> bool;
|
||||||
|
fn union(&self, other: &Self) -> Option<Self>;
|
||||||
|
fn fixate(&self) -> Option<Self>;
|
||||||
|
fn is_fixed(&self) -> bool;
|
||||||
|
fn is_subset(&self, superset: &Self) -> bool;
|
||||||
|
fn serialize(&self) -> Option<String>;
|
||||||
|
fn deserialize<'a, T: Into<&'a str>>(s: T) -> Option<glib::Value>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GstValueExt for glib::Value {
|
||||||
|
fn can_compare(&self, other: &Self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_can_compare(self.to_glib_none().0, other.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compare(&self, other: &Self) -> ValueOrder {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_compare(self.to_glib_none().0, other.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn can_intersect(&self, other: &Self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_can_intersect(self.to_glib_none().0, other.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn intersect(&self, other: &Self) -> Option<Self> {
|
||||||
|
unsafe {
|
||||||
|
let mut value = glib::Value::uninitialized();
|
||||||
|
let ret: bool = from_glib(ffi::gst_value_intersect(value.to_glib_none_mut().0, self.to_glib_none().0, other.to_glib_none().0));
|
||||||
|
if ret {
|
||||||
|
Some(value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn can_subtract(&self, other: &Self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_can_subtract(self.to_glib_none().0, other.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn subtract(&self, other: &Self) -> Option<Self> {
|
||||||
|
unsafe {
|
||||||
|
let mut value = glib::Value::uninitialized();
|
||||||
|
let ret: bool = from_glib(ffi::gst_value_subtract(value.to_glib_none_mut().0, self.to_glib_none().0, other.to_glib_none().0));
|
||||||
|
if ret {
|
||||||
|
Some(value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn can_union(&self, other: &Self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_can_union(self.to_glib_none().0, other.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn union(&self, other: &Self) -> Option<Self> {
|
||||||
|
unsafe {
|
||||||
|
let mut value = glib::Value::uninitialized();
|
||||||
|
let ret: bool = from_glib(ffi::gst_value_union(value.to_glib_none_mut().0, self.to_glib_none().0, other.to_glib_none().0));
|
||||||
|
if ret {
|
||||||
|
Some(value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fixate(&self) -> Option<Self> {
|
||||||
|
unsafe {
|
||||||
|
let mut value = glib::Value::uninitialized();
|
||||||
|
let ret: bool = from_glib(ffi::gst_value_fixate(value.to_glib_none_mut().0, self.to_glib_none().0));
|
||||||
|
if ret {
|
||||||
|
Some(value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_fixed(&self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_is_fixed(self.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_subset(&self, superset: &Self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_value_is_subset(self.to_glib_none().0, superset.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
from_glib_full(ffi::gst_value_serialize(self.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize<'a, T: Into<&'a str>>(s: T) -> Option<glib::Value> {
|
||||||
|
let s = s.into();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
let mut value = glib::Value::uninitialized();
|
||||||
|
let ret: bool = from_glib(ffi::gst_value_deserialize(value.to_glib_none_mut().0, s.to_glib_none().0));
|
||||||
|
if ret {
|
||||||
|
Some(value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue