|
|
|
@ -57,6 +57,13 @@ |
|
|
|
|
#define LSP_POW_BITS 7 |
|
|
|
|
|
|
|
|
|
#define VLCBITS 9 |
|
|
|
|
#define VLCMAX ((22+VLCBITS-1)/VLCBITS) |
|
|
|
|
|
|
|
|
|
#define EXPVLCBITS 8 |
|
|
|
|
#define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS) |
|
|
|
|
|
|
|
|
|
#define HGAINVLCBITS 9 |
|
|
|
|
#define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS) |
|
|
|
|
|
|
|
|
|
typedef struct WMADecodeContext { |
|
|
|
|
GetBitContext gb; |
|
|
|
@ -185,7 +192,7 @@ static void init_coef_vlc(VLC *vlc, |
|
|
|
|
const uint16_t *p; |
|
|
|
|
int i, l, j, level; |
|
|
|
|
|
|
|
|
|
init_vlc(vlc, 9, n, table_bits, 1, 1, table_codes, 4, 4, 0); |
|
|
|
|
init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); |
|
|
|
|
|
|
|
|
|
run_table = av_malloc(n * sizeof(uint16_t)); |
|
|
|
|
level_table = av_malloc(n * sizeof(uint16_t)); |
|
|
|
@ -494,13 +501,13 @@ static int wma_decode_init(AVCodecContext * avctx) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
init_vlc(&s->hgain_vlc, 9, sizeof(hgain_huffbits), |
|
|
|
|
init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(hgain_huffbits), |
|
|
|
|
hgain_huffbits, 1, 1, |
|
|
|
|
hgain_huffcodes, 2, 2, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->use_exp_vlc) { |
|
|
|
|
init_vlc(&s->exp_vlc, 9, sizeof(scale_huffbits), |
|
|
|
|
init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(scale_huffbits), |
|
|
|
|
scale_huffbits, 1, 1, |
|
|
|
|
scale_huffcodes, 4, 4, 0); |
|
|
|
|
} else { |
|
|
|
@ -681,7 +688,7 @@ static int decode_exp_vlc(WMADecodeContext *s, int ch) |
|
|
|
|
} |
|
|
|
|
last_exp = 36; |
|
|
|
|
while (q < q_end) { |
|
|
|
|
code = get_vlc2(&s->gb, s->exp_vlc.table, VLCBITS, 2); |
|
|
|
|
code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); |
|
|
|
|
if (code < 0) |
|
|
|
|
return -1; |
|
|
|
|
/* NOTE: this offset is the same as MPEG4 AAC ! */ |
|
|
|
@ -822,7 +829,7 @@ static int wma_decode_block(WMADecodeContext *s) |
|
|
|
|
if (val == (int)0x80000000) { |
|
|
|
|
val = get_bits(&s->gb, 7) - 19; |
|
|
|
|
} else { |
|
|
|
|
code = get_vlc2(&s->gb, s->hgain_vlc.table, VLCBITS, 2); |
|
|
|
|
code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX); |
|
|
|
|
if (code < 0) |
|
|
|
|
return -1; |
|
|
|
|
val += code - 18; |
|
|
|
@ -879,7 +886,7 @@ static int wma_decode_block(WMADecodeContext *s) |
|
|
|
|
eptr = ptr + nb_coefs[ch]; |
|
|
|
|
memset(ptr, 0, s->block_len * sizeof(int16_t)); |
|
|
|
|
for(;;) { |
|
|
|
|
code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, 3); |
|
|
|
|
code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX); |
|
|
|
|
if (code < 0) |
|
|
|
|
return -1; |
|
|
|
|
if (code == 1) { |
|
|
|
|