taglist: make proper struct not just a GstStructure

This commit is contained in:
Tim-Philipp Müller 2012-05-21 00:31:29 +01:00
parent d06c7dc6fd
commit 97c2498bbe
2 changed files with 51 additions and 30 deletions

View file

@ -53,7 +53,8 @@
/* a tag list is basically a structure, but we don't make this fact public */ /* a tag list is basically a structure, but we don't make this fact public */
struct _GstTagList struct _GstTagList
{ {
GstStructure structure; GType type;
GstStructure *structure;
}; };
/* FIXME 0.11: use GParamSpecs or something similar for tag registrations, /* FIXME 0.11: use GParamSpecs or something similar for tag registrations,
@ -621,6 +622,20 @@ gst_tag_is_fixed (const gchar * tag)
return info->merge_func == NULL; return info->merge_func == NULL;
} }
/* takes ownership of the structure */
static GstTagList *
gst_tag_list_new_internal (GstStructure * s)
{
GstTagList *tag_list;
g_assert (s != NULL);
tag_list = g_slice_new0 (GstTagList);
tag_list->type = GST_TYPE_TAG_LIST;
tag_list->structure = s;
return tag_list;
}
/** /**
* gst_tag_list_new_empty: * gst_tag_list_new_empty:
* *
@ -633,7 +648,12 @@ gst_tag_is_fixed (const gchar * tag)
GstTagList * GstTagList *
gst_tag_list_new_empty (void) gst_tag_list_new_empty (void)
{ {
return GST_TAG_LIST (gst_structure_new_id_empty (GST_QUARK (TAGLIST))); GstStructure *s;
GstTagList *tag_list;
s = gst_structure_new_id_empty (GST_QUARK (TAGLIST));
tag_list = gst_tag_list_new_internal (s);
return tag_list;
} }
/** /**
@ -716,7 +736,7 @@ gst_tag_list_to_string (const GstTagList * list)
{ {
g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL); g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
return gst_structure_to_string (GST_STRUCTURE (list)); return gst_structure_to_string (list->structure);
} }
/** /**
@ -732,10 +752,13 @@ gst_tag_list_to_string (const GstTagList * list)
GstTagList * GstTagList *
gst_tag_list_new_from_string (const gchar * str) gst_tag_list_new_from_string (const gchar * str)
{ {
GstTagList *tag_list;
g_return_val_if_fail (str != NULL, NULL); g_return_val_if_fail (str != NULL, NULL);
g_return_val_if_fail (g_str_has_prefix (str, "taglist"), NULL); g_return_val_if_fail (g_str_has_prefix (str, "taglist"), NULL);
return GST_TAG_LIST (gst_structure_from_string (str, NULL)); tag_list = gst_tag_list_new_internal (gst_structure_from_string (str, NULL));
return tag_list;
} }
/** /**
@ -752,7 +775,7 @@ gst_tag_list_n_tags (const GstTagList * list)
g_return_val_if_fail (list != NULL, 0); g_return_val_if_fail (list != NULL, 0);
g_return_val_if_fail (GST_IS_TAG_LIST (list), 0); g_return_val_if_fail (GST_IS_TAG_LIST (list), 0);
return gst_structure_n_fields ((GstStructure *) list); return gst_structure_n_fields (list->structure);
} }
/** /**
@ -770,7 +793,7 @@ gst_tag_list_nth_tag_name (const GstTagList * list, guint index)
g_return_val_if_fail (list != NULL, 0); g_return_val_if_fail (list != NULL, 0);
g_return_val_if_fail (GST_IS_TAG_LIST (list), 0); g_return_val_if_fail (GST_IS_TAG_LIST (list), 0);
return gst_structure_nth_field_name ((GstStructure *) list, index); return gst_structure_nth_field_name (list->structure, index);
} }
/** /**
@ -789,7 +812,7 @@ gst_tag_list_is_empty (const GstTagList * list)
g_return_val_if_fail (list != NULL, FALSE); g_return_val_if_fail (list != NULL, FALSE);
g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE); g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
return (gst_structure_n_fields ((GstStructure *) list) == 0); return (gst_structure_n_fields (list->structure) == 0);
} }
static gboolean static gboolean
@ -836,8 +859,8 @@ gst_tag_list_is_equal (const GstTagList * list1, const GstTagList * list2)
/* we don't just use gst_structure_is_equal() here so we can add some /* we don't just use gst_structure_is_equal() here so we can add some
* tolerance for doubles, though maybe we should just add that to * tolerance for doubles, though maybe we should just add that to
* gst_value_compare_double() as well? */ * gst_value_compare_double() as well? */
s1 = (const GstStructure *) list1; s1 = list1->structure;
s2 = (const GstStructure *) list2; s2 = list2->structure;
num_fields1 = gst_structure_n_fields (s1); num_fields1 = gst_structure_n_fields (s1);
num_fields2 = gst_structure_n_fields (s2); num_fields2 = gst_structure_n_fields (s2);
@ -865,20 +888,18 @@ gst_tag_list_is_equal (const GstTagList * list1, const GstTagList * list2)
/** /**
* gst_is_tag_list: * gst_is_tag_list:
* @p: Object that might be a taglist * @taglist: Object that might be a taglist
* *
* Checks if the given pointer is a taglist. * Checks if the given pointer is a taglist.
* *
* Returns: TRUE, if the given pointer is a taglist * Returns: TRUE, if the given pointer is a taglist
*/ */
gboolean gboolean
gst_is_tag_list (gconstpointer p) gst_is_tag_list (GstTagList * taglist)
{ {
GstStructure *s = (GstStructure *) p; g_return_val_if_fail (taglist != NULL, FALSE);
g_return_val_if_fail (p != NULL, FALSE); return taglist->type == GST_TYPE_TAG_LIST;
return (GST_IS_STRUCTURE (s) && s->name == GST_QUARK (TAGLIST));
} }
typedef struct typedef struct
@ -892,7 +913,7 @@ static void
gst_tag_list_add_value_internal (GstTagList * tag_list, GstTagMergeMode mode, gst_tag_list_add_value_internal (GstTagList * tag_list, GstTagMergeMode mode,
const gchar * tag, const GValue * value, GstTagInfo * info) const gchar * tag, const GValue * value, GstTagInfo * info)
{ {
GstStructure *list = GST_STRUCTURE (tag_list); GstStructure *list = tag_list->structure;
const GValue *value2; const GValue *value2;
GQuark tag_quark; GQuark tag_quark;
@ -987,10 +1008,9 @@ gst_tag_list_insert (GstTagList * into, const GstTagList * from,
data.list = into; data.list = into;
data.mode = mode; data.mode = mode;
if (mode == GST_TAG_MERGE_REPLACE_ALL) { if (mode == GST_TAG_MERGE_REPLACE_ALL) {
gst_structure_remove_all_fields (GST_STRUCTURE (data.list)); gst_structure_remove_all_fields (into->structure);
} }
gst_structure_foreach ((GstStructure *) from, gst_tag_list_copy_foreach, gst_structure_foreach (from->structure, gst_tag_list_copy_foreach, &data);
&data);
} }
/** /**
@ -1008,7 +1028,8 @@ gst_tag_list_copy (const GstTagList * list)
{ {
g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL); g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
return GST_TAG_LIST (gst_structure_copy ((GstStructure *) list));
return gst_tag_list_new_internal (gst_structure_copy (list->structure));
} }
/** /**
@ -1062,7 +1083,8 @@ void
gst_tag_list_free (GstTagList * list) gst_tag_list_free (GstTagList * list)
{ {
g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (GST_IS_TAG_LIST (list));
gst_structure_free ((GstStructure *) list); gst_structure_free (list->structure);
g_slice_free (GstTagList, list);
} }
/** /**
@ -1081,7 +1103,7 @@ gst_tag_list_get_tag_size (const GstTagList * list, const gchar * tag)
g_return_val_if_fail (GST_IS_TAG_LIST (list), 0); g_return_val_if_fail (GST_IS_TAG_LIST (list), 0);
value = gst_structure_get_value ((GstStructure *) list, tag); value = gst_structure_get_value (list->structure, tag);
if (value == NULL) if (value == NULL)
return 0; return 0;
if (G_VALUE_TYPE (value) != GST_TYPE_LIST) if (G_VALUE_TYPE (value) != GST_TYPE_LIST)
@ -1159,7 +1181,7 @@ gst_tag_list_add_valist (GstTagList * list, GstTagMergeMode mode,
g_return_if_fail (tag != NULL); g_return_if_fail (tag != NULL);
if (mode == GST_TAG_MERGE_REPLACE_ALL) { if (mode == GST_TAG_MERGE_REPLACE_ALL) {
gst_structure_remove_all_fields (GST_STRUCTURE (list)); gst_structure_remove_all_fields (list->structure);
} }
while (tag != NULL) { while (tag != NULL) {
@ -1203,7 +1225,7 @@ gst_tag_list_add_valist_values (GstTagList * list, GstTagMergeMode mode,
g_return_if_fail (tag != NULL); g_return_if_fail (tag != NULL);
if (mode == GST_TAG_MERGE_REPLACE_ALL) { if (mode == GST_TAG_MERGE_REPLACE_ALL) {
gst_structure_remove_all_fields (GST_STRUCTURE (list)); gst_structure_remove_all_fields (list->structure);
} }
while (tag != NULL) { while (tag != NULL) {
@ -1255,7 +1277,7 @@ gst_tag_list_remove_tag (GstTagList * list, const gchar * tag)
g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (GST_IS_TAG_LIST (list));
g_return_if_fail (tag != NULL); g_return_if_fail (tag != NULL);
gst_structure_remove_field ((GstStructure *) list, tag); gst_structure_remove_field (list->structure, tag);
} }
typedef struct typedef struct
@ -1297,8 +1319,7 @@ gst_tag_list_foreach (const GstTagList * list, GstTagForeachFunc func,
data.func = func; data.func = func;
data.tag_list = list; data.tag_list = list;
data.data = user_data; data.data = user_data;
gst_structure_foreach ((GstStructure *) list, structure_foreach_wrapper, gst_structure_foreach (list->structure, structure_foreach_wrapper, &data);
&data);
} }
/** /**
@ -1322,7 +1343,7 @@ gst_tag_list_get_value_index (const GstTagList * list, const gchar * tag,
g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL); g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
g_return_val_if_fail (tag != NULL, NULL); g_return_val_if_fail (tag != NULL, NULL);
value = gst_structure_get_value ((GstStructure *) list, tag); value = gst_structure_get_value (list->structure, tag);
if (value == NULL) if (value == NULL)
return NULL; return NULL;
@ -1362,7 +1383,7 @@ gst_tag_list_copy_value (GValue * dest, const GstTagList * list,
g_return_val_if_fail (dest != NULL, FALSE); g_return_val_if_fail (dest != NULL, FALSE);
g_return_val_if_fail (G_VALUE_TYPE (dest) == 0, FALSE); g_return_val_if_fail (G_VALUE_TYPE (dest) == 0, FALSE);
src = gst_structure_get_value ((GstStructure *) list, tag); src = gst_structure_get_value (list->structure, tag);
if (!src) if (!src)
return FALSE; return FALSE;

View file

@ -206,7 +206,7 @@ GstTagList * gst_tag_list_new_valist (va_list var_args) G_GNUC_MALLOC;
gchar * gst_tag_list_to_string (const GstTagList * list) G_GNUC_MALLOC; gchar * gst_tag_list_to_string (const GstTagList * list) G_GNUC_MALLOC;
GstTagList * gst_tag_list_new_from_string (const gchar * str) G_GNUC_MALLOC; GstTagList * gst_tag_list_new_from_string (const gchar * str) G_GNUC_MALLOC;
gboolean gst_is_tag_list (gconstpointer p); gboolean gst_is_tag_list (GstTagList * taglist);
GstTagList * gst_tag_list_copy (const GstTagList * list) G_GNUC_MALLOC; GstTagList * gst_tag_list_copy (const GstTagList * list) G_GNUC_MALLOC;
gint gst_tag_list_n_tags (const GstTagList * list); gint gst_tag_list_n_tags (const GstTagList * list);
const gchar* gst_tag_list_nth_tag_name (const GstTagList * list, guint index); const gchar* gst_tag_list_nth_tag_name (const GstTagList * list, guint index);