diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-09 16:26:11 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-29 16:54:00 -0400 |
commit | 119974b164dd2d09031c61c87c8c59a1819f3a90 (patch) | |
tree | 0f28ddca59fb62c73237aa1480d1865093e29211 /libavcodec/adpcm.c | |
parent | 7c287b18a01df4ace16593f43160aaf16c04070e (diff) | |
download | ffmpeg-119974b164dd2d09031c61c87c8c59a1819f3a90.tar.gz |
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.c | 18 |
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: |