summaryrefslogtreecommitdiff
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2016-05-04 11:33:34 +0200
committerPaul B Mahol <onemda@gmail.com>2016-05-04 11:33:34 +0200
commit66eb5b809add21f8f977b9efb0fe3b4fd6253d38 (patch)
tree8d044a2825dd7206047b4e30d2d7cf1dd23a7632 /libavcodec/adpcm.c
parent3395ad48fa2f018bd3d33324f2e5a9c89af4357e (diff)
avcodec/adpcm: fix decoding of stereo non 4-bit ADPCM IMA WAV
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 791631751d..0b6b92e8dc 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -783,15 +783,23 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
if (avctx->bits_per_coded_sample != 4) {
int samples_per_block = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
+ int block_size = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
+ uint8_t temp[20] = { 0 };
GetBitContext g;
- ret = init_get_bits8(&g, gb.buffer, bytestream2_get_bytes_left(&gb));
- if (ret < 0)
- return ret;
for (n = 0; n < (nb_samples - 1) / samples_per_block; n++) {
for (i = 0; i < avctx->channels; i++) {
+ int j;
+
cs = &c->status[i];
samples = &samples_p[i][1 + n * samples_per_block];
+ for (j = 0; j < block_size; j++) {
+ temp[j] = buf[4 * avctx->channels + block_size * n * avctx->channels +
+ (j % 4) + (j / 4) * (avctx->channels * 4) + i * 4];
+ }
+ ret = init_get_bits8(&g, (const uint8_t *)&temp, block_size);
+ if (ret < 0)
+ return ret;
for (m = 0; m < samples_per_block; m++) {
samples[m] = adpcm_ima_wav_expand_nibble(cs, &g,
avctx->bits_per_coded_sample);