[FFmpeg-devel] [PATCH] wmadec.c: SIMD optimization using float_to_int16_interleave
Zhou Zongyi
zhouzy
Tue Mar 9 13:15:23 CET 2010
> ive not reviewed the patch as iam waiting for a clean version without
> cosmetic changes, but nothing of this size that makes a codec 10% can
> be too hackish
Well it seems C version of float_to_int16_interleave does different job from SIMD versions,
so I have to keep the original av_clip_int16(lrintf()) method.
Here is a patch without cosmetics.
Index: libavcodec/wmadec.c
===================================================================
--- libavcodec/wmadec.c (revision 22281)
+++ libavcodec/wmadec.c (working copy)
@@ -790,17 +790,28 @@
/* convert frame to integer */
n = s->frame_len;
incr = s->nb_channels;
- for(ch = 0; ch < s->nb_channels; ch++) {
- ptr = samples + ch;
- iptr = s->frame_out[ch];
+ if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) {
+ for(ch = 0; ch < incr; ch++) {
+ ptr = samples + ch;
+ iptr = s->frame_out[ch];
- for(i=0;i- *ptr = av_clip_int16(lrintf(*iptr++));
- ptr += incr;
+ for(i=0;i+ *ptr = av_clip_int16(lrintf(*iptr++));
+ ptr += incr;
+ }
+ /* prepare for next block */
+ memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
+ s->frame_len * sizeof(float));
}
- /* prepare for next block */
- 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
ZZ
2010-03-09
More information about the ffmpeg-devel
mailing list