# HG changeset patch # User cehoyos # Date 1268177757 0 # Node ID 01559518729eae262858143f4b9905e359044846 # Parent 95123a24a580349b5db3d5b086ffad9285b52eba SIMD optimization using float_to_int16_interleave. Patch by Zhou Zongyi, zhouzy A os D pku D edu D cn diff -r 95123a24a580 -r 01559518729e wmadec.c --- a/wmadec.c Tue Mar 09 21:50:10 2010 +0000 +++ b/wmadec.c Tue Mar 09 23:35:57 2010 +0000 @@ -790,6 +790,7 @@ /* convert frame to integer */ n = s->frame_len; incr = s->nb_channels; + if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) { for(ch = 0; ch < s->nb_channels; ch++) { ptr = samples + ch; iptr = s->frame_out[ch]; @@ -802,6 +803,16 @@ memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len], s->frame_len * sizeof(float)); } + } else { + float *output[MAX_CHANNELS]; + for (ch = 0; ch < MAX_CHANNELS; ch++) + output[ch] = s->frame_out[ch]; + s->dsp.float_to_int16_interleave(samples, (const float **)output, n, incr); + for(ch = 0; ch < incr; ch++) { + /* prepare for next block */ + memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float)); + } + } #ifdef TRACE dump_shorts(s, "samples", samples, n * s->nb_channels);