From 92de89d14acbb8160147dc9e7a62c2a4fd6423da Mon Sep 17 00:00:00 2001 From: Muhammad Faiz Date: Mon, 17 Oct 2016 06:12:18 +0700 Subject: [PATCH] avfilter/firequalizer: optimize gain/gain_entry command do not rebuild when gain/gain_entry command are equal with old gain/gain_entry Signed-off-by: Muhammad Faiz --- libavfilter/af_firequalizer.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libavfilter/af_firequalizer.c b/libavfilter/af_firequalizer.c index 78d776713c..aed3e2821e 100644 --- a/libavfilter/af_firequalizer.c +++ b/libavfilter/af_firequalizer.c @@ -453,6 +453,9 @@ static int generate_kernel(AVFilterContext *ctx, const char *gain, const char *g return 0; } +#define SELECT_GAIN(s) (s->gain_cmd ? s->gain_cmd : s->gain) +#define SELECT_GAIN_ENTRY(s) (s->gain_entry_cmd ? s->gain_entry_cmd : s->gain_entry) + static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; @@ -510,8 +513,7 @@ static int config_input(AVFilterLink *inlink) if (s->fixed) inlink->min_samples = inlink->max_samples = inlink->partial_buf_size = s->nsamples_max; - return generate_kernel(ctx, s->gain_cmd ? s->gain_cmd : s->gain, - s->gain_entry_cmd ? s->gain_entry_cmd : s->gain_entry); + return generate_kernel(ctx, SELECT_GAIN(s), SELECT_GAIN_ENTRY(s)); } static int filter_frame(AVFilterLink *inlink, AVFrame *frame) @@ -567,11 +569,16 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar if (!strcmp(cmd, "gain")) { char *gain_cmd; + if (SELECT_GAIN(s) && !strcmp(SELECT_GAIN(s), args)) { + av_log(ctx, AV_LOG_DEBUG, "equal gain, do not rebuild.\n"); + return 0; + } + gain_cmd = av_strdup(args); if (!gain_cmd) return AVERROR(ENOMEM); - ret = generate_kernel(ctx, gain_cmd, s->gain_entry_cmd ? s->gain_entry_cmd : s->gain_entry); + ret = generate_kernel(ctx, gain_cmd, SELECT_GAIN_ENTRY(s)); if (ret >= 0) { av_freep(&s->gain_cmd); s->gain_cmd = gain_cmd; @@ -581,11 +588,16 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar } else if (!strcmp(cmd, "gain_entry")) { char *gain_entry_cmd; + if (SELECT_GAIN_ENTRY(s) && !strcmp(SELECT_GAIN_ENTRY(s), args)) { + av_log(ctx, AV_LOG_DEBUG, "equal gain_entry, do not rebuild.\n"); + return 0; + } + gain_entry_cmd = av_strdup(args); if (!gain_entry_cmd) return AVERROR(ENOMEM); - ret = generate_kernel(ctx, s->gain_cmd ? s->gain_cmd : s->gain, gain_entry_cmd); + ret = generate_kernel(ctx, SELECT_GAIN(s), gain_entry_cmd); if (ret >= 0) { av_freep(&s->gain_entry_cmd); s->gain_entry_cmd = gain_entry_cmd;