Index: apps/codecs/libwmapro/mdct_tables.c =================================================================== --- apps/codecs/libwmapro/mdct_tables.c (revision 27644) +++ apps/codecs/libwmapro/mdct_tables.c (working copy) @@ -1378,6 +1378,7 @@ the table should be in s.31 format, but in wma pro, all the tables are scaled down to preserve energy in the signal, so this downscaling is equivalent to having the tables in ~s15.16 instead. */ +/* rockbox: not used const int32_t sincos_lookup_wmap[8064] = { 0x0000011C, 0x00016A09, 0x000009FE, 0x000169E6, 0x000012DF, 0x0001698B, 0x00001BBD, 0x000168F9, @@ -3387,4 +3388,4 @@ 0x00003FFD, 0x00000112, 0x00003FFD, 0x00000106, 0x00003FFE }; - +*/ Index: apps/codecs/libwmapro/wmaprodec.c =================================================================== --- apps/codecs/libwmapro/wmaprodec.c (revision 27644) +++ apps/codecs/libwmapro/wmaprodec.c (working copy) @@ -91,7 +91,7 @@ #include "wmaprodata.h" #include "wma.h" #include "wmaprodec.h" -#include "wmapro_mdct.h" +//#include "wmapro_mdct.h" #include "mdct_tables.h" #include "quant.h" #include "wmapro_math.h" @@ -878,11 +878,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; @@ -1266,6 +1273,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++) { @@ -1276,7 +1284,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); @@ -1299,8 +1307,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/SOURCES =================================================================== --- apps/codecs/libwmapro/SOURCES (revision 27644) +++ apps/codecs/libwmapro/SOURCES (working copy) @@ -2,4 +2,3 @@ wma.c mdct_tables.c ../lib/ffmpeg_bitstream.c -wmapro_mdct.c Index: apps/codecs/libwmapro/wma.c =================================================================== --- apps/codecs/libwmapro/wma.c (revision 27644) +++ 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 */ Index: apps/codecs/libwmapro/mdct_tables.h =================================================================== --- apps/codecs/libwmapro/mdct_tables.h (revision 27644) +++ apps/codecs/libwmapro/mdct_tables.h (working copy) @@ -3,7 +3,8 @@ #include extern const int32_t *sine_windows[6]; +/* rockbox: not used extern const int32_t sincos_lookup_wmap[8064]; - +*/ #endif /* _MDCT_TABLES_H_ */