[FFmpeg-devel] [PATCH v1] avfilter/vf_vaguedenoiser: use fabsf() instead of FFABS()

mypopy at gmail.com mypopy at gmail.com
Fri Nov 8 04:26:27 EET 2019


On Fri, Nov 8, 2019 at 10:09 AM Limin Wang <lance.lmwang at gmail.com> wrote:
>
> On Wed, Nov 06, 2019 at 08:10:53PM +0100, Carl Eugen Hoyos wrote:
> > Am Mi., 6. Nov. 2019 um 12:04 Uhr schrieb Limin Wang <lance.lmwang at gmail.com>:
> > >
> > > On Wed, Nov 06, 2019 at 11:11:08AM +0100, Carl Eugen Hoyos wrote:
> > > > Am Mi., 6. Nov. 2019 um 10:31 Uhr schrieb <lance.lmwang at gmail.com>:
> > > > >
> > > > > From: Limin Wang <lance.lmwang at gmail.com>
> > > > >
> > > > > Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> > > > > ---
> > > > >  libavfilter/vf_vaguedenoiser.c | 6 +++---
> > > > >  1 file changed, 3 insertions(+), 3 deletions(-)
> > > > >
> > > > > diff --git a/libavfilter/vf_vaguedenoiser.c b/libavfilter/vf_vaguedenoiser.c
> > > > > index a68f7626e6..75a58c363b 100644
> > > > > --- a/libavfilter/vf_vaguedenoiser.c
> > > > > +++ b/libavfilter/vf_vaguedenoiser.c
> > > > > @@ -335,7 +335,7 @@ static void hard_thresholding(float *block, const int width, const int height,
> > > > >
> > > > >      for (y = 0; y < height; y++) {
> > > > >          for (x = 0; x < width; x++) {
> > > > > -            if (FFABS(block[x]) <= threshold)
> > > > > +            if (fabsf(block[x]) <= threshold)
> > > > >                  block[x] *= frac;
> > > > >          }
> > > > >          block += stride;
> > > > > @@ -359,7 +359,7 @@ static void soft_thresholding(float *block, const int width, const int height, c
> > > > >      for (y = 0; y < height; y++) {
> > > > >          const int x0 = (y < h) ? w : 0;
> > > > >          for (x = x0; x < width; x++) {
> > > > > -            const float temp = FFABS(block[x]);
> > > > > +            const float temp = fabsf(block[x]);
> > > > >              if (temp <= threshold)
> > > > >                  block[x] *= frac;
> > > > >              else
> > > > > @@ -380,7 +380,7 @@ static void qian_thresholding(float *block, const int width, const int height,
> > > > >
> > > > >      for (y = 0; y < height; y++) {
> > > > >          for (x = 0; x < width; x++) {
> > > > > -            const float temp = FFABS(block[x]);
> > > > > +            const float temp = fabsf(block[x]);
> > > > >              if (temp <= threshold) {
> > > > >                  block[x] *= frac;
> > > > >              } else {
> > > >
> > > > Please add a sentence to the commit message that explains why this
> > > > change is a good idea.
> > >
> > > block is float type, so I think it's better to use fabsf, isn't right?
> >
> > Looking at the definition of FFABS(), I don't think this is correct.
>
> Below is one old commit log to describe about it. What's the result for the discussion?
>
>
> commit 8507b98c10d948653375400e2b0a3d4389f74be4
> Author: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
> Date:   Mon Oct 12 01:30:22 2015 -0400
>
>     avfilter,swresample,swscale: use fabs, fabsf instead of FFABS
>
>     It is well known that fabs and fabsf are at least as fast and sometimes
>     faster than the FFABS macro, at least on the gcc+glibc combination.
>     For instance, see the reference:
>     http://patchwork.sourceware.org/patch/6735/.
>     This was a patch to glibc in order to remove their usages of a macro.
>
>     The reason essentially boils down to fabs using the __builtin_fabs of
>     the compiler, while FFABS needs to infer to not use a branch and to
>     simply change the sign bit. Usually the inference works, but sometimes
>     it does not. This may be easily checked by looking at the asm.
>
>     This also has the added benefit of reducing macro usage, which has
>     problems with side-effects.
>
>     Note that avcodec is not handled here, as it is huge and
>     most things there are integer arithmetic anyway.
>
>     Tested with FATE.
>
>     Reviewed-by: Clément Bœsch <u at pkh.me>
>     Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>
>
>
> >

Is it has some performance data after change FFABS to fabsf in this filter?   As
my personal opinion,  if FFABS is not a performance bottleneck in this filter,
keep the old way may be better.

Swresample, swscale are the other thing, they are basic components for
another part
in FFmpeg, so I think we can use the fabsf for potential performance income.


More information about the ffmpeg-devel mailing list