X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmp3.c;h=8db38517276b0b4520251cb5e8947a01ae81f3f6;hb=fe03062883881dcd0e1b8d65d676433d17973477;hp=8bb7ee7f432f6a43d439f396021ed10db94e2a62;hpb=e3147ae362f22e9627c7eace0b33d01c09e30f25;p=swftools.git diff --git a/lib/mp3.c b/lib/mp3.c index 8bb7ee7..8db3851 100644 --- a/lib/mp3.c +++ b/lib/mp3.c @@ -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; }