I have added the variable options. I have not done the refactoring part yet.
From 00052c1bbe5fe87d86fcff6f5e810290468d0251 Mon Sep 17 00:00:00 2001
From: Arwa Arif <arwaarif1...@gmail.com>
Date: Fri, 13 Mar 2015 11:37:40 +0530
Subject: [PATCH] Add variables to process_command in vf_eq

---
 doc/filters.texi    |   16 +++++++++++++--
 libavfilter/vf_eq.c |   55 ++++++++++++++++++++++++++++++---------------------
 libavfilter/vf_eq.h |   36 ++++++++++++++++-----------------
 3 files changed, 64 insertions(+), 43 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index dbcd391..cf482c8 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -4402,6 +4402,19 @@ Default is @code{1.0}.
 
 @end table
 
+These options accept the following parameters:
+
+@table
+@item n
+Frame count of the input frame starting from 0.
+
+@item r
+Frame rate of the input video, NAN if the input frame rate is unknown.
+
+@item t
+Timestamp expressed in seconds, NAN if the input timestamp is unknown.
+@end table
+
 @subsection Commands
 The filter supports the following commands:
 
@@ -4538,8 +4551,7 @@ The number of seconds for which the fade effect has to last. At the end of the
 fade-in effect the output video will have the same intensity as the input video,
 at the end of the fade-out transition the output video will be filled with the
 selected @option{color}.
-If both duration and nb_frames are specified, duration is used. Default is 0
-(nb_frames is used by default).
+If both duration and nb_frames are specified, duration is used. Default is 0.
 
 @item color, c
 Specify the color of the fade. Default is "black".
diff --git a/libavfilter/vf_eq.c b/libavfilter/vf_eq.c
index 980e9ca..4cbe617 100644
--- a/libavfilter/vf_eq.c
+++ b/libavfilter/vf_eq.c
@@ -27,11 +27,6 @@
  * very simple video equalizer
  */
 
-/**
- * TODO:
- * - Add support to process_command
- */
-
 #include "libavfilter/internal.h"
 #include "libavutil/common.h"
 #include "libavutil/imgutils.h"
@@ -111,16 +106,16 @@ static void check_values(EQParameters *param, EQContext *eq)
 
 static void set_contrast(EQContext *eq)
 {
-    eq->var_values[VAR_CONTRAST] = av_clipf(av_expr_eval(eq->contrast_pexpr, eq->var_values, eq),-2.0, 2.0);
-    eq->param[0].contrast = eq->var_values[VAR_CONTRAST];
+    eq->contrast = av_clipf(av_expr_eval(eq->contrast_pexpr, eq->var_values, eq),-2.0, 2.0);
+    eq->param[0].contrast = eq->contrast;
     eq->param[0].lut_clean = 0;
     check_values(&eq->param[0], eq);
 }
 
 static void set_brightness(EQContext *eq)
 {
-    eq->var_values[VAR_BRIGHTNESS] =  av_clipf(av_expr_eval(eq->brightness_pexpr, eq->var_values, eq), -1.0, 1.0);
-    eq->param[0].brightness = eq->var_values[VAR_BRIGHTNESS];
+    eq->brightness =  av_clipf(av_expr_eval(eq->brightness_pexpr, eq->var_values, eq), -1.0, 1.0);
+    eq->param[0].brightness = eq->brightness;
     eq->param[0].lut_clean = 0;
     check_values(&eq->param[0], eq);
 }
