[FFmpeg-devel] [PATCH] wmadec.c: SIMD optimization using float_to_int16_interleave
Måns Rullgård
mans
Tue Mar 9 13:59:39 CET 2010
"Zhou Zongyi"<zhouzy at os.pku.edu.cn> writes:
>> 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));
> + }
> }
Still full of whitespace changes => impossible to review.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list