Index: apps/codecs/libwmapro/wmaprodec.c =================================================================== --- apps/codecs/libwmapro/wmaprodec.c (revision 27643) +++ apps/codecs/libwmapro/wmaprodec.c (working copy) @@ -873,11 +873,18 @@ vals[3] = symbol_to_vec4[idx] & 0xF; } + /* Rockbox: To be able to use rockbox' optimized mdct we need to + * pre-shift the values by >>(nbits-3). */ + const int nbits = av_log2(s->subframe_len)+1; + const int shift = WMAPRO_FRACT-(nbits-3); + /** decode sign */ for (i = 0; i < 4; i++) { if (vals[i]) { int sign = get_bits1(&s->gb) - 1; - ci->coeffs[cur_coeff] = (sign == -1)? -vals[i]<coeffs[cur_coeff] = (sign == -1)? vals[i]<coeffs[cur_coeff] = 0; @@ -1261,6 +1268,7 @@ get_bits_count(&s->gb) - s->subframe_offset); if (transmit_coeffs) { + int nbits = av_log2(subframe_len)+1; /** reconstruct the per channel data */ inverse_channel_transform(s); for (i = 0; i < s->channels_for_cur_subframe; i++) { @@ -1271,7 +1279,7 @@ if (c == s->lfe_channel) memset(&s->tmp[cur_subwoofer_cutoff], 0, sizeof(*s->tmp) * (subframe_len - cur_subwoofer_cutoff)); - + /** inverse quantization and rescaling */ for (b = 0; b < s->num_bands; b++) { const int end = FFMIN(s->cur_sfb_offsets[b+1], s->subframe_len); @@ -1294,8 +1302,7 @@ } /** apply imdct (ff_imdct_half == DCTIV with reverse) */ - imdct_half(av_log2(subframe_len)+1, - s->channel[c].coeffs, s->tmp); + ff_imdct_half(nbits,s->channel[c].coeffs, s->tmp); } } Index: apps/codecs/libwmapro/wma.c =================================================================== --- apps/codecs/libwmapro/wma.c (revision 27643) +++ apps/codecs/libwmapro/wma.c (working copy) @@ -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 @@ { 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 @@ } } 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 */