diff options
author | Benjamin Larsson <banan@ludd.ltu.se> | 2006-08-19 08:46:52 +0000 |
---|---|---|
committer | Benjamin Larsson <banan@ludd.ltu.se> | 2006-08-19 08:46:52 +0000 |
commit | 9aee40d967ca56229e0d4f15e65c484548ad1a38 (patch) | |
tree | 16d112fb970180ea752ac7d92c29c025d54c05a2 | |
parent | a1c69e0b5097be8fa76c3882f535c6600b0e56b6 (diff) | |
download | ffmpeg-9aee40d967ca56229e0d4f15e65c484548ad1a38.tar.gz |
SIMD vector optimizations. 3% faster overall decoding.
Originally committed as revision 6026 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/wmadec.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index 6f33d2a8f8..8f44817318 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -130,6 +130,7 @@ typedef struct WMADecodeContext { float lsp_pow_e_table[256]; float lsp_pow_m_table1[(1 << LSP_POW_BITS)]; float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; + DSPContext dsp; #ifdef TRACE int frame_count; @@ -228,6 +229,8 @@ static int wma_decode_init(AVCodecContext * avctx) s->bit_rate = avctx->bit_rate; s->block_align = avctx->block_align; + dsputil_init(&s->dsp, avctx); + if (avctx->codec->id == CODEC_ID_WMAV1) { s->version = 1; } else { @@ -1109,7 +1112,7 @@ static int wma_decode_block(WMADecodeContext *s) if (s->channel_coded[ch]) { DECLARE_ALIGNED_16(FFTSample, output[BLOCK_MAX_SIZE * 2]); float *ptr; - int i, n4, index, n; + int n4, index, n; n = s->block_len; n4 = s->block_len / 2; @@ -1118,27 +1121,17 @@ static int wma_decode_block(WMADecodeContext *s) /* XXX: optimize all that by build the window and multipying/adding at the same time */ - /* multiply by the window */ - for(i=0;i<n * 2;i++) { - output[i] *= window[i]; - } - /* add in the frame */ + /* multiply by the window and add in the frame */ index = (s->frame_len / 2) + s->block_pos - n4; ptr = &s->frame_out[ch][index]; - for(i=0;i<n * 2;i++) { - *ptr += output[i]; - ptr++; - } + s->dsp.vector_fmul_add_add(ptr,window,output,ptr,0,2*n,1); /* specific fast case for ms-stereo : add to second channel if it is not coded */ if (s->ms_stereo && !s->channel_coded[1]) { ptr = &s->frame_out[1][index]; - for(i=0;i<n * 2;i++) { - *ptr += output[i]; - ptr++; - } + s->dsp.vector_fmul_add_add(ptr,window,output,ptr,0,2*n,1); } } } |