Ticket #36282: mediatomb-0.12.1-libmp4v2_191_p479.patch

File mediatomb-0.12.1-libmp4v2_191_p479.patch, 5.8 KB (added by mfourtytwoi@…, 4 years ago)

Patch for using libmp4v2 1.9.1 p479

  • src/metadata/libmp4v2_handler.cc

    diff -urN old/src/metadata/libmp4v2_handler.cc new/src/metadata/libmp4v2_handler.cc
    old new  
    6565static void addMetaField(metadata_fields_t field, MP4FileHandle mp4, Ref<CdsItem> item)
    6666{
    6767    String value;
    68     char*  mp4_retval = NULL;
    69     u_int16_t track;
    70     u_int16_t total_tracks;
    71  
    7268    Ref<StringConverter> sc = StringConverter::i2i();
    7369   
     70    const MP4Tags* new_tags = MP4TagsAlloc();
     71
     72    if (!MP4TagsFetch(new_tags, mp4))
     73        return;
     74
    7475    switch (field)
    7576    {
    7677        case M_TITLE:
    77             MP4GetMetadataName(mp4, &mp4_retval);
     78            value = new_tags->name;
    7879            break;
    7980        case M_ARTIST:
    80             MP4GetMetadataArtist(mp4, &mp4_retval);
     81            value = new_tags->artist;
    8182            break;
    8283        case M_ALBUM:
    83             MP4GetMetadataAlbum(mp4, &mp4_retval);
     84            value = new_tags->album;
    8485            break;
    8586        case M_DATE:
    86             MP4GetMetadataYear(mp4, &mp4_retval);
    87             if (mp4_retval)
     87            value = new_tags->releaseDate;
     88            if (value.length() > 0)
    8889            {
    89                 value = mp4_retval;
    90                 free(mp4_retval);
    9190                if (string_ok(value))
    9291                    value = value + "-01-01";
    9392                else
     
    9594            }
    9695            break;
    9796        case M_GENRE:
    98             MP4GetMetadataGenre(mp4, &mp4_retval);
     97            value = new_tags->genre;
    9998            break;
    10099        case M_DESCRIPTION:
    101             MP4GetMetadataComment(mp4, &mp4_retval);
     100            value = new_tags->comments;
    102101            break;
    103102        case M_TRACKNUMBER:
    104             MP4GetMetadataTrack(mp4, &track, &total_tracks);
    105             if (track > 0)
     103            if (new_tags->track)
    106104            {
    107                 value = String::from(track);
    108                 item->setTrackNumber((int)track);
     105                value = String::from(new_tags->track->index);
     106                item->setTrackNumber((int)new_tags->track->index);
    109107            }
    110108            else
     109                        {
     110                            MP4TagsFree( new_tags );
    111111                return;
     112            }
    112113            break;
    113114        default:
     115                        MP4TagsFree( new_tags );
    114116            return;
    115117    }
    116118
    117     if ((field != M_DATE) && (field != M_TRACKNUMBER) &&
    118         (mp4_retval))
    119     {
    120         value = mp4_retval;
    121         free(mp4_retval);
    122     }
    123    
     119        MP4TagsFree( new_tags );
    124120    value = trim_string(value);
    125    
     121
    126122    if (string_ok(value))
    127123    {
    128124        item->setMetadata(MT_KEYS[field].upnp, sc->convert(value));
     
    190186        }
    191187
    192188#if defined(HAVE_MAGIC)
    193         u_int8_t *art_data;
    194         u_int32_t art_data_len;
     189        void *art_data = 0;
     190        u_int32_t art_data_len = 0;
    195191        String art_mimetype;
     192
     193        const MP4Tags* new_tags = MP4TagsAlloc();
     194        MP4TagsFetch(new_tags, mp4);
     195        if (new_tags->artworkCount)
     196        {
     197            art_data = new_tags->artwork->data;
     198            art_data_len = new_tags->artwork->size;
     199        }
    196200#ifdef HAVE_MP4_GET_METADATA_COVER_ART_COUNT
    197         if (MP4GetMetadataCoverArtCount(mp4) &&
    198             MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len))
    199 #else
    200             MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len);
     201        if (new_tags->artworkCount && art_data_len > 0)
    201202#endif
    202203        {
    203204            if (art_data)
     
    211212                }
    212213                catch (Exception ex)
    213214                {
    214                     free(art_data);
     215                    MP4TagsFree(new_tags);
    215216                    throw ex;
    216217                }
    217218
    218                 free(art_data);
    219219                if (art_mimetype != _(MIMETYPE_DEFAULT))
    220220                {
    221221                    Ref<CdsResource> resource(new CdsResource(CH_MP4));
     
    225225                }
    226226            }
    227227        }
     228        MP4TagsFree(new_tags);
    228229#endif
    229230        MP4Close(mp4);
    230231    }
     
    249250
    250251    if (ctype != ID3_ALBUM_ART)
    251252        throw _Exception(_("LibMP4V2Handler: got unknown content type: ") + ctype);
     253
     254    const MP4Tags* new_tags = MP4TagsAlloc();
     255    if (MP4TagsFetch(new_tags, mp4))
     256    {
    252257#ifdef HAVE_MP4_GET_METADATA_COVER_ART_COUNT
    253     if (!MP4GetMetadataCoverArtCount(mp4))
    254         throw _Exception(_("LibMP4V2Handler: resource has no album art information"));
     258        if (!new_tags->artworkCount)
     259            throw _Exception(_("LibMP4V2Handler: resource has no album art information"));
    255260#endif
    256     u_int8_t *art_data;
    257     u_int32_t art_data_len;
    258     if (MP4GetMetadataCoverArt(mp4, &art_data, &art_data_len))
    259     {
    260         if (art_data)
     261        void *art_data = 0;
     262        u_int32_t art_data_len;
     263
     264        const MP4TagArtwork* art = new_tags->artwork;
     265        art_data = art->data;
     266        art_data_len = art->size;
     267        if (art)
    261268        {
    262             *data_size = (off_t)art_data_len;
    263             Ref<IOHandler> h(new MemIOHandler((void *)art_data, art_data_len));
    264             free(art_data);
    265             return h;
     269            if (art_data)
     270            {
     271                *data_size = (off_t)art_data_len;
     272                Ref<IOHandler> h(new MemIOHandler(art_data, art_data_len));
     273                MP4TagsFree(new_tags);
     274                return h;
     275            }
    266276        }
     277        MP4TagsFree(new_tags);
    267278    }
    268        
    269279    throw _Exception(_("LibMP4V2Handler: could not serve album art "
    270                            "for file") + item->getLocation() +
    271                            " - embedded image not found");
     280            "for file") + item->getLocation() +
     281        " - embedded image not found");
    272282}
    273283
    274284#endif // HAVE_LIBMP4V2