diff options
author | Mohamed Tarek <mt@rockbox.org> | 2010-08-04 22:29:50 +0000 |
---|---|---|
committer | Mohamed Tarek <mt@rockbox.org> | 2010-08-04 22:29:50 +0000 |
commit | 3bbbb9639587fa17df470e605cda6ebd1a3af021 (patch) | |
tree | 5fe4e540263b986521403d462db4d02f28b2b84d /apps/codecs/libwmapro | |
parent | 83be40f7d355e7af8db12f5854ada831a8c68e8e (diff) |
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
Diffstat (limited to 'apps/codecs/libwmapro')
-rw-r--r-- | apps/codecs/libwmapro/SOURCES | 1 | ||||
-rw-r--r-- | apps/codecs/libwmapro/mdct_tables.c | 3 | ||||
-rw-r--r-- | apps/codecs/libwmapro/mdct_tables.h | 3 | ||||
-rw-r--r-- | apps/codecs/libwmapro/wma.c | 15 | ||||
-rw-r--r-- | 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 <inttypes.h> 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]<<WMAPRO_FRACT : vals[i]<<WMAPRO_FRACT; + /* Rockbox: To be able to use rockbox' optimized mdct we need + * invert the sign. */ + ci->coeffs[cur_coeff] = (sign == -1)? vals[i]<<shift : -vals[i]<<shift; num_zeros = 0; } else { ci->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); } } |