diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-03 21:04:09 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-03 21:04:09 +0000 |
| commit | 2e525fe9eda0a160612fba53d22f3719af2ec168 (patch) | |
| tree | bbe513f55c606066ebc7721b112fe56135b37a60 | |
| parent | 51da9dfcdbc712d344ca43e3b764193a68415a3d (diff) | |
| download | rockbox-2e525fe9eda0a160612fba53d22f3719af2ec168.zip rockbox-2e525fe9eda0a160612fba53d22f3719af2ec168.tar.gz rockbox-2e525fe9eda0a160612fba53d22f3719af2ec168.tar.bz2 rockbox-2e525fe9eda0a160612fba53d22f3719af2ec168.tar.xz | |
Added Xing VBR frame parsing
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1324 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/id3.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index c913404..4a40ff8 100644 --- a/firmware/id3.c +++ b/firmware/id3.c @@ -366,8 +366,12 @@ getid3v1len(int fd) static int getsonglength(int fd, struct mp3entry *entry) { + unsigned int filetime = 0; unsigned long header=0; unsigned char tmp; + unsigned char frame[200]; + unsigned int framecount; + int version; int layer; int bitindex; @@ -402,7 +406,7 @@ getsonglength(int fd, struct mp3entry *entry) /* * Some files are filled with garbage in the beginning, * if the bitrate index of the header is binary 1111 - * that is a good is a good indicator + * that is a good indicator */ if((header & 0xF000) == 0xF000) goto restart; @@ -481,12 +485,39 @@ getsonglength(int fd, struct mp3entry *entry) /* Calculate time per frame */ tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1); + + /* OK, we have found a frame. Let's see if it has a Xing header */ + if(read(fd, frame, 200) < 0) + return -1; - /* - * Now song length is - * ((filesize)/(bytes per frame))*(time per frame) - */ - return entry->filesize/bpf*tpf; + if(frame[32] == 'X' && + frame[33] == 'i' && + frame[34] == 'n' && + frame[35] == 'g') + { + if(frame[39] & 0x01) /* Is the frame count there? */ + { + framecount = (frame[40] << 24) | (frame[41] << 16) | + (frame[42] << 8) | frame[43]; + + filetime = framecount * tpf; + } + /* We don't care about the file size and the TOC just yet. Maybe + another time. */ + } + + /* If the file time hasn't been established, this may be a fixed + rate MP3, so just use the default formula */ + if(filetime == 0) + { + /* + * Now song length is + * ((filesize)/(bytes per frame))*(time per frame) + */ + filetime = entry->filesize/bpf*tpf; + } + + return filetime; } |