From 3bbbb9639587fa17df470e605cda6ebd1a3af021 Mon Sep 17 00:00:00 2001 From: Mohamed Tarek Date: Wed, 4 Aug 2010 22:29:50 +0000 Subject: Use codeclib's mdct in wmapro. Input coeffs to the transform needed to be scaled down first by (log2(frame_size) - 3). Increases decoding speed by 1.3MHz on PP5022 and saves ~32KB that were previously needed by the mdct tables. (FS#11511 by Buschel and myself) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27701 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libwmapro/SOURCES | 1 - apps/codecs/libwmapro/mdct_tables.c | 3 ++- apps/codecs/libwmapro/mdct_tables.h | 3 ++- apps/codecs/libwmapro/wma.c | 15 +++++++++++---- apps/codecs/libwmapro/wmaprodec.c | 17 ++++++++++++----- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/apps/codecs/libwmapro/SOURCES b/apps/codecs/libwmapro/SOURCES index ce4bfc234d..296f26ab7f 100644 --- a/apps/codecs/libwmapro/SOURCES +++ b/apps/codecs/libwmapro/SOURCES @@ -2,4 +2,3 @@ wmaprodec.c wma.c mdct_tables.c ../lib/ffmpeg_bitstream.c -wmapro_mdct.c diff --git a/apps/codecs/libwmapro/mdct_tables.c b/apps/codecs/libwmapro/mdct_tables.c index dd8b2a451c..edb15a4159 100644 --- a/apps/codecs/libwmapro/mdct_tables.c +++ b/apps/codecs/libwmapro/mdct_tables.c @@ -1378,6 +1378,7 @@ const int32_t *sine_windows[6] = { 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 @@ const int32_t sincos_lookup_wmap[8064] = { 0x00003FFD, 0x00000112, 0x00003FFD, 0x00000106, 0x00003FFE }; - +*/ diff --git a/apps/codecs/libwmapro/mdct_tables.h b/apps/codecs/libwmapro/mdct_tables.h index f40bf70fcf..5e54868b01 100644 --- a/apps/codecs/libwmapro/mdct_tables.h +++ b/apps/codecs/libwmapro/mdct_tables.h @@ -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_ */ diff --git a/apps/codecs/libwmapro/wma.c b/apps/codecs/libwmapro/wma.c index 64ec2405ae..83cec89a4c 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 */ diff --git a/apps/codecs/libwmapro/wmaprodec.c b/apps/codecs/libwmapro/wmaprodec.c index a7a0f4d34d..e5a5fd94eb 100644 --- a/apps/codecs/libwmapro/wmaprodec.c +++ b/apps/codecs/libwmapro/wmaprodec.c @@ -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 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) 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 @@ static int decode_subframe(WMAProDecodeCtx *s) 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 @@ static int decode_subframe(WMAProDecodeCtx *s) 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 @@ static int decode_subframe(WMAProDecodeCtx *s) } /** 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); } } -- cgit v1.2.3