From 14165fe1256e0f11ba3d9cf574492ae528e5c9cf Mon Sep 17 00:00:00 2001 From: Hendrik Leppkes Date: Fri, 16 Dec 2011 22:41:29 +0100 Subject: wavpack: determine sample_fmt before requesting a buffer Signed-off-by: Justin Ruggles --- libavcodec/wavpack.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'libavcodec/wavpack.c') diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 7d16a9b5a6..95a67a98c1 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -783,13 +783,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, s->samples = wc->samples; } s->frame_flags = AV_RL32(buf); buf += 4; - if(s->frame_flags&0x80){ - avctx->sample_fmt = AV_SAMPLE_FMT_FLT; - } else if((s->frame_flags&0x03) <= 1){ - avctx->sample_fmt = AV_SAMPLE_FMT_S16; - } else { - avctx->sample_fmt = AV_SAMPLE_FMT_S32; - } bpp = av_get_bytes_per_sample(avctx->sample_fmt); samples = (uint8_t*)samples + bpp * wc->ch_offset; @@ -1147,7 +1140,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, WavpackContext *s = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - int frame_size, ret; + int frame_size, ret, frame_flags; int samplecount = 0; s->block = 0; @@ -1155,12 +1148,16 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, /* determine number of samples */ if(s->mkv_mode){ - s->samples = AV_RL32(buf); buf += 4; + s->samples = AV_RL32(buf); buf += 4; + frame_flags = AV_RL32(buf); } else { - if (s->multichannel) - s->samples = AV_RL32(buf + 4); - else - s->samples = AV_RL32(buf); + if (s->multichannel) { + s->samples = AV_RL32(buf + 4); + frame_flags = AV_RL32(buf + 8); + } else { + s->samples = AV_RL32(buf); + frame_flags = AV_RL32(buf + 4); + } } if (s->samples <= 0) { av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n", @@ -1168,6 +1165,14 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, return AVERROR(EINVAL); } + if (frame_flags & 0x80) { + avctx->sample_fmt = AV_SAMPLE_FMT_FLT; + } else if ((frame_flags & 0x03) <= 1) { + avctx->sample_fmt = AV_SAMPLE_FMT_S16; + } else { + avctx->sample_fmt = AV_SAMPLE_FMT_S32; + } + /* get output buffer */ s->frame.nb_samples = s->samples; if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { -- cgit v1.2.3