X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fpcm-dvd.c;h=77da8bf7e7c0a1b17eb353bfe9e1043fe6b1259e;hb=3adb825650965492f5f874c027b426c0077b523d;hp=9696b091155c5f35ece0592e1d98d79279ef0b59;hpb=e28130bcaf48281b431ea611a546e7520bb90dda;p=ffmpeg diff --git a/libavcodec/pcm-dvd.c b/libavcodec/pcm-dvd.c index 9696b091155..77da8bf7e7c 100644 --- a/libavcodec/pcm-dvd.c +++ b/libavcodec/pcm-dvd.c @@ -173,6 +173,17 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src, #endif return dst16; case 20: + if (avctx->channels == 1) { + do { + for (i = 2; i; i--) { + dst32[0] = bytestream2_get_be16u(&gb) << 16; + dst32[1] = bytestream2_get_be16u(&gb) << 16; + t = bytestream2_get_byteu(&gb); + *dst32++ += (t & 0xf0) << 8; + *dst32++ += (t & 0x0f) << 12; + } + } while (--blocks); + } else { do { for (i = s->groups_per_block; i; i--) { dst32[0] = bytestream2_get_be16u(&gb) << 16; @@ -180,15 +191,26 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src, dst32[2] = bytestream2_get_be16u(&gb) << 16; dst32[3] = bytestream2_get_be16u(&gb) << 16; t = bytestream2_get_byteu(&gb); - *dst32 += (t & 0xf0) << 8; - *dst32 += (t & 0x0f) << 12; + *dst32++ += (t & 0xf0) << 8; + *dst32++ += (t & 0x0f) << 12; t = bytestream2_get_byteu(&gb); - *dst32 += (t & 0xf0) << 8; - *dst32 += (t & 0x0f) << 12; + *dst32++ += (t & 0xf0) << 8; + *dst32++ += (t & 0x0f) << 12; } } while (--blocks); + } return dst32; case 24: + if (avctx->channels == 1) { + do { + for (i = 2; i; i--) { + dst32[0] = bytestream2_get_be16u(&gb) << 16; + dst32[1] = bytestream2_get_be16u(&gb) << 16; + *dst32++ += bytestream2_get_byteu(&gb) << 8; + *dst32++ += bytestream2_get_byteu(&gb) << 8; + } + } while (--blocks); + } else { do { for (i = s->groups_per_block; i; i--) { dst32[0] = bytestream2_get_be16u(&gb) << 16; @@ -201,6 +223,7 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src, *dst32++ += bytestream2_get_byteu(&gb) << 8; } } while (--blocks); + } return dst32; default: return NULL; @@ -225,8 +248,8 @@ static int pcm_dvd_decode_frame(AVCodecContext *avctx, void *data, if ((retval = pcm_dvd_parse_header(avctx, src))) return retval; - if (s->last_block_size != s->block_size) { - av_log(avctx, AV_LOG_WARNING, "block_size has changed\n"); + if (s->last_block_size && s->last_block_size != s->block_size) { + av_log(avctx, AV_LOG_WARNING, "block_size has changed %d != %d\n", s->last_block_size, s->block_size); s->extra_sample_count = 0; } s->last_block_size = s->block_size;