Correctly update output sample format in wavpack decoder.

Patch by Laurent Aimar (at 'fenrir (cons 'videolan 'org))

Originally committed as revision 18694 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Laurent Aimar 16 years ago committed by Kostya Shishkov
parent bdb8d99613
commit 60294c593e
  1. 21
      libavcodec/wavpack.c

@ -524,7 +524,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
int got_hybrid = 0; int got_hybrid = 0;
const uint8_t* buf_end = buf + buf_size; const uint8_t* buf_end = buf + buf_size;
int i, j, id, size, ssize, weights, t; int i, j, id, size, ssize, weights, t;
int bpp = avctx->bits_per_coded_sample <= 16 ? 2 : 4; int bpp;
if (buf_size == 0){ if (buf_size == 0){
*data_size = 0; *data_size = 0;
@ -540,18 +540,27 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
*data_size = 0; *data_size = 0;
return buf_size; 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; 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->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
s->joint = s->frame_flags & WV_JOINT_STEREO; s->joint = s->frame_flags & WV_JOINT_STEREO;
s->hybrid = s->frame_flags & WV_HYBRID_MODE; s->hybrid = s->frame_flags & WV_HYBRID_MODE;
s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; 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->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
s->CRC = AV_RL32(buf); buf += 4; 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 // parse metadata blocks
while(buf < buf_end){ while(buf < buf_end){
id = *buf++; id = *buf++;

Loading…
Cancel
Save