static void gst_wavparse_tags_foreach (const GstTagList * tags, const gchar * tag, gpointer data) { const struct { guint32 fcc; const gchar *tag; } rifftags[] = { { GST_RIFF_INFO_IARL, GST_TAG_LOCATION}, { GST_RIFF_INFO_IART, GST_TAG_ARTIST}, { GST_RIFF_INFO_ICMT, GST_TAG_COMMENT}, { GST_RIFF_INFO_ICOP, GST_TAG_COPYRIGHT}, { GST_RIFF_INFO_ICRD, GST_TAG_DATE}, { GST_RIFF_INFO_IGNR, GST_TAG_GENRE}, { GST_RIFF_INFO_IKEY, GST_TAG_KEYWORDS}, { GST_RIFF_INFO_INAM, GST_TAG_TITLE}, { GST_RIFF_INFO_IPRD, GST_TAG_ALBUM}, { GST_RIFF_INFO_ISBJ, GST_TAG_ALBUM_ARTIST}, { GST_RIFF_INFO_ISFT, GST_TAG_ENCODER}, { GST_RIFF_INFO_ISRC, GST_TAG_ISRC}, { 0, NULL} }; gint n; gchar *str = NULL; GstByteWriter *bw = data; for (n = 0; rifftags[n].fcc != 0; n++) { if (!strcmp (rifftags[n].tag, tag)) { if (rifftags[n].fcc == GST_RIFF_INFO_ICRD) { GDate *date; /* special case for the date tag */ if (gst_tag_list_get_date (tags, tag, &date)) { str = g_strdup_printf ("%04d:%02d:%02d", g_date_get_year (date), g_date_get_month (date), g_date_get_day (date)); g_date_free (date); } } else { gst_tag_list_get_string (tags, tag, &str); } if (str) { gst_byte_writer_put_uint32_le (bw, rifftags[n].fcc); gst_byte_writer_put_uint32_le (bw, GST_ROUND_UP_2 (strlen (str))); gst_byte_writer_put_string (bw, str); g_free (str); str = NULL; break; } } } }
static void write_exif_ascii_tag (GstExifWriter * writer, guint16 tag, const gchar * str) { gint size; guint32 offset; size = strlen (str) + 1; if (size > 4) { /* we only use the data offset here, later we add up the * resulting tag headers offset and the base offset */ offset = gst_byte_writer_get_size (&writer->datawriter); gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_ASCII, size, offset, FALSE); gst_byte_writer_put_string (&writer->datawriter, str); } else { /* small enough to go in the offset */ memcpy ((guint8 *) & offset, str, size); gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_ASCII, size, offset, TRUE); } }