[gst-cvs] gstreamer: taglist: add gst_tag_list_peek_string_index to avoid a copy
Thiago Sousa Santos
thiagoss at kemper.freedesktop.org
Fri Jun 18 10:49:07 PDT 2010
Module: gstreamer
Branch: master
Commit: 9ee11a2af41ec6f37bbf37e7990d129c357fb809
URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=9ee11a2af41ec6f37bbf37e7990d129c357fb809
Author: Thiago Santos <thiago.sousa.santos at collabora.co.uk>
Date: Thu Jun 17 11:39:04 2010 -0300
taglist: add gst_tag_list_peek_string_index to avoid a copy
Adds a variation of the _get_string_index function that doesn't copy
the string.
API: gst_tag_list_peek_string_index
https://bugzilla.gnome.org/show_bug.cgi?id=621896
---
docs/gst/gstreamer-sections.txt | 1 +
gst/gsttaglist.c | 38 ++++++++++++++++++++++++++++++++++++++
gst/gsttaglist.h | 4 ++++
win32/common/libgstreamer.def | 1 +
4 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index 79f6064..9be7cb1 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -2255,6 +2255,7 @@ gst_tag_list_get_double
gst_tag_list_get_double_index
gst_tag_list_get_string
gst_tag_list_get_string_index
+gst_tag_list_peek_string_index
gst_tag_list_get_pointer
gst_tag_list_get_pointer_index
gst_tag_list_get_date
diff --git a/gst/gsttaglist.c b/gst/gsttaglist.c
index 644b387..d31787e 100644
--- a/gst/gsttaglist.c
+++ b/gst/gsttaglist.c
@@ -1601,6 +1601,44 @@ TAG_MERGE_FUNCS (pointer, gpointer, (*value != NULL))
*/
TAG_MERGE_FUNCS (string, gchar *, (*value != NULL && **value != '\0'))
+/*
+ *FIXME 0.11: Instead of _peek (non-copy) and _get (copy), we could have
+ * _get (non-copy) and _dup (copy) for strings, seems more
+ * widely used
+ */
+/**
+ * gst_tag_list_peek_string_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: location for the result
+ *
+ * Peeks at the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and doesn't need
+ * to be freed by the caller. The returned string is also guaranteed to
+ * be non-NULL and non-empty.
+ *
+ * Returns: TRUE, if a value was set, FALSE if the tag didn't exist in the
+ * given list.
+ */
+gboolean
+gst_tag_list_peek_string_index (const GstTagList * list,
+ const gchar * tag, guint index, const gchar ** value)
+{
+ const GValue *v;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL)
+ return FALSE;
+ *value = g_value_get_string (v);
+ return *value != NULL && **value != '\0';
+}
+
/**
* gst_tag_list_get_date:
* @list: a #GstTagList to get the tag from
diff --git a/gst/gsttaglist.h b/gst/gsttaglist.h
index 1d0971c..52eb134 100644
--- a/gst/gsttaglist.h
+++ b/gst/gsttaglist.h
@@ -345,6 +345,10 @@ gboolean gst_tag_list_get_string_index (const GstTagList * list,
const gchar * tag,
guint index,
gchar ** value);
+gboolean gst_tag_list_peek_string_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ const gchar ** value);
gboolean gst_tag_list_get_pointer (const GstTagList * list,
const gchar * tag,
gpointer * value);
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
index 1146b2a..91ac1d8 100644
--- a/win32/common/libgstreamer.def
+++ b/win32/common/libgstreamer.def
@@ -991,6 +991,7 @@ EXPORTS
gst_tag_list_new
gst_tag_list_new_full
gst_tag_list_new_full_valist
+ gst_tag_list_peek_string_index
gst_tag_list_remove_tag
gst_tag_merge_mode_get_type
gst_tag_merge_strings_with_comma
More information about the Gstreamer-commits
mailing list