[FFmpeg-devel] [PATCH 3/3] avfilter/vf_lenscorrection: get rid of floats i init code

Daniel Oberhoff danieloberhoff at gmail.com
Wed Aug 20 14:42:35 CEST 2014


---
 Daniel Oberhoff 
 daniel.oberhoff at gmail.com



On Aug 20, 2014, at 2:17 PM, Michael Niedermayer <michaelni at gmx.at> wrote:

> The only remaining floats are in the user interface, they are left as they
> should not cause a problem in practice
> ---
> libavfilter/vf_lenscorrection.c |   13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/libavfilter/vf_lenscorrection.c b/libavfilter/vf_lenscorrection.c
> index 11fa4c8..d30a81b 100644
> --- a/libavfilter/vf_lenscorrection.c
> +++ b/libavfilter/vf_lenscorrection.c
> @@ -149,8 +149,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
>         int h = rect->height / vdiv;
>         int xcenter = rect->cx * w;
>         int ycenter = rect->cy * h;
> -        float k1 = rect->k1;
> -        float k2 = rect->k2;
> +        int k1 = rect->k1 * (1<<24);
> +        int k2 = rect->k2 * (1<<24);
>         ThreadData td = {
>             .in = in,
>             .out  = out,
> @@ -162,7 +162,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
> 
>         if (!rect->correction[plane]) {
>             int i,j;
> -            const float r2inv = 4.0 / (w * w + h * h);
> +            const int64_t r2inv = (4LL<<60) / (w * w + h * h);
> 
>             rect->correction[plane] = av_malloc_array(w, h * sizeof(**rect->correction));
>             if (!rect->correction[plane])
> @@ -172,9 +172,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
>                 const int off_y2 = off_y * off_y;
>                 for (i = 0; i < w; i++) {
>                     const int off_x = i - xcenter;
> -                    const float r2 = (off_x * off_x + off_y2) * r2inv;
> -                    const float radius_mult = 1.0f + r2 * k1 + r2 * r2 * k2;
> -                    rect->correction[plane][j * w + i] = lrintf(radius_mult * (1<<24));
> +                    const int64_t r2 = ((off_x * off_x + off_y2) * r2inv + (1LL<<31)) >> 32;

won’t this potentially overflow for large off_x if int is 32bit? (same above for off_y2)

> +                    const int64_t r4 = (r2 * r2 + (1<<27)) >> 28;
> +                    const int radius_mult = (r2 * k1 + r4 * k2 + (1LL<<27) + (1LL<<52))>>28;
> +                    rect->correction[plane][j * w + i] = radius_mult;
>                 }
>             }
>         }
> -- 
> 1.7.9.5
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel



More information about the ffmpeg-devel mailing list