forked from len0rd/rockbox
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
This commit is contained in:
parent
83be40f7d3
commit
3bbbb96395
5 changed files with 27 additions and 12 deletions
|
@ -2,4 +2,3 @@ wmaprodec.c
|
|||
wma.c
|
||||
mdct_tables.c
|
||||
../lib/ffmpeg_bitstream.c
|
||||
wmapro_mdct.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
|
||||
};
|
||||
|
||||
*/
|
||||
|
|
|
@ -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_ */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue