Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
20b46f8f
Commit
20b46f8f
authored
Feb 25, 2013
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vf_lut: switch to an AVOptions-based system.
parent
ee0e8d4b
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
50 additions
and
59 deletions
+50
-59
filters.texi
doc/filters.texi
+10
-18
vf_lut.c
libavfilter/vf_lut.c
+40
-41
No files found.
doc/filters.texi
View file @
20b46f8f
...
@@ -1243,40 +1243,32 @@ to an output value, and apply it to input video.
...
@@ -1243,40 +1243,32 @@ to an output value, and apply it to input video.
@var{lutyuv} applies a lookup table to a YUV input video, @var{lutrgb}
@var{lutyuv} applies a lookup table to a YUV input video, @var{lutrgb}
to an RGB input video.
to an RGB input video.
These filters accept in input a ":"-separated list of options, which
These filters accept the following options:
specify the expressions used for computing the lookup table for the
corresponding pixel component values.
The @var{lut} filter requires either YUV or RGB pixel formats in
input, and accepts the options:
@table @option
@table @option
@item @var{c0} (first pixel component)
@item @var{c0} (first pixel component)
@item @var{c1} (second pixel component)
@item @var{c1} (second pixel component)
@item @var{c2} (third pixel component)
@item @var{c2} (third pixel component)
@item @var{c3} (fourth pixel component, corresponds to the alpha component)
@item @var{c3} (fourth pixel component, corresponds to the alpha component)
@end table
The exact component associated to each option depends on the format in
input.
The @var{lutrgb} filter requires RGB pixel formats in input, and
accepts the options:
@table @option
@item @var{r} (red component)
@item @var{r} (red component)
@item @var{g} (green component)
@item @var{g} (green component)
@item @var{b} (blue component)
@item @var{b} (blue component)
@item @var{a} (alpha component)
@item @var{a} (alpha component)
@end table
The @var{lutyuv} filter requires YUV pixel formats in input, and
accepts the options:
@table @option
@item @var{y} (Y/luminance component)
@item @var{y} (Y/luminance component)
@item @var{u} (U/Cb component)
@item @var{u} (U/Cb component)
@item @var{v} (V/Cr component)
@item @var{v} (V/Cr component)
@item @var{a} (alpha component)
@end table
@end table
Each of them specifies the expression to use for computing the lookup table for
the corresponding pixel component values.
The exact component associated to each of the @var{c*} options depends on the
format in input.
The @var{lut} filter requires either YUV or RGB pixel formats in input,
@var{lutrgb} requires RGB pixel formats in input, and @var{lutyuv} requires YUV.
The expressions can contain the following constants and functions:
The expressions can contain the following constants and functions:
@table @option
@table @option
...
...
libavfilter/vf_lut.c
View file @
20b46f8f
...
@@ -84,40 +84,26 @@ typedef struct {
...
@@ -84,40 +84,26 @@ typedef struct {
#define A 3
#define A 3
#define OFFSET(x) offsetof(LutContext, x)
#define OFFSET(x) offsetof(LutContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static
const
AVOption
lut_options
[]
=
{
static
const
AVOption
lut_options
[]
=
{
{
"c0"
,
"set component #0 expression"
,
OFFSET
(
comp_expr_str
[
0
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"c0"
,
"set component #0 expression"
,
OFFSET
(
comp_expr_str
[
0
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"c1"
,
"set component #1 expression"
,
OFFSET
(
comp_expr_str
[
1
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"c1"
,
"set component #1 expression"
,
OFFSET
(
comp_expr_str
[
1
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"c2"
,
"set component #2 expression"
,
OFFSET
(
comp_expr_str
[
2
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"c2"
,
"set component #2 expression"
,
OFFSET
(
comp_expr_str
[
2
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"c3"
,
"set component #3 expression"
,
OFFSET
(
comp_expr_str
[
3
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"c3"
,
"set component #3 expression"
,
OFFSET
(
comp_expr_str
[
3
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"y"
,
"set Y expression"
,
OFFSET
(
comp_expr_str
[
Y
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"y"
,
"set Y expression"
,
OFFSET
(
comp_expr_str
[
Y
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"u"
,
"set U expression"
,
OFFSET
(
comp_expr_str
[
U
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"u"
,
"set U expression"
,
OFFSET
(
comp_expr_str
[
U
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"v"
,
"set V expression"
,
OFFSET
(
comp_expr_str
[
V
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"v"
,
"set V expression"
,
OFFSET
(
comp_expr_str
[
V
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"r"
,
"set R expression"
,
OFFSET
(
comp_expr_str
[
R
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"r"
,
"set R expression"
,
OFFSET
(
comp_expr_str
[
R
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"g"
,
"set G expression"
,
OFFSET
(
comp_expr_str
[
G
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"g"
,
"set G expression"
,
OFFSET
(
comp_expr_str
[
G
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"b"
,
"set B expression"
,
OFFSET
(
comp_expr_str
[
B
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"b"
,
"set B expression"
,
OFFSET
(
comp_expr_str
[
B
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
"a"
,
"set A expression"
,
OFFSET
(
comp_expr_str
[
A
]),
AV_OPT_TYPE_STRING
,
{.
str
=
"val"
},
CHAR_MIN
,
CHAR_MAX
},
{
"a"
,
"set A expression"
,
OFFSET
(
comp_expr_str
[
A
]),
AV_OPT_TYPE_STRING
,
{
.
str
=
"val"
},
.
flags
=
FLAGS
},
{
NULL
},
{
NULL
},
};
static
const
char
*
lut_get_name
(
void
*
ctx
)
{
return
"lut"
;
}
static
const
AVClass
lut_class
=
{
"LutContext"
,
lut_get_name
,
lut_options
};
};
static
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
static
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
{
{
LutContext
*
lut
=
ctx
->
priv
;
LutContext
*
lut
=
ctx
->
priv
;
int
ret
;
lut
->
class
=
&
lut_class
;
av_opt_set_defaults
(
lut
);
lut
->
var_values
[
VAR_PHI
]
=
M_PHI
;
lut
->
var_values
[
VAR_PHI
]
=
M_PHI
;
lut
->
var_values
[
VAR_PI
]
=
M_PI
;
lut
->
var_values
[
VAR_PI
]
=
M_PI
;
...
@@ -125,8 +111,6 @@ static int init(AVFilterContext *ctx, const char *args)
...
@@ -125,8 +111,6 @@ static int init(AVFilterContext *ctx, const char *args)
lut
->
is_rgb
=
!
strcmp
(
ctx
->
filter
->
name
,
"lutrgb"
);
lut
->
is_rgb
=
!
strcmp
(
ctx
->
filter
->
name
,
"lutrgb"
);
lut
->
is_yuv
=
!
strcmp
(
ctx
->
filter
->
name
,
"lutyuv"
);
lut
->
is_yuv
=
!
strcmp
(
ctx
->
filter
->
name
,
"lutyuv"
);
if
(
args
&&
(
ret
=
av_set_options_string
(
lut
,
args
,
"="
,
":"
))
<
0
)
return
ret
;
return
0
;
return
0
;
}
}
...
@@ -363,11 +347,18 @@ static const AVFilterPad outputs[] = {
...
@@ -363,11 +347,18 @@ static const AVFilterPad outputs[] = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
},
.
type
=
AVMEDIA_TYPE_VIDEO
,
},
{
.
name
=
NULL
}
{
.
name
=
NULL
}
};
};
#define DEFINE_LUT_FILTER(name_, description_, init_) \
#define DEFINE_LUT_FILTER(name_, description_, init_, options) \
static const AVClass name_ ## _class = { \
.class_name = #name_, \
.item_name = av_default_item_name, \
.option = options, \
.version = LIBAVUTIL_VERSION_INT, \
}; \
AVFilter avfilter_vf_##name_ = { \
AVFilter avfilter_vf_##name_ = { \
.name = #name_, \
.name = #name_, \
.description = NULL_IF_CONFIG_SMALL(description_), \
.description = NULL_IF_CONFIG_SMALL(description_), \
.priv_size = sizeof(LutContext), \
.priv_size = sizeof(LutContext), \
.priv_class = &name_ ## _class, \
\
\
.init = init_, \
.init = init_, \
.uninit = uninit, \
.uninit = uninit, \
...
@@ -378,33 +369,41 @@ static const AVFilterPad outputs[] = {
...
@@ -378,33 +369,41 @@ static const AVFilterPad outputs[] = {
}
}
#if CONFIG_LUT_FILTER
#if CONFIG_LUT_FILTER
DEFINE_LUT_FILTER
(
lut
,
"Compute and apply a lookup table to the RGB/YUV input video."
,
init
);
DEFINE_LUT_FILTER
(
lut
,
"Compute and apply a lookup table to the RGB/YUV input video."
,
init
,
lut_options
);
#endif
#endif
#if CONFIG_LUTYUV_FILTER
#if CONFIG_LUTYUV_FILTER
DEFINE_LUT_FILTER
(
lutyuv
,
"Compute and apply a lookup table to the YUV input video."
,
init
);
DEFINE_LUT_FILTER
(
lutyuv
,
"Compute and apply a lookup table to the YUV input video."
,
init
,
lut_options
);
#endif
#endif
#if CONFIG_LUTRGB_FILTER
#if CONFIG_LUTRGB_FILTER
DEFINE_LUT_FILTER
(
lutrgb
,
"Compute and apply a lookup table to the RGB input video."
,
init
);
DEFINE_LUT_FILTER
(
lutrgb
,
"Compute and apply a lookup table to the RGB input video."
,
init
,
lut_options
);
#endif
#endif
#if CONFIG_NEGATE_FILTER
#if CONFIG_NEGATE_FILTER
static
const
AVOption
negate_options
[]
=
{
{
"negate_alpha"
,
NULL
,
OFFSET
(
negate_alpha
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
.
flags
=
FLAGS
},
{
NULL
},
};
static
int
negate_init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
static
int
negate_init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
{
{
LutContext
*
lut
=
ctx
->
priv
;
LutContext
*
lut
=
ctx
->
priv
;
char
lut_params
[
64
];
int
i
;
if
(
args
)
sscanf
(
args
,
"%d"
,
&
lut
->
negate_alpha
);
av_log
(
ctx
,
AV_LOG_DEBUG
,
"negate_alpha:%d
\n
"
,
lut
->
negate_alpha
);
av_log
(
ctx
,
AV_LOG_DEBUG
,
"negate_alpha:%d
\n
"
,
lut
->
negate_alpha
);
snprintf
(
lut_params
,
sizeof
(
lut_params
),
"c0=negval:c1=negval:c2=negval:a=%s"
,
for
(
i
=
0
;
i
<
4
;
i
++
)
{
lut
->
negate_alpha
?
"negval"
:
"val"
);
lut
->
comp_expr_str
[
i
]
=
av_strdup
((
i
==
3
&&
lut
->
negate_alpha
)
?
"val"
:
"negval"
);
if
(
!
lut
->
comp_expr_str
[
i
])
{
uninit
(
ctx
);
return
AVERROR
(
ENOMEM
);
}
}
return
init
(
ctx
,
lut_params
);
return
init
(
ctx
,
NULL
);
}
}
DEFINE_LUT_FILTER
(
negate
,
"Negate input video."
,
negate_init
);
DEFINE_LUT_FILTER
(
negate
,
"Negate input video."
,
negate_init
,
negate_options
);
#endif
#endif
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