File xmms2-0.7-vorbis-picture-support.patch of Package xmms2
Description: Add support for METADATA_BLOCK_PICTURE in Vorbis plugin
Bug-Debian: http://bugs.debian.org/565479
Author: anomie@users.sourceforge.net
Forwarded: no
Index: debian.git/src/plugins/vorbis_common/common.c
===================================================================
--- debian.git.orig/src/plugins/vorbis_common/common.c 2010-02-20 13:02:52.314149734 +0100
+++ debian.git/src/plugins/vorbis_common/common.c 2010-02-20 13:03:10.212899779 +0100
@@ -243,6 +243,74 @@
}
}
+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 @@
{
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 ((!g_ascii_strncasecmp (key, "MUSICBRAINZ_ALBUMARTISTID", key_len)) &&
(!g_ascii_strcasecmp (value, MUSICBRAINZ_VA_ID))) {