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 <[email protected]>
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
[email protected]
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel