aboutsummaryrefslogtreecommitdiffstats
path: root/multimedia
diff options
context:
space:
mode:
authormezz <mezz@FreeBSD.org>2006-06-05 11:23:59 +0800
committermezz <mezz@FreeBSD.org>2006-06-05 11:23:59 +0800
commit387a4ac2456d30def5600d41a7f7450d0f04ff29 (patch)
tree9a2ad08989aafa7624191684bcf074aba5a40ab5 /multimedia
parent6b8b8c481e9172d67b10c7081bd70c4dd99a2db9 (diff)
downloadfreebsd-ports-gnome-387a4ac2456d30def5600d41a7f7450d0f04ff29.tar.gz
freebsd-ports-gnome-387a4ac2456d30def5600d41a7f7450d0f04ff29.tar.zst
freebsd-ports-gnome-387a4ac2456d30def5600d41a7f7450d0f04ff29.zip
* gst/id3demux/id3v2frames.c: (find_utf16_bom),
(parse_insert_string_field), (parse_split_strings): Rework string parsing to always walk over BOM markers in UTF16 strings, using the endianness indicated by the innermost one, then trying the opposite endianness if that fails to convert to valid UTF-8. Fixes #341774 Bump the PORTREVISION. PR: ports/98090 Submitted by: Khairil Yusof <kaeru@inigo-tech.com> Obtained from: CVS GNOME Bugzilla: http://bugzilla.gnome.org/show_bug.cgi?id=341774
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/gstreamer-plugins-good/Makefile2
-rw-r--r--multimedia/gstreamer-plugins-good/files/patch-gst_id3demux_id3v2frames.c174
2 files changed, 175 insertions, 1 deletions
diff --git a/multimedia/gstreamer-plugins-good/Makefile b/multimedia/gstreamer-plugins-good/Makefile
index 9cf4d9ab75a3..1adc16ef8e9b 100644
--- a/multimedia/gstreamer-plugins-good/Makefile
+++ b/multimedia/gstreamer-plugins-good/Makefile
@@ -6,7 +6,7 @@
# $MCom: ports/multimedia/gstreamer-plugins-good/Makefile,v 1.5 2006/04/02 07:33:41 marcus Exp $
#
-PORTREVISION= 3
+PORTREVISION= 4
CATEGORIES= multimedia
COMMENT= Good gstreamer-plugins
diff --git a/multimedia/gstreamer-plugins-good/files/patch-gst_id3demux_id3v2frames.c b/multimedia/gstreamer-plugins-good/files/patch-gst_id3demux_id3v2frames.c
new file mode 100644
index 000000000000..acdb3db8c177
--- /dev/null
+++ b/multimedia/gstreamer-plugins-good/files/patch-gst_id3demux_id3v2frames.c
@@ -0,0 +1,174 @@
+diff -u -r1.16 id3v2frames.c
+--- gst/id3demux/id3v2frames.c 10 May 2006 13:51:01 -0000 1.16
++++ gst/id3demux/id3v2frames.c 15 May 2006 09:48:46 -0000
+@@ -667,33 +667,21 @@
+ return result;
+ }
+
+-static void
+-parse_insert_string_field (const gchar * encoding, gchar * data, gint data_size,
+- GArray * fields)
+-{
+- gchar *field;
+-
+- field = g_convert (data, data_size, "UTF-8", encoding, NULL, NULL, NULL);
+- if (field && !g_utf8_validate (field, -1, NULL)) {
+- GST_DEBUG ("%s was bad UTF-8. Ignoring", field);
+- g_free (field);
+- field = NULL;
+- }
+- if (field)
+- g_array_append_val (fields, field);
+-}
++static const gchar utf16enc[] = "UTF-16";
++static const gchar utf16leenc[] = "UTF-16LE";
++static const gchar utf16beenc[] = "UTF-16BE";
+
+ static gboolean
+-has_utf16_bom (gchar * data, const gchar ** p_in_encoding)
++find_utf16_bom (gchar * data, const gchar ** p_in_encoding)
+ {
+ guint16 marker = (GST_READ_UINT8 (data) << 8) | GST_READ_UINT8 (data + 1);
+
+ switch (marker) {
+ case 0xFFFE:
+- *p_in_encoding = "UTF16LE";
++ *p_in_encoding = utf16leenc;
+ return TRUE;
+ case 0xFEFF:
+- *p_in_encoding = "UTF16BE";
++ *p_in_encoding = utf16beenc;
+ return TRUE;
+ default:
+ break;
+@@ -702,6 +690,63 @@
+ }
+
+ static void
++parse_insert_string_field (guint8 encoding, gchar * data, gint data_size,
++ GArray * fields)
++{
++ gchar *field = NULL;
++
++ switch (encoding) {
++ case ID3V2_ENCODING_UTF16:
++ case ID3V2_ENCODING_UTF16BE:
++ {
++ const gchar *in_encode;
++
++ if (encoding == ID3V2_ENCODING_UTF16)
++ in_encode = utf16enc;
++ else
++ in_encode = utf16beenc;
++
++ /* Sometimes we see strings with multiple BOM markers at the start.
++ * In that case, we assume the innermost one is correct. If that fails
++ * to produce valid UTF-8, we try the other endianness anyway */
++ while (data_size > 2 && find_utf16_bom (data, &in_encode)) {
++ data += 2; /* skip BOM */
++ data_size -= 2;
++ }
++
++ field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
++
++ if (field == NULL || g_utf8_validate (field, -1, NULL) == FALSE) {
++ /* As a fallback, try interpreting UTF-16 in the other endianness */
++ if (in_encode == utf16beenc)
++ field = g_convert (data, data_size, "UTF-8", utf16leenc,
++ NULL, NULL, NULL);
++ }
++ }
++
++ break;
++ case ID3V2_ENCODING_ISO8859:
++ field = g_convert (data, data_size, "UTF-8", "ISO-8859-1",
++ NULL, NULL, NULL);
++ break;
++ default:
++ field = g_strndup (data, data_size);
++ break;
++ }
++
++ if (field) {
++ if (g_utf8_validate (field, -1, NULL)) {
++ g_array_append_val (fields, field);
++ return;
++ }
++
++ GST_DEBUG ("%s was bad UTF-8 after conversion from encoding %d. Ignoring",
++ field, encoding);
++ g_free (field);
++ }
++}
++
++static void
+ parse_split_strings (guint8 encoding, gchar * data, gint data_size,
+ GArray ** out_fields)
+ {
+@@ -715,13 +760,13 @@
+ case ID3V2_ENCODING_ISO8859:
+ for (text_pos = 0; text_pos < data_size; text_pos++) {
+ if (data[text_pos] == 0) {
+- parse_insert_string_field ("ISO-8859-1", data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 1, fields);
+ prev = text_pos + 1;
+ }
+ }
+ if (data_size - prev > 0 && data[prev] != 0x00) {
+- parse_insert_string_field ("ISO-8859-1", data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+
+@@ -729,34 +774,24 @@
+ case ID3V2_ENCODING_UTF8:
+ for (prev = 0, text_pos = 0; text_pos < data_size; text_pos++) {
+ if (data[text_pos] == '\0') {
+- parse_insert_string_field ("UTF-8", data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 1, fields);
+ prev = text_pos + 1;
+ }
+ }
+ if (data_size - prev > 0 && data[prev] != 0x00) {
+- parse_insert_string_field ("UTF-8", data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+ break;
+ case ID3V2_ENCODING_UTF16:
+ case ID3V2_ENCODING_UTF16BE:
+ {
+- const gchar *in_encode;
+-
+- if (encoding == ID3V2_ENCODING_UTF16)
+- in_encode = "UTF-16";
+- else
+- in_encode = "UTF-16BE";
+-
+ /* Find '\0\0' terminator */
+ for (text_pos = 0; text_pos < data_size - 1; text_pos += 2) {
+ if (data[text_pos] == '\0' && data[text_pos + 1] == '\0') {
+- if (has_utf16_bom (data + prev, &in_encode)) {
+- prev += 2; /* skip BOM */
+- }
+ /* found a delimiter */
+- parse_insert_string_field (in_encode, data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ text_pos - prev + 2, fields);
+ text_pos++; /* Advance to the 2nd NULL terminator */
+ prev = text_pos + 1;
+@@ -765,11 +800,8 @@
+ }
+ if (data_size - prev > 1 &&
+ (data[prev] != 0x00 || data[prev + 1] != 0x00)) {
+- if (has_utf16_bom (data + prev, &in_encode)) {
+- prev += 2; /* skip BOM */
+- }
+ /* There were 2 or more non-null chars left, convert those too */
+- parse_insert_string_field (in_encode, data + prev,
++ parse_insert_string_field (encoding, data + prev,
+ data_size - prev, fields);
+ }
+ break;