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