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

Reimar Döffinger Reimar.Doeffinger
Sat Jul 12 11:53:18 CEST 2008


Hello,
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...

Greetings,
Reimar D?ffinger
-------------- next part --------------
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index a9a8f74..91fe9a0 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -605,14 +605,14 @@ static int adpcm_encode_frame(AVCodecContext *avctx,
         }
         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++;
 
             bytestream_put_le16(&dst, c->status[i].sample2);
         }
+        for(i=0; i<avctx->channels; i++)
+            bytestream_put_le16(&dst, c->status[i].sample1);
 
         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..bb277d7 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
+5e380ba6f403e12665baed17ef70f64f *./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
+852b38f93a20ff872f402542ec3656f1 *./tests/data/adpcm_ms.vsynth.out.wav
+stddev:3601.01 PSNR:25.19 bytes:1054720
 ab11d9151644cbff27827b7e89f37aa9 *./tests/data/a-adpcm_yam.wav
 264248 ./tests/data/a-adpcm_yam.wav
 e92cec8c07913ffb91ad2b11f79cdc00 *./tests/data/adpcm_yam.vsynth.out.wav



More information about the ffmpeg-devel mailing list