EXPORT_C #endif GstTagList * gst_tag_list_merge (const GstTagList * list1, const GstTagList * list2, GstTagMergeMode mode) { g_return_val_if_fail (list1 == NULL || GST_IS_TAG_LIST (list1), NULL); g_return_val_if_fail (list2 == NULL || GST_IS_TAG_LIST (list2), NULL); g_return_val_if_fail (GST_TAG_MODE_IS_VALID (mode), NULL); if (!list1 && !list2) { return NULL; } else if (!list1) { return gst_tag_list_copy (list2); } else if (!list2) { return gst_tag_list_copy (list1); } else { GstTagList *ret; ret = gst_tag_list_copy (list1); gst_tag_list_insert (ret, list2, mode); return ret; } }
/** * gst_tag_setter_set_tag_merge_mode: * @setter: a #GstTagSetter * @mode: The mode with which tags are added * * Sets the given merge mode that is used for adding tags from events to tags * specified by this interface. The default is #GST_TAG_MERGE_KEEP, which keeps * the tags set with this interface and discards tags from events. */ void gst_tag_setter_set_tag_merge_mode (GstTagSetter * setter, GstTagMergeMode mode) { g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); gst_tag_setter_get_data (setter)->mode = mode; }
/** * gst_tag_setter_add_tag_values: * @setter: a #GstTagSetter * @mode: the mode to use * @tag: tag to set * @...: more tag / GValue pairs to set * * Adds the given tag / GValue pairs on the setter using the given merge mode. * The list must be terminated with NULL. */ void gst_tag_setter_add_tag_values (GstTagSetter * setter, GstTagMergeMode mode, const gchar * tag, ...) { va_list args; g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); va_start (args, tag); gst_tag_setter_add_tag_valist_values (setter, mode, tag, args); va_end (args); }
/** * gst_tag_setter_set_tag_merge_mode: * @setter: a #GstTagSetter * @mode: The mode with which tags are added * * Sets the given merge mode that is used for adding tags from events to tags * specified by this interface. The default is #GST_TAG_MERGE_KEEP, which keeps * the tags set with this interface and discards tags from events. */ void gst_tag_setter_set_tag_merge_mode (GstTagSetter * setter, GstTagMergeMode mode) { GstTagData *data; g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); data = gst_tag_setter_get_data (setter); g_static_mutex_lock (&data->lock); data->mode = mode; g_static_mutex_unlock (&data->lock); }
/** * gst_tag_setter_add_tag_valist_values: * @setter: a #GstTagSetter * @mode: the mode to use * @tag: tag to set * @var_args: tag / GValue pairs to set * * Adds the given tag / GValue pairs on the setter using the given merge mode. * The list must be terminated with NULL. */ void gst_tag_setter_add_tag_valist_values (GstTagSetter * setter, GstTagMergeMode mode, const gchar * tag, va_list var_args) { GstTagData *data; g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); data = gst_tag_setter_get_data (setter); if (!data->list) data->list = gst_tag_list_new (); gst_tag_list_add_valist_values (data->list, mode, tag, var_args); }
EXPORT_C #endif void gst_tag_list_add_values (GstTagList * list, GstTagMergeMode mode, const gchar * tag, ...) { va_list args; g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); g_return_if_fail (tag != NULL); va_start (args, tag); gst_tag_list_add_valist_values (list, mode, tag, args); va_end (args); }
/** * gst_tag_setter_merge_tags: * @setter: a #GstTagSetter * @list: a tag list to merge from * @mode: the mode to merge with * * Merges the given list into the setter's list using the given mode. */ void gst_tag_setter_merge_tags (GstTagSetter * setter, const GstTagList * list, GstTagMergeMode mode) { GstTagData *data; g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); g_return_if_fail (GST_IS_TAG_LIST (list)); data = gst_tag_setter_get_data (setter); if (data->list == NULL) { if (mode != GST_TAG_MERGE_KEEP_ALL) data->list = gst_tag_list_copy (list); } else { gst_tag_list_insert (data->list, list, mode); } }
/** * gst_tag_setter_add_tag_value: * @setter: a #GstTagSetter * @mode: the mode to use * @tag: tag to set * @value: GValue to set for the tag * * Adds the given tag / GValue pair on the setter using the given merge mode. * * Since: 0.10.24 */ void gst_tag_setter_add_tag_value (GstTagSetter * setter, GstTagMergeMode mode, const gchar * tag, const GValue * value) { GstTagData *data; g_return_if_fail (GST_IS_TAG_SETTER (setter)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); data = gst_tag_setter_get_data (setter); g_static_mutex_lock (&data->lock); if (!data->list) data->list = gst_tag_list_new (); gst_tag_list_add_value (data->list, mode, tag, value); g_static_mutex_unlock (&data->lock); }
EXPORT_C #endif void gst_tag_list_insert (GstTagList * into, const GstTagList * from, GstTagMergeMode mode) { GstTagCopyData data; g_return_if_fail (GST_IS_TAG_LIST (into)); g_return_if_fail (GST_IS_TAG_LIST (from)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); data.list = (GstStructure *) into; data.mode = mode; if (mode == GST_TAG_MERGE_REPLACE_ALL) { gst_structure_remove_all_fields (data.list); } gst_structure_foreach ((GstStructure *) from, gst_tag_list_copy_foreach, &data); }
EXPORT_C #endif void gst_tag_list_add_valist (GstTagList * list, GstTagMergeMode mode, const gchar * tag, va_list var_args) { GstTagInfo *info; GQuark quark; gchar *error = NULL; g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); g_return_if_fail (tag != NULL); while (tag != NULL) { GValue value = { 0, }; quark = g_quark_from_string (tag); info = gst_tag_lookup (quark); if (info == NULL) g_warning ("no GstTag for %s", tag); g_return_if_fail (info != NULL); g_value_init (&value, info->type); G_VALUE_COLLECT (&value, var_args, 0, &error); if (error) { g_warning ("%s: %s", G_STRLOC, error); g_free (error); /* we purposely leak the value here, it might not be * in a sane state if an error condition occoured */ return; } gst_tag_list_add_value_internal (list, mode, quark, &value); g_value_unset (&value); tag = va_arg (var_args, gchar *); } }
EXPORT_C #endif void gst_tag_list_add_valist_values (GstTagList * list, GstTagMergeMode mode, const gchar * tag, va_list var_args) { GstTagInfo *info; GQuark quark; g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); g_return_if_fail (tag != NULL); while (tag != NULL) { quark = g_quark_from_string (tag); info = gst_tag_lookup (quark); g_return_if_fail (info != NULL); gst_tag_list_add_value_internal (list, mode, quark, va_arg (var_args, GValue *)); tag = va_arg (var_args, gchar *); } }