Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
283e7557
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
283e7557
编写于
2月 09, 2020
作者:
P
Paul B Mahol
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avfilter/vf_xfade: add diagonal smooth transitions
上级
3f24e744
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
133 addition
and
0 deletion
+133
-0
doc/filters.texi
doc/filters.texi
+4
-0
libavfilter/vf_xfade.c
libavfilter/vf_xfade.c
+129
-0
未找到文件。
doc/filters.texi
浏览文件 @
283e7557
...
...
@@ -19990,6 +19990,10 @@ Set one of available transition effects:
@item horzclose
@item dissolve
@item pixelize
@item diagtl
@item diagtr
@item diagbl
@item diagbr
@end table
Default transition effect is fade.
...
...
libavfilter/vf_xfade.c
浏览文件 @
283e7557
...
...
@@ -57,6 +57,10 @@ enum XFadeTransitions {
HORZCLOSE
,
DISSOLVE
,
PIXELIZE
,
DIAGTL
,
DIAGTR
,
DIAGBL
,
DIAGBR
,
NB_TRANSITIONS
,
};
...
...
@@ -166,6 +170,10 @@ static const AVOption xfade_options[] = {
{
"horzclose"
,
"horz close transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
HORZCLOSE
},
0
,
0
,
FLAGS
,
"transition"
},
{
"dissolve"
,
"dissolve transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
DISSOLVE
},
0
,
0
,
FLAGS
,
"transition"
},
{
"pixelize"
,
"pixelize transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
PIXELIZE
},
0
,
0
,
FLAGS
,
"transition"
},
{
"diagtl"
,
"diag tl transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
DIAGTL
},
0
,
0
,
FLAGS
,
"transition"
},
{
"diagtr"
,
"diag tr transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
DIAGTR
},
0
,
0
,
FLAGS
,
"transition"
},
{
"diagbl"
,
"diag bl transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
DIAGBL
},
0
,
0
,
FLAGS
,
"transition"
},
{
"diagbr"
,
"diag br transition"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
DIAGBR
},
0
,
0
,
FLAGS
,
"transition"
},
{
"duration"
,
"set cross fade duration"
,
OFFSET
(
duration
),
AV_OPT_TYPE_DURATION
,
{.
i64
=
1000000
},
0
,
60000000
,
FLAGS
},
{
"offset"
,
"set cross fade start relative to first input stream"
,
OFFSET
(
offset
),
AV_OPT_TYPE_DURATION
,
{.
i64
=
0
},
INT64_MIN
,
INT64_MAX
,
FLAGS
},
{
"expr"
,
"set expression for custom transition"
,
OFFSET
(
custom_str
),
AV_OPT_TYPE_STRING
,
{.
str
=
NULL
},
0
,
0
,
FLAGS
},
...
...
@@ -1043,6 +1051,123 @@ static void pixelize##name##_transition(AVFilterContext *ctx,
PIXELIZE_TRANSITION
(
8
,
uint8_t
,
1
)
PIXELIZE_TRANSITION
(
16
,
uint16_t
,
2
)
#define DIAGTL_TRANSITION(name, type, div) \
static void diagtl##name##_transition(AVFilterContext *ctx, \
const AVFrame *a, const AVFrame *b, AVFrame *out, \
float progress, \
int slice_start, int slice_end, int jobnr) \
{ \
XFadeContext *s = ctx->priv; \
const int width = out->width; \
const float w = width; \
const float h = out->height; \
\
for (int y = slice_start; y < slice_end; y++) { \
for (int x = 0; x < width; x++) { \
const float smooth = 1.f + x / w * y / h - progress * 2.f; \
\
for (int p = 0; p < s->nb_planes; p++) { \
const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]); \
const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]); \
type *dst = (type *)(out->data[p] + y * out->linesize[p]); \
\
dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth)); \
} \
} \
} \
}
DIAGTL_TRANSITION
(
8
,
uint8_t
,
1
)
DIAGTL_TRANSITION
(
16
,
uint16_t
,
2
)
#define DIAGTR_TRANSITION(name, type, div) \
static void diagtr##name##_transition(AVFilterContext *ctx, \
const AVFrame *a, const AVFrame *b, AVFrame *out, \
float progress, \
int slice_start, int slice_end, int jobnr) \
{ \
XFadeContext *s = ctx->priv; \
const int width = out->width; \
const float w = width; \
const float h = out->height; \
\
for (int y = slice_start; y < slice_end; y++) { \
for (int x = 0; x < width; x++) { \
const float smooth = 1.f + (w - 1 - x) / w * y / h - progress * 2.f; \
\
for (int p = 0; p < s->nb_planes; p++) { \
const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]); \
const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]); \
type *dst = (type *)(out->data[p] + y * out->linesize[p]); \
\
dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth)); \
} \
} \
} \
}
DIAGTR_TRANSITION
(
8
,
uint8_t
,
1
)
DIAGTR_TRANSITION
(
16
,
uint16_t
,
2
)
#define DIAGBL_TRANSITION(name, type, div) \
static void diagbl##name##_transition(AVFilterContext *ctx, \
const AVFrame *a, const AVFrame *b, AVFrame *out, \
float progress, \
int slice_start, int slice_end, int jobnr) \
{ \
XFadeContext *s = ctx->priv; \
const int width = out->width; \
const float w = width; \
const float h = out->height; \
\
for (int y = slice_start; y < slice_end; y++) { \
for (int x = 0; x < width; x++) { \
const float smooth = 1.f + x / w * (h - 1 - y) / h - progress * 2.f; \
\
for (int p = 0; p < s->nb_planes; p++) { \
const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]); \
const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]); \
type *dst = (type *)(out->data[p] + y * out->linesize[p]); \
\
dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth)); \
} \
} \
} \
}
DIAGBL_TRANSITION
(
8
,
uint8_t
,
1
)
DIAGBL_TRANSITION
(
16
,
uint16_t
,
2
)
#define DIAGBR_TRANSITION(name, type, div) \
static void diagbr##name##_transition(AVFilterContext *ctx, \
const AVFrame *a, const AVFrame *b, AVFrame *out, \
float progress, \
int slice_start, int slice_end, int jobnr) \
{ \
XFadeContext *s = ctx->priv; \
const int width = out->width; \
const float w = width; \
const float h = out->height; \
\
for (int y = slice_start; y < slice_end; y++) { \
for (int x = 0; x < width; x++) { \
const float smooth = 1.f + (w - 1 - x) / w * (h - 1 - y) / h - \
progress * 2.f; \
\
for (int p = 0; p < s->nb_planes; p++) { \
const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]); \
const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]); \
type *dst = (type *)(out->data[p] + y * out->linesize[p]); \
\
dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth)); \
} \
} \
} \
}
DIAGBR_TRANSITION
(
8
,
uint8_t
,
1
)
DIAGBR_TRANSITION
(
16
,
uint16_t
,
2
)
static
inline
double
getpix
(
void
*
priv
,
double
x
,
double
y
,
int
plane
,
int
nb
)
{
XFadeContext
*
s
=
priv
;
...
...
@@ -1161,6 +1286,10 @@ static int config_output(AVFilterLink *outlink)
case
HORZCLOSE
:
s
->
transitionf
=
s
->
depth
<=
8
?
horzclose8_transition
:
horzclose16_transition
;
break
;
case
DISSOLVE
:
s
->
transitionf
=
s
->
depth
<=
8
?
dissolve8_transition
:
dissolve16_transition
;
break
;
case
PIXELIZE
:
s
->
transitionf
=
s
->
depth
<=
8
?
pixelize8_transition
:
pixelize16_transition
;
break
;
case
DIAGTL
:
s
->
transitionf
=
s
->
depth
<=
8
?
diagtl8_transition
:
diagtl16_transition
;
break
;
case
DIAGTR
:
s
->
transitionf
=
s
->
depth
<=
8
?
diagtr8_transition
:
diagtr16_transition
;
break
;
case
DIAGBL
:
s
->
transitionf
=
s
->
depth
<=
8
?
diagbl8_transition
:
diagbl16_transition
;
break
;
case
DIAGBR
:
s
->
transitionf
=
s
->
depth
<=
8
?
diagbr8_transition
:
diagbr16_transition
;
break
;
}
if
(
s
->
transition
==
CUSTOM
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录