/** * gst_tag_setter_get_tag_merge_mode: * @setter: a #GstTagSetter * * Queries the mode by which tags inside the setter are overwritten by tags * from events * * Returns: the merge mode used inside the element. */ GstTagMergeMode gst_tag_setter_get_tag_merge_mode (GstTagSetter * setter) { g_return_val_if_fail (GST_IS_TAG_SETTER (setter), FALSE); return gst_tag_setter_get_data (setter)->mode; }
/** * gst_tag_setter_get_tag_list: * @setter: a #GstTagSetter * * Returns the current list of tags the setter uses. The list should not be * modified or freed. * * Returns: a current snapshot of the taglist used in the setter * or NULL if none is used. */ G_CONST_RETURN GstTagList * gst_tag_setter_get_tag_list (GstTagSetter * setter) { g_return_val_if_fail (GST_IS_TAG_SETTER (setter), NULL); return gst_tag_setter_get_data (setter)->list; }
/** * 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; }
/* * metadata_write_probe: * @pad: sink pad of metadata muxer * @buffer: received buffer * @u_data: image bin object * * Buffer probe that sets Xmp.dc.type and Xmp.dc.format tags * to metadata muxer based on preceding element src pad caps. * * Returns: TRUE always */ static gboolean metadata_write_probe (GstPad * pad, GstBuffer * buffer, gpointer u_data) { /* Add XMP tags */ GstCameraBinImage *img = NULL; GstTagSetter *setter = NULL; GstPad *srcpad = NULL; GstCaps *caps = NULL; GstStructure *st = NULL; img = GST_CAMERABIN_IMAGE (u_data); g_return_val_if_fail (img != NULL, TRUE); if (GST_IS_TAG_SETTER (img->formatter)) { setter = GST_TAG_SETTER (img->formatter); } if (!setter) { GST_WARNING_OBJECT (img, "setting tags failed"); goto done; } /* Xmp.dc.type tag */ gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE, GST_TAG_CODEC, "Image", NULL); /* Xmp.dc.format tag */ if (img->enc) { srcpad = gst_element_get_static_pad (img->enc, "src"); } GST_LOG_OBJECT (img, "srcpad:%" GST_PTR_FORMAT, srcpad); if (srcpad) { caps = gst_pad_get_negotiated_caps (srcpad); GST_LOG_OBJECT (img, "caps:%" GST_PTR_FORMAT, caps); if (caps) { /* If there are many structures, we can't know which one to use */ if (gst_caps_get_size (caps) != 1) { GST_WARNING_OBJECT (img, "can't decide structure for format tag"); goto done; } st = gst_caps_get_structure (caps, 0); if (st) { GST_DEBUG_OBJECT (img, "Xmp.dc.format:%s", gst_structure_get_name (st)); gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE, GST_TAG_VIDEO_CODEC, gst_structure_get_name (st), NULL); } } } done: if (caps) gst_caps_unref (caps); if (srcpad) gst_object_unref (srcpad); return TRUE; }
GstTagSetter *setter() { if (!device || !device->d_ptr->cameraBin) { return 0; } if (!GST_IS_TAG_SETTER(device->d_ptr->cameraBin)) { return 0; } return GST_TAG_SETTER(gst_object_ref(device->d_ptr->cameraBin)); }
/** * 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_reset_tags: * @setter: a #GstTagSetter * * Reset the internal taglist. Elements should call this from within the * state-change handler. * * Since: 0.10.22 */ void gst_tag_setter_reset_tags (GstTagSetter * setter) { GstTagData *data; g_return_if_fail (GST_IS_TAG_SETTER (setter)); data = gst_tag_setter_get_data (setter); if (data->list) { gst_tag_list_free (data->list); data->list = NULL; } }
/** * 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); }
/** * gst_tag_setter_get_tag_merge_mode: * @setter: a #GstTagSetter * * Queries the mode by which tags inside the setter are overwritten by tags * from events * * Returns: the merge mode used inside the element. */ GstTagMergeMode gst_tag_setter_get_tag_merge_mode (GstTagSetter * setter) { GstTagMergeMode mode; GstTagData *data; g_return_val_if_fail (GST_IS_TAG_SETTER (setter), FALSE); data = gst_tag_setter_get_data (setter); g_static_mutex_lock (&data->lock); mode = data->mode; g_static_mutex_unlock (&data->lock); return mode; }
/** * 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); }