[FFmpeg-cvslog] avcodec/adpcm: fix decoding of stereo non 4-bit ADPCM IMA WAV

Paul B Mahol git at videolan.org
Wed May 4 11:35:40 CEST 2016


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Wed May  4 11:33:34 2016 +0200| [66eb5b809add21f8f977b9efb0fe3b4fd6253d38] | committer: Paul B Mahol

avcodec/adpcm: fix decoding of stereo non 4-bit ADPCM IMA WAV

Signed-off-by: Paul B Mahol <onemda at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=66eb5b809add21f8f977b9efb0fe3b4fd6253d38
---

 libavcodec/adpcm.c |   14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 7916317..0b6b92e 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);



More information about the ffmpeg-cvslog mailing list