diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/wmadec.c')
-rw-r--r-- | src/libffmpeg/libavcodec/wmadec.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/libffmpeg/libavcodec/wmadec.c b/src/libffmpeg/libavcodec/wmadec.c index 0eef66c6b..7505a9be3 100644 --- a/src/libffmpeg/libavcodec/wmadec.c +++ b/src/libffmpeg/libavcodec/wmadec.c @@ -122,7 +122,7 @@ static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len); #include "wmadata.h" #ifdef DEBUG_TRACE - +#include <stdarg.h> int frame_count; static FILE *flog; @@ -245,7 +245,7 @@ static int wma_decode_init(AVCodecContext * avctx) s->bit_rate = avctx->bit_rate; s->block_align = avctx->block_align; - if (avctx->codec_id == CODEC_ID_WMAV1) { + if (avctx->codec->id == CODEC_ID_WMAV1) { s->version = 1; } else { s->version = 2; @@ -270,14 +270,22 @@ static int wma_decode_init(AVCodecContext * avctx) /* compute MDCT block size */ if (s->sample_rate <= 16000) { s->frame_len_bits = 9; - } else if (s->sample_rate <= 32000 && s->version == 1) { + } else if (s->sample_rate <= 22050 || + (s->sample_rate <= 32000 && s->version == 1)) { s->frame_len_bits = 10; } else { s->frame_len_bits = 11; } s->frame_len = 1 << s->frame_len_bits; if (s->use_variable_block_len) { - s->nb_block_sizes = s->frame_len_bits - BLOCK_MIN_BITS + 1; + int nb_max, nb; + nb = ((flags2 >> 3) & 3) + 1; + if ((s->bit_rate / s->nb_channels) >= 32000) + nb += 2; + nb_max = s->frame_len_bits - BLOCK_MIN_BITS; + if (nb > nb_max) + nb = nb_max; + s->nb_block_sizes = nb + 1; } else { s->nb_block_sizes = 1; } @@ -352,8 +360,8 @@ static int wma_decode_init(AVCodecContext * avctx) s->block_align); printf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n", bps, bps1, high_freq, s->byte_offset_bits); - printf("use_noise_coding=%d use_exp_vlc=%d\n", - s->use_noise_coding, s->use_exp_vlc); + printf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", + s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); #endif /* compute the scale factor band sizes for each MDCT block size */ @@ -472,7 +480,7 @@ static int wma_decode_init(AVCodecContext * avctx) /* init MDCT */ for(i = 0; i < s->nb_block_sizes; i++) - mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1); + ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1); /* init MDCT windows : simple sinus window */ for(i = 0; i < s->nb_block_sizes; i++) { @@ -1116,8 +1124,8 @@ static int wma_decode_block(WMADecodeContext *s) n = s->block_len; n4 = s->block_len / 2; - imdct_calc(&s->mdct_ctx[bsize], - output, s->coefs[ch], s->mdct_tmp); + ff_imdct_calc(&s->mdct_ctx[bsize], + output, s->coefs[ch], s->mdct_tmp); /* XXX: optimize all that by build the window and multipying/adding at the same time */ @@ -1183,7 +1191,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples) iptr = s->frame_out[ch]; for(i=0;i<n;i++) { - a = lrint(*iptr++); + a = lrintf(*iptr++); if (a > 32767) a = 32767; else if (a < -32768) @@ -1274,7 +1282,7 @@ static int wma_decode_superframe(AVCodecContext *avctx, s->last_bitoffset = pos & 7; pos >>= 3; len = buf_size - pos; - if (len > MAX_CODED_SUPERFRAME_SIZE) { + if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) { return -1; } s->last_superframe_len = len; @@ -1295,7 +1303,7 @@ static int wma_decode_end(AVCodecContext *avctx) int i; for(i = 0; i < s->nb_block_sizes; i++) - mdct_end(&s->mdct_ctx[i]); + ff_mdct_end(&s->mdct_ctx[i]); for(i = 0; i < s->nb_block_sizes; i++) av_free(s->windows[i]); |