mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-05 17:19:42 +00:00
tags: add dynamic tag retrieval based on string's and Value's
The rust compiler won't complain if you use the wrong types with the dynamic getter/adder however GStreamer itself does.
This commit is contained in:
parent
fa054fe3b0
commit
2e1f1eadac
1 changed files with 62 additions and 0 deletions
|
@ -188,6 +188,23 @@ impl TagListRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn add_dynamic<'a, T>(&'a mut self, tag_name : &str, value: &T, mode: TagMergeMode)
|
||||
where
|
||||
T: ToSendValue
|
||||
{
|
||||
/* TODO: implement limiting values for tags? */
|
||||
unsafe {
|
||||
let v = value.to_send_value();
|
||||
|
||||
ffi::gst_tag_list_add_value(
|
||||
self.as_mut_ptr(),
|
||||
mode.to_glib(),
|
||||
tag_name.to_glib_none().0,
|
||||
v.to_glib_none().0,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get<'a, T: Tag<'a>>(&self) -> Option<TypedValue<T::TagType>> {
|
||||
unsafe {
|
||||
let mut value: Value = mem::zeroed();
|
||||
|
@ -206,6 +223,34 @@ impl TagListRef {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn n_tags<'a>(&'a self) -> i32 {
|
||||
unsafe { ffi::gst_tag_list_n_tags(self.as_ptr()) }
|
||||
}
|
||||
|
||||
pub fn nth_tag<'a>(&'a self, idx: u32) -> &str {
|
||||
unsafe { CStr::from_ptr(ffi::gst_tag_list_nth_tag_name(self.as_ptr(), idx)).to_str().unwrap() }
|
||||
}
|
||||
|
||||
pub fn get_size_dynamic<'a>(&'a self, tag_name: &str) -> u32 {
|
||||
unsafe { ffi::gst_tag_list_get_tag_size(self.as_ptr(), tag_name.to_glib_none().0) }
|
||||
}
|
||||
|
||||
pub fn get_index_dynamic<'a>(&'a self, tag_name: &str, idx: u32) -> Option<&'a Value> {
|
||||
unsafe {
|
||||
let value = ffi::gst_tag_list_get_value_index(
|
||||
self.as_ptr(),
|
||||
tag_name.to_glib_none().0,
|
||||
idx,
|
||||
);
|
||||
|
||||
if value.is_null() {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(&*(value as *const Value))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_index<'a, T: Tag<'a>>(&'a self, idx: u32) -> Option<&'a TypedValue<T::TagType>> {
|
||||
unsafe {
|
||||
let value = ffi::gst_tag_list_get_value_index(
|
||||
|
@ -400,4 +445,21 @@ mod tests {
|
|||
(::SECOND * 120)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_dynamic() {
|
||||
::init().unwrap();
|
||||
|
||||
let mut tags = TagList::new();
|
||||
{
|
||||
let tags = tags.get_mut().unwrap();
|
||||
tags.add_dynamic(&TAG_TITLE, &"some title", TagMergeMode::Append);
|
||||
tags.add_dynamic(&TAG_TITLE, &"second title", TagMergeMode::Append);
|
||||
tags.add_dynamic(&TAG_DURATION, &(::SECOND * 120), TagMergeMode::Append);
|
||||
}
|
||||
|
||||
assert_eq!(tags.get_index_dynamic(&TAG_TITLE, 0).unwrap().get(), Some("some title"));
|
||||
assert_eq!(tags.get_index_dynamic(&TAG_TITLE, 1).unwrap().get(), Some("second title"));
|
||||
assert_eq!(tags.get_index_dynamic(&TAG_DURATION, 0).unwrap().get(), Some(::SECOND * 120));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue