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