diff options
author | Jindřich Makovička <makovick@gmail.com> | 2006-02-11 19:39:05 +0000 |
---|---|---|
committer | Jindřich Makovička <makovick@gmail.com> | 2006-02-11 19:39:05 +0000 |
commit | 63a5b0b1aeaf514cae3b2be22b59c9ba1170bd2a (patch) | |
tree | ce74217cc4f66536946854408d7944dc2f3b7614 /libavcodec/wmadec.c | |
parent | dc2a1ce5c0753de76c623151fa78db6f407c113b (diff) | |
download | ffmpeg-63a5b0b1aeaf514cae3b2be22b59c9ba1170bd2a.tar.gz |
- fix insufficient code length for exp_vlc
- move vlc tweaking parameters to one place
Originally committed as revision 4987 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/wmadec.c')
-rw-r--r-- | libavcodec/wmadec.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index c557a2a7a5..5bf87ac386 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -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) { |