diff options
Diffstat (limited to 'apps/codecs/libwmapro/wma.c')
| -rw-r--r-- | apps/codecs/libwmapro/wma.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/apps/codecs/libwmapro/wma.c b/apps/codecs/libwmapro/wma.c index 64ec240..83cec89 100644 --- a/apps/codecs/libwmapro/wma.c +++ b/apps/codecs/libwmapro/wma.c @@ -20,6 +20,7 @@ */ #include "wma.h" +#include "codeclib.h" /* needed for av_log2() */ /** *@brief Get the samples per frame for this stream. @@ -109,14 +110,20 @@ int ff_wma_run_level_decode(GetBitContext* gb, { int32_t code, level, sign; const unsigned int coef_mask = block_len - 1; + /* Rockbox: To be able to use rockbox' optimized mdct we need to pre-shift + * the values by >>(nbits-3). */ + const int nbits = av_log2(block_len)+1; + const int shift = WMAPRO_FRACT-(nbits-3); for (; offset < num_coefs; offset++) { code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX); if (code > 1) { /** normal code */ offset += run_table[code]; sign = !get_bits1(gb); - ptr[offset & coef_mask] = sign ? -level_table[code] : level_table[code]; - ptr[offset & coef_mask] <<= WMAPRO_FRACT; + /* Rockbox: To be able to use rockbox' optimized mdct we need + * invert the sign. */ + ptr[offset & coef_mask] = sign ? level_table[code] : -level_table[code]; + ptr[offset & coef_mask] <<= shift; } else if (code == 1) { /** EOB */ break; @@ -143,8 +150,8 @@ int ff_wma_run_level_decode(GetBitContext* gb, } } sign = !get_bits1(gb); - ptr[offset & coef_mask] = sign ? -level : level; - ptr[offset & coef_mask] <<= WMAPRO_FRACT; + ptr[offset & coef_mask] = sign ? level : -level; + ptr[offset & coef_mask] <<= shift; } } /** NOTE: EOB can be omitted */ |