[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