diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-22 16:05:46 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-22 16:05:46 +0000 |
commit | 4e69f82c8f0feb124710ac1f6ce44040cb1acc2c (patch) | |
tree | 52e234d7ba34665a9884b46f252194444a48c3e8 /firmware | |
parent | 6f75d1739fa6e1f76753a62e4417761df812c072 (diff) | |
download | rockbox-4e69f82c8f0feb124710ac1f6ce44040cb1acc2c.tar.gz rockbox-4e69f82c8f0feb124710ac1f6ce44040cb1acc2c.zip |
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
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/id3.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index 16a155dd44..021b817704 100644 --- a/firmware/id3.c +++ b/firmware/id3.c | |||
@@ -396,6 +396,7 @@ static int getsonglength(int fd, struct mp3entry *entry) | |||
396 | int freqindex; | 396 | int freqindex; |
397 | int frequency; | 397 | int frequency; |
398 | int chmode; | 398 | int chmode; |
399 | int bytecount; | ||
399 | 400 | ||
400 | long bpf; | 401 | long bpf; |
401 | long tpf; | 402 | long tpf; |
@@ -413,12 +414,18 @@ static int getsonglength(int fd, struct mp3entry *entry) | |||
413 | } | 414 | } |
414 | 415 | ||
415 | /* Loop trough file until we find a frame header */ | 416 | /* Loop trough file until we find a frame header */ |
417 | bytecount = 0; | ||
416 | restart: | 418 | restart: |
417 | do { | 419 | do { |
418 | header <<= 8; | 420 | header <<= 8; |
419 | if(!read(fd, &tmp, 1)) | 421 | if(!read(fd, &tmp, 1)) |
420 | return -1; | 422 | return -1; |
421 | header |= tmp; | 423 | header |= tmp; |
424 | |||
425 | /* Quit if we haven't found a valid header within 128K */ | ||
426 | bytecount++; | ||
427 | if(bytecount > 0x20000) | ||
428 | return -1; | ||
422 | } while(!mp3frameheader(header)); | 429 | } while(!mp3frameheader(header)); |
423 | 430 | ||
424 | /* | 431 | /* |
@@ -444,7 +451,7 @@ static int getsonglength(int fd, struct mp3entry *entry) | |||
444 | version = 1; | 451 | version = 1; |
445 | break; | 452 | break; |
446 | default: | 453 | default: |
447 | return -1; | 454 | goto restart; |
448 | } | 455 | } |
449 | 456 | ||
450 | /* Layer */ | 457 | /* Layer */ |
@@ -459,20 +466,20 @@ static int getsonglength(int fd, struct mp3entry *entry) | |||
459 | layer = 1; | 466 | layer = 1; |
460 | break; | 467 | break; |
461 | default: | 468 | default: |
462 | return -1; | 469 | goto restart; |
463 | } | 470 | } |
464 | 471 | ||
465 | /* Bitrate */ | 472 | /* Bitrate */ |
466 | bitindex = (header & 0xF000) >> 12; | 473 | bitindex = (header & 0xF000) >> 12; |
467 | bitrate = bitrate_table[version-1][layer-1][bitindex]; | 474 | bitrate = bitrate_table[version-1][layer-1][bitindex]; |
468 | if(bitrate == 0) | 475 | if(bitrate == 0) |
469 | return -1; | 476 | goto restart; |
470 | 477 | ||
471 | /* Sampling frequency */ | 478 | /* Sampling frequency */ |
472 | freqindex = (header & 0x0C00) >> 10; | 479 | freqindex = (header & 0x0C00) >> 10; |
473 | frequency = freqtab[version-1][freqindex]; | 480 | frequency = freqtab[version-1][freqindex]; |
474 | if(frequency == 0) | 481 | if(frequency == 0) |
475 | return -1; | 482 | goto restart; |
476 | 483 | ||
477 | #ifdef DEBUG_VERBOSE | 484 | #ifdef DEBUG_VERBOSE |
478 | DEBUGF( "Version %i, lay %i, biti %i, bitr %i, freqi %i, freq %i, chmode %d\n", | 485 | 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) | |||
500 | } | 507 | } |
501 | 508 | ||
502 | /* Calculate time per frame */ | 509 | /* Calculate time per frame */ |
503 | tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1); | 510 | tpf = bs[layer] / (freqtab[version-1][freqindex] << (version - 1)); |
504 | 511 | ||
505 | /* OK, we have found a frame. Let's see if it has a Xing header */ | 512 | /* OK, we have found a frame. Let's see if it has a Xing header */ |
506 | if(read(fd, frame, sizeof frame) < 0) | 513 | if(read(fd, frame, sizeof frame) < 0) |