diff options
| -rw-r--r-- | firmware/mpeg.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c index cc514ba..9d6718d 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -337,17 +337,20 @@ static void set_elapsed(struct mp3entry* id3) remainder = id3->offset - (relpos * (id3->filesize / 256)); - /* set time for this percent */ - id3->elapsed = i * id3->length / 100; + /* set time for this percent (divide before multiply to prevent + overflow on long files. loss of precision is negligible on + short files) */ + id3->elapsed = i * (id3->length / 100); /* calculate remainder time */ plen = (nextpos - relpos) * (id3->filesize / 256); - id3->elapsed += (((remainder * 100) / plen) * id3->length) / 10000; + id3->elapsed += (((remainder * 100) / plen) * + (id3->length / 10000)); } else { /* no TOC exists. set a rough estimate using average bitrate */ int tpk = id3->length / (id3->filesize / 1024); - id3->elapsed = id3->offset * tpk / 1024; + id3->elapsed = id3->offset / 1024 * tpk; } } else |