Ticket #41229: easytag-2.1.7-mp4v2-build.patch

File easytag-2.1.7-mp4v2-build.patch, 15.5 KB (added by promac@…, 11 years ago)

Patch for using mp4v2 2.0 with easy tag 2.1.7

  • src/mp4_header.c

    diff -uNr easytag-2.1.7/src/mp4_header.c easytag-2.1.7-mp4v2-build/src/mp4_header.c
    old new  
    204204    /* Get size of file */
    205205    ETFileInfo->size = Get_File_Size(filename);
    206206
    207     if ((file = MP4Read(filename, 0)) == MP4_INVALID_FILE_HANDLE )
     207    if ((file = MP4Read(filename)) == MP4_INVALID_FILE_HANDLE )
    208208    {
    209209        gchar *filename_utf8 = filename_to_display(filename);
    210210        //g_print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno));
     
    218218    {
    219219        gchar *filename_utf8 = filename_to_display(filename);
    220220        Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,("Contains no audio track"));
    221         MP4Close(file);
     221        MP4Close(file, 0);
    222222        g_free(filename_utf8);
    223223        return FALSE;
    224224    }
     
    243243    ETFileInfo->mode = MP4GetTrackAudioChannels(file, trackId);
    244244    ETFileInfo->duration = MP4ConvertFromTrackDuration(file, trackId, MP4GetTrackDuration(file, trackId), MP4_SECS_TIME_SCALE);
    245245
    246     MP4Close(file);
     246    MP4Close(file, 0);
    247247    return TRUE;
    248248}
    249249
  • src/mp4_tag.c

    diff -uNr easytag-2.1.7/src/mp4_tag.c easytag-2.1.7-mp4v2-build/src/mp4_tag.c
    old new  
    7272 *
    7373 * Read tag data into an Mp4 file.
    7474 *
     75 * cf. http://mp4v2.googlecode.com/svn/doc/1.9.0/api/example_2itmf_2tags_8c-example.html
     76 *
    7577 * Note:
    7678 *  - for string fields, //if field is found but contains no info (strlen(str)==0), we don't read it
    7779 *  - for track numbers, if they are zero, then we don't read it
     
    8082{
    8183    FILE   *file;
    8284    MP4FileHandle mp4file = NULL;
     85    const MP4Tags *mp4tags = NULL;
    8386    uint16_t track, track_total;
    8487    uint16_t disk, disktotal;
    85     u_int8_t *coverArt;
    86     u_int32_t coverSize;
    8788    Picture *prev_pic = NULL;
    88 #ifdef NEWMP4
    89     gint pic_num;
    90 #endif
     89    int pic_num;
     90    const MP4TagArtwork *mp4artwork = NULL;
    9191   
    9292    if (!filename || !FileTag)
    9393        return FALSE;
     
    102102    fclose(file); // We close it cause mp4 opens/closes file itself
    103103
    104104    /* Get data from tag */
    105     mp4file = MP4Read(filename, 0);
     105    mp4file = MP4Read(filename);
    106106    if (mp4file == MP4_INVALID_FILE_HANDLE)
    107107    {
    108108        gchar *filename_utf8 = filename_to_display(filename);
     
    111111        return FALSE;
    112112    }
    113113
     114    mp4tags = MP4TagsAlloc();
     115    if (!MP4TagsFetch(mp4tags, mp4file))
     116    {
     117        gchar *filename_utf8 = filename_to_display(filename);
     118        Log_Print(LOG_ERROR,_("ERROR reading tags from file: '%s' (%s)."),filename_utf8,_("MP4 format invalid"));
     119        g_free(filename_utf8);
     120        return FALSE;
     121    }
     122
    114123    /* TODO Add error detection */
    115124
    116125    /*********
    117126     * Title *
    118127     *********/
    119     MP4GetMetadataName(mp4file, &FileTag->title);
     128    if (mp4tags->name)
     129        FileTag->title = g_strdup(mp4tags->name);
    120130
    121131    /**********
    122132     * Artist *
    123133     **********/
    124     MP4GetMetadataArtist(mp4file, &FileTag->artist);
     134    if (mp4tags->artist)
     135        FileTag->artist = g_strdup(mp4tags->artist);
    125136
    126137    /*********
    127138     * Album *
    128139     *********/
    129     MP4GetMetadataAlbum(mp4file, &FileTag->album);
     140    if (mp4tags->album)
     141        FileTag->album = g_strdup(mp4tags->album);
     142
     143    /****************
     144     * Album Artist *
     145     ****************/
     146    if (mp4tags->albumArtist)
     147        FileTag->album_artist = g_strdup(mp4tags->albumArtist);
    130148
    131149    /**********************
    132150     * Disk / Total Disks *
    133151     **********************/
    134     if (MP4GetMetadataDisk(mp4file, &disk, &disktotal))
     152    if (mp4tags->disk)
    135153    {
     154        disk = mp4tags->disk->index, disktotal = mp4tags->disk->total;
    136155        if (disk != 0 && disktotal != 0)
    137156            FileTag->disc_number = g_strdup_printf("%d/%d",(gint)disk,(gint)disktotal);
    138157        else if (disk != 0)
     
    146165    /********
    147166     * Year *
    148167     ********/
    149     MP4GetMetadataYear(mp4file, &FileTag->year);
     168    if (mp4tags->releaseDate)
     169        FileTag->year = g_strdup(mp4tags->releaseDate);
    150170
    151171    /*************************
    152172     * Track and Total Track *
    153173     *************************/
    154     if (MP4GetMetadataTrack(mp4file, &track, &track_total))
     174    if (mp4tags->track)
    155175    {
     176
     177        track = mp4tags->track->index, track_total = mp4tags->track->total;
    156178        if (track != 0)
    157             FileTag->track = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track); // Just to have numbers like this : '01', '05', '12', ...
     179            FileTag->track = NUMBER_TRACK_FORMATED ? g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track) : g_strdup_printf("%d",(gint)track);
    158180        if (track_total != 0)
    159             FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track_total); // Just to have numbers like this : '01', '05', '12', ...
     181            FileTag->track_total = NUMBER_TRACK_FORMATED ? g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track_total) : g_strdup_printf("%d",(gint)track_total);
    160182    }
    161183
    162184    /*********
    163185     * Genre *
    164186     *********/
    165     MP4GetMetadataGenre(mp4file, &FileTag->genre);
     187    if (mp4tags->genre)
     188        FileTag->genre = g_strdup(mp4tags->genre);
    166189
    167190    /***********
    168191     * Comment *
    169192     ***********/
    170     MP4GetMetadataComment(mp4file, &FileTag->comment);
     193    if (mp4tags->comments)
     194        FileTag->comment = g_strdup(mp4tags->comments);
    171195
    172196    /**********************
    173197     * Composer or Writer *
    174198     **********************/
    175     MP4GetMetadataWriter(mp4file, &FileTag->composer);
     199    if (mp4tags->composer)
     200        FileTag->composer = g_strdup(mp4tags->composer);
    176201
    177202    /*****************
    178203     * Encoding Tool *
    179204     *****************/
    180     MP4GetMetadataTool(mp4file, &FileTag->encoded_by);
     205    if (mp4tags->encodedBy)
     206        FileTag->encoded_by = g_strdup(mp4tags->encodedBy);
    181207
    182208    /* Unimplemented
    183209    Tempo / BPM
     
    187213    /***********
    188214     * Picture *
    189215     ***********/
    190 #ifdef NEWMP4
    191     // There version can handle multiple pictures!
    192     // Version 1.6 of libmp4v2 introduces an index argument for MP4GetMetadataCoverart
    193     for (pic_num = 0; (MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize,pic_num )); pic_num++)
    194 #else
    195     // There version handle only one picture!
    196     if ( MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize ) )
    197 #endif
     216    // Version 1.9.1 of mp4v2 and up handle multiple cover art
     217    mp4artwork = mp4tags->artwork;
     218    for (pic_num = 0; pic_num < mp4tags->artworkCount; ++pic_num, ++mp4artwork)
    198219    {
    199220        Picture *pic;
    200221       
     
    205226            prev_pic->next = pic;
    206227        prev_pic = pic;
    207228
    208         pic->size = coverSize;
    209         pic->data = coverArt;
    210         pic->type = PICTURE_TYPE_FRONT_COVER;
     229        pic->size = mp4artwork->size;
     230        pic->data = g_memdup(mp4artwork->data, pic->size);
     231        pic->type = PICTURE_TYPE_FRONT_COVER;/* mp4artwork->type gives image type */
    211232        pic->description = NULL;
    212233    }
    213234
    214235
    215236    /* Free allocated data */
    216     MP4Close(mp4file);
     237    MP4TagsFree(mp4tags);
     238    MP4Close(mp4file, 0);
    217239
    218240    return TRUE;
    219241}
     
    234256    gchar    *filename_utf8;
    235257    FILE     *file;
    236258    MP4FileHandle mp4file = NULL;
     259    const MP4Tags *mp4tags = NULL;
     260    MP4TagDisk mp4disk;
     261    MP4TagTrack mp4track;
     262    MP4TagArtwork mp4artwork;
    237263    gint error = 0;
    238264
     265    /* extra initializers */
     266    mp4disk.index  = 0;
     267    mp4disk.total  = 0;
     268    mp4track.index = 0;
     269    mp4track.total = 0;
     270
    239271    if (!ETFile || !ETFile->FileTag)
    240272        return FALSE;
    241273
     
    252284    fclose(file);
    253285
    254286    /* Open file for writing */
    255     mp4file = MP4Modify(filename,0,0);
     287    mp4file = MP4Modify(filename, 0);
    256288    if (mp4file == MP4_INVALID_FILE_HANDLE)
    257289    {
    258290        Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid"));
    259291        return FALSE;
    260292    }
    261293
     294    mp4tags = MP4TagsAlloc();
     295    if (!MP4TagsFetch(mp4tags, mp4file))
     296    {
     297        Log_Print(LOG_ERROR,_("ERROR reading tags from file: '%s' (%s)."),filename_utf8,_("MP4 format invalid"));
     298        return FALSE;
     299    }
     300
    262301    /*********
    263302     * Title *
    264303     *********/
    265304    if (FileTag->title && g_utf8_strlen(FileTag->title, -1) > 0)
    266305    {
    267         MP4SetMetadataName(mp4file, FileTag->title);
     306        MP4TagsSetName(mp4tags, FileTag->title);
    268307    }else
    269308    {
    270         //MP4DeleteMetadataName(mp4file); // Not available on mpeg4ip-1.2 (only in 1.3)
    271         MP4SetMetadataName(mp4file, "");
     309        MP4TagsSetName(mp4tags, "");
    272310    }
    273311
    274312    /**********
     
    276314     **********/
    277315    if (FileTag->artist && g_utf8_strlen(FileTag->artist, -1) > 0)
    278316    {
    279         MP4SetMetadataArtist(mp4file, FileTag->artist);
     317        MP4TagsSetArtist(mp4tags, FileTag->artist);
    280318    }else
    281319    {
    282         //MP4DeleteMetadataArtist(mp4file);
    283         MP4SetMetadataArtist(mp4file, "");
     320        MP4TagsSetArtist(mp4tags, "");
    284321    }
    285322
    286323    /*********
     
    288325     *********/
    289326    if (FileTag->album && g_utf8_strlen(FileTag->album, -1) > 0)
    290327    {
    291         MP4SetMetadataAlbum(mp4file, FileTag->album);
     328        MP4TagsSetAlbum(mp4tags, FileTag->album);
    292329    }else
    293330    {
    294         //MP4DeleteMetadataAlbum(mp4file);
    295         MP4SetMetadataAlbum(mp4file, "");
     331        MP4TagsSetAlbum(mp4tags, "");
     332    }
     333
     334    /****************
     335     * Album Artist *
     336     ****************/
     337    if (FileTag->album_artist && g_utf8_strlen(FileTag->album_artist, -1) > 0)
     338    {
     339        MP4TagsSetAlbumArtist(mp4tags, FileTag->album_artist);
     340    }else
     341    {
     342        MP4TagsSetAlbumArtist(mp4tags, "");
    296343    }
    297344
    298345    /**********************
     
    301348    if (FileTag->disc_number && g_utf8_strlen(FileTag->disc_number, -1) > 0)
    302349    //|| FileTag->disc_number_total && g_utf8_strlen(FileTag->disc_number_total, -1) > 0)
    303350    {
    304         uint16_t disk      = 0;
    305         uint16_t disktotal = 0;
    306 
    307351        /* At the present time, we manage only disk number like '1' or '1/2', we
    308352         * don't use disk number total... so here we try to decompose */
    309353        if (FileTag->disc_number)
     
    314358            {
    315359                // A disc_number_total was entered
    316360                if ( (tmp+1) && atoi(tmp+1) )
    317                     disktotal = atoi(tmp+1);
     361                    mp4disk.total = atoi(tmp+1);
    318362
    319363                // Fill disc_number
    320364                *tmp = '\0';
    321                 disk = atoi(dn_tmp);
     365                mp4disk.index = atoi(dn_tmp);
    322366            }else
    323367            {
    324                 disk = atoi(FileTag->disc_number);
     368                mp4disk.index = atoi(FileTag->disc_number);
    325369            }
    326370            g_free(dn_tmp);
    327371        }
    328372        /*if (FileTag->disc_number)
    329             disk = atoi(FileTag->disc_number);
     373            mp4disk.index = atoi(FileTag->disc_number);
    330374        if (FileTag->disc_number_total)
    331             disktotal = atoi(FileTag->disc_number_total);
     375            mp4disk.total = atoi(FileTag->disc_number_total);
    332376        */
    333         MP4SetMetadataDisk(mp4file, disk, disktotal);
    334     }else
    335     {
    336         //MP4DeleteMetadataDisk(mp4file);
    337         MP4SetMetadataDisk(mp4file, 0, 0);
    338377    }
     378    MP4TagsSetDisk(mp4tags, &mp4disk);
    339379
    340380    /********
    341381     * Year *
    342382     ********/
    343383    if (FileTag->year && g_utf8_strlen(FileTag->year, -1) > 0)
    344384    {
    345         MP4SetMetadataYear(mp4file, FileTag->year);
     385        MP4TagsSetReleaseDate(mp4tags, FileTag->year);
    346386    }else
    347387    {
    348         //MP4DeleteMetadataYear(mp4file);
    349         MP4SetMetadataYear(mp4file, "");
     388        MP4TagsSetReleaseDate(mp4tags, "");
    350389    }
    351390
    352391    /*************************
     
    355394    if ( (FileTag->track       && g_utf8_strlen(FileTag->track, -1) > 0)
    356395    ||   (FileTag->track_total && g_utf8_strlen(FileTag->track_total, -1) > 0) )
    357396    {
    358         uint16_t track       = 0;
    359         uint16_t track_total = 0;
    360397        if (FileTag->track)
    361             track = atoi(FileTag->track);
     398            mp4track.index = atoi(FileTag->track);
    362399        if (FileTag->track_total)
    363             track_total = atoi(FileTag->track_total);
    364         MP4SetMetadataTrack(mp4file, track, track_total);
    365     }else
    366     {
    367         //MP4DeleteMetadataTrack(mp4file);
    368         MP4SetMetadataTrack(mp4file, 0, 0);
     400            mp4track.total = atoi(FileTag->track_total);
    369401    }
     402    MP4TagsSetTrack(mp4tags, &mp4track);
    370403
    371404    /*********
    372405     * Genre *
    373406     *********/
    374407    if (FileTag->genre && g_utf8_strlen(FileTag->genre, -1) > 0 )
    375408    {
    376         MP4SetMetadataGenre(mp4file, FileTag->genre);
     409        MP4TagsSetGenre(mp4tags, FileTag->genre);
    377410    }else
    378411    {
    379         //MP4DeleteMetadataGenre(mp4file);
    380         MP4SetMetadataGenre(mp4file, "");
     412        MP4TagsSetGenre(mp4tags, "");
    381413    }
    382414
    383415    /***********
     
    385417     ***********/
    386418    if (FileTag->comment && g_utf8_strlen(FileTag->comment, -1) > 0)
    387419    {
    388         MP4SetMetadataComment(mp4file, FileTag->comment);
     420        MP4TagsSetComments(mp4tags, FileTag->comment);
    389421    }else
    390422    {
    391         //MP4DeleteMetadataComment(mp4file);
    392         MP4SetMetadataComment(mp4file, "");
     423        MP4TagsSetComments(mp4tags, "");
    393424    }
    394425
    395426    /**********************
     
    397428     **********************/
    398429    if (FileTag->composer && g_utf8_strlen(FileTag->composer, -1) > 0)
    399430    {
    400         MP4SetMetadataWriter(mp4file, FileTag->composer);
     431        MP4TagsSetComposer(mp4tags, FileTag->composer);
    401432    }else
    402433    {
    403         //MP4DeleteMetadataWriter(mp4file);
    404         MP4SetMetadataWriter(mp4file, "");
     434        MP4TagsSetComposer(mp4tags, "");
    405435    }
    406436
    407437    /*****************
     
    409439     *****************/
    410440    if (FileTag->encoded_by && g_utf8_strlen(FileTag->encoded_by, -1) > 0)
    411441    {
    412         MP4SetMetadataTool(mp4file, FileTag->encoded_by);
     442        MP4TagsSetEncodedBy(mp4tags, FileTag->encoded_by);
    413443    }else
    414444    {
    415         //MP4DeleteMetadataTool(mp4file);
    416         MP4SetMetadataTool(mp4file, "");
     445        MP4TagsSetEncodedBy(mp4tags, "");
    417446    }
    418447
    419448    /***********
     
    422451    {
    423452        // Can handle only one picture...
    424453        Picture *pic;
    425 
    426         //MP4DeleteMetadataCoverArt(mp4file);
    427         MP4SetMetadataCoverArt(mp4file, NULL, 0);
    428         for( pic = FileTag->picture; pic; pic = pic->next )
     454        if (mp4tags->artworkCount && mp4tags->artwork)
     455            MP4TagsRemoveArtwork(mp4tags, 0);
     456        MP4TagsSetArtwork(mp4tags, 0, NULL);
     457        for (pic = FileTag->picture; pic; pic = pic->next)
    429458        {
    430             if( pic->type == PICTURE_TYPE_FRONT_COVER )
     459            if (pic->type == PICTURE_TYPE_FRONT_COVER)
    431460            {
    432                 MP4SetMetadataCoverArt(mp4file, pic->data, pic->size);
     461                 mp4artwork.data = pic->data;
     462                 mp4artwork.size = pic->size;
     463                 switch (pic->type) {
     464                  case PICTURE_FORMAT_JPEG:
     465                     mp4artwork.type = MP4_ART_JPEG;
     466                     break;
     467                  case PICTURE_FORMAT_PNG:
     468                     mp4artwork.type = MP4_ART_PNG;
     469                     break;
     470                  default:
     471                     mp4artwork.type = MP4_ART_UNDEFINED;
     472                 }
     473                 if (mp4tags->artworkCount)
     474                     MP4TagsSetArtwork(mp4tags, 0, &mp4artwork);
     475                 else
     476                     MP4TagsAddArtwork(mp4tags, &mp4artwork);
    433477            }
    434478        }
    435479    }
    436480
    437 
    438     MP4Close(mp4file);
     481    MP4TagsStore(mp4tags, mp4file);
     482    MP4TagsFree(mp4tags);
     483    MP4Close(mp4file, 0);
    439484
    440485    if (error) return FALSE;
    441486    else       return TRUE;