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
2183def1
Commit
2183def1
authored
Aug 27, 2019
by
Steven Liu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter/vf_delogo: support expr in delogo filter
Signed-off-by:
Steven Liu
<
lq@chinaffmpeg.org
>
parent
75aea52a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
79 additions
and
4 deletions
+79
-4
vf_delogo.c
libavfilter/vf_delogo.c
+79
-4
No files found.
libavfilter/vf_delogo.c
View file @
2183def1
...
...
@@ -31,10 +31,52 @@
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/eval.h"
#include "avfilter.h"
#include "formats.h"
#include "internal.h"
#include "video.h"
static
const
char
*
const
var_names
[]
=
{
"x"
,
"y"
,
"w"
,
"h"
,
"n"
,
///< number of frame
"t"
,
///< timestamp expressed in seconds
NULL
};
enum
var_name
{
VAR_X
,
VAR_Y
,
VAR_W
,
VAR_H
,
VAR_N
,
VAR_T
,
VAR_VARS_NB
};
#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts) * av_q2d(tb))
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 parsing the expression '%s' for %s
\n
"
,
expr
,
option
);
*
pexpr
=
old
;
return
ret
;
}
av_expr_free
(
old
);
return
0
;
}
/**
* Apply a simple delogo algorithm to the image in src and put the
...
...
@@ -156,16 +198,19 @@ static void apply_delogo(uint8_t *dst, int dst_linesize,
typedef
struct
DelogoContext
{
const
AVClass
*
class
;
int
x
,
y
,
w
,
h
,
band
,
show
;
char
*
x_expr
,
*
y_expr
,
*
w_expr
,
*
h_expr
;
AVExpr
*
x_pexpr
,
*
y_pexpr
,
*
w_pexpr
,
*
h_pexpr
;
double
var_values
[
VAR_VARS_NB
];
}
DelogoContext
;
#define OFFSET(x) offsetof(DelogoContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
static
const
AVOption
delogo_options
[]
=
{
{
"x"
,
"set logo x position"
,
OFFSET
(
x
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
INT
_MAX
,
FLAGS
},
{
"y"
,
"set logo y position"
,
OFFSET
(
y
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
INT
_MAX
,
FLAGS
},
{
"w"
,
"set logo width"
,
OFFSET
(
w
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
INT
_MAX
,
FLAGS
},
{
"h"
,
"set logo height"
,
OFFSET
(
h
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
INT
_MAX
,
FLAGS
},
{
"x"
,
"set logo x position"
,
OFFSET
(
x
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"-1"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"y"
,
"set logo y position"
,
OFFSET
(
y
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"-1"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"w"
,
"set logo width"
,
OFFSET
(
w
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"-1"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
{
"h"
,
"set logo height"
,
OFFSET
(
h
_expr
),
AV_OPT_TYPE_STRING
,
{
.
str
=
"-1"
},
CHAR_MIN
,
CHAR
_MAX
,
FLAGS
},
#if LIBAVFILTER_VERSION_MAJOR < 7
/* Actual default value for band/t is 1, set in init */
{
"band"
,
"set delogo area band size"
,
OFFSET
(
band
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
},
...
...
@@ -176,6 +221,16 @@ static const AVOption delogo_options[]= {
};
AVFILTER_DEFINE_CLASS
(
delogo
);
static
void
uninit
(
AVFilterContext
*
ctx
)
{
DelogoContext
*
s
=
ctx
->
priv
;
av_expr_free
(
s
->
x_pexpr
);
s
->
x_pexpr
=
NULL
;
av_expr_free
(
s
->
y_pexpr
);
s
->
y_pexpr
=
NULL
;
av_expr_free
(
s
->
w_pexpr
);
s
->
w_pexpr
=
NULL
;
av_expr_free
(
s
->
h_pexpr
);
s
->
h_pexpr
=
NULL
;
}
static
int
query_formats
(
AVFilterContext
*
ctx
)
{
...
...
@@ -194,6 +249,18 @@ static int query_formats(AVFilterContext *ctx)
static
av_cold
int
init
(
AVFilterContext
*
ctx
)
{
DelogoContext
*
s
=
ctx
->
priv
;
int
ret
=
0
;
if
((
ret
=
set_expr
(
&
s
->
x_pexpr
,
s
->
x_expr
,
"x"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
s
->
y_pexpr
,
s
->
y_expr
,
"y"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
s
->
w_pexpr
,
s
->
w_expr
,
"w"
,
ctx
))
<
0
||
(
ret
=
set_expr
(
&
s
->
h_pexpr
,
s
->
h_expr
,
"h"
,
ctx
))
<
0
)
return
ret
;
s
->
x
=
av_expr_eval
(
s
->
x_pexpr
,
s
->
var_values
,
s
);
s
->
y
=
av_expr_eval
(
s
->
y_pexpr
,
s
->
var_values
,
s
);
s
->
w
=
av_expr_eval
(
s
->
w_pexpr
,
s
->
var_values
,
s
);
s
->
h
=
av_expr_eval
(
s
->
h_pexpr
,
s
->
var_values
,
s
);
#define CHECK_UNSET_OPT(opt) \
if (s->opt == -1) { \
...
...
@@ -252,6 +319,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
int
plane
;
AVRational
sar
;
s
->
var_values
[
VAR_N
]
=
inlink
->
frame_count_out
;
s
->
var_values
[
VAR_T
]
=
TS2T
(
in
->
pts
,
inlink
->
time_base
);
s
->
x
=
av_expr_eval
(
s
->
x_pexpr
,
s
->
var_values
,
s
);
s
->
y
=
av_expr_eval
(
s
->
y_pexpr
,
s
->
var_values
,
s
);
s
->
w
=
av_expr_eval
(
s
->
w_pexpr
,
s
->
var_values
,
s
);
s
->
h
=
av_expr_eval
(
s
->
h_pexpr
,
s
->
var_values
,
s
);
if
(
av_frame_is_writable
(
in
))
{
direct
=
1
;
out
=
in
;
...
...
@@ -317,6 +391,7 @@ AVFilter ff_vf_delogo = {
.
priv_size
=
sizeof
(
DelogoContext
),
.
priv_class
=
&
delogo_class
,
.
init
=
init
,
.
uninit
=
uninit
,
.
query_formats
=
query_formats
,
.
inputs
=
avfilter_vf_delogo_inputs
,
.
outputs
=
avfilter_vf_delogo_outputs
,
...
...
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