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
84f571e3
Commit
84f571e3
authored
Jun 18, 2013
by
Mark Visser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
enabled expressions on x, y, w, h and t parameters for drawgrid and drawbox, added examples
parent
7fff3df6
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
209 additions
and
27 deletions
+209
-27
filters.texi
doc/filters.texi
+92
-6
vf_drawbox.c
libavfilter/vf_drawbox.c
+117
-21
No files found.
doc/filters.texi
View file @
84f571e3
...
...
@@ -2886,11 +2886,11 @@ This filter accepts the following options:
@table @option
@item x
@item y
S
pecify the top left corner coordinates of the box. Default to 0.
The expressions which s
pecify the top left corner coordinates of the box. Default to 0.
@item width, w
@item height, h
S
pecify the width and height of the box, if 0 they are interpreted as
The expressions which s
pecify the width and height of the box, if 0 they are interpreted as
the input width and height. Default to 0.
@item color, c
...
...
@@ -2900,7 +2900,44 @@ value @code{invert} is used, the box edge color is the same as the
video with inverted luma.
@item thickness, t
Set the thickness of the box edge. Default value is @code{3}.
The expression which sets the thickness of the box edge. Default value is @code{3}.
See below for the list of accepted constants.
@end table
The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the
following constants:
@table @option
@item dar
The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}.
@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@item in_h, ih
@item in_w, iw
The input width and height.
@item sar
The input sample aspect ratio.
@item x
@item y
The x and y offset coordinates where the box is drawn.
@item w
@item h
The width and height of the drawn box.
@item t
The thickness of the drawn box.
These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to
each other, so you may for example specify @code(y=x/dar} or @code(h=w/dar).
@end table
@subsection Examples
...
...
@@ -2928,6 +2965,12 @@ Fill the box with pink color:
@example
drawbox=x=10:y=10:w=100:h=100:color=pink@@0.5:t=max
@end example
@item
Draw a 2-pixel red 2.40:1 mask:
@example
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red
@end example
@end itemize
@section drawgrid
...
...
@@ -2939,11 +2982,11 @@ This filter accepts the following options:
@table @option
@item x
@item y
S
pecify the coordinates of some point of grid intersection (meant to configure offset). Both default to 0.
The expressions which s
pecify the coordinates of some point of grid intersection (meant to configure offset). Both default to 0.
@item width, w
@item height, h
S
pecify the width and height of the grid cell, if 0 they are interpreted as the
The expressions which s
pecify the width and height of the grid cell, if 0 they are interpreted as the
input width and height, respectively, minus @code{thickness}, so image gets
framed. Default to 0.
...
...
@@ -2956,7 +2999,44 @@ Note that you can append opacity value (in range of 0.0 - 1.0)
to color name after @@ sign.
@item thickness, t
Set the thickness of the grid line. Default value is @code{1}.
The expression which sets the thickness of the grid line. Default value is @code{1}.
See below for the list of accepted constants.
@end table
The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the
following constants:
@table @option
@item dar
The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}.
@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@item in_h, ih
@item in_w, iw
The input grid cell width and height.
@item sar
The input sample aspect ratio.
@item x
@item y
The x and y coordinates of some point of grid intersection (meant to configure offset).
@item w
@item h
The width and height of the drawn cell.
@item t
The thickness of the drawn cell.
These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to
each other, so you may for example specify @code(y=x/dar} or @code(h=w/dar).
@end table
@subsection Examples
...
...
@@ -2967,6 +3047,12 @@ Draw a grid with cell 100x100 pixels, thickness 2 pixels, with color red and an
@example
drawgrid=width=100:height=100:thickness=2:color=red@@0.5
@end example
@item
Draw a white 3x3 grid with an opacity of 50%:
@example
drawgrid=w=iw/3:h=ih/3:t=2:c=white@@0.5
@end example
@end itemize
@anchor{drawtext}
...
...
libavfilter/vf_drawbox.c
View file @
84f571e3
...
...
@@ -28,6 +28,7 @@
#include "libavutil/colorspace.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
#include "libavutil/eval.h"
#include "libavutil/pixdesc.h"
#include "libavutil/parseutils.h"
#include "avfilter.h"
...
...
@@ -35,18 +36,51 @@
#include "internal.h"
#include "video.h"
static
const
char
*
const
var_names
[]
=
{
"dar"
,
"hsub"
,
"vsub"
,
"in_h"
,
"ih"
,
///< height of the input video
"in_w"
,
"iw"
,
///< width of the input video
"sar"
,
"x"
,
"y"
,
"h"
,
///< height of the rendered box
"w"
,
///< width of the rendered box
"t"
,
NULL
};
enum
{
Y
,
U
,
V
,
A
};
enum
var_name
{
VAR_DAR
,
VAR_HSUB
,
VAR_VSUB
,
VAR_IN_H
,
VAR_IH
,
VAR_IN_W
,
VAR_IW
,
VAR_SAR
,
VAR_X
,
VAR_Y
,
VAR_H
,
VAR_W
,
VAR_T
,
VARS_NB
};
typedef
struct
{
const
AVClass
*
class
;
int
x
,
y
,
w
_opt
,
h_opt
,
w
,
h
;
int
x
,
y
,
w
,
h
;
int
thickness
;
char
*
color_str
;
unsigned
char
yuv_color
[
4
];
int
invert_color
;
///< invert luma color
int
vsub
,
hsub
;
///< chroma subsampling
char
*
x_expr
,
*
y_expr
;
///< expression for x and y
char
*
w_expr
,
*
h_expr
;
///< expression for width and height
char
*
t_expr
;
///< expression for thickness
}
DrawBoxContext
;
static
const
int
NUM_EXPR_EVALS
=
5
;
static
av_cold
int
init
(
AVFilterContext
*
ctx
)
{
DrawBoxContext
*
s
=
ctx
->
priv
;
...
...
@@ -83,20 +117,82 @@ static int query_formats(AVFilterContext *ctx)
static
int
config_input
(
AVFilterLink
*
inlink
)
{
DrawBoxContext
*
s
=
inlink
->
dst
->
priv
;
AVFilterContext
*
ctx
=
inlink
->
dst
;
DrawBoxContext
*
s
=
ctx
->
priv
;
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
double
var_values
[
VARS_NB
],
res
;
char
*
expr
;
int
ret
;
s
->
hsub
=
desc
->
log2_chroma_w
;
s
->
vsub
=
desc
->
log2_chroma_h
;
s
->
w
=
(
s
->
w_opt
>
0
)
?
s
->
w_opt
:
inlink
->
w
;
s
->
h
=
(
s
->
h_opt
>
0
)
?
s
->
h_opt
:
inlink
->
h
;
var_values
[
VAR_IN_H
]
=
var_values
[
VAR_IH
]
=
inlink
->
h
;
var_values
[
VAR_IN_W
]
=
var_values
[
VAR_IW
]
=
inlink
->
w
;
var_values
[
VAR_SAR
]
=
inlink
->
sample_aspect_ratio
.
num
?
av_q2d
(
inlink
->
sample_aspect_ratio
)
:
1
;
var_values
[
VAR_DAR
]
=
(
double
)
inlink
->
w
/
inlink
->
h
*
var_values
[
VAR_SAR
];
var_values
[
VAR_HSUB
]
=
s
->
hsub
;
var_values
[
VAR_VSUB
]
=
s
->
vsub
;
var_values
[
VAR_X
]
=
NAN
;
var_values
[
VAR_Y
]
=
NAN
;
var_values
[
VAR_H
]
=
NAN
;
var_values
[
VAR_W
]
=
NAN
;
var_values
[
VAR_T
]
=
NAN
;
for
(
int
i
=
0
;
i
<=
NUM_EXPR_EVALS
;
i
++
)
{
/* evaluate expressions, fail on last iteration */
if
((
ret
=
av_expr_parse_and_eval
(
&
res
,
(
expr
=
s
->
x_expr
),
var_names
,
var_values
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
))
<
0
&&
i
==
NUM_EXPR_EVALS
)
goto
fail
;
s
->
x
=
var_values
[
VAR_X
]
=
res
;
if
((
ret
=
av_expr_parse_and_eval
(
&
res
,
(
expr
=
s
->
y_expr
),
var_names
,
var_values
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
))
<
0
&&
i
==
NUM_EXPR_EVALS
)
goto
fail
;
s
->
y
=
var_values
[
VAR_Y
]
=
res
;
if
((
ret
=
av_expr_parse_and_eval
(
&
res
,
(
expr
=
s
->
w_expr
),
var_names
,
var_values
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
))
<
0
&&
i
==
NUM_EXPR_EVALS
)
goto
fail
;
s
->
w
=
var_values
[
VAR_W
]
=
res
;
if
((
ret
=
av_expr_parse_and_eval
(
&
res
,
(
expr
=
s
->
h_expr
),
var_names
,
var_values
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
))
<
0
&&
i
==
NUM_EXPR_EVALS
)
goto
fail
;
s
->
h
=
var_values
[
VAR_H
]
=
res
;
if
((
ret
=
av_expr_parse_and_eval
(
&
res
,
(
expr
=
s
->
t_expr
),
var_names
,
var_values
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
))
<
0
&&
i
==
NUM_EXPR_EVALS
)
goto
fail
;
s
->
thickness
=
var_values
[
VAR_T
]
=
res
;
}
/* if w or h are zero, use the input w/h */
s
->
w
=
(
s
->
w
>
0
)
?
s
->
w
:
inlink
->
w
;
s
->
h
=
(
s
->
h
>
0
)
?
s
->
h
:
inlink
->
h
;
/* sanity check width and height */
if
(
s
->
w
<
0
||
s
->
h
<
0
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Size values less than 0 are not acceptable.
\n
"
);
return
AVERROR
(
EINVAL
);
}
av_log
(
inlink
->
dst
,
AV_LOG_VERBOSE
,
"x:%d y:%d w:%d h:%d color:0x%02X%02X%02X%02X
\n
"
,
av_log
(
ctx
,
AV_LOG_VERBOSE
,
"x:%d y:%d w:%d h:%d color:0x%02X%02X%02X%02X
\n
"
,
s
->
x
,
s
->
y
,
s
->
w
,
s
->
h
,
s
->
yuv_color
[
Y
],
s
->
yuv_color
[
U
],
s
->
yuv_color
[
V
],
s
->
yuv_color
[
A
]);
return
0
;
fail:
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error when evaluating the expression '%s'.
\n
"
,
expr
);
return
ret
;
}
static
int
filter_frame
(
AVFilterLink
*
inlink
,
AVFrame
*
frame
)
...
...
@@ -140,16 +236,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
#if CONFIG_DRAWBOX_FILTER
static
const
AVOption
drawbox_options
[]
=
{
{
"x"
,
"set horizontal position of the left box edge"
,
OFFSET
(
x
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
INT_MIN
,
INT
_MAX
,
FLAGS
},
{
"y"
,
"set vertical position of the top box edge"
,
OFFSET
(
y
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
INT_MIN
,
INT
_MAX
,
FLAGS
},
{
"width"
,
"set width of the box"
,
OFFSET
(
w_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT
_MAX
,
FLAGS
},
{
"w"
,
"set width of the box"
,
OFFSET
(
w_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT
_MAX
,
FLAGS
},
{
"height"
,
"set height of the box"
,
OFFSET
(
h_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT
_MAX
,
FLAGS
},
{
"h"
,
"set height of the box"
,
OFFSET
(
h_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT
_MAX
,
FLAGS
},
{
"x"
,
"set horizontal position of the left box edge"
,
OFFSET
(
x
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"y"
,
"set vertical position of the top box edge"
,
OFFSET
(
y
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"width"
,
"set width of the box"
,
OFFSET
(
w_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"w"
,
"set width of the box"
,
OFFSET
(
w_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"height"
,
"set height of the box"
,
OFFSET
(
h_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"h"
,
"set height of the box"
,
OFFSET
(
h_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"color"
,
"set color of the box"
,
OFFSET
(
color_str
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"c"
,
"set color of the box"
,
OFFSET
(
color_str
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"thickness"
,
"set the box thickness"
,
OFFSET
(
t
hickness
),
AV_OPT_TYPE_INT
,
{
.
i64
=
3
},
0
,
INT
_MAX
,
FLAGS
},
{
"t"
,
"set the box thickness"
,
OFFSET
(
t
hickness
),
AV_OPT_TYPE_INT
,
{
.
i64
=
3
},
0
,
INT
_MAX
,
FLAGS
},
{
"thickness"
,
"set the box thickness"
,
OFFSET
(
t
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"3"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"t"
,
"set the box thickness"
,
OFFSET
(
t
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"3"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
NULL
}
};
...
...
@@ -248,16 +344,16 @@ static int drawgrid_filter_frame(AVFilterLink *inlink, AVFrame *frame)
}
static
const
AVOption
drawgrid_options
[]
=
{
{
"x"
,
"set horizontal offset"
,
OFFSET
(
x
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
INT_MIN
,
INT_MAX
,
FLAGS
},
{
"y"
,
"set vertical offset"
,
OFFSET
(
y
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
INT_MIN
,
INT_MAX
,
FLAGS
},
{
"width"
,
"set width of grid cell"
,
OFFSET
(
w_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
},
{
"w"
,
"set width of grid cell"
,
OFFSET
(
w_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
},
{
"height"
,
"set height of grid cell"
,
OFFSET
(
h_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
},
{
"h"
,
"set height of grid cell"
,
OFFSET
(
h_
opt
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
},
{
"x"
,
"set horizontal offset"
,
OFFSET
(
x
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"y"
,
"set vertical offset"
,
OFFSET
(
y
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"width"
,
"set width of grid cell"
,
OFFSET
(
w_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"w"
,
"set width of grid cell"
,
OFFSET
(
w_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"height"
,
"set height of grid cell"
,
OFFSET
(
h_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"h"
,
"set height of grid cell"
,
OFFSET
(
h_
expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"color"
,
"set color of the grid"
,
OFFSET
(
color_str
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"c"
,
"set color of the grid"
,
OFFSET
(
color_str
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"thickness"
,
"set grid line thickness"
,
OFFSET
(
t
hickness
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
INT_MAX
,
FLAGS
},
{
"t"
,
"set grid line thickness"
,
OFFSET
(
t
hickness
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
INT_MAX
,
FLAGS
},
{
"thickness"
,
"set grid line thickness"
,
OFFSET
(
t
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"t"
,
"set grid line thickness"
,
OFFSET
(
t
_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"1"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
NULL
}
};
...
...
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