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<CdsItem> item)
 {
     String value;
-    char*  mp4_retval = NULL;
-    u_int16_t track;
-    u_int16_t total_tracks;
- 
     Ref<StringConverter> 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<CdsResource> 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<IOHandler> 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<IOHandler> 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
