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
59fb8cae
Commit
59fb8cae
authored
Jan 13, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter: add colorhold filter
Fixes #7671.
parent
c81ec198
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
105 additions
and
2 deletions
+105
-2
Changelog
Changelog
+1
-0
filters.texi
doc/filters.texi
+18
-0
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
version.h
libavfilter/version.h
+1
-1
vf_colorkey.c
libavfilter/vf_colorkey.c
+83
-1
No files found.
Changelog
View file @
59fb8cae
...
...
@@ -27,6 +27,7 @@ version <next>:
- lagfun filter
- asoftclip filter
- Support decoding of HEVC 4:4:4 content in vdpau
- colorhold filter
version 4.1:
...
...
doc/filters.texi
View file @
59fb8cae
...
...
@@ -6723,6 +6723,24 @@ ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.
@
end
example
@
end
itemize
@
section
colorhold
Remove
all
color
information
for
all
RGB
colors
except
for
certain
one
.
The
filter
accepts
the
following
options
:
@
table
@
option
@
item
color
The
color
which
will
not
be
replaced
with
neutral
gray
.
@
item
similarity
Similarity
percentage
with
the
above
color
.
0.01
matches
only
the
exact
key
color
,
while
1.0
matches
everything
.
@
item
blend
Blend
percentage
.
0.0
makes
pixels
fully
gray
.
Higher
values
result
in
more
preserved
color
.
@
end
table
@
section
colorlevels
Adjust
video
input
frames
using
levels
.
...
...
libavfilter/Makefile
View file @
59fb8cae
...
...
@@ -179,6 +179,7 @@ OBJS-$(CONFIG_COLORCHANNELMIXER_FILTER) += vf_colorchannelmixer.o
OBJS-$(CONFIG_COLORKEY_FILTER)
+=
vf_colorkey.o
OBJS-$(CONFIG_COLORKEY_OPENCL_FILTER)
+=
vf_colorkey_opencl.o
opencl.o
\
opencl/colorkey.o
OBJS-$(CONFIG_COLORHOLD_FILTER)
+=
vf_colorkey.o
OBJS-$(CONFIG_COLORLEVELS_FILTER)
+=
vf_colorlevels.o
OBJS-$(CONFIG_COLORMATRIX_FILTER)
+=
vf_colormatrix.o
OBJS-$(CONFIG_COLORSPACE_FILTER)
+=
vf_colorspace.o
colorspace.o
colorspacedsp.o
...
...
libavfilter/allfilters.c
View file @
59fb8cae
...
...
@@ -167,6 +167,7 @@ extern AVFilter ff_vf_colorbalance;
extern
AVFilter
ff_vf_colorchannelmixer
;
extern
AVFilter
ff_vf_colorkey
;
extern
AVFilter
ff_vf_colorkey_opencl
;
extern
AVFilter
ff_vf_colorhold
;
extern
AVFilter
ff_vf_colorlevels
;
extern
AVFilter
ff_vf_colormatrix
;
extern
AVFilter
ff_vf_colorspace
;
...
...
libavfilter/version.h
View file @
59fb8cae
...
...
@@ -30,7 +30,7 @@
#include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 7
#define LIBAVFILTER_VERSION_MINOR 5
0
#define LIBAVFILTER_VERSION_MINOR 5
1
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
...
...
libavfilter/vf_colorkey.c
View file @
59fb8cae
...
...
@@ -34,6 +34,9 @@ typedef struct ColorkeyContext {
uint8_t
colorkey_rgba
[
4
];
float
similarity
;
float
blend
;
int
(
*
do_slice
)(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
);
}
ColorkeyContext
;
static
uint8_t
do_colorkey_pixel
(
ColorkeyContext
*
ctx
,
uint8_t
r
,
uint8_t
g
,
uint8_t
b
)
...
...
@@ -77,15 +80,65 @@ static int do_colorkey_slice(AVFilterContext *avctx, void *arg, int jobnr, int n
return
0
;
}
static
int
do_colorhold_slice
(
AVFilterContext
*
avctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
)
{
AVFrame
*
frame
=
arg
;
const
int
slice_start
=
(
frame
->
height
*
jobnr
)
/
nb_jobs
;
const
int
slice_end
=
(
frame
->
height
*
(
jobnr
+
1
))
/
nb_jobs
;
ColorkeyContext
*
ctx
=
avctx
->
priv
;
int
x
,
y
;
for
(
y
=
slice_start
;
y
<
slice_end
;
++
y
)
{
for
(
x
=
0
;
x
<
frame
->
width
;
++
x
)
{
int
o
,
t
,
r
,
g
,
b
;
o
=
frame
->
linesize
[
0
]
*
y
+
x
*
4
;
r
=
frame
->
data
[
0
][
o
+
ctx
->
co
[
0
]];
g
=
frame
->
data
[
0
][
o
+
ctx
->
co
[
1
]];
b
=
frame
->
data
[
0
][
o
+
ctx
->
co
[
2
]];
t
=
do_colorkey_pixel
(
ctx
,
r
,
g
,
b
);
if
(
t
>
0
)
{
int
a
=
(
r
+
g
+
b
)
/
3
;
int
rt
=
255
-
t
;
frame
->
data
[
0
][
o
+
ctx
->
co
[
0
]]
=
(
a
*
t
+
r
*
rt
+
127
)
>>
8
;
frame
->
data
[
0
][
o
+
ctx
->
co
[
1
]]
=
(
a
*
t
+
g
*
rt
+
127
)
>>
8
;
frame
->
data
[
0
][
o
+
ctx
->
co
[
2
]]
=
(
a
*
t
+
b
*
rt
+
127
)
>>
8
;
}
}
}
return
0
;
}
static
av_cold
int
init_filter
(
AVFilterContext
*
avctx
)
{
ColorkeyContext
*
ctx
=
avctx
->
priv
;
if
(
!
strcmp
(
avctx
->
filter
->
name
,
"colorkey"
))
{
ctx
->
do_slice
=
do_colorkey_slice
;
}
else
{
ctx
->
do_slice
=
do_colorhold_slice
;
}
return
0
;
}
static
int
filter_frame
(
AVFilterLink
*
link
,
AVFrame
*
frame
)
{
AVFilterContext
*
avctx
=
link
->
dst
;
ColorkeyContext
*
ctx
=
avctx
->
priv
;
int
res
;
if
(
res
=
av_frame_make_writable
(
frame
))
return
res
;
if
(
res
=
avctx
->
internal
->
execute
(
avctx
,
do_colorkey
_slice
,
frame
,
NULL
,
FFMIN
(
frame
->
height
,
ff_filter_get_nb_threads
(
avctx
))))
if
(
res
=
avctx
->
internal
->
execute
(
avctx
,
ctx
->
do
_slice
,
frame
,
NULL
,
FFMIN
(
frame
->
height
,
ff_filter_get_nb_threads
(
avctx
))))
return
res
;
return
ff_filter_frame
(
avctx
->
outputs
[
0
],
frame
);
...
...
@@ -148,6 +201,8 @@ static const AVFilterPad colorkey_outputs[] = {
#define OFFSET(x) offsetof(ColorkeyContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
#if CONFIG_COLORKEY_FILTER
static
const
AVOption
colorkey_options
[]
=
{
{
"color"
,
"set the colorkey key color"
,
OFFSET
(
colorkey_rgba
),
AV_OPT_TYPE_COLOR
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"similarity"
,
"set the colorkey similarity value"
,
OFFSET
(
similarity
),
AV_OPT_TYPE_FLOAT
,
{
.
dbl
=
0
.
01
},
0
.
01
,
1
.
0
,
FLAGS
},
...
...
@@ -163,7 +218,34 @@ AVFilter ff_vf_colorkey = {
.
priv_size
=
sizeof
(
ColorkeyContext
),
.
priv_class
=
&
colorkey_class
,
.
query_formats
=
query_formats
,
.
init
=
init_filter
,
.
inputs
=
colorkey_inputs
,
.
outputs
=
colorkey_outputs
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
|
AVFILTER_FLAG_SLICE_THREADS
,
};
#endif
/* CONFIG_COLORKEY_FILTER */
#if CONFIG_COLORHOLD_FILTER
static
const
AVOption
colorhold_options
[]
=
{
{
"color"
,
"set the colorhold key color"
,
OFFSET
(
colorkey_rgba
),
AV_OPT_TYPE_COLOR
,
{
.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
{
"similarity"
,
"set the colorhold similarity value"
,
OFFSET
(
similarity
),
AV_OPT_TYPE_FLOAT
,
{
.
dbl
=
0
.
01
},
0
.
01
,
1
.
0
,
FLAGS
},
{
"blend"
,
"set the colorhold blend value"
,
OFFSET
(
blend
),
AV_OPT_TYPE_FLOAT
,
{
.
dbl
=
0
.
0
},
0
.
0
,
1
.
0
,
FLAGS
},
{
NULL
}
};
AVFILTER_DEFINE_CLASS
(
colorhold
);
AVFilter
ff_vf_colorhold
=
{
.
name
=
"colorhold"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Turns a certain color range into gray. Operates on RGB colors."
),
.
priv_size
=
sizeof
(
ColorkeyContext
),
.
priv_class
=
&
colorhold_class
,
.
query_formats
=
query_formats
,
.
init
=
init_filter
,
.
inputs
=
colorkey_inputs
,
.
outputs
=
colorkey_outputs
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
|
AVFILTER_FLAG_SLICE_THREADS
,
};
#endif
/* CONFIG_COLORHOLD_FILTER */
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