@@ -129,18 +124,18 @@ static void set_gamma(EQContext *eq)
 {
     int i;
 
-    eq->var_values[VAR_GAMMA]        =  av_clipf(av_expr_eval(eq->gamma_pexpr,        eq->var_values, eq),  0.1, 10.0);
-    eq->var_values[VAR_GAMMA_R]      =  av_clipf(av_expr_eval(eq->gamma_r_pexpr,      eq->var_values, eq),  0.1, 10.0);
-    eq->var_values[VAR_GAMMA_G]      =  av_clipf(av_expr_eval(eq->gamma_g_pexpr,      eq->var_values, eq),  0.1, 10.0);
-    eq->var_values[VAR_GAMMA_B]      =  av_clipf(av_expr_eval(eq->gamma_b_pexpr,      eq->var_values, eq),  0.1, 10.0);
-    eq->var_values[VAR_GAMMA_WEIGHT] =  av_clipf(av_expr_eval(eq->gamma_weight_pexpr, eq->var_values, eq),  0.0,  1.0);
+    eq->gamma        =  av_clipf(av_expr_eval(eq->gamma_pexpr,        eq->var_values, eq),  0.1, 10.0);
+    eq->gamma_r      =  av_clipf(av_expr_eval(eq->gamma_r_pexpr,      eq->var_values, eq),  0.1, 10.0);
+    eq->gamma_g      =  av_clipf(av_expr_eval(eq->gamma_g_pexpr,      eq->var_values, eq),  0.1, 10.0);
+    eq->gamma_b      =  av_clipf(av_expr_eval(eq->gamma_b_pexpr,      eq->var_values, eq),  0.1, 10.0);
+    eq->gamma_weight =  av_clipf(av_expr_eval(eq->gamma_weight_pexpr, eq->var_values, eq),  0.0,  1.0);
 
-    eq->param[0].gamma = eq->var_values[VAR_GAMMA] * eq->var_values[VAR_GAMMA_G];
-    eq->param[1].gamma = sqrt(eq->var_values[VAR_GAMMA_B] / eq->var_values[VAR_GAMMA_G]);
-    eq->param[2].gamma = sqrt(eq->var_values[VAR_GAMMA_R] / eq->var_values[VAR_GAMMA_G]);
+    eq->param[0].gamma = eq->gamma * eq->gamma_g;
+    eq->param[1].gamma = sqrt(eq->gamma_b / eq->gamma_g);
+    eq->param[2].gamma = sqrt(eq->gamma_r / eq->gamma_g);
 
     for (i = 0; i < 3; i++) {
-        eq->param[i].gamma_weight = eq->var_values[VAR_GAMMA_WEIGHT];
+        eq->param[i].gamma_weight = eq->gamma_weight;
         eq->param[i].lut_clean = 0;
         check_values(&eq->param[i], eq);
     }
@@ -150,10 +145,10 @@ static void set_saturation(EQContext *eq)
 {
     int i;
 
-    eq->var_values[VAR_SATURATION] = av_clipf(av_expr_eval(eq->saturation_pexpr, eq->var_values, eq), 0.0, 3.0);
+    eq->saturation = av_clipf(av_expr_eval(eq->saturation_pexpr, eq->var_values, eq), 0.0, 3.0);
 
     for (i = 1; i < 3; i++) {
-        eq->param[i].contrast = eq->var_values[VAR_SATURATION];
+        eq->param[i].contrast = eq->saturation;
         eq->param[i].lut_clean = 0;
         check_values(&eq->param[i], eq);
     }
@@ -166,8 +161,7 @@ static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *
 
     if (*pexpr)
         old = *pexpr;
-    ret = av_expr_parse(pexpr, expr, var_names,
-                        NULL, NULL, NULL, NULL, 0, log_ctx);
+    ret = av_expr_parse(pexpr, expr, var_names, NULL, NULL, NULL, NULL, 0, log_ctx);
     if (ret < 0) {
         av_log(log_ctx, AV_LOG_ERROR,
                "Error when evaluating the expression '%s' for %s\n",
@@ -222,6 +216,17 @@ static void uninit(AVFilterContext *ctx)
     av_expr_free(eq->gamma_b_pexpr);      eq->gamma_b_pexpr      = NULL;
 }
 
+static int config_props(AVFilterLink *inlink)
+{
+    EQContext *eq = inlink->dst->priv;
+
+    eq->var_values[VAR_N]  = 0;
+    eq->var_values[VAR_R]  = inlink->frame_rate.num == 0 || inlink->frame_rate.den == 0 ?
+        NAN : av_q2d(inlink->frame_rate);
+
+    return 0;
+}
+
 static int query_formats(AVFilterContext *ctx)
 {
     static const enum AVPixelFormat pixel_fmts_eq[] = {
@@ -239,6 +244,8 @@ static int query_formats(AVFilterContext *ctx)
     return 0;
 }
 
+#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts) * av_q2d(tb))
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -255,6 +262,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     av_frame_copy_props(out, in);
     desc = av_pix_fmt_desc_get(inlink->format);
 
+    eq->var_values[VAR_N]   = inlink->frame_count;
+    eq->var_values[VAR_T]   = TS2T(in->pts, inlink->time_base);
+
     for (i = 0; i < desc->nb_components; i++) {
         int w = inlink->w;
         int h = inlink->h;
@@ -331,6 +341,7 @@ static const AVFilterPad eq_inputs[] = {
         .name = "default",
         .type = AVMEDIA_TYPE_VIDEO,
         .filter_frame = filter_frame,
+        .config_props = config_props,
     },
     { NULL }
 };
diff --git a/libavfilter/vf_eq.h b/libavfilter/vf_eq.h
index fe9c09c..0ee809f 100644
--- a/libavfilter/vf_eq.h
+++ b/libavfilter/vf_eq.h
@@ -28,28 +28,18 @@
 #include "avfilter.h"
 #include "libavutil/eval.h"
 
-static const char * const var_names[] = {
-    "contrast",
-    "brightness",
-    "saturation",
-    "gamma",
-    "gamma_weight",
-    "gamma_r",
-    "gamma_g",
-    "gamma_b",
+static const char *const var_names[] = {
+    "n",   // frame count
+    "r",   // frame rate
+    "t",   // timestamp expressed in seconds
     NULL
 };
 
 enum var_name {
-    VAR_CONTRAST ,
-    VAR_BRIGHTNESS ,
-    VAR_SATURATION ,
-    VAR_GAMMA ,
-    VAR_GAMMA_WEIGHT ,
-    VAR_GAMMA_R ,
-    VAR_GAMMA_G ,
-    VAR_GAMMA_B ,
-    VAR_VARS_NB ,
+    VAR_N,
+    VAR_R,
+    VAR_T,
+    VAR_NB
 };
 
 typedef struct EQParameters {
@@ -70,29 +60,37 @@ typedef struct {
 
     char   *contrast_expr;
     AVExpr *contrast_pexpr;
+    double  contrast;
 
     char   *brightness_expr;
     AVExpr *brightness_pexpr;
+    double  brightness;
 
     char   *saturation_expr;
     AVExpr *saturation_pexpr;
+    double  saturation;
 
     char   *gamma_expr;
     AVExpr *gamma_pexpr;
+    double  gamma;
 
     char   *gamma_weight_expr;
     AVExpr *gamma_weight_pexpr;
+    double  gamma_weight;
 
     char   *gamma_r_expr;
     AVExpr *gamma_r_pexpr;
+    double  gamma_r;
 
     char   *gamma_g_expr;
     AVExpr *gamma_g_pexpr;
+    double  gamma_g;
 
     char   *gamma_b_expr;
     AVExpr *gamma_b_pexpr;
+    double  gamma_b;
 
-    double var_values[VAR_VARS_NB];
+    double   var_values[VAR_NB];
 
     void (*process)(struct EQParameters *par, uint8_t *dst, int dst_stride,
                     const uint8_t *src, int src_stride, int w, int h);
-- 
1.7.9.5

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to