[FFmpeg-devel] [PATCH] avfilter/firequalizer: optimize gain/gain_entry command

Muhammad Faiz mfcc64 at gmail.com
Mon Oct 17 02:16:02 EEST 2016


do not rebuild when gain/gain_entry command are
equal with old gain/gain_entry

Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
---
 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 78d7767..aed3e28 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;
-- 
2.5.0



More information about the ffmpeg-devel mailing list