Von meinem iPhone gesendet

> Am 20.08.2014 um 03:16 schrieb Michael Niedermayer <michae...@gmx.at>:
> 
>> On Wed, Aug 20, 2014 at 12:12:49AM +0200, Daniel Oberhoff wrote:
>> Hello,
>> 
>> As a follow-up to my last patch I now factored out the floating point based 
>> interpolation from transform.h/transform.c and applied it in the 
>> vf_lenscorrection filter I introduced in my last patch. What I did not do is 
>> also factor out fixed point based interpolation as used in vf_rotate and 
>> vf_perspective and maybe others as could probably also be done. Also I did 
>> not look further for uses of floating point based interpolation. Basically I 
>> just wanted to introduce interpolation in vf_lenscorrection without code 
>> duplication. As a side note I also tried to introduce fixed point 
>> calculations to vf_lenscorrection but found myself effectively doing 
>> floating point “by hand” since due to the high order of the algorithm (up to 
>> 4th order) it is very hard to keep track of the right amount of 
>> pre/post-comma digits for a given step in the algorithm and given parameters 
>> and it felt rather futile after a while.
> 
>> Looking forward to reviews :).
> 
> why did you use the deshake code and not the vf_perspective code ?!
> i suspect this will be quite a bit harder to get into shape for a
> common API
> 

As i Said, perspective does fixed point calculations. Also would you care to 
ekaborate what exactly are your whoes with this API?

> 
>> 
>> From 4b271f72946aeebf5603cc8779f6b61ff0c1bd49 Mon Sep 17 00:00:00 2001
>> From: James Almer <jamr...@gmail.com>
>> Date: Sun, 10 Aug 2014 02:24:01 -0300
>> Subject: [PATCH] afvilter: re-factor/re-use floating point based 
>> interpolation
>> from vf_perspective
>> 
>> ---
>> doc/filters.texi                |  11 +++
>> libavfilter/interpolate.h       | 144 
>> ++++++++++++++++++++++++++++++++++++++++
>> libavfilter/transform.c         |  91 ++-----------------------
>> libavfilter/transform.h         |  14 +---
>> libavfilter/vf_lenscorrection.c |  21 ++++--
>> 5 files changed, 176 insertions(+), 105 deletions(-)
>> create mode 100644 libavfilter/interpolate.h
>> 
>> diff --git a/doc/filters.texi b/doc/filters.texi
>> index 0ca1d6f..2edefc4 100644
>> --- a/doc/filters.texi
>> +++ b/doc/filters.texi
>> @@ -5582,6 +5582,17 @@ height.
>> Coefficient of the quadratic correction term. 0.5 means no correction.
>> @item k2
>> Coefficient of the double quadratic correction term. 0.5 means no correction.
>> +@item interpolation
>> +Set the interpolation method for the transformation
>> +
>> +It accepts the following values:
>> +@table @samp
>> +@item nearest
>> +@item linear
>> +@item cubic
>> +@end table
>> +Default value is @samp{linear}.
>> +
>> @end table
>> 
>> The formula that generates the correction is:
>> diff --git a/libavfilter/interpolate.h b/libavfilter/interpolate.h
>> new file mode 100644
>> index 0000000..6f7a849
>> --- /dev/null
>> +++ b/libavfilter/interpolate.h
>> @@ -0,0 +1,144 @@
>> +/*
>> + * Copyright (C) 2010 Georg Martius <georg.mart...@web.de>
>> + * Copyright (C) 2010 Daniel G. Taylor <d...@programmer-art.org>
>> + *
>> + * This file is part of FFmpeg.
>> + *
>> + * FFmpeg is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * FFmpeg is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with FFmpeg; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
>> USA
>> + */
>> +
>> +#ifndef AVFILTER_INTERPOLATE_H
>> +#define AVFILTER_INTERPOLATE_H
>> +
>> +enum InterpolateMethod {
>> +    INTERPOLATE_NEAREST,        //< Nearest-neighbor (fast)
>> +    INTERPOLATE_BILINEAR,       //< Bilinear
>> +    INTERPOLATE_BIQUADRATIC,    //< Biquadratic (best)
>> +    INTERPOLATE_COUNT,          //< Number of interpolation methods
>> +};
>> +
>> +// Shortcuts for the fastest and best interpolation methods
>> +#define INTERPOLATE_DEFAULT INTERPOLATE_BILINEAR
>> +#define INTERPOLATE_FAST    INTERPOLATE_NEAREST
>> +#define INTERPOLATE_BEST    INTERPOLATE_BIQUADRATIC
>> +
>> +#define INTERPOLATE_METHOD(name) \
>> +    static av_always_inline uint8_t name(float x, float y, const uint8_t 
>> *src, \
>> +                                         int width, int height, int stride, 
>> uint8_t def)
>> +
> 
>> +/**
>> + * Nearest neighbor interpolation
>> + */
>> +INTERPOLATE_METHOD(interpolate_nearest)
>> +{
>> +    if (x < 0 || x >= width || y < 0 || y >= height) {
>> +        return def;
>> +    } else {
>> +        return src[(int)(x + 0.5f) + stride * (int)(y + 0.5f)];
>> +    }
>> +}
> 
> i dont think using float in a nearest neighbor resampler is acceptable
> 
> 
>> +
>> +/**
>> + * Bilinear interpolation
>> + */
>> +INTERPOLATE_METHOD(interpolate_bilinear)
>> +{
>> +    int x_c, x_f, y_c, y_f;
>> +    int v1, v2, v3, v4;
>> +    const uint8_t *line_y_f, *line_y_c;
>> +
>> +    if (x < 0 || x >= width || y < 0 || y >= height) {
>> +        return def;
>> +    } else {
>> +        x_f = (int)x;
>> +        x_c = x_f + 1;
>> +
>> +        y_f = (int)y;
>> +        y_c = y_f + 1;
>> +
>> +        line_y_f = src + stride * y_c;
>> +        line_y_c = line_y_f + stride;
>> +
>> +        v1 = line_y_c[x_c];
>> +        v2 = line_y_f[x_c];
>> +        v3 = line_y_c[x_f];
>> +        v4 = line_y_f[x_f];
>> +
>> +        return (v1*(x - x_f)*(y - y_f) + v2*((x - x_f)*(y_c - y)) +
>> +                v3*(x_c - x)*(y - y_f) + v4*((x_c - x)*(y_c - y)));
>> +    }
>> +}
> 
> 
>> +
>> +/**
>> + * Biquadratic interpolation
>> + */
>> +INTERPOLATE_METHOD(interpolate_biquadratic)
>> +{
>> +    int     x_c, x_f, y_c, y_f;
>> +    uint8_t v1,  v2,  v3,  v4;
>> +    float   f1,  f2,  f3,  f4;
>> +    const uint8_t *line_y_f, *line_y_c;
>> +
>> +    if (x < 0 || x >= width || y < 0 || y >= height) {
>> +        return def;
>> +    } else {
>> +        x_f = (int)x;
>> +        x_c = x_f + 1;
>> +        y_f = (int)y;
>> +        y_c = y_f + 1;
>> +
>> +        line_y_f = src + stride * y_c;
>> +        line_y_c = line_y_f + stride;
>> +
>> +        v1 = line_y_c[x_c];
>> +        v2 = line_y_f[x_c];
>> +        v3 = line_y_c[x_f];
>> +        v4 = line_y_f[x_f];
>> +
>> +        f1 = 1 - sqrt((x_c - x) * (y_c - y));
>> +        f2 = 1 - sqrt((x_c - x) * (y - y_f));
>> +        f3 = 1 - sqrt((x - x_f) * (y_c - y));
>> +        f4 = 1 - sqrt((x - x_f) * (y - y_f));
>> +        return (v1 * f1 + v2 * f2 + v3 * f3 + v4 * f4) / (f1 + f2 + f3 + 
>> f4);
>> +    }
>> +}
> 
> There should be bilinear and bicubic filters.
> If you want to add windowed sinc filters or spline based ones i dont
> mind.
> But ive no faith that this odd filter above which has the order of a
> bilinear one will look all that great. And it sure wont be fast with
> sqrt() per sample
> 
> also
> one way to do higher order filters is to create a LUT with the filter
> Coefficients, for example if you want 8bit sub pixel precission and
> a bicubic filter that makes just 256 * 4 entries, 4 Coefficients for
> each 256 subpixel positions.
> 
> That LUT can be filled by using the float code from vf_perspective
> 
> or if done without LUT the code from vf_perspective can also be used
> directly and doesnt need any functions like sqrt() and at the
> same time should be higher quality
> 
> [...]
> -- 
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> 
> Complexity theory is the science of finding the exact solution to an
> approximation. Benchmarking OTOH is finding an approximation of the exact
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to