From f38882beb1c9b4f3e3c63ac7d65603ad5917cd9d Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Tue, 09 Mar 2010 15:41:33 +0000 Subject: OTHER: Add support for METADATA_BLOCK_PICTURE in Vorbis plugin Bug-Debian: http://bugs.debian.org/565479 --- diff --git a/src/plugins/vorbis_common/common.c b/src/plugins/vorbis_common/common.c index c1f4ef9..fc4ff1b 100644 --- a/src/plugins/vorbis_common/common.c +++ b/src/plugins/vorbis_common/common.c @@ -243,6 +243,74 @@ get_replaygain (xmms_xform_t *xform, vorbis_comment *vc) } } +static void +handle_image_comment (xmms_xform_t *xform, const gchar *value, gsize len) +{ + guint32 typ, mime_len, desc_len, img_len; + guchar *pos, *end, *mime_data, *img_data; + gchar hash[33]; + + pos = value; + end = value + len; + + if (pos + 4 > end) { + XMMS_DBG ("Malformed picture comment"); + return; + } + typ = GUINT32_FROM_BE (*(guint32 *)pos); + if (typ != 0 && typ != 3) { + XMMS_DBG ("Picture type %d not handled", typ); + return; + } + pos += 4; + + if (pos + 4 > end) { + XMMS_DBG ("Malformed picture comment"); + return; + } + mime_len = GUINT32_FROM_BE (*(guint32 *)pos); + pos += 4; + mime_data = pos; + pos += mime_len; + + if (pos + 4 > end) { + XMMS_DBG ("Malformed picture comment"); + return; + } + desc_len = GUINT32_FROM_BE (*(guint32 *)pos); + pos += 4; + pos += desc_len; + + pos += 4; /* width */ + pos += 4; /* height */ + pos += 4; /* depth */ + pos += 4; /* indexed palette length */ + + if (pos + 4 > end) { + XMMS_DBG ("Malformed picture comment"); + return; + } + img_len = GUINT32_FROM_BE (*(guint32 *)pos); + pos += 4; + img_data = pos; + + if (img_data + img_len > end) { + XMMS_DBG ("Malformed picture comment"); + return; + } + + if (xmms_bindata_plugin_add ((const guchar *)img_data, img_len, hash)) { + const gchar *metakey; + + metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT; + xmms_xform_metadata_set_str (xform, metakey, hash); + + metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT_MIME; + mime_data[mime_len] = '\0'; + xmms_xform_metadata_set_str (xform, metakey, mime_data); + } +} + /* note that "key" is NOT NUL-terminated here, * but "value" is. */ @@ -253,6 +321,14 @@ handle_comment (xmms_xform_t *xform, { gint i; + if (!g_ascii_strncasecmp (key, "METADATA_BLOCK_PICTURE", key_len)) { + gsize dlen; + gchar *dvalue = g_base64_decode (value, &dlen); + handle_image_comment (xform, dvalue, dlen); + g_free (dvalue); + return; + } + for (i = 0; i < G_N_ELEMENTS (properties); i++) { if (key_len != strlen (properties[i].vname)) continue; -- cgit v0.8.3.4 From d8273630bd92ecea581240ae93c6795cc538d076 Mon Sep 17 00:00:00 2001 From: Erik Massop Date: Tue, 09 Mar 2010 15:45:03 +0000 Subject: OTHER: Add Brad Jorsch to AUTHORS, disable Vorbis albumart for glib < 2.12 (Name found using e-mail address at http://sourceforge.net/users/anomie ) --- diff --git a/AUTHORS b/AUTHORS index f2ef9af..7331d4b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -146,6 +146,10 @@ N: Johannes Jordan E: ypnos@lanrules.de D: Visualization +N: Brad Jorsch +E: anomie@users.sourceforge.net +D: Support for front picture from Vorbis. + N: Daniel KamiƄski E: maniel.rulez@gmail.com D: mlib remove command in cli, Ruby fixes. diff --git a/src/plugins/vorbis_common/common.c b/src/plugins/vorbis_common/common.c index fc4ff1b..ab1dc75 100644 --- a/src/plugins/vorbis_common/common.c +++ b/src/plugins/vorbis_common/common.c @@ -27,6 +27,7 @@ #include "xmms/xmms_sample.h" #include "xmms/xmms_log.h" #include "xmms/xmms_medialib.h" +#include "xmms/xmms_bindata.h" #include @@ -244,12 +245,22 @@ get_replaygain (xmms_xform_t *xform, vorbis_comment *vc) } static void -handle_image_comment (xmms_xform_t *xform, const gchar *value, gsize len) +handle_image_comment (xmms_xform_t *xform, const gchar *encoded_value) { + gsize len; + guchar *value; + guint32 typ, mime_len, desc_len, img_len; guchar *pos, *end, *mime_data, *img_data; gchar hash[33]; +#if GLIB_CHECK_VERSION(2,12,0) + value = g_base64_decode (encoded_value, &len); +#else + /* TODO: Implement/backport base64 decoding */ + return; +#endif + pos = value; end = value + len; @@ -299,7 +310,7 @@ handle_image_comment (xmms_xform_t *xform, const gchar *value, gsize len) return; } - if (xmms_bindata_plugin_add ((const guchar *)img_data, img_len, hash)) { + if (xmms_bindata_plugin_add (img_data, img_len, hash)) { const gchar *metakey; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT; @@ -307,8 +318,10 @@ handle_image_comment (xmms_xform_t *xform, const gchar *value, gsize len) metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT_MIME; mime_data[mime_len] = '\0'; - xmms_xform_metadata_set_str (xform, metakey, mime_data); + xmms_xform_metadata_set_str (xform, metakey, (gchar *)mime_data); } + + g_free (value); } /* note that "key" is NOT NUL-terminated here, @@ -322,10 +335,7 @@ handle_comment (xmms_xform_t *xform, gint i; if (!g_ascii_strncasecmp (key, "METADATA_BLOCK_PICTURE", key_len)) { - gsize dlen; - gchar *dvalue = g_base64_decode (value, &dlen); - handle_image_comment (xform, dvalue, dlen); - g_free (dvalue); + handle_image_comment (xform, value); return; } -- cgit v0.8.3.4