[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