mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 13:06:23 +00:00
tag: exif: Exif strings should be ascii
Use g_convert to turn all strings into extended ascii before writing to the exif buffer and converting back from ascii to utf8 when reading them.
This commit is contained in:
parent
d0503165c4
commit
cd46e0ca13
1 changed files with 41 additions and 9 deletions
|
@ -781,22 +781,41 @@ write_exif_ascii_tag (GstExifWriter * writer, guint16 tag, const gchar * str)
|
|||
{
|
||||
gint size;
|
||||
guint32 offset = 0;
|
||||
gchar *ascii_str;
|
||||
gsize ascii_size;
|
||||
GError *error = NULL;
|
||||
|
||||
size = strlen (str) + 1;
|
||||
|
||||
if (size > 4) {
|
||||
ascii_str =
|
||||
g_convert (str, size, "latin1", "utf8", NULL, &ascii_size, &error);
|
||||
|
||||
if (error) {
|
||||
GST_WARNING ("Failed to convert exif tag to ascii: 0x%x - %s. Error: %s",
|
||||
tag, str, error->message);
|
||||
g_error_free (error);
|
||||
g_free (ascii_str);
|
||||
return;
|
||||
}
|
||||
|
||||
/* add the \0 at the end */
|
||||
ascii_size++;
|
||||
|
||||
if (ascii_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);
|
||||
ascii_size, offset, FALSE);
|
||||
gst_byte_writer_put_string (&writer->datawriter, ascii_str);
|
||||
} else {
|
||||
/* small enough to go in the offset */
|
||||
memcpy ((guint8 *) & offset, str, size);
|
||||
memcpy ((guint8 *) & offset, ascii_str, ascii_size);
|
||||
gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_ASCII,
|
||||
size, offset, TRUE);
|
||||
ascii_size, offset, TRUE);
|
||||
}
|
||||
|
||||
g_free (ascii_str);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1164,7 +1183,9 @@ parse_exif_ascii_tag (GstExifReader * reader, const GstExifTagMatch * tag,
|
|||
{
|
||||
GType tagtype;
|
||||
gchar *str;
|
||||
gchar *utfstr;
|
||||
guint32 real_offset;
|
||||
GError *error = NULL;
|
||||
|
||||
if (count > 4) {
|
||||
if (offset < reader->base_offset) {
|
||||
|
@ -1187,11 +1208,22 @@ parse_exif_ascii_tag (GstExifReader * reader, const GstExifTagMatch * tag,
|
|||
str = g_strndup ((gchar *) offset_as_data, count);
|
||||
}
|
||||
|
||||
/* convert from ascii to utf8 */
|
||||
utfstr = g_convert (str, count, "utf8", "latin1", NULL, NULL, &error);
|
||||
g_free (str);
|
||||
if (error) {
|
||||
GST_WARNING ("Skipping tag %d:%s. Failed to convert ascii string "
|
||||
"to utf8 : %s - %s", tag->exif_tag, tag->gst_tag, str, error->message);
|
||||
g_error_free (error);
|
||||
g_free (utfstr);
|
||||
return;
|
||||
}
|
||||
|
||||
tagtype = gst_tag_get_type (tag->gst_tag);
|
||||
if (tagtype == GST_TYPE_DATE_TIME) {
|
||||
gint year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0;
|
||||
|
||||
if (sscanf (str, "%04d:%02d:%02d %02d:%02d:%02d", &year, &month, &day,
|
||||
if (sscanf (utfstr, "%04d:%02d:%02d %02d:%02d:%02d", &year, &month, &day,
|
||||
&hour, &minute, &second) > 0) {
|
||||
GstDateTime *d;
|
||||
|
||||
|
@ -1203,13 +1235,13 @@ parse_exif_ascii_tag (GstExifReader * reader, const GstExifTagMatch * tag,
|
|||
GST_WARNING ("Failed to parse %s into a datetime tag", str);
|
||||
}
|
||||
} else if (tagtype == G_TYPE_STRING) {
|
||||
gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE, tag->gst_tag, str,
|
||||
NULL);
|
||||
gst_tag_list_add (reader->taglist, GST_TAG_MERGE_REPLACE, tag->gst_tag,
|
||||
utfstr, NULL);
|
||||
} else {
|
||||
GST_WARNING ("No parsing function associated to %x(%s)", tag->exif_tag,
|
||||
tag->gst_tag);
|
||||
}
|
||||
g_free (str);
|
||||
g_free (utfstr);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue