shithub: aacdec

Download patch

ref: 571ea294b58a6b39eb15a58570aa0dac39655e56
parent: 3fc490ae3d1b82ee1212720482371852e52db1ce
author: ca5e <ca5e>
date: Sat Nov 22 06:12:13 EST 2003

Fixed memory leak in tag writer, improved handling of track and disc number tag fields

--- a/plugins/foo_mp4/foo_mp4.cpp
+++ b/plugins/foo_mp4/foo_mp4.cpp
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through [email protected].
 **
-** $Id: foo_mp4.cpp,v 1.70 2003/11/10 18:57:59 ca5e Exp $
+** $Id: foo_mp4.cpp,v 1.71 2003/11/22 11:12:13 ca5e Exp $
 **/
 
 #include <mp4.h>
@@ -48,7 +48,7 @@
 #endif
 
 DECLARE_COMPONENT_VERSION ("MPEG-4 AAC decoder",
-                           "1.66",
+                           "1.68",
                            "Based on FAAD2 v" FAAD2_VERSION "\nCopyright (C) 2002-2003 http://www.audiocoding.com" );
 
 static const char *object_type_string(int type)
@@ -360,7 +360,6 @@
         if (hFile == MP4_INVALID_FILE_HANDLE) return SET_INFO_FAILURE;
 
         MP4MetadataDelete(hFile);
-
         MP4Close(hFile);
 
         hFile = MP4ModifyCb(0, 0, open_cb, close_cb, read_cb, write_cb,
@@ -367,10 +366,7 @@
             setpos_cb, getpos_cb, filesize_cb, (void*)m_reader);
         if (hFile == MP4_INVALID_FILE_HANDLE) return SET_INFO_FAILURE;
 
-        /* replay gain writing */
-        const char *p = NULL;
-
-        p = info->info_get("TOOL");
+        const char *p = info->info_get("TOOL");
         if (p && *p)
             MP4SetMetadataTool(hFile, p);
         p = info->info_get("REPLAYGAIN_TRACK_PEAK");
