more fiddling with edgestyles
[swftools.git] / lib / mp3.c
index 8bb7ee7..48f03d1 100644 (file)
--- a/lib/mp3.c
+++ b/lib/mp3.c
@@ -47,7 +47,7 @@ static const unsigned SR_mpeg25[4] = {11025,12000,8000,0};
 static const unsigned SR_reserved[4] = {0,0,0,0};
 static const unsigned*const SR[4] = {SR_mpeg25, SR_reserved, SR_mpeg2, SR_mpeg1};
 
-int mp3_read(struct MP3*mp3, char* filename)
+int mp3_read(struct MP3*mp3, const char* filename)
 {
     struct MP3Frame* root = 0;
     struct MP3Frame** cur = &root;
@@ -75,6 +75,36 @@ int mp3_read(struct MP3*mp3, char* filename)
         int chanmode;
 
         if(fread(hdr,1,4,fi) < 4) break;
+
+        if(hdr[0] == 'I' && hdr[1] == 'D' && hdr[2] == '3')
+        {
+            /* Skip ID3 header */
+            unsigned id3_size = 0;
+            if(fread(FrameBuf, 1, 6, fi) < 6) break;
+            id3_size = (FrameBuf[5])
+                     + (FrameBuf[4] << 7)
+                     + (FrameBuf[3] << 14)
+                     + (FrameBuf[2] << 21);
+            fprintf(stderr, "readMP3: skipping ID3 tag (10+%u bytes)\n", id3_size);
+            if(fseek(fi, id3_size, SEEK_CUR) < 0)
+            {
+                /* Cannot seek? Try reading. */
+                char* tmpbuf = (char*)malloc(id3_size);
+                int nread=0;
+                if(!tmpbuf)
+                {
+                    fprintf(stderr, "readMP3: fseek and malloc both failed?\n");
+                    break;
+                }
+                nread = fread(tmpbuf, 1, id3_size, fi);
+                free(tmpbuf);
+                if(nread < id3_size) break;
+            }
+            continue;
+        }
+
+
         if(hdr[0] != 0xFF
         || (hdr[1] & 0xE0) != 0xE0)
         {
@@ -157,6 +187,7 @@ int mp3_read(struct MP3*mp3, char* filename)
     if(!root)
     {
         fprintf(stderr, "readMP3: not a MP3 file\n");
+        fclose(fi);
         return 0;
     }
     
@@ -192,6 +223,7 @@ int mp3_read(struct MP3*mp3, char* filename)
         root = next;
     }
     
+    fclose(fi);
     return mp3->data != NULL;
 }