pcm-dvd: Support channel configuration changes
authorChristian Schmidt <schmidt@digadd.de>
Wed, 11 Sep 2013 14:12:27 +0000 (16:12 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Fri, 13 Sep 2013 10:14:05 +0000 (12:14 +0200)
The sample buffering logic does not take into account that the blocksize
could change. Reset the buffer if the channel configuration changes,
since if there are leftover samples, it is most likely a broken or
misconcatenated stream. This could lead to negative numbers for
missing_samples during decoding.

Thanks to Michael Niedermeyer for pointing these out.

libavcodec/pcm-dvd.c

index 9fd6d13365c7ea50ce5eff25b9b423283643748c..3f092f646ad385c19a65c066545b16bc2d36b588 100644 (file)
@@ -46,7 +46,6 @@ static av_cold int pcm_dvd_decode_init(AVCodecContext *avctx)
     /* reserve space for 8 channels, 3 bytes/sample, 4 samples/block */
     if (!(s->extra_samples = av_malloc(8 * 3 * 4)))
         return AVERROR(ENOMEM);
-    s->extra_sample_count = 0;
 
     return 0;
 }
@@ -81,6 +80,9 @@ static int pcm_dvd_parse_header(AVCodecContext *avctx, const uint8_t *header)
      * header[2] dynamic range control (0x80 = off)
      */
 
+    /* Discard potentially existing leftover samples from old channel layout */
+    s->extra_sample_count = 0;
+
     /* get the sample depth and derive the sample format from it */
     avctx->bits_per_coded_sample = 16 + (header[1] >> 6 & 3) * 4;
     if (avctx->bits_per_coded_sample == 28) {