diff options
author | Jeremy Messenger <mezz@FreeBSD.org> | 2006-06-05 03:23:59 +0000 |
---|---|---|
committer | Jeremy Messenger <mezz@FreeBSD.org> | 2006-06-05 03:23:59 +0000 |
commit | d87fe96dc94352df0d556ae7dcab89ff058a1372 (patch) | |
tree | 18363b72fe832b8b5b1715e7320ad2ebb9fc3d88 /multimedia | |
parent | e663e754eea6fd99344edcbb5cc06c1d84b1216d (diff) | |
download | ports-d87fe96dc94352df0d556ae7dcab89ff058a1372.tar.gz ports-d87fe96dc94352df0d556ae7dcab89ff058a1372.zip |
Notes
Diffstat (limited to 'multimedia')
-rw-r--r-- | multimedia/gstreamer-plugins-good/Makefile | 2 | ||||
-rw-r--r-- | multimedia/gstreamer-plugins-good/files/patch-gst_id3demux_id3v2frames.c | 174 |
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; |