Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
627d2a76
Commit
627d2a76
authored
Feb 18, 2015
by
Arwa Arif
Committed by
Michael Niedermayer
Feb 19, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter/vf_eq: Add process_command to eq.
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
b11edbd2
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
219 additions
and
29 deletions
+219
-29
filters.texi
doc/filters.texi
+35
-0
vf_eq.c
libavfilter/vf_eq.c
+134
-23
vf_eq.h
libavfilter/vf_eq.h
+50
-6
No files found.
doc/filters.texi
View file @
627d2a76
...
...
@@ -4402,6 +4402,41 @@ Default is @code{1.0}.
@end table
@subsection Commands
The filter supports the following commands:
@table @option
@item contrast
Set the contrast expression.
@item brightness
Set the brightness expression.
@item saturation
Set the saturation expression.
@item gamma
Set the gamma expression.
@item gamma_r
Set the gamma_r expression.
@item gamma_g
Set gamma_g expression.
@item gamma_b
Set gamma_b expression.
@item gamma_weight
Set gamma_weight expression.
The command accepts the same syntax of the corresponding option.
If the specified expression is not valid, it is kept at its current
value.
@end table
@section extractplanes
Extract color channel components from input video stream into
...
...
libavfilter/vf_eq.c
View file @
627d2a76
...
...
@@ -111,14 +111,16 @@ static void check_values(EQParameters *param, EQContext *eq)
static
void
set_contrast
(
EQContext
*
eq
)
{
eq
->
param
[
0
].
contrast
=
eq
->
contrast
;
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
->
param
[
0
].
lut_clean
=
0
;
check_values
(
&
eq
->
param
[
0
],
eq
);
}
static
void
set_brightness
(
EQContext
*
eq
)
{
eq
->
param
[
0
].
brightness
=
eq
->
brightness
;
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
->
param
[
0
].
lut_clean
=
0
;
check_values
(
&
eq
->
param
[
0
],
eq
);
}
...
...
@@ -126,12 +128,19 @@ static void set_brightness(EQContext *eq)
static
void
set_gamma
(
EQContext
*
eq
)
{
int
i
;
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
);
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
->
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
]);
for
(
i
=
0
;
i
<
3
;
i
++
)
{
eq
->
param
[
i
].
gamma_weight
=
eq
->
gamma_weight
;
eq
->
param
[
i
].
gamma_weight
=
eq
->
var_values
[
VAR_GAMMA_WEIGHT
]
;
eq
->
param
[
i
].
lut_clean
=
0
;
check_values
(
&
eq
->
param
[
i
],
eq
);
}
...
...
@@ -140,19 +149,54 @@ static void set_gamma(EQContext *eq)
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
);
for
(
i
=
1
;
i
<
3
;
i
++
)
{
eq
->
param
[
i
].
contrast
=
eq
->
saturation
;
eq
->
param
[
i
].
contrast
=
eq
->
var_values
[
VAR_SATURATION
]
;
eq
->
param
[
i
].
lut_clean
=
0
;
check_values
(
&
eq
->
param
[
i
],
eq
);
}
}
static
int
set_expr
(
AVExpr
**
pexpr
,
const
char
*
expr
,
const
char
*
option
,
void
*
log_ctx
)
{
int
ret
;
AVExpr
*
old
=
NULL
;
if
(
*
pexpr
)
old
=
*
pexpr
;
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
"
,
expr
,
option
);
*
pexpr
=
old
;
return
ret
;
}
av_expr_free
(
old
);
return
0
;
}
static
int
initialize
(
AVFilterContext
*
ctx
)
{
EQContext
*
eq
=
ctx
->
priv
;
int
ret
;
eq
->
process
=
process_c
;
if
((
ret
=
set_expr
(
&
eq
->
contrast_pexpr
,
eq
->
contrast_expr
,
"contrast"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
brightness_pexpr
,
eq
->
brightness_expr
,
"brightness"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
saturation_pexpr
,
eq
->
saturation_expr
,
"saturation"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
gamma_pexpr
,
eq
->
gamma_expr
,
"gamma"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
gamma_r_pexpr
,
eq
->
gamma_r_expr
,
"gamma_r"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
gamma_g_pexpr
,
eq
->
gamma_g_expr
,
"gamma_g"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
gamma_b_pexpr
,
eq
->
gamma_b_expr
,
"gamma_b"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
eq
->
gamma_weight_pexpr
,
eq
->
gamma_weight_expr
,
"gamma_weight"
,
ctx
))
<
0
)
return
ret
;
if
(
ARCH_X86
)
ff_eq_init_x86
(
eq
);
...
...
@@ -164,6 +208,20 @@ static int initialize(AVFilterContext *ctx)
return
0
;
}
static
void
uninit
(
AVFilterContext
*
ctx
)
{
EQContext
*
eq
=
ctx
->
priv
;
av_expr_free
(
eq
->
contrast_pexpr
);
eq
->
contrast_pexpr
=
NULL
;
av_expr_free
(
eq
->
brightness_pexpr
);
eq
->
brightness_pexpr
=
NULL
;
av_expr_free
(
eq
->
saturation_pexpr
);
eq
->
saturation_pexpr
=
NULL
;
av_expr_free
(
eq
->
gamma_pexpr
);
eq
->
gamma_pexpr
=
NULL
;
av_expr_free
(
eq
->
gamma_weight_pexpr
);
eq
->
gamma_weight_pexpr
=
NULL
;
av_expr_free
(
eq
->
gamma_r_pexpr
);
eq
->
gamma_r_pexpr
=
NULL
;
av_expr_free
(
eq
->
gamma_g_pexpr
);
eq
->
gamma_g_pexpr
=
NULL
;
av_expr_free
(
eq
->
gamma_b_pexpr
);
eq
->
gamma_b_pexpr
=
NULL
;
}
static
int
query_formats
(
AVFilterContext
*
ctx
)
{
static
const
enum
AVPixelFormat
pixel_fmts_eq
[]
=
{
...
...
@@ -217,6 +275,57 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
av_frame_free
(
&
in
);
return
ff_filter_frame
(
outlink
,
out
);
}
static
int
process_command
(
AVFilterContext
*
ctx
,
const
char
*
cmd
,
const
char
*
args
,
char
*
res
,
int
res_len
,
int
flags
)
{
EQContext
*
eq
=
ctx
->
priv
;
int
ret
;
if
(
!
strcmp
(
cmd
,
"contrast"
))
{
ret
=
set_expr
(
&
eq
->
contrast_pexpr
,
args
,
cmd
,
ctx
);
set_contrast
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"brightness"
))
{
ret
=
set_expr
(
&
eq
->
brightness_pexpr
,
args
,
cmd
,
ctx
);
set_brightness
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"saturation"
))
{
ret
=
set_expr
(
&
eq
->
saturation_pexpr
,
args
,
cmd
,
ctx
);
set_saturation
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"gamma"
))
{
ret
=
set_expr
(
&
eq
->
gamma_pexpr
,
args
,
cmd
,
ctx
);
set_gamma
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"gamma_r"
))
{
ret
=
set_expr
(
&
eq
->
gamma_r_pexpr
,
args
,
cmd
,
ctx
);
set_gamma
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"gamma_g"
))
{
ret
=
set_expr
(
&
eq
->
gamma_g_pexpr
,
args
,
cmd
,
ctx
);
set_gamma
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"gamma_b"
))
{
ret
=
set_expr
(
&
eq
->
gamma_b_pexpr
,
args
,
cmd
,
ctx
);
set_gamma
(
eq
);
return
ret
;
}
else
if
(
!
strcmp
(
cmd
,
"gamma_weight"
))
{
ret
=
set_expr
(
&
eq
->
gamma_weight_pexpr
,
args
,
cmd
,
ctx
);
set_gamma
(
eq
);
return
ret
;
}
else
return
AVERROR
(
ENOSYS
);
}
static
const
AVFilterPad
eq_inputs
[]
=
{
{
.
name
=
"default"
,
...
...
@@ -239,33 +348,35 @@ static const AVFilterPad eq_outputs[] = {
static
const
AVOption
eq_options
[]
=
{
{
"contrast"
,
"set the contrast adjustment, negative values give a negative image"
,
OFFSET
(
contrast
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
-
2
.
0
,
2
.
0
,
FLAGS
},
OFFSET
(
contrast
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"brightness"
,
"set the brightness adjustment"
,
OFFSET
(
brightness
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
0
.
0
},
-
1
.
0
,
1
.
0
,
FLAGS
},
OFFSET
(
brightness
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"0.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"saturation"
,
"set the saturation adjustment"
,
OFFSET
(
saturation
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
0
,
3
.
0
,
FLAGS
},
OFFSET
(
saturation
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"gamma"
,
"set the initial gamma value"
,
OFFSET
(
gamma
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
1
,
10
.
0
,
FLAGS
},
OFFSET
(
gamma
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"gamma_r"
,
"gamma value for red"
,
OFFSET
(
gamma_r
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
1
,
10
.
0
,
FLAGS
},
OFFSET
(
gamma_r
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"gamma_g"
,
"gamma value for green"
,
OFFSET
(
gamma_g
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
1
,
10
.
0
,
FLAGS
},
OFFSET
(
gamma_g
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"gamma_b"
,
"gamma value for blue"
,
OFFSET
(
gamma_b
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
1
,
10
.
0
,
FLAGS
},
OFFSET
(
gamma_b
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"gamma_weight"
,
"set the gamma weight which reduces the effect of gamma on bright areas"
,
OFFSET
(
gamma_weight
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.
0
},
0
.
0
,
1
.
0
,
FLAGS
},
OFFSET
(
gamma_weight
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1.0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
NULL
}
};
AVFILTER_DEFINE_CLASS
(
eq
);
AVFilter
ff_vf_eq
=
{
.
name
=
"eq"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Adjust brightness, contrast, gamma, and saturation."
),
.
priv_size
=
sizeof
(
EQContext
),
.
priv_class
=
&
eq_class
,
.
inputs
=
eq_inputs
,
.
outputs
=
eq_outputs
,
.
query_formats
=
query_formats
,
.
init
=
initialize
,
.
name
=
"eq"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Adjust brightness, contrast, gamma, and saturation."
),
.
priv_size
=
sizeof
(
EQContext
),
.
priv_class
=
&
eq_class
,
.
inputs
=
eq_inputs
,
.
outputs
=
eq_outputs
,
.
process_command
=
process_command
,
.
query_formats
=
query_formats
,
.
init
=
initialize
,
.
uninit
=
uninit
,
};
libavfilter/vf_eq.h
View file @
627d2a76
...
...
@@ -26,6 +26,31 @@
#define AVFILTER_EQ_H
#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"
,
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
,
};
typedef
struct
EQParameters
{
void
(
*
adjust
)(
struct
EQParameters
*
eq
,
uint8_t
*
dst
,
int
dst_stride
,
...
...
@@ -35,6 +60,7 @@ typedef struct EQParameters {
double
brightness
,
contrast
,
gamma
,
gamma_weight
;
int
lut_clean
;
}
EQParameters
;
typedef
struct
{
...
...
@@ -42,13 +68,31 @@ typedef struct {
EQParameters
param
[
3
];
double
contrast
;
double
brightness
;
double
saturation
;
char
*
contrast_expr
;
AVExpr
*
contrast_pexpr
;
char
*
brightness_expr
;
AVExpr
*
brightness_pexpr
;
char
*
saturation_expr
;
AVExpr
*
saturation_pexpr
;
char
*
gamma_expr
;
AVExpr
*
gamma_pexpr
;
char
*
gamma_weight_expr
;
AVExpr
*
gamma_weight_pexpr
;
char
*
gamma_r_expr
;
AVExpr
*
gamma_r_pexpr
;
char
*
gamma_g_expr
;
AVExpr
*
gamma_g_pexpr
;
char
*
gamma_b_expr
;
AVExpr
*
gamma_b_pexpr
;
double
gamma
;
double
gamma_weight
;
double
gamma_r
,
gamma_g
,
gamma_b
;
double
var_values
[
VAR_VARS_NB
];
void
(
*
process
)(
struct
EQParameters
*
par
,
uint8_t
*
dst
,
int
dst_stride
,
const
uint8_t
*
src
,
int
src_stride
,
int
w
,
int
h
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment