mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-01-10 17:25:33 +00:00
Add bindings for gst::tags::register()
This commit is contained in:
parent
bd0cbe99b3
commit
598e012568
5 changed files with 172 additions and 3 deletions
|
@ -40,6 +40,7 @@ generate = [
|
||||||
"Gst.StreamFlags",
|
"Gst.StreamFlags",
|
||||||
"Gst.ProgressType",
|
"Gst.ProgressType",
|
||||||
"Gst.BusSyncReply",
|
"Gst.BusSyncReply",
|
||||||
|
"Gst.TagFlag",
|
||||||
"Gst.TagMergeMode",
|
"Gst.TagMergeMode",
|
||||||
"Gst.PadProbeType",
|
"Gst.PadProbeType",
|
||||||
"Gst.PadProbeReturn",
|
"Gst.PadProbeReturn",
|
||||||
|
|
|
@ -2387,6 +2387,73 @@ impl SetValue for StructureChangeType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub enum TagFlag {
|
||||||
|
Undefined,
|
||||||
|
Meta,
|
||||||
|
Encoded,
|
||||||
|
Decoded,
|
||||||
|
Count,
|
||||||
|
#[doc(hidden)]
|
||||||
|
__Unknown(i32),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
impl ToGlib for TagFlag {
|
||||||
|
type GlibType = ffi::GstTagFlag;
|
||||||
|
|
||||||
|
fn to_glib(&self) -> ffi::GstTagFlag {
|
||||||
|
match *self {
|
||||||
|
TagFlag::Undefined => ffi::GST_TAG_FLAG_UNDEFINED,
|
||||||
|
TagFlag::Meta => ffi::GST_TAG_FLAG_META,
|
||||||
|
TagFlag::Encoded => ffi::GST_TAG_FLAG_ENCODED,
|
||||||
|
TagFlag::Decoded => ffi::GST_TAG_FLAG_DECODED,
|
||||||
|
TagFlag::Count => ffi::GST_TAG_FLAG_COUNT,
|
||||||
|
TagFlag::__Unknown(value) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
impl FromGlib<ffi::GstTagFlag> for TagFlag {
|
||||||
|
fn from_glib(value: ffi::GstTagFlag) -> Self {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
match value {
|
||||||
|
0 => TagFlag::Undefined,
|
||||||
|
1 => TagFlag::Meta,
|
||||||
|
2 => TagFlag::Encoded,
|
||||||
|
3 => TagFlag::Decoded,
|
||||||
|
4 => TagFlag::Count,
|
||||||
|
value => TagFlag::__Unknown(value),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StaticType for TagFlag {
|
||||||
|
fn static_type() -> Type {
|
||||||
|
unsafe { from_glib(ffi::gst_tag_flag_get_type()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> FromValueOptional<'a> for TagFlag {
|
||||||
|
unsafe fn from_value_optional(value: &Value) -> Option<Self> {
|
||||||
|
Some(FromValue::from_value(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> FromValue<'a> for TagFlag {
|
||||||
|
unsafe fn from_value(value: &Value) -> Self {
|
||||||
|
from_glib(gobject_ffi::g_value_get_enum(value.to_glib_none().0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SetValue for TagFlag {
|
||||||
|
unsafe fn set_value(value: &mut Value, this: &Self) {
|
||||||
|
gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub enum TagMergeMode {
|
pub enum TagMergeMode {
|
||||||
|
|
|
@ -144,6 +144,7 @@ pub use self::enums::StateChangeReturn;
|
||||||
pub use self::enums::StreamError;
|
pub use self::enums::StreamError;
|
||||||
pub use self::enums::StreamStatusType;
|
pub use self::enums::StreamStatusType;
|
||||||
pub use self::enums::StructureChangeType;
|
pub use self::enums::StructureChangeType;
|
||||||
|
pub use self::enums::TagFlag;
|
||||||
pub use self::enums::TagMergeMode;
|
pub use self::enums::TagMergeMode;
|
||||||
pub use self::enums::TaskState;
|
pub use self::enums::TaskState;
|
||||||
pub use self::enums::TocEntryType;
|
pub use self::enums::TocEntryType;
|
||||||
|
|
|
@ -335,7 +335,7 @@ pub mod prelude {
|
||||||
pub use value::GstValueExt;
|
pub use value::GstValueExt;
|
||||||
|
|
||||||
pub use miniobject::MiniObject;
|
pub use miniobject::MiniObject;
|
||||||
pub use tags::Tag;
|
pub use tags::{CustomTag, Tag};
|
||||||
|
|
||||||
pub use muldiv::MulDiv;
|
pub use muldiv::MulDiv;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2016-2017 Sebastian Dröge <sebastian@centricular.com>
|
// Copyright (C) 2016-2018 Sebastian Dröge <sebastian@centricular.com>
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
@ -14,7 +14,9 @@ use std::mem;
|
||||||
use ffi;
|
use ffi;
|
||||||
use glib;
|
use glib;
|
||||||
use glib::translate::{from_glib, from_glib_full, ToGlib, ToGlibPtr, ToGlibPtrMut};
|
use glib::translate::{from_glib, from_glib_full, ToGlib, ToGlibPtr, ToGlibPtrMut};
|
||||||
use glib::value::{FromValueOptional, SendValue, SetValue, ToSendValue, TypedValue};
|
use glib::value::{FromValueOptional, SendValue, SetValue, ToSendValue, TypedValue, Value};
|
||||||
|
use glib::StaticType;
|
||||||
|
use gobject_ffi;
|
||||||
|
|
||||||
use miniobject::*;
|
use miniobject::*;
|
||||||
|
|
||||||
|
@ -765,6 +767,60 @@ impl<'a> DoubleEndedIterator for Iter<'a> {
|
||||||
|
|
||||||
impl<'a> ExactSizeIterator for Iter<'a> {}
|
impl<'a> ExactSizeIterator for Iter<'a> {}
|
||||||
|
|
||||||
|
pub trait CustomTag<'a>: Tag<'a> {
|
||||||
|
const FLAG: ::TagFlag;
|
||||||
|
const NICK: &'static str;
|
||||||
|
const DESCRIPTION: &'static str;
|
||||||
|
|
||||||
|
fn merge_func(src: &Value) -> Value {
|
||||||
|
merge_use_first(src)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register<T: for<'a> CustomTag<'a>>() {
|
||||||
|
unsafe extern "C" fn merge_func_trampoline<T: for<'a> CustomTag<'a>>(
|
||||||
|
dest: *mut gobject_ffi::GValue,
|
||||||
|
src: *const gobject_ffi::GValue,
|
||||||
|
) {
|
||||||
|
*dest = T::merge_func(&*(src as *const Value)).into_raw();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
ffi::gst_tag_register(
|
||||||
|
T::tag_name().to_glib_none().0,
|
||||||
|
T::FLAG.to_glib(),
|
||||||
|
T::TagType::static_type().to_glib(),
|
||||||
|
T::NICK.to_glib_none().0,
|
||||||
|
T::DESCRIPTION.to_glib_none().0,
|
||||||
|
Some(merge_func_trampoline::<T>),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn merge_use_first(src: &Value) -> Value {
|
||||||
|
assert_eq!(src.type_(), ::List::static_type());
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
use glib::translate::Uninitialized;
|
||||||
|
|
||||||
|
let mut res = Value::uninitialized();
|
||||||
|
ffi::gst_tag_merge_use_first(res.to_glib_none_mut().0, src.to_glib_none().0);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn merge_strings_with_comma(src: &Value) -> Value {
|
||||||
|
assert_eq!(src.type_(), ::List::static_type());
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
use glib::translate::Uninitialized;
|
||||||
|
|
||||||
|
let mut res = Value::uninitialized();
|
||||||
|
ffi::gst_tag_merge_strings_with_comma(res.to_glib_none_mut().0, src.to_glib_none().0);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -915,4 +971,48 @@ mod tests {
|
||||||
assert_eq!(tag_value.get(), Some(::SECOND * 120));
|
assert_eq!(tag_value.get(), Some(::SECOND * 120));
|
||||||
assert!(tag_iter.next().is_none());
|
assert!(tag_iter.next().is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_custom_tags() {
|
||||||
|
::init().unwrap();
|
||||||
|
|
||||||
|
struct MyCustomTag;
|
||||||
|
|
||||||
|
impl<'a> Tag<'a> for MyCustomTag {
|
||||||
|
type TagType = &'a str;
|
||||||
|
fn tag_name<'b>() -> &'b str {
|
||||||
|
"my-custom-tag"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> CustomTag<'a> for MyCustomTag {
|
||||||
|
const FLAG: ::TagFlag = ::TagFlag::Meta;
|
||||||
|
const NICK: &'static str = "my custom tag";
|
||||||
|
const DESCRIPTION: &'static str = "My own custom tag type for testing";
|
||||||
|
|
||||||
|
fn merge_func(src: &Value) -> Value {
|
||||||
|
merge_strings_with_comma(src)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
register::<MyCustomTag>();
|
||||||
|
|
||||||
|
let mut tags = TagList::new();
|
||||||
|
{
|
||||||
|
let tags = tags.get_mut().unwrap();
|
||||||
|
tags.add::<MyCustomTag>(&"first one", TagMergeMode::Append);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(tags.get::<MyCustomTag>().unwrap().get(), Some("first one"));
|
||||||
|
|
||||||
|
{
|
||||||
|
let tags = tags.get_mut().unwrap();
|
||||||
|
tags.add::<MyCustomTag>(&"second one", TagMergeMode::Append);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
tags.get::<MyCustomTag>().unwrap().get(),
|
||||||
|
Some("first one, second one")
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue