gst-libs/gst/riff/riff-read.c: If strings in INFO chunk are not UTF-8, do something similar to what we do for ID3v1 t...
Original commit message from CVS: * gst-libs/gst/riff/riff-read.c: (freeform_string_to_utf8), (gst_riff_parse_info): If strings in INFO chunk are not UTF-8, do something similar to what we do for ID3v1 tags: check a number of environment variables (GST_AVI_TAG_ENCODING, GST_RIFF_TAG_ENCODING, GST_TAG_ENCODING) for character sets to try, otherwise try the current locale and/or fall back on ISO-8859-1. Fixes #360552.
This commit is contained in:
parent
443dfa5857
commit
cc156bc97c
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2006-10-26 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
|
* gst-libs/gst/riff/riff-read.c: (freeform_string_to_utf8),
|
||||||
|
(gst_riff_parse_info):
|
||||||
|
If strings in INFO chunk are not UTF-8, do something similar to
|
||||||
|
what we do for ID3v1 tags: check a number of environment variables
|
||||||
|
(GST_AVI_TAG_ENCODING, GST_RIFF_TAG_ENCODING, GST_TAG_ENCODING) for
|
||||||
|
character sets to try, otherwise try the current locale and/or fall
|
||||||
|
back on ISO-8859-1. Fixes #360552.
|
||||||
|
|
||||||
2006-10-23 Tim-Philipp Müller <tim at centricular dot net>
|
2006-10-23 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* gst/videotestsrc/gstvideotestsrc.c:
|
* gst/videotestsrc/gstvideotestsrc.c:
|
||||||
|
@ -577,6 +577,78 @@ too_small:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
freeform_string_to_utf8 (const gchar * data, gint size, const gchar ** env_vars)
|
||||||
|
{
|
||||||
|
const gchar *env = NULL;
|
||||||
|
gsize bytes_read;
|
||||||
|
gchar *utf8 = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (data != NULL, NULL);
|
||||||
|
|
||||||
|
if (size < 0)
|
||||||
|
size = strlen (data);
|
||||||
|
|
||||||
|
/* Should we try the charsets specified
|
||||||
|
* via environment variables FIRST ? */
|
||||||
|
if (g_utf8_validate (data, size, NULL))
|
||||||
|
return g_strndup (data, size);
|
||||||
|
|
||||||
|
while ((env == NULL || *env == '\0') && env_vars && *env_vars != NULL) {
|
||||||
|
env = g_getenv (*env_vars);
|
||||||
|
++env_vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try charsets specified via the environment */
|
||||||
|
if (env != NULL && *env != '\0') {
|
||||||
|
gchar **c, **csets;
|
||||||
|
|
||||||
|
csets = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, -1);
|
||||||
|
|
||||||
|
for (c = csets; c && *c; ++c) {
|
||||||
|
if ((utf8 = g_convert (data, size, "UTF-8", *c, &bytes_read, NULL, NULL))) {
|
||||||
|
if (bytes_read == size) {
|
||||||
|
g_strfreev (csets);
|
||||||
|
goto beach;
|
||||||
|
}
|
||||||
|
g_free (utf8);
|
||||||
|
utf8 = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (csets);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try current locale (if not UTF-8) */
|
||||||
|
if (!g_get_charset (&env)) {
|
||||||
|
if ((utf8 = g_locale_to_utf8 (data, size, &bytes_read, NULL, NULL))) {
|
||||||
|
if (bytes_read == size) {
|
||||||
|
goto beach;
|
||||||
|
}
|
||||||
|
g_free (utf8);
|
||||||
|
utf8 = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try ISO-8859-1 */
|
||||||
|
utf8 = g_convert (data, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
|
||||||
|
if (utf8 != NULL && bytes_read == size) {
|
||||||
|
goto beach;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (utf8);
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
beach:
|
||||||
|
|
||||||
|
g_strchomp (utf8);
|
||||||
|
if (utf8 && utf8[0] != '\0')
|
||||||
|
return utf8;
|
||||||
|
|
||||||
|
g_free (utf8);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_riff_parse_info:
|
* gst_riff_parse_info:
|
||||||
* @element: caller element (used for debugging/error).
|
* @element: caller element (used for debugging/error).
|
||||||
@ -595,9 +667,7 @@ gst_riff_parse_info (GstElement * element,
|
|||||||
guint size, tsize;
|
guint size, tsize;
|
||||||
guint32 tag;
|
guint32 tag;
|
||||||
const gchar *type;
|
const gchar *type;
|
||||||
gchar *name;
|
|
||||||
GstTagList *taglist;
|
GstTagList *taglist;
|
||||||
gboolean have_tags = FALSE;
|
|
||||||
|
|
||||||
g_return_if_fail (_taglist != NULL);
|
g_return_if_fail (_taglist != NULL);
|
||||||
g_return_if_fail (buf != NULL);
|
g_return_if_fail (buf != NULL);
|
||||||
@ -700,17 +770,19 @@ gst_riff_parse_info (GstElement * element,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type) {
|
if (type != NULL && data[0] != '\0') {
|
||||||
if (data[0] != '\0') {
|
static const gchar *env_vars[] = { "GST_AVI_TAG_ENCODING",
|
||||||
/* read, NULL-terminate */
|
"GST_RIFF_TAG_ENCODING", "GST_TAG_ENCODING", NULL
|
||||||
name = g_new (gchar, tsize + 1);
|
};
|
||||||
name[tsize] = '\0';
|
gchar *val;
|
||||||
memcpy (name, data, tsize);
|
|
||||||
|
|
||||||
/* add to list */
|
val = freeform_string_to_utf8 ((gchar *) data, tsize, env_vars);
|
||||||
have_tags = TRUE;
|
|
||||||
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, name, NULL);
|
if (val) {
|
||||||
g_free (name);
|
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL);
|
||||||
|
g_free (val);
|
||||||
|
} else {
|
||||||
|
GST_WARNING_OBJECT (element, "could not extract %s tag", type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -718,7 +790,7 @@ gst_riff_parse_info (GstElement * element,
|
|||||||
size -= tsize;
|
size -= tsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (have_tags) {
|
if (!gst_tag_list_is_empty (taglist)) {
|
||||||
*_taglist = taglist;
|
*_taglist = taglist;
|
||||||
} else {
|
} else {
|
||||||
*_taglist = NULL;
|
*_taglist = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user