From 209488ccb0f38fbb384a4821f8c170986255d21b Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sat, 18 Dec 2021 16:04:40 +0100 Subject: [PATCH] avfilter: add anlmf filter --- Changelog | 1 + doc/filters.texi | 4 ++-- libavfilter/Makefile | 1 + libavfilter/af_anlms.c | 22 +++++++++++++++++++++- libavfilter/allfilters.c | 1 + libavfilter/version.h | 2 +- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Changelog b/Changelog index a613e2c5a6462..edb4152d0fb60 100644 --- a/Changelog +++ b/Changelog @@ -43,6 +43,7 @@ version : - adynamicequalizer audio filter - yadif_videotoolbox filter - VideoToolbox ProRes encoder +- anlmf audio filter version 4.4: diff --git a/doc/filters.texi b/doc/filters.texi index da95688c535c6..05d4b1a56e505 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -2301,8 +2301,8 @@ Set smooth factor. Default value is @var{11}. Allowed range is from @var{1} to @ This filter supports the all above options as @ref{commands}. -@section anlms -Apply Normalized Least-Mean-Squares algorithm to the first audio stream using the second audio stream. +@section anlmf, anlms +Apply Normalized Least-Mean-(Squares|Fourth) algorithm to the first audio stream using the second audio stream. This adaptive filter is used to mimic a desired filter by finding the filter coefficients that relate to producing the least mean square of the error signal (difference between the desired, diff --git a/libavfilter/Makefile b/libavfilter/Makefile index cb328c2bf8306..090944a99c1bd 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -71,6 +71,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o OBJS-$(CONFIG_AMULTIPLY_FILTER) += af_amultiply.o OBJS-$(CONFIG_ANEQUALIZER_FILTER) += af_anequalizer.o OBJS-$(CONFIG_ANLMDN_FILTER) += af_anlmdn.o +OBJS-$(CONFIG_ANLMF_FILTER) += af_anlms.o OBJS-$(CONFIG_ANLMS_FILTER) += af_anlms.o OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o OBJS-$(CONFIG_APAD_FILTER) += af_apad.o diff --git a/libavfilter/af_anlms.c b/libavfilter/af_anlms.c index f1f82b491db72..f20e3c0e82037 100644 --- a/libavfilter/af_anlms.c +++ b/libavfilter/af_anlms.c @@ -54,6 +54,8 @@ typedef struct AudioNLMSContext { AVFrame *frame[2]; + int anlmf; + AVFloatDSPContext *fdsp; } AudioNLMSContext; @@ -74,7 +76,7 @@ static const AVOption anlms_options[] = { { NULL } }; -AVFILTER_DEFINE_CLASS(anlms); +AVFILTER_DEFINE_CLASS_EXT(anlms, "anlm(f|s)", anlms_options); static int query_formats(AVFilterContext *ctx) { @@ -130,6 +132,8 @@ static float process_sample(AudioNLMSContext *s, float input, float desired, norm = s->eps + sum; b = mu * e / norm; + if (s->anlmf) + b *= 4.f * e * e; memcpy(tmp, delay + offset, order * sizeof(float)); @@ -241,6 +245,7 @@ static int config_output(AVFilterLink *outlink) AVFilterContext *ctx = outlink->src; AudioNLMSContext *s = ctx->priv; + s->anlmf = !strcmp(ctx->filter->name, "anlmf"); s->kernel_size = FFALIGN(s->order, 16); if (!s->offset) @@ -312,3 +317,18 @@ const AVFilter ff_af_anlms = { .flags = AVFILTER_FLAG_SLICE_THREADS, .process_command = ff_filter_process_command, }; + +const AVFilter ff_af_anlmf = { + .name = "anlmf", + .description = NULL_IF_CONFIG_SMALL("Apply Normalized Least-Mean-Fourth algorithm to first audio stream."), + .priv_size = sizeof(AudioNLMSContext), + .priv_class = &anlms_class, + .init = init, + .uninit = uninit, + .activate = activate, + FILTER_INPUTS(inputs), + FILTER_OUTPUTS(outputs), + FILTER_QUERY_FUNC(query_formats), + .flags = AVFILTER_FLAG_SLICE_THREADS, + .process_command = ff_filter_process_command, +}; diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c index 26f1c7350586f..caa755320eb1f 100644 --- a/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c @@ -64,6 +64,7 @@ extern const AVFilter ff_af_amix; extern const AVFilter ff_af_amultiply; extern const AVFilter ff_af_anequalizer; extern const AVFilter ff_af_anlmdn; +extern const AVFilter ff_af_anlmf; extern const AVFilter ff_af_anlms; extern const AVFilter ff_af_anull; extern const AVFilter ff_af_apad; diff --git a/libavfilter/version.h b/libavfilter/version.h index 0253c911be3e1..a4066fd8838a2 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFILTER_VERSION_MAJOR 8 -#define LIBAVFILTER_VERSION_MINOR 20 +#define LIBAVFILTER_VERSION_MINOR 21 #define LIBAVFILTER_VERSION_MICRO 100