aboutsummaryrefslogtreecommitdiff
path: root/multimedia
diff options
context:
space:
mode:
authorJeremy Messenger <mezz@FreeBSD.org>2006-06-05 03:23:59 +0000
committerJeremy Messenger <mezz@FreeBSD.org>2006-06-05 03:23:59 +0000
commitd87fe96dc94352df0d556ae7dcab89ff058a1372 (patch)
tree18363b72fe832b8b5b1715e7320ad2ebb9fc3d88 /multimedia
parente663e754eea6fd99344edcbb5cc06c1d84b1216d (diff)
downloadports-d87fe96dc94352df0d556ae7dcab89ff058a1372.tar.gz
ports-d87fe96dc94352df0d556ae7dcab89ff058a1372.zip
Notes
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;