void add_raw_value(tag_list &p_tag_list, GValue const *p_value, std::string const &p_name, GstTagMergeMode const p_merge_mode) { g_assert(p_value != NULL); g_assert(!p_name.empty()); if (p_tag_list.is_empty()) p_tag_list = tag_list(gst_tag_list_new_empty()); gst_tag_list_add_value(p_tag_list.get_tag_list(), p_merge_mode, p_name.c_str(), p_value); }
static gboolean on_activate(GstPad* pad, GstObject* parent) { gst_pad_activate_mode(pad,GST_PAD_MODE_PUSH,TRUE); GstTagList* list = gst_tag_list_new_empty(); GValue value; memset(&value,0,sizeof(value)); g_value_init(&value,G_TYPE_DOUBLE); fprintf(stderr,"bwub setting gain/peak %f %f %f\n", g_activate_gain.peak, g_activate_gain.gain, g_activate_gain.level); g_value_set_double(&value,g_activate_gain.gain*2); gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, &value); gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_GAIN, &value); g_value_set_double(&value,g_activate_gain.peak*2); gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_PEAK, &value); gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_PEAK, &value); g_value_set_double(&value,g_activate_gain.level); gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_REFERENCE_LEVEL, &value); assert(TRUE==gst_pad_send_event(pad,gst_event_new_tag(list))); return TRUE; }
/** * 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); if (!data->list) data->list = gst_tag_list_new (); gst_tag_list_add_value (data->list, mode, tag, value); }
static gboolean metadataparse_handle_unit_tags (ExifEntry * entry, MEUserData * meudata, const ExifByteOrder byte_order) { gboolean ret = TRUE; /* FIXME: Cast to gint because EXIF_TAG_GPS_ALTITUDE_REF * and EXIF_TAG_GPS_LONGITUDE_REF are not part of ExifTag * and gcc warns about this */ switch ((gint) entry->tag) { case EXIF_TAG_RESOLUTION_UNIT: meudata->resolution_unit = exif_get_short (entry->data, byte_order); if (meudata->resolution_unit == 3) { /* if [xy]resolution has alredy been add in cm, replace it in inches */ GValue cm = { 0, }; GValue inch = { 0, }; GValue factor = { 0, }; g_value_init (&factor, GST_TYPE_FRACTION); gst_value_set_fraction (&factor, 2, 5); if (gst_tag_list_copy_value (&cm, meudata->taglist, GST_TAG_IMAGE_XRESOLUTION)) { g_value_init (&inch, GST_TYPE_FRACTION); gst_tag_list_add_value (meudata->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_IMAGE_XRESOLUTION, &inch); g_value_unset (&inch); g_value_unset (&cm); } if (gst_tag_list_copy_value (&cm, meudata->taglist, GST_TAG_IMAGE_YRESOLUTION)) { g_value_init (&inch, GST_TYPE_FRACTION); gst_tag_list_add_value (meudata->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_IMAGE_YRESOLUTION, &inch); g_value_unset (&inch); g_value_unset (&cm); } g_value_unset (&factor); } break; case EXIF_TAG_GPS_ALTITUDE_REF: { gdouble value; meudata->altitude_ref = entry->data[0]; if (gst_tag_list_get_double (meudata->taglist, GST_TAG_GEO_LOCATION_ELEVATION, &value)) { GST_DEBUG ("alt-ref: %d", meudata->altitude_ref); if (((meudata->altitude_ref == 1) && (value > 0.0)) || ((meudata->altitude_ref == 0) && (value < 0.0))) { gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_GEO_LOCATION_ELEVATION, -value, NULL); } } } break; case EXIF_TAG_GPS_LATITUDE_REF: { gdouble value; meudata->latitude_ref = entry->data[0]; if (gst_tag_list_get_double (meudata->taglist, GST_TAG_GEO_LOCATION_LATITUDE, &value)) { GST_DEBUG ("lat-ref: %c", meudata->latitude_ref); if (((meudata->latitude_ref == 'S') && (value > 0.0)) || ((meudata->latitude_ref == 'N') && (value < 0.0))) { gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_GEO_LOCATION_LATITUDE, -value, NULL); } } } break; case EXIF_TAG_GPS_LONGITUDE_REF: { gdouble value; meudata->longitude_ref = entry->data[0]; if (gst_tag_list_get_double (meudata->taglist, GST_TAG_GEO_LOCATION_LONGITUDE, &value)) { GST_DEBUG ("lon-ref: %c", meudata->longitude_ref); if (((meudata->longitude_ref == 'W') && (value > 0.0)) || ((meudata->longitude_ref == 'E') && (value < 0.0))) { gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_GEO_LOCATION_LONGITUDE, -value, NULL); } } } break; default: ret = FALSE; break; } return ret; }
/** * gst_riff_parse_info: * @element: caller element (used for debugging/error). * @buf: input data to be used for parsing, stripped from header. * @taglist: a pointer to a taglist (returned by this function) * containing information about this stream. May be * NULL if no supported tags were found. * * Parses stream metadata from input data. */ void gst_riff_parse_info (GstElement * element, GstBuffer * buf, GstTagList ** _taglist) { guint8 *data; guint size, tsize; guint32 tag; const gchar *type; GstTagList *taglist; g_return_if_fail (_taglist != NULL); if (!buf) { *_taglist = NULL; return; } data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); taglist = gst_tag_list_new (); while (size > 8) { tag = GST_READ_UINT32_LE (data); tsize = GST_READ_UINT32_LE (data + 4); GST_MEMDUMP_OBJECT (element, "tag chunk", data, MIN (tsize + 8, size)); size -= 8; data += 8; GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u", GST_FOURCC_ARGS (tag), tsize); if (tsize > size) { GST_WARNING_OBJECT (element, "Tagsize %d is larger than available data %d", tsize, size); tsize = size; } /* make uppercase */ tag = tag & 0xDFDFDFDF; /* find out the type of metadata */ switch (tag) { case GST_RIFF_INFO_IARL: type = GST_TAG_LOCATION; break; case GST_RIFF_INFO_IAAR: type = GST_TAG_ALBUM_ARTIST; break; case GST_RIFF_INFO_IART: type = GST_TAG_ARTIST; break; case GST_RIFF_INFO_ICMS: type = NULL; /*"Commissioner"; */ break; case GST_RIFF_INFO_ICMT: type = GST_TAG_COMMENT; break; case GST_RIFF_INFO_ICOP: type = GST_TAG_COPYRIGHT; break; case GST_RIFF_INFO_ICRD: type = GST_TAG_DATE; break; case GST_RIFF_INFO_ICRP: type = NULL; /*"Cropped"; */ break; case GST_RIFF_INFO_IDIM: type = NULL; /*"Dimensions"; */ break; case GST_RIFF_INFO_IDPI: type = NULL; /*"Dots per Inch"; */ break; case GST_RIFF_INFO_IENG: type = NULL; /*"Engineer"; */ break; case GST_RIFF_INFO_IGNR: type = GST_TAG_GENRE; break; case GST_RIFF_INFO_IKEY: type = GST_TAG_KEYWORDS; break; case GST_RIFF_INFO_ILGT: type = NULL; /*"Lightness"; */ break; case GST_RIFF_INFO_IMED: type = NULL; /*"Medium"; */ break; case GST_RIFF_INFO_INAM: type = GST_TAG_TITLE; break; case GST_RIFF_INFO_IPLT: type = NULL; /*"Palette"; */ break; case GST_RIFF_INFO_IPRD: type = GST_TAG_ALBUM; break; case GST_RIFF_INFO_ISBJ: type = GST_TAG_ALBUM_ARTIST; break; case GST_RIFF_INFO_ISFT: type = GST_TAG_ENCODER; break; case GST_RIFF_INFO_ISHP: type = NULL; /*"Sharpness"; */ break; case GST_RIFF_INFO_ISRC: type = GST_TAG_ISRC; break; case GST_RIFF_INFO_ISRF: type = NULL; /*"Source Form"; */ break; case GST_RIFF_INFO_ITCH: type = NULL; /*"Technician"; */ break; case GST_RIFF_INFO_ITRK: type = GST_TAG_TRACK_NUMBER; break; default: type = NULL; GST_WARNING_OBJECT (element, "Unknown INFO (metadata) tag entry %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); break; } if (type != NULL && data[0] != '\0') { static const gchar *env_vars[] = { "GST_AVI_TAG_ENCODING", "GST_RIFF_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; GType tag_type; gchar *val; GST_DEBUG_OBJECT (element, "mapped tag %" GST_FOURCC_FORMAT " to tag %s", GST_FOURCC_ARGS (tag), type); tag_type = gst_tag_get_type (type); val = gst_tag_freeform_string_to_utf8 ((gchar *) data, tsize, env_vars); if (val != NULL) { if (tag_type == G_TYPE_STRING) { gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL); } else { GValue tag_val = { 0, }; g_value_init (&tag_val, tag_type); if (gst_value_deserialize (&tag_val, val)) { gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, type, &tag_val); } else { GST_WARNING_OBJECT (element, "could not deserialize '%s' into a " "tag %s of type %s", val, type, g_type_name (tag_type)); } g_value_unset (&tag_val); } g_free (val); } else { GST_WARNING_OBJECT (element, "could not extract %s tag", type); } } if (tsize & 1) { tsize++; if (tsize > size) tsize = size; } data += tsize; size -= tsize; } if (!gst_tag_list_is_empty (taglist)) { GST_INFO_OBJECT (element, "extracted tags: %" GST_PTR_FORMAT, taglist); *_taglist = taglist; } else { *_taglist = NULL; gst_tag_list_free (taglist); } return; }