Skip to content
Snippets Groups Projects
Commit d9cdb7d8 authored by Christian Schmidt's avatar Christian Schmidt Committed by Luca Barbato
Browse files

pcm-dvd: Support channel configuration changes

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.
parent 00a63bfb
No related branches found
No related tags found
No related merge requests found
...@@ -46,7 +46,6 @@ static av_cold int pcm_dvd_decode_init(AVCodecContext *avctx) ...@@ -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 */ /* reserve space for 8 channels, 3 bytes/sample, 4 samples/block */
if (!(s->extra_samples = av_malloc(8 * 3 * 4))) if (!(s->extra_samples = av_malloc(8 * 3 * 4)))
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
s->extra_sample_count = 0;
return 0; return 0;
} }
...@@ -81,6 +80,9 @@ static int pcm_dvd_parse_header(AVCodecContext *avctx, const uint8_t *header) ...@@ -81,6 +80,9 @@ static int pcm_dvd_parse_header(AVCodecContext *avctx, const uint8_t *header)
* header[2] dynamic range control (0x80 = off) * 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 */ /* get the sample depth and derive the sample format from it */
avctx->bits_per_coded_sample = 16 + (header[1] >> 6 & 3) * 4; avctx->bits_per_coded_sample = 16 + (header[1] >> 6 & 3) * 4;
if (avctx->bits_per_coded_sample == 28) { if (avctx->bits_per_coded_sample == 28) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment