Now continues searching for good frames if a bad one is found. Patch by Hardeep Sidhu

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1398 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2002-07-22 16:05:46 +00:00
parent 6f75d1739f
commit 4e69f82c8f

View file

@ -396,6 +396,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
int freqindex; int freqindex;
int frequency; int frequency;
int chmode; int chmode;
int bytecount;
long bpf; long bpf;
long tpf; long tpf;
@ -413,12 +414,18 @@ static int getsonglength(int fd, struct mp3entry *entry)
} }
/* Loop trough file until we find a frame header */ /* Loop trough file until we find a frame header */
bytecount = 0;
restart: restart:
do { do {
header <<= 8; header <<= 8;
if(!read(fd, &tmp, 1)) if(!read(fd, &tmp, 1))
return -1; return -1;
header |= tmp; header |= tmp;
/* Quit if we haven't found a valid header within 128K */
bytecount++;
if(bytecount > 0x20000)
return -1;
} while(!mp3frameheader(header)); } while(!mp3frameheader(header));
/* /*
@ -444,7 +451,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
version = 1; version = 1;
break; break;
default: default:
return -1; goto restart;
} }
/* Layer */ /* Layer */
@ -459,20 +466,20 @@ static int getsonglength(int fd, struct mp3entry *entry)
layer = 1; layer = 1;
break; break;
default: default:
return -1; goto restart;
} }
/* Bitrate */ /* Bitrate */
bitindex = (header & 0xF000) >> 12; bitindex = (header & 0xF000) >> 12;
bitrate = bitrate_table[version-1][layer-1][bitindex]; bitrate = bitrate_table[version-1][layer-1][bitindex];
if(bitrate == 0) if(bitrate == 0)
return -1; goto restart;
/* Sampling frequency */ /* Sampling frequency */
freqindex = (header & 0x0C00) >> 10; freqindex = (header & 0x0C00) >> 10;
frequency = freqtab[version-1][freqindex]; frequency = freqtab[version-1][freqindex];
if(frequency == 0) if(frequency == 0)
return -1; goto restart;
#ifdef DEBUG_VERBOSE #ifdef DEBUG_VERBOSE
DEBUGF( "Version %i, lay %i, biti %i, bitr %i, freqi %i, freq %i, chmode %d\n", DEBUGF( "Version %i, lay %i, biti %i, bitr %i, freqi %i, freq %i, chmode %d\n",
@ -500,7 +507,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
} }
/* Calculate time per frame */ /* Calculate time per frame */
tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1); tpf = bs[layer] / (freqtab[version-1][freqindex] << (version - 1));
/* OK, we have found a frame. Let's see if it has a Xing header */ /* OK, we have found a frame. Let's see if it has a Xing header */
if(read(fd, frame, sizeof frame) < 0) if(read(fd, frame, sizeof frame) < 0)