diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-11-18 20:56:40 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-11-18 21:00:03 +0100 |
commit | ab184b298d4a54199986de10927258aed18c7b6b (patch) | |
tree | c49d1b3b21a6252118b32eff834c9654e7c0c20d /libavcodec/pcm-dvd.c | |
parent | 5db49fc38d9132e134de92584f296559bec3b789 (diff) | |
download | ffmpeg-ab184b298d4a54199986de10927258aed18c7b6b.tar.gz |
avcodec/pcm-dvd: fix 20/24bit 1 channel
Fixes part of ticket3122
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/pcm-dvd.c')
-rw-r--r-- | libavcodec/pcm-dvd.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libavcodec/pcm-dvd.c b/libavcodec/pcm-dvd.c index b895e39786..243b6aa0bb 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; @@ -187,8 +198,19 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src, *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; |