diff -urN old/src/metadata/libmp4v2_handler.cc new/src/metadata/libmp4v2_handler.cc --- old/src/metadata/libmp4v2_handler.cc 2012-04-05 01:46:26.000000000 +0200 +++ new/src/metadata/libmp4v2_handler.cc 2012-04-05 02:01:24.000000000 +0200 @@ -65,29 +65,28 @@ static void addMetaField(metadata_fields_t field, MP4FileHandle mp4, Ref item) { String value; - char* mp4_retval = NULL; - u_int16_t track; - u_int16_t total_tracks; - Ref sc = StringConverter::i2i(); + const MP4Tags* new_tags = MP4TagsAlloc(); + + if (!MP4TagsFetch(new_tags, mp4)) + return; + switch (field) { case M_TITLE: - MP4GetMetadataName(mp4, &mp4_retval); + value = new_tags->name; break; case M_ARTIST: - MP4GetMetadataArtist(mp4, &mp4_retval); + value = new_tags->artist; break; case M_ALBUM: - MP4GetMetadataAlbum(mp4, &mp4_retval); + value = new_tags->album; break; case M_DATE: - MP4GetMetadataYear(mp4, &mp4_retval); - if (mp4_retval) + value = new_tags->releaseDate; + if (value.length() > 0) { - value = mp4_retval; - free(mp4_retval); if (string_ok(value)) value = value + "-01-01"; else @@ -95,34 +94,31 @@ } break; case M_GENRE: - MP4GetMetadataGenre(mp4, &mp4_retval); + value = new_tags->genre; break; case M_DESCRIPTION: - MP4GetMetadataComment(mp4, &mp4_retval); + value = new_tags->comments; break; case M_TRACKNUMBER: - MP4GetMetadataTrack(mp4, &track, &total_tracks); - if (track > 0) + if (new_tags->track) { - value = String::from(track); - item->setTrackNumber((int)track); + value = String::from(new_tags->track->index); + item->setTrackNumber((int)new_tags->track->index); } else + { + MP4TagsFree( new_tags ); return; + } break; default: + MP4TagsFree( new_tags ); return; } - if ((field != M_DATE) && (field != M_TRACKNUMBER) && - (mp4_retval)) - { - value = mp4_retval; - free(mp4_retval); - } - + MP4TagsFree( new_tags ); value = trim_string(value); - + if (string_ok(value)) { item->setMetadata(MT_KEYS[field].upnp, sc->convert(value)); @@ -190,14 +186,19 @@ } #if defined(HAVE_MAGIC) - u_int8_t *art_data; - u_int32_t art_data_len; + void *art_data = 0; + u_int32_t art_data_len = 0; String art_mimetype; + + const MP4Tags* new_tags = MP4TagsAlloc(); + MP4TagsFetch(new_tags, mp4); + if (new_tags->artworkCount) + { + art_data = new_tags->artwork->data; + art_data_len = new_tags->artwork->size; + } #ifdef HAVE_MP4_GET_METADATA_COVER_ART_COUNT - if (MP4GetMetadataCoverArtCount(mp4) && - MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len)) -#else - MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len); + if (new_tags->artworkCount && art_data_len > 0) #endif { if (art_data) @@ -211,11 +212,10 @@ } catch (Exception ex) { - free(art_data); + MP4TagsFree(new_tags); throw ex; } - free(art_data); if (art_mimetype != _(MIMETYPE_DEFAULT)) { Ref resource(new CdsResource(CH_MP4)); @@ -225,6 +225,7 @@ } } } + MP4TagsFree(new_tags); #endif MP4Close(mp4); } @@ -249,26 +250,35 @@ if (ctype != ID3_ALBUM_ART) throw _Exception(_("LibMP4V2Handler: got unknown content type: ") + ctype); + + const MP4Tags* new_tags = MP4TagsAlloc(); + if (MP4TagsFetch(new_tags, mp4)) + { #ifdef HAVE_MP4_GET_METADATA_COVER_ART_COUNT - if (!MP4GetMetadataCoverArtCount(mp4)) - throw _Exception(_("LibMP4V2Handler: resource has no album art information")); + if (!new_tags->artworkCount) + throw _Exception(_("LibMP4V2Handler: resource has no album art information")); #endif - u_int8_t *art_data; - u_int32_t art_data_len; - if (MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len)) - { - if (art_data) + void *art_data = 0; + u_int32_t art_data_len; + + const MP4TagArtwork* art = new_tags->artwork; + art_data = art->data; + art_data_len = art->size; + if (art) { - *data_size = (off_t)art_data_len; - Ref h(new MemIOHandler((void *)art_data, art_data_len)); - free(art_data); - return h; + if (art_data) + { + *data_size = (off_t)art_data_len; + Ref h(new MemIOHandler(art_data, art_data_len)); + MP4TagsFree(new_tags); + return h; + } } + MP4TagsFree(new_tags); } - throw _Exception(_("LibMP4V2Handler: could not serve album art " - "for file") + item->getLocation() + - " - embedded image not found"); + "for file") + item->getLocation() + + " - embedded image not found"); } #endif // HAVE_LIBMP4V2 De binära filerna old/src/metadata/.libmp4v2_handler.cc.swp och new/src/metadata/.libmp4v2_handler.cc.swp skiljer