aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Larsson <banan@ludd.ltu.se>2006-08-19 08:46:52 +0000
committerBenjamin Larsson <banan@ludd.ltu.se>2006-08-19 08:46:52 +0000
commit9aee40d967ca56229e0d4f15e65c484548ad1a38 (patch)
tree16d112fb970180ea752ac7d92c29c025d54c05a2
parenta1c69e0b5097be8fa76c3882f535c6600b0e56b6 (diff)
downloadffmpeg-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.c21
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);
}
}
}