]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Correctly update output sample format in wavpack decoder.
authorkostya <kostya@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sun, 26 Apr 2009 04:23:29 +0000 (04:23 +0000)
committerkostya <kostya@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sun, 26 Apr 2009 04:23:29 +0000 (04:23 +0000)
Patch by Laurent Aimar (at 'fenrir (cons 'videolan 'org))

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18694 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavcodec/wavpack.c

index 4e262a20482a84d3e5e98f46d87392e7412d8833..f31402dafa56450c84cd719d14b63bb2b82b3dfe 100644 (file)
@@ -524,7 +524,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
     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 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
         *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->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++;