1
0
Fork 0
forked from len0rd/rockbox

Fix rare overflow when decoding MDCT coefficients. As a bonus, decoding is now slightly faster. Thanks to preglow for suggesting I test with a full scale normalized square wave.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13815 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Giacomelli 2007-07-08 06:06:00 +00:00
parent 030dce6f88
commit 93bc5ef1d6
2 changed files with 10 additions and 17 deletions

View file

@ -630,16 +630,7 @@ void ff_imdct_calc(MDCTContext *s,
in2 -= 2; in2 -= 2;
} }
for(k = 0; k < n4; k++){
z[k].re >>=1;
z[k].im >>=1;
}
//rb->splash(HZ, "in MDCT calc");
scale = fft_calc_unscaled(&s->fft, z); scale = fft_calc_unscaled(&s->fft, z);
// scale = fft_calc(&s->fft, z);
//rb->splash(HZ, "in MDCT calc2");
/* post rotation + reordering */ /* post rotation + reordering */
@ -1764,8 +1755,7 @@ static int wma_decode_block(WMADecodeContext *s)
{ {
/* XXX: optimize more */ /* XXX: optimize more */
for(i = 0;i < s->coefs_start; ++i)
*coefs++ = 0; //why do we do this step?!
n = nb_coefs[ch]; n = nb_coefs[ch];
@ -1773,15 +1763,17 @@ static int wma_decode_block(WMADecodeContext *s)
for(i = 0;i < n; ++i) for(i = 0;i < n; ++i)
{ {
/*
* Previously the IMDCT was run in 17.15 precision to avoid overflow. However rare files could
* overflow here as well, so switch to 17.15 now. As a bonus, this saves us a shift later on.
*/
atemp = (fixed32)(coefs1[i]*mult>>16);
//atemp= ftofix32(coefs1[i] * fixtof64(exponents[i]) * fixtof64(mult>>16)); //this "works" in the sense that the mdcts converge
//this can still overflow in rare cases atemp = (fixed32)(coefs1[i]*mult>>17);
//running a full scale value square wave through here does bad things //this "works" in the sense that the mdcts converge
//atemp= ftofix32(coefs1[i] * fixtof64(exponents[i]) * fixtof64(mult>>16));
*coefs++=fixmul32(atemp,exponents[i<<bsize>>esize]);
*coefs++=fixmul32(atemp,exponents[i<<bsize>>esize]);
} }
n = s->block_len - s->coefs_end[bsize]; n = s->block_len - s->coefs_end[bsize];

View file

@ -18,6 +18,7 @@ stats.c
stopwatch.c stopwatch.c
vbrfix.c vbrfix.c
viewer.c viewer.c
test_codec.c
/* plugins built for all targets, but not for the simulator */ /* plugins built for all targets, but not for the simulator */
#if !defined(SIMULATOR) #if !defined(SIMULATOR)