@@ -411,10 +407,14 @@
                 } else if (stricmp(pName, "GENRE") == 0) {
                     MP4SetMetadataGenre(hFile, val);
                 } else if (stricmp(pName, "TRACKNUMBER") == 0) {
-                    unsigned __int16 trkn = atoi(val), tot = 0;
+                    int t1 = 0, t2 = 0;
+                    sscanf(val, "%d/%d", &t1, &t2);
+                    unsigned __int16 trkn = t1, tot = t2;
                     MP4SetMetadataTrack(hFile, trkn, tot);
                 } else if (stricmp(pName, "DISKNUMBER") == 0 || stricmp(pName, "DISC") == 0) {
-                    unsigned __int16 disk = atoi(val), tot = 0;
+                    int t1 = 0, t2 = 0;
+                    sscanf(val, "%d/%d", &t1, &t2);
+                    unsigned __int16 disk = t1, tot = t2;
                     MP4SetMetadataDisk(hFile, disk, tot);
                 } else if (stricmp(pName, "COMPILATION") == 0) {
                     unsigned __int8 cpil = atoi(val);
@@ -505,7 +505,7 @@
         unsigned __int32 valueSize = 0;
         unsigned __int8* pValue;
         char* pName;
-        int i = 0;
+        unsigned int i = 0;
 
         do {
             valueSize = 0;
@@ -514,86 +514,105 @@
 
             if (valueSize > 0)
             {
-                char* val = (char*)malloc((valueSize+1)*sizeof(char));
-                memset(val, 0, (valueSize+1)*sizeof(char));
-                memcpy(val, pValue, valueSize*sizeof(char));
+                char *val = (char*)malloc((valueSize+1)*sizeof(char));
 
-                if (pName[0] == '�')
+                if (val)
                 {
-                    if (memcmp(pName, "�nam", 4) == 0)
+                    memcpy(val, pValue, valueSize*sizeof(char));
+                    val[valueSize] = '\0';
+
+                    if (pName[0] == '�')
                     {
-                        info->meta_add("TITLE", val);
-                    } else if (memcmp(pName, "�ART", 4) == 0) {
-                        info->meta_add("ARTIST", val);
-                    } else if (memcmp(pName, "�wrt", 4) == 0) {
-                        info->meta_add("WRITER", val);
-                    } else if (memcmp(pName, "�alb", 4) == 0) {
-                        info->meta_add("ALBUM", val);
-                    } else if (memcmp(pName, "�day", 4) == 0) {
-                        info->meta_add("DATE", val);
-                    } else if (memcmp(pName, "�too", 4) == 0) {
-                        info->info_set("tool", val);
-                    } else if (memcmp(pName, "�cmt", 4) == 0) {
-                        info->meta_add("COMMENT", val);
-                    } else if (memcmp(pName, "�gen", 4) == 0) {
-                        info->meta_add("GENRE", val);
+                        if (memcmp(pName, "�nam", 4) == 0)
+                        {
+                            info->meta_add("TITLE", val);
+                        } else if (memcmp(pName, "�ART", 4) == 0) {
+                            info->meta_add("ARTIST", val);
+                        } else if (memcmp(pName, "�wrt", 4) == 0) {
+                            info->meta_add("WRITER", val);
+                        } else if (memcmp(pName, "�alb", 4) == 0) {
+                            info->meta_add("ALBUM", val);
+                        } else if (memcmp(pName, "�day", 4) == 0) {
+                            info->meta_add("DATE", val);
+                        } else if (memcmp(pName, "�too", 4) == 0) {
+                            info->info_set("tool", val);
+                        } else if (memcmp(pName, "�cmt", 4) == 0) {
+                            info->meta_add("COMMENT", val);
+                        } else if (memcmp(pName, "�gen", 4) == 0) {
+                            info->meta_add("GENRE", val);
+                        } else {
+                            info->meta_add(pName, val);
+                        }
+                    } else if (memcmp(pName, "gnre", 4) == 0) {
+                        char *t=0;
+                        if (MP4GetMetadataGenre(hFile, &t) && t)
+                            info->meta_add("GENRE", t);
+                    } else if (memcmp(pName, "trkn", 4) == 0) {
+                        unsigned __int16 trkn = 0, tot = 0;
+                        if (MP4GetMetadataTrack(hFile, &trkn, &tot))
+                        {
+                            char t[64];
+                            if (tot > 0)
+                                wsprintf(t, "%d/%d", (int)trkn, (int)tot);
+                            else
+                                wsprintf(t, "%d", (int)trkn);
+                            info->meta_add("TRACKNUMBER", t);
+                        }
+                    } else if (memcmp(pName, "disk", 4) == 0) {
+                        unsigned __int16 disk = 0, tot = 0;
+                        if (MP4GetMetadataDisk(hFile, &disk, &tot))
+                        {
+                            char t[64];
+                            if (tot > 0)
+                                wsprintf(t, "%d/%d", (int)disk, (int)tot);
+                            else
+                                wsprintf(t, "%d", (int)disk);
+                            //info->meta_add("DISKNUMBER", t);
+                            info->meta_add("DISC", t);
+                        }
+                    } else if (memcmp(pName, "cpil", 4) == 0) {
+                        unsigned __int8 cpil = 0;
+                        if (MP4GetMetadataCompilation(hFile, &cpil))
+                        {
+                            char t[64];
+                            wsprintf(t, "%d", (int)cpil);
+                            info->meta_add("COMPILATION", t);
+                        }
+                    } else if (memcmp(pName, "tmpo", 4) == 0) {
+                        unsigned __int16 tempo = 0;
+                        if (MP4GetMetadataTempo(hFile, &tempo))
+                        {
+                            char t[64];
+                            wsprintf(t, "%d BPM", (int)tempo);
+                            info->meta_add("TEMPO", t);
+                        }
+                    } else if (memcmp(pName, "NDFL", 4) == 0) {
+                        /* Removed */
                     } else {
-                        info->meta_add(pName, val);
+                        float f = 0;
+                        if (!stricmp(pName, "REPLAYGAIN_TRACK_PEAK"))
+                        {
+                            sscanf(val, "%f", &f);
+                            info->info_set_replaygain_track_peak((double)f);
+                        } else if (!stricmp(pName, "REPLAYGAIN_TRACK_GAIN")) {
+                            sscanf(val, "%f", &f);
+                            info->info_set_replaygain_track_gain((double)f);
+                        } else if (!stricmp(pName, "REPLAYGAIN_ALBUM_PEAK")) {
+                            sscanf(val, "%f", &f);
+                            info->info_set_replaygain_album_peak((double)f);
+                        } else if (!stricmp(pName, "REPLAYGAIN_ALBUM_GAIN")) {
+                            sscanf(val, "%f", &f);
+                            info->info_set_replaygain_album_gain((double)f);
+                        } else {
+                            info->meta_add(pName, val);
+                        }
                     }
-                } else if (memcmp(pName, "gnre", 4) == 0) {
-                    char *t=0;
-                    MP4GetMetadataGenre(hFile, &t);
-                    info->meta_add("GENRE", t);
-                } else if (memcmp(pName, "trkn", 4) == 0) {
-                    unsigned __int16 trkn = 0, tot = 0;
-                    char t[200];
-                    MP4GetMetadataTrack(hFile, &trkn, &tot);
-                    wsprintf(t, "%d", trkn);
-                    info->meta_add("TRACKNUMBER", t);
-                } else if (memcmp(pName, "disk", 4) == 0) {
-                    unsigned __int16 disk = 0, tot = 0;
-                    char t[200];
-                    MP4GetMetadataDisk(hFile, &disk, &tot);
-                    wsprintf(t, "%d", disk);
-                    //info->meta_add("DISKNUMBER", t);
-                    info->meta_add("DISC", t);
-                } else if (memcmp(pName, "cpil", 4) == 0) {
-                    unsigned __int8 cpil = 0;
-                    char t[200];
-                    MP4GetMetadataCompilation(hFile, &cpil);
-                    wsprintf(t, "%d", cpil);
-                    info->meta_add("COMPILATION", t);
-                } else if (memcmp(pName, "tmpo", 4) == 0) {
-                    unsigned __int16 tempo = 0;
-                    char t[200];
-                    MP4GetMetadataTempo(hFile, &tempo);
-                    wsprintf(t, "%d BPM", tempo);
-                    info->meta_add("TEMPO", t);
-                } else if (memcmp(pName, "NDFL", 4) == 0) {
-                    /* Removed */
-                } else {
-                    float f = 0;
-                    if (!stricmp(pName, "REPLAYGAIN_TRACK_PEAK"))
-                    {
-                        sscanf(val, "%f", &f);
-                        info->info_set_replaygain_track_peak((double)f);
-                    } else if (!stricmp(pName, "REPLAYGAIN_TRACK_GAIN")) {
-                        sscanf(val, "%f", &f);
-                        info->info_set_replaygain_track_gain((double)f);
-                    } else if (!stricmp(pName, "REPLAYGAIN_ALBUM_PEAK")) {
-                        sscanf(val, "%f", &f);
-                        info->info_set_replaygain_album_peak((double)f);
-                    } else if (!stricmp(pName, "REPLAYGAIN_ALBUM_GAIN")) {
-                        sscanf(val, "%f", &f);
-                        info->info_set_replaygain_album_gain((double)f);
-                    } else {
-                        info->meta_add(pName, val);
-                    }
+
+                    free(val);
                 }
             }
 
             i++;
-
         } while (valueSize > 0);
 
         return 1;