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
8c1fb50d
Commit
8c1fb50d
authored
Nov 09, 2011
by
Mark Himsley
Committed by
Stefano Sabatini
Nov 10, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vf_fade: add alpha option and alpha fading support
Signed-off-by:
Stefano Sabatini
<
stefasab@gmail.com
>
parent
0d602615
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
71 additions
and
13 deletions
+71
-13
filters.texi
doc/filters.texi
+6
-0
avfilter.h
libavfilter/avfilter.h
+1
-1
vf_fade.c
libavfilter/vf_fade.c
+64
-12
No files found.
doc/filters.texi
View file @
8c1fb50d
...
@@ -1166,6 +1166,9 @@ See @var{start_frame}.
...
@@ -1166,6 +1166,9 @@ See @var{start_frame}.
@item nb_frames, n
@item nb_frames, n
See @var{nb_frames}.
See @var{nb_frames}.
@item alpha
If set to 1, fade only alpha channel, if one exists on the input.
Default value is 0.
@end table
@end table
A few usage examples follow, usable too as test scenarios.
A few usage examples follow, usable too as test scenarios.
...
@@ -1181,6 +1184,9 @@ fade=in:0:25, fade=out:975:25
...
@@ -1181,6 +1184,9 @@ fade=in:0:25, fade=out:975:25
# make first 5 frames black, then fade in from frame 5-24
# make first 5 frames black, then fade in from frame 5-24
fade=in:5:20
fade=in:5:20
# fade in alpha over first 25 frames of video
fade=in:0:25:alpha=1
@end example
@end example
@section fieldorder
@section fieldorder
...
...
libavfilter/avfilter.h
View file @
8c1fb50d
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MINOR 47
#define LIBAVFILTER_VERSION_MINOR 47
#define LIBAVFILTER_VERSION_MICRO
1
#define LIBAVFILTER_VERSION_MICRO
2
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
LIBAVFILTER_VERSION_MINOR, \
...
...
libavfilter/vf_fade.c
View file @
8c1fb50d
...
@@ -33,12 +33,24 @@
...
@@ -33,12 +33,24 @@
#include "drawutils.h"
#include "drawutils.h"
#include "internal.h"
#include "internal.h"
#define R 0
#define G 1
#define B 2
#define A 3
#define Y 0
#define U 1
#define V 2
typedef
struct
{
typedef
struct
{
const
AVClass
*
class
;
const
AVClass
*
class
;
int
factor
,
fade_per_frame
;
int
factor
,
fade_per_frame
;
unsigned
int
frame_index
,
start_frame
,
stop_frame
,
nb_frames
;
unsigned
int
frame_index
,
start_frame
,
stop_frame
,
nb_frames
;
int
hsub
,
vsub
,
bpp
;
int
hsub
,
vsub
,
bpp
;
unsigned
int
black_level
,
black_level_scaled
;
unsigned
int
black_level
,
black_level_scaled
;
uint8_t
is_packed_rgb
;
uint8_t
rgba_map
[
4
];
int
alpha
;
char
*
type
;
char
*
type
;
}
FadeContext
;
}
FadeContext
;
...
@@ -52,6 +64,7 @@ static const AVOption fade_options[] = {
...
@@ -52,6 +64,7 @@ static const AVOption fade_options[] = {
{
"s"
,
"set expression of frame to start fading"
,
OFFSET
(
start_frame
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
INT_MAX
},
{
"s"
,
"set expression of frame to start fading"
,
OFFSET
(
start_frame
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
INT_MAX
},
{
"nb_frames"
,
"set expression for fade duration in frames"
,
OFFSET
(
nb_frames
),
AV_OPT_TYPE_INT
,
{.
dbl
=
25
},
0
,
INT_MAX
},
{
"nb_frames"
,
"set expression for fade duration in frames"
,
OFFSET
(
nb_frames
),
AV_OPT_TYPE_INT
,
{.
dbl
=
25
},
0
,
INT_MAX
},
{
"n"
,
"set expression for fade duration in frames"
,
OFFSET
(
nb_frames
),
AV_OPT_TYPE_INT
,
{.
dbl
=
25
},
0
,
INT_MAX
},
{
"n"
,
"set expression for fade duration in frames"
,
OFFSET
(
nb_frames
),
AV_OPT_TYPE_INT
,
{.
dbl
=
25
},
0
,
INT_MAX
},
{
"alpha"
,
"fade alpha if it is available on the input"
,
OFFSET
(
alpha
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
1
},
{
NULL
},
{
NULL
},
};
};
...
@@ -119,8 +132,8 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
...
@@ -119,8 +132,8 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
fade
->
stop_frame
=
fade
->
start_frame
+
fade
->
nb_frames
;
fade
->
stop_frame
=
fade
->
start_frame
+
fade
->
nb_frames
;
av_log
(
ctx
,
AV_LOG_INFO
,
av_log
(
ctx
,
AV_LOG_INFO
,
"type:%s start_frame:%d nb_frames:%d
\n
"
,
"type:%s start_frame:%d nb_frames:%d
alpha:%d
\n
"
,
fade
->
type
,
fade
->
start_frame
,
fade
->
nb_frames
);
fade
->
type
,
fade
->
start_frame
,
fade
->
nb_frames
,
fade
->
alpha
);
end:
end:
av_free
(
args1
);
av_free
(
args1
);
...
@@ -141,7 +154,10 @@ static int query_formats(AVFilterContext *ctx)
...
@@ -141,7 +154,10 @@ static int query_formats(AVFilterContext *ctx)
PIX_FMT_YUV411P
,
PIX_FMT_YUV410P
,
PIX_FMT_YUV411P
,
PIX_FMT_YUV410P
,
PIX_FMT_YUVJ444P
,
PIX_FMT_YUVJ422P
,
PIX_FMT_YUVJ420P
,
PIX_FMT_YUVJ444P
,
PIX_FMT_YUVJ422P
,
PIX_FMT_YUVJ420P
,
PIX_FMT_YUV440P
,
PIX_FMT_YUVJ440P
,
PIX_FMT_YUV440P
,
PIX_FMT_YUVJ440P
,
PIX_FMT_YUVA420P
,
PIX_FMT_RGB24
,
PIX_FMT_BGR24
,
PIX_FMT_RGB24
,
PIX_FMT_BGR24
,
PIX_FMT_ARGB
,
PIX_FMT_ABGR
,
PIX_FMT_RGBA
,
PIX_FMT_BGRA
,
PIX_FMT_NONE
PIX_FMT_NONE
};
};
...
@@ -156,6 +172,13 @@ const static enum PixelFormat studio_level_pix_fmts[] = {
...
@@ -156,6 +172,13 @@ const static enum PixelFormat studio_level_pix_fmts[] = {
PIX_FMT_NONE
PIX_FMT_NONE
};
};
static
enum
PixelFormat
alpha_pix_fmts
[]
=
{
PIX_FMT_YUVA420P
,
PIX_FMT_ARGB
,
PIX_FMT_ABGR
,
PIX_FMT_RGBA
,
PIX_FMT_BGRA
,
PIX_FMT_NONE
};
static
int
config_props
(
AVFilterLink
*
inlink
)
static
int
config_props
(
AVFilterLink
*
inlink
)
{
{
FadeContext
*
fade
=
inlink
->
dst
->
priv
;
FadeContext
*
fade
=
inlink
->
dst
->
priv
;
...
@@ -165,14 +188,37 @@ static int config_props(AVFilterLink *inlink)
...
@@ -165,14 +188,37 @@ static int config_props(AVFilterLink *inlink)
fade
->
vsub
=
pixdesc
->
log2_chroma_h
;
fade
->
vsub
=
pixdesc
->
log2_chroma_h
;
fade
->
bpp
=
av_get_bits_per_pixel
(
pixdesc
)
>>
3
;
fade
->
bpp
=
av_get_bits_per_pixel
(
pixdesc
)
>>
3
;
fade
->
alpha
=
fade
->
alpha
?
ff_fmt_is_in
(
inlink
->
format
,
alpha_pix_fmts
)
:
0
;
fade
->
is_packed_rgb
=
ff_fill_rgba_map
(
fade
->
rgba_map
,
inlink
->
format
)
>=
0
;
fade
->
black_level
=
ff_fmt_is_in
(
inlink
->
format
,
studio_level_pix_fmts
)
?
16
:
0
;
/* CCIR601/709 black level unless input is RGB or has alpha */
fade
->
black_level
=
ff_fmt_is_in
(
inlink
->
format
,
studio_level_pix_fmts
)
||
fade
->
alpha
?
0
:
16
;
/* 32768 = 1 << 15, it is an integer representation
/* 32768 = 1 << 15, it is an integer representation
* of 0.5 and is for rounding. */
* of 0.5 and is for rounding. */
fade
->
black_level_scaled
=
(
fade
->
black_level
<<
16
)
+
32768
;
fade
->
black_level_scaled
=
(
fade
->
black_level
<<
16
)
+
32768
;
return
0
;
return
0
;
}
}
static
void
fade_plane
(
int
y
,
int
h
,
int
w
,
int
fade_factor
,
int
black_level
,
int
black_level_scaled
,
uint8_t
offset
,
uint8_t
step
,
int
bytes_per_plane
,
uint8_t
*
data
,
int
line_size
)
{
uint8_t
*
p
;
int
i
,
j
;
/* luma, alpha or rgb plane */
for
(
i
=
0
;
i
<
h
;
i
++
)
{
p
=
data
+
offset
+
(
y
+
i
)
*
line_size
;
for
(
j
=
0
;
j
<
w
*
bytes_per_plane
;
j
++
)
{
/* fade->factor is using 16 lower-order bits for decimal places. */
*
p
=
((
*
p
-
black_level
)
*
fade_factor
+
black_level_scaled
)
>>
16
;
p
+=
step
;
}
}
}
static
void
draw_slice
(
AVFilterLink
*
inlink
,
int
y
,
int
h
,
int
slice_dir
)
static
void
draw_slice
(
AVFilterLink
*
inlink
,
int
y
,
int
h
,
int
slice_dir
)
{
{
FadeContext
*
fade
=
inlink
->
dst
->
priv
;
FadeContext
*
fade
=
inlink
->
dst
->
priv
;
...
@@ -181,16 +227,21 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
...
@@ -181,16 +227,21 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
int
i
,
j
,
plane
;
int
i
,
j
,
plane
;
if
(
fade
->
factor
<
UINT16_MAX
)
{
if
(
fade
->
factor
<
UINT16_MAX
)
{
if
(
fade
->
alpha
)
{
// alpha only
plane
=
fade
->
is_packed_rgb
?
0
:
A
;
// alpha is on plane 0 for packed formats
// or plane 3 for planar formats
fade_plane
(
y
,
h
,
inlink
->
w
,
fade
->
factor
,
fade
->
black_level
,
fade
->
black_level_scaled
,
fade
->
is_packed_rgb
?
fade
->
rgba_map
[
A
]
:
0
,
// alpha offset for packed formats
fade
->
is_packed_rgb
?
4
:
1
,
// pixstep for 8 bit packed formats
1
,
outpic
->
data
[
plane
],
outpic
->
linesize
[
plane
]);
}
else
{
/* luma or rgb plane */
/* luma or rgb plane */
for
(
i
=
0
;
i
<
h
;
i
++
)
{
fade_plane
(
y
,
h
,
inlink
->
w
,
p
=
outpic
->
data
[
0
]
+
(
y
+
i
)
*
outpic
->
linesize
[
0
];
fade
->
factor
,
fade
->
black_level
,
fade
->
black_level_scaled
,
for
(
j
=
0
;
j
<
inlink
->
w
*
fade
->
bpp
;
j
++
)
{
0
,
1
,
// offset & pixstep for Y plane or RGB packed format
/* fade->factor is using 16 lower-order bits for decimal places. */
fade
->
bpp
,
outpic
->
data
[
0
],
outpic
->
linesize
[
0
]);
*
p
=
((
*
p
-
fade
->
black_level
)
*
fade
->
factor
+
fade
->
black_level_scaled
)
>>
16
;
p
++
;
}
}
if
(
outpic
->
data
[
1
]
&&
outpic
->
data
[
2
])
{
if
(
outpic
->
data
[
1
]
&&
outpic
->
data
[
2
])
{
/* chroma planes */
/* chroma planes */
for
(
plane
=
1
;
plane
<
3
;
plane
++
)
{
for
(
plane
=
1
;
plane
<
3
;
plane
++
)
{
...
@@ -207,6 +258,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
...
@@ -207,6 +258,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
}
}
}
}
}
}
}
avfilter_draw_slice
(
inlink
->
dst
->
outputs
[
0
],
y
,
h
,
slice_dir
);
avfilter_draw_slice
(
inlink
->
dst
->
outputs
[
0
],
y
,
h
,
slice_dir
);
}
}
...
...
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