summaryrefslogtreecommitdiff
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-09-09 16:26:11 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2011-09-29 16:54:00 -0400
commit119974b164dd2d09031c61c87c8c59a1819f3a90 (patch)
tree0f28ddca59fb62c73237aa1480d1865093e29211 /libavcodec/adpcm.c
parent7c287b18a01df4ace16593f43160aaf16c04070e (diff)
adpcm_ima_wav: process channel-interleaved blocks sequentially rather than simultaneously.
Speeds up the ADPCM IMA WAV decoder by 15-20% overall.
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index df316fb646..80e36e536f 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -448,14 +448,18 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
}
while(src < buf + buf_size){
- for(m=0; m<4; m++){
- for(i=0; i<=st; i++)
- *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] & 0x0F, 3);
- for(i=0; i<=st; i++)
- *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] >> 4 , 3);
- src++;
+ for (i = 0; i < avctx->channels; i++) {
+ cs = &c->status[i];
+ for (m = 0; m < 4; m++) {
+ uint8_t v = *src++;
+ *samples = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
+ samples += avctx->channels;
+ *samples = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
+ samples += avctx->channels;
+ }
+ samples -= 8 * avctx->channels - 1;
}
- src += 4*st;
+ samples += 7 * avctx->channels;
}
break;
case CODEC_ID_ADPCM_4XM: