/** * Read meta information from APE tags * @param tag: the APE tag * @param p_demux_meta: the demuxer meta * @param p_meta: the meta */ static void ReadMetaFromAPE( APE::Tag* tag, demux_meta_t* p_demux_meta, vlc_meta_t* p_meta ) { APE::ItemListMap fields ( tag->itemListMap() ); APE::ItemListMap::Iterator iter; iter = fields.find("COVER ART (FRONT)"); if( iter != fields.end() && !iter->second.isEmpty() && iter->second.type() == APE::Item::Binary) { input_attachment_t *p_attachment; const ByteVector picture = iter->second.binaryData(); const char *p_data = picture.data(); unsigned i_data = picture.size(); /* Null terminated filename followed by the image data */ size_t desc_len = strnlen(p_data, i_data); if( desc_len < i_data && IsUTF8( p_data ) ) { const char *psz_name = p_data; const char *psz_mime = vlc_mime_Ext2Mime( psz_name ); p_data += desc_len + 1; /* '\0' */ i_data -= desc_len + 1; msg_Dbg( p_demux_meta, "Found embedded art: %s (%s) is %u bytes", psz_name, psz_mime, i_data ); p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_name, p_data, i_data ); if( p_attachment ) { TAB_APPEND_CAST( (input_attachment_t**), p_demux_meta->i_attachments, p_demux_meta->attachments, p_attachment ); char *psz_url; if( asprintf( &psz_url, "attachment://%s", p_attachment->psz_name ) != -1 ) { vlc_meta_SetArtURL( p_meta, psz_url ); free( psz_url ); } } } fields.erase(iter); }