diff options
-rwxr-xr-x[-rw-r--r--] | lib/rbcodec/codecs/libwma/wmadata.h | 3 | ||||
-rwxr-xr-x[-rw-r--r--] | lib/rbcodec/codecs/libwma/wmadeci.c | 20 |
2 files changed, 17 insertions, 6 deletions
diff --git a/lib/rbcodec/codecs/libwma/wmadata.h b/lib/rbcodec/codecs/libwma/wmadata.h index 07a55df19a..7f97a75676 100644..100755 --- a/lib/rbcodec/codecs/libwma/wmadata.h +++ b/lib/rbcodec/codecs/libwma/wmadata.h @@ -1578,7 +1578,8 @@ const fixed64 lsp_pow_e_table[] ICONST_ATTR_WMA_XL_IRAM = 0x0LL }; -/* table of exp noise values multiplied by 16 in order to reduce rounding error */ +/* table of exp noise values multiplied by 16 in order to reduce rounding error, + * note that that first value (0x5) is used as a magic number in the init code*/ fixed32 noisetable_exp[] = { 0x5, 0xfffffa2e, 0xc2c, 0xb47, 0xffffaebe, 0xfffffa63, 0xfffff7ff, 0x16bd, diff --git a/lib/rbcodec/codecs/libwma/wmadeci.c b/lib/rbcodec/codecs/libwma/wmadeci.c index d7a836dd97..69bdbeaca2 100644..100755 --- a/lib/rbcodec/codecs/libwma/wmadeci.c +++ b/lib/rbcodec/codecs/libwma/wmadeci.c @@ -487,23 +487,33 @@ int wma_decode_init(WMADecodeContext* s, asf_waveformatex_t *wfx) s->reset_block_lengths = 1; - if (s->use_noise_coding) + if (s->use_noise_coding) /* init the noise generator */ { - /* init the noise generator */ + /* LSP values are simply 2x the EXP values */ if (s->use_exp_vlc) { s->noise_mult = 0x51f; + /*unlikely, but we may have previoiusly used this table for LSP, + so halve the values if needed*/ + if(noisetable_exp[0] == 0x10) { + for (i=0;i<NOISE_TAB_SIZE;++i) + noisetable_exp[i] >>= 1; + } s->noise_table = noisetable_exp; } else { s->noise_mult = 0xa3d; - /* LSP values are simply 2x the EXP values */ - for (i=0;i<NOISE_TAB_SIZE;++i) - noisetable_exp[i] = noisetable_exp[i]<< 1; + /*check that we haven't already doubled this table*/ + if(noisetable_exp[0] == 0x5) { + for (i=0;i<NOISE_TAB_SIZE;++i) + noisetable_exp[i] <<= 1; + } s->noise_table = noisetable_exp; } #if 0 +/*TODO: Rockbox has a dither function. Consider using it for noise coding*/ + /* We use a lookup table computered in advance, so no need to do this*/ { unsigned int seed; |