Re: [FFmpeg-devel] [PATCH] avfilter: add acontrast filter
On 11/18/17, Rostislav Pehlivanov wrote: > On 18 November 2017 at 10:44, Paul B Mahol wrote: > >> Signed-off-by: Paul B Mahol >> --- >> doc/filters.texi | 10 +++ >> libavfilter/Makefile | 1 + >> libavfilter/af_acontrast.c | 219 ++ >> +++ >> libavfilter/allfilters.c | 1 + >> 4 files changed, 231 insertions(+) >> create mode 100644 libavfilter/af_acontrast.c >> >> diff --git a/doc/filters.texi b/doc/filters.texi >> index 5d99437871..e35952510b 100644 >> --- a/doc/filters.texi >> +++ b/doc/filters.texi >> @@ -429,6 +429,16 @@ How much to use compressed signal in output. Default >> is 1. >> Range is between 0 and 1. >> @end table >> >> +@section acontrast >> +Simple audio dynamic range commpression/expansion filter. >> + >> +The filter accepts the following options: >> + >> +@table @option >> +@item c >> +Set contrast. Default is 33. Allowed range is between 0 and 100. >> +@end table >> + >> @section acopy >> >> Copy the input audio source unchanged to the output. This is mainly >> useful for >> diff --git a/libavfilter/Makefile b/libavfilter/Makefile >> index 9acae3ff5b..71c6333a52 100644 >> --- a/libavfilter/Makefile >> +++ b/libavfilter/Makefile >> @@ -31,6 +31,7 @@ OBJS-$(CONFIG_QSVVPP)+= qsvvpp.o >> # audio filters >> OBJS-$(CONFIG_ABENCH_FILTER) += f_bench.o >> OBJS-$(CONFIG_ACOMPRESSOR_FILTER)+= af_sidechaincompress.o >> +OBJS-$(CONFIG_ACONTRAST_FILTER) += af_acontrast.o >> OBJS-$(CONFIG_ACOPY_FILTER) += af_acopy.o >> OBJS-$(CONFIG_ACROSSFADE_FILTER) += af_afade.o >> OBJS-$(CONFIG_ACRUSHER_FILTER) += af_acrusher.o >> diff --git a/libavfilter/af_acontrast.c b/libavfilter/af_acontrast.c >> new file mode 100644 >> index 00..38de08ffe5 >> --- /dev/null >> +++ b/libavfilter/af_acontrast.c >> @@ -0,0 +1,219 @@ >> +/* >> + * Copyright (c) 2008 Rob Sykes >> + * Copyright (c) 2017 Paul B Mahol >> + * >> + * 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 >> + */ >> + >> +#include "libavutil/channel_layout.h" >> +#include "libavutil/opt.h" >> +#include "avfilter.h" >> +#include "audio.h" >> +#include "formats.h" >> + >> +typedef struct AudioContrastContext { >> +const AVClass *class; >> +float contrast; >> +void (*filter)(void **dst, const void **src, >> + int nb_samples, int channels, float contrast); >> +} AudioContrastContext; >> + >> +#define OFFSET(x) offsetof(AudioContrastContext, x) >> +#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM >> + >> +static const AVOption acontrast_options[] = { >> +{ "c", "set contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, >> {.dbl=33}, 0, 100, A }, >> > > "contrast" instead of "c"? Not sure if single letter options are a good > idea. > > > >> +{ NULL } >> +}; >> + >> +AVFILTER_DEFINE_CLASS(acontrast); >> + >> +static int query_formats(AVFilterContext *ctx) >> +{ >> +AVFilterFormats *formats = NULL; >> +AVFilterChannelLayouts *layouts = NULL; >> +static const enum AVSampleFormat sample_fmts[] = { >> +AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, >> +AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP, >> +AV_SAMPLE_FMT_NONE >> +}; >> +int ret; >> + >> +formats = ff_make_format_list(sample_fmts); >> +if (!formats) >> +return AVERROR(ENOMEM); >> +ret = ff_set_common_formats(ctx, formats); >> +if (ret < 0) >> +return ret; >> + >> +layouts = ff_all_channel_counts(); >> +if (!layouts) >> +return AVERROR(ENOMEM); >> + >> +ret = ff_set_common_channel_layouts(ctx, layouts); >> +if (ret < 0) >> +return ret; >> + >> +formats = ff_all_samplerates(); >> +return ff_set_common_samplerates(ctx, formats); >> +} >> + >> +static void filter_flt(void **d, const void **s, >> + int nb_samples, int channels, >> + float contrast) >> +{ >> +const float *src = s[0]; >> +float *dst = d[0]; >> +int n, c; >> + >> +for (n = 0; n < nb_samples; n++) { >> +for (c = 0; c < channels; c++) { >> +double d = src[c] * M_PI_2; >> + >> +dst
Re: [FFmpeg-devel] [PATCH] avfilter: add acontrast filter
On 18 November 2017 at 10:44, Paul B Mahol wrote: > Signed-off-by: Paul B Mahol > --- > doc/filters.texi | 10 +++ > libavfilter/Makefile | 1 + > libavfilter/af_acontrast.c | 219 ++ > +++ > libavfilter/allfilters.c | 1 + > 4 files changed, 231 insertions(+) > create mode 100644 libavfilter/af_acontrast.c > > diff --git a/doc/filters.texi b/doc/filters.texi > index 5d99437871..e35952510b 100644 > --- a/doc/filters.texi > +++ b/doc/filters.texi > @@ -429,6 +429,16 @@ How much to use compressed signal in output. Default > is 1. > Range is between 0 and 1. > @end table > > +@section acontrast > +Simple audio dynamic range commpression/expansion filter. > + > +The filter accepts the following options: > + > +@table @option > +@item c > +Set contrast. Default is 33. Allowed range is between 0 and 100. > +@end table > + > @section acopy > > Copy the input audio source unchanged to the output. This is mainly > useful for > diff --git a/libavfilter/Makefile b/libavfilter/Makefile > index 9acae3ff5b..71c6333a52 100644 > --- a/libavfilter/Makefile > +++ b/libavfilter/Makefile > @@ -31,6 +31,7 @@ OBJS-$(CONFIG_QSVVPP)+= qsvvpp.o > # audio filters > OBJS-$(CONFIG_ABENCH_FILTER) += f_bench.o > OBJS-$(CONFIG_ACOMPRESSOR_FILTER)+= af_sidechaincompress.o > +OBJS-$(CONFIG_ACONTRAST_FILTER) += af_acontrast.o > OBJS-$(CONFIG_ACOPY_FILTER) += af_acopy.o > OBJS-$(CONFIG_ACROSSFADE_FILTER) += af_afade.o > OBJS-$(CONFIG_ACRUSHER_FILTER) += af_acrusher.o > diff --git a/libavfilter/af_acontrast.c b/libavfilter/af_acontrast.c > new file mode 100644 > index 00..38de08ffe5 > --- /dev/null > +++ b/libavfilter/af_acontrast.c > @@ -0,0 +1,219 @@ > +/* > + * Copyright (c) 2008 Rob Sykes > + * Copyright (c) 2017 Paul B Mahol > + * > + * 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 > + */ > + > +#include "libavutil/channel_layout.h" > +#include "libavutil/opt.h" > +#include "avfilter.h" > +#include "audio.h" > +#include "formats.h" > + > +typedef struct AudioContrastContext { > +const AVClass *class; > +float contrast; > +void (*filter)(void **dst, const void **src, > + int nb_samples, int channels, float contrast); > +} AudioContrastContext; > + > +#define OFFSET(x) offsetof(AudioContrastContext, x) > +#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > + > +static const AVOption acontrast_options[] = { > +{ "c", "set contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, > {.dbl=33}, 0, 100, A }, > "contrast" instead of "c"? Not sure if single letter options are a good idea. > +{ NULL } > +}; > + > +AVFILTER_DEFINE_CLASS(acontrast); > + > +static int query_formats(AVFilterContext *ctx) > +{ > +AVFilterFormats *formats = NULL; > +AVFilterChannelLayouts *layouts = NULL; > +static const enum AVSampleFormat sample_fmts[] = { > +AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, > +AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP, > +AV_SAMPLE_FMT_NONE > +}; > +int ret; > + > +formats = ff_make_format_list(sample_fmts); > +if (!formats) > +return AVERROR(ENOMEM); > +ret = ff_set_common_formats(ctx, formats); > +if (ret < 0) > +return ret; > + > +layouts = ff_all_channel_counts(); > +if (!layouts) > +return AVERROR(ENOMEM); > + > +ret = ff_set_common_channel_layouts(ctx, layouts); > +if (ret < 0) > +return ret; > + > +formats = ff_all_samplerates(); > +return ff_set_common_samplerates(ctx, formats); > +} > + > +static void filter_flt(void **d, const void **s, > + int nb_samples, int channels, > + float contrast) > +{ > +const float *src = s[0]; > +float *dst = d[0]; > +int n, c; > + > +for (n = 0; n < nb_samples; n++) { > +for (c = 0; c < channels; c++) { > +double d = src[c] * M_PI_2; > + > +dst[c] = sin(d + contrast * sin(d * 4)); > sinf() instead of sin() > +} > + > +dst += c; > +src += c; > +} > +} > + > +static void filter_dbl(void **d, const void **