[FFmpeg-devel] [RFC] wrong MS ADPC decoding

Reimar Döffinger Reimar.Doeffinger
Sun Jul 13 15:28:14 CEST 2008


Hello,
On Sat, Jul 12, 2008 at 11:53:18AM +0200, Reimar D?ffinger wrote:
> by comparing with MPlayer decoder and an listen test with
> http://samples.mplayerhq.hu/A-codecs/msadpcm-stereo/dance-b5th.asf I
> came to the conclusion that the FFmpeg decoder decodes incorrectly,
> the directly-stored samples should be swapped, as with attached patch.
> Could you please verify?
> Looking at the PSNR of the new encoder regression tests there is still
> something wrong, and the last ca. 12 kB of the decoded audio still
> differs between MPlayer and FFmpeg decoders...

Updated, the encoder part as Michael pointed out was wrong.

Greetings,
Reimar D?ffinger
-------------- next part --------------
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index a9a8f74..b4b716f 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -604,15 +604,15 @@ static int adpcm_encode_frame(AVCodecContext *avctx,
             bytestream_put_le16(&dst, c->status[i].idelta);
         }
         for(i=0; i<avctx->channels; i++){
+            c->status[i].sample2= *samples++;
+        }
+        for(i=0; i<avctx->channels; i++){
             c->status[i].sample1= *samples++;
 
             bytestream_put_le16(&dst, c->status[i].sample1);
         }
-        for(i=0; i<avctx->channels; i++){
-            c->status[i].sample2= *samples++;
-
+        for(i=0; i<avctx->channels; i++)
             bytestream_put_le16(&dst, c->status[i].sample2);
-        }
 
         if(avctx->trellis > 0) {
             int n = avctx->block_align - 7*avctx->channels;
@@ -1050,10 +1050,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
         if (st) c->status[1].sample2 = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00));
         if (st) src+=2;
 
-        *samples++ = c->status[0].sample1;
-        if (st) *samples++ = c->status[1].sample1;
         *samples++ = c->status[0].sample2;
         if (st) *samples++ = c->status[1].sample2;
+        *samples++ = c->status[0].sample1;
+        if (st) *samples++ = c->status[1].sample1;
         for(;n>0;n--) {
             *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], src[0] >> 4  );
             *samples++ = adpcm_ms_expand_nibble(&c->status[st], src[0] & 0x0F);
diff --git a/tests/ffmpeg.regression.ref b/tests/ffmpeg.regression.ref
index 75f51af..7bdea4d 100644
--- a/tests/ffmpeg.regression.ref
+++ b/tests/ffmpeg.regression.ref
@@ -181,10 +181,10 @@ efdae2746040dbc27be402b149556f1e *./tests/data/a-adpcm_qt.aiff
 281184 ./tests/data/a-adpcm_qt.aiff
 5a2084ad27674d5cf3bc2945061e7910 *./tests/data/adpcm_ima_qt.vsynth.out.wav
 stddev:915.35 PSNR:37.09 bytes:1056768
-628d4789cf9ee16a756ac54b7fd8650d *./tests/data/a-adpcm_ms.wav
+88a0c48c9bc6d50a84c408151c6a3d64 *./tests/data/a-adpcm_ms.wav
 267320 ./tests/data/a-adpcm_ms.wav
-91a84bb4f319a3a0bf0c0441b3d3a529 *./tests/data/adpcm_ms.vsynth.out.wav
-stddev:1050.18 PSNR:35.89 bytes:1054720
+d5f98f5136040be42232a34df92d61f2 *./tests/data/adpcm_ms.vsynth.out.wav
+stddev:1051.84 PSNR:35.88 bytes:1054720
 ab11d9151644cbff27827b7e89f37aa9 *./tests/data/a-adpcm_yam.wav
 264248 ./tests/data/a-adpcm_yam.wav
 e92cec8c07913ffb91ad2b11f79cdc00 *./tests/data/adpcm_yam.vsynth.out.wav
diff --git a/tests/rotozoom.regression.ref b/tests/rotozoom.regression.ref
index 054145a..eaab2cc 100644
--- a/tests/rotozoom.regression.ref
+++ b/tests/rotozoom.regression.ref
@@ -181,10 +181,10 @@ efdae2746040dbc27be402b149556f1e *./tests/data/a-adpcm_qt.aiff
 281184 ./tests/data/a-adpcm_qt.aiff
 5a2084ad27674d5cf3bc2945061e7910 *./tests/data/adpcm_ima_qt.rotozoom.out.wav
 stddev:915.35 PSNR:37.09 bytes:1056768
-628d4789cf9ee16a756ac54b7fd8650d *./tests/data/a-adpcm_ms.wav
+88a0c48c9bc6d50a84c408151c6a3d64 *./tests/data/a-adpcm_ms.wav
 267320 ./tests/data/a-adpcm_ms.wav
-91a84bb4f319a3a0bf0c0441b3d3a529 *./tests/data/adpcm_ms.rotozoom.out.wav
-stddev:1050.18 PSNR:35.89 bytes:1054720
+d5f98f5136040be42232a34df92d61f2 *./tests/data/adpcm_ms.rotozoom.out.wav
+stddev:1051.84 PSNR:35.88 bytes:1054720
 ab11d9151644cbff27827b7e89f37aa9 *./tests/data/a-adpcm_yam.wav
 264248 ./tests/data/a-adpcm_yam.wav
 e92cec8c07913ffb91ad2b11f79cdc00 *./tests/data/adpcm_yam.rotozoom.out.wav



More information about the ffmpeg-devel mailing list