# HG changeset patch # User kostya # Date 1240719809 0 # Node ID 9a3fddd310925399d5c76da4f556deafffccd941 # Parent 5c1aeaf1bc12579d1a99ddf0cd73ff49bf6b4f39 Correctly update output sample format in wavpack decoder. Patch by Laurent Aimar (at 'fenrir (cons 'videolan 'org)) diff -r 5c1aeaf1bc12 -r 9a3fddd31092 wavpack.c --- a/wavpack.c Sat Apr 25 20:09:34 2009 +0000 +++ b/wavpack.c Sun Apr 26 04:23:29 2009 +0000 @@ -524,7 +524,7 @@ int got_hybrid = 0; const uint8_t* buf_end = buf + buf_size; int i, j, id, size, ssize, weights, t; - int bpp = avctx->bits_per_coded_sample <= 16 ? 2 : 4; + int bpp; if (buf_size == 0){ *data_size = 0; @@ -540,18 +540,27 @@ *data_size = 0; return buf_size; } - /* should not happen but who knows */ - if(s->samples * bpp * avctx->channels > *data_size){ - av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n"); - return -1; + s->frame_flags = AV_RL32(buf); buf += 4; + if((s->frame_flags&0x03) <= 1){ + bpp = 2; + avctx->sample_fmt = SAMPLE_FMT_S16; + } else { + bpp = 4; + avctx->sample_fmt = SAMPLE_FMT_S32; } - s->frame_flags = AV_RL32(buf); buf += 4; s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; s->joint = s->frame_flags & WV_JOINT_STEREO; s->hybrid = s->frame_flags & WV_HYBRID_MODE; s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f); s->CRC = AV_RL32(buf); buf += 4; + + /* should not happen but who knows */ + if(s->samples * bpp * avctx->channels > *data_size){ + av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n"); + return -1; + } + // parse metadata blocks while(buf < buf_end){ id = *buf++;