X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Faf_anlmdn.c;h=b8aef31c359e5ace79decbae067431ccea561f4e;hb=619f5308122beb166b750ff6084c734d822b7de4;hp=06e9736cc2b9e6e97c55f2f8cc87879f6d3fe2df;hpb=b5355774652cfbef3fd3f2c77d1403661e5222a5;p=ffmpeg diff --git a/libavfilter/af_anlmdn.c b/libavfilter/af_anlmdn.c index 06e9736cc2b..b8aef31c359 100644 --- a/libavfilter/af_anlmdn.c +++ b/libavfilter/af_anlmdn.c @@ -22,6 +22,7 @@ #include "libavutil/avassert.h" #include "libavutil/audio_fifo.h" +#include "libavutil/avstring.h" #include "libavutil/opt.h" #include "avfilter.h" #include "audio.h" @@ -72,15 +73,16 @@ enum OutModes { #define OFFSET(x) offsetof(AudioNLMeansContext, x) #define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM +#define AFT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM static const AVOption anlmdn_options[] = { - { "s", "set denoising strength", OFFSET(a), AV_OPT_TYPE_FLOAT, {.dbl=0.00001},0.00001, 10, AF }, + { "s", "set denoising strength", OFFSET(a), AV_OPT_TYPE_FLOAT, {.dbl=0.00001},0.00001, 10, AFT }, { "p", "set patch duration", OFFSET(pd), AV_OPT_TYPE_DURATION, {.i64=2000}, 1000, 100000, AF }, { "r", "set research duration", OFFSET(rd), AV_OPT_TYPE_DURATION, {.i64=6000}, 2000, 300000, AF }, - { "o", "set output mode", OFFSET(om), AV_OPT_TYPE_INT, {.i64=OUT_MODE}, 0, NB_MODES-1, AF, "mode" }, - { "i", "input", 0, AV_OPT_TYPE_CONST, {.i64=IN_MODE}, 0, 0, AF, "mode" }, - { "o", "output", 0, AV_OPT_TYPE_CONST, {.i64=OUT_MODE}, 0, 0, AF, "mode" }, - { "n", "noise", 0, AV_OPT_TYPE_CONST, {.i64=NOISE_MODE},0, 0, AF, "mode" }, + { "o", "set output mode", OFFSET(om), AV_OPT_TYPE_INT, {.i64=OUT_MODE}, 0, NB_MODES-1, AFT, "mode" }, + { "i", "input", 0, AV_OPT_TYPE_CONST, {.i64=IN_MODE}, 0, 0, AFT, "mode" }, + { "o", "output", 0, AV_OPT_TYPE_CONST, {.i64=OUT_MODE}, 0, 0, AFT, "mode" }, + { "n", "noise", 0, AV_OPT_TYPE_CONST, {.i64=NOISE_MODE},0, 0, AFT, "mode" }, { "m", "set smooth factor", OFFSET(m), AV_OPT_TYPE_FLOAT, {.dbl=11.}, 1, 15, AF }, { NULL } }; @@ -224,7 +226,10 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) unsigned weight_lut_idx; float w; - av_assert2(distance >= 0.f); + if (distance < 0.f) { + cache[j] = 0.f; + continue; + } w = distance * sw; if (w >= smooth) continue; @@ -293,7 +298,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) out->nb_samples = FFMIN(s->eof_left, s->offset); s->eof_left -= out->nb_samples; } - s->pts += s->offset; + s->pts += av_rescale_q(s->offset, (AVRational){1, outlink->sample_rate}, outlink->time_base); return ff_filter_frame(outlink, out); } @@ -314,7 +319,7 @@ static int request_frame(AVFilterLink *outlink) if (s->eof_left < 0) s->eof_left = av_audio_fifo_size(s->fifo) - (s->S + s->K); - if (s->eof_left < 0) + if (s->eof_left <= 0) return AVERROR_EOF; in = ff_get_audio_buffer(outlink, s->H); if (!in) @@ -363,6 +368,7 @@ AVFilter ff_af_anlmdn = { .uninit = uninit, .inputs = inputs, .outputs = outputs, + .process_command = ff_filter_process_command, .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS, };