Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
bfdd6304
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,发现更多精彩内容 >>
提交
bfdd6304
编写于
2月 07, 2020
作者:
P
Paul B Mahol
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avfilter/af_crystalizer: add slice threading support
上级
af1f1e86
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
93 addition
and
34 deletion
+93
-34
libavfilter/af_crystalizer.c
libavfilter/af_crystalizer.c
+93
-34
未找到文件。
libavfilter/af_crystalizer.c
浏览文件 @
bfdd6304
...
...
@@ -29,8 +29,7 @@ typedef struct CrystalizerContext {
float
mult
;
int
clip
;
AVFrame
*
prev
;
void
(
*
filter
)(
void
**
dst
,
void
**
prv
,
const
void
**
src
,
int
nb_samples
,
int
channels
,
float
mult
,
int
clip
);
int
(
*
filter
)(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
);
}
CrystalizerContext
;
#define OFFSET(x) offsetof(CrystalizerContext, x)
...
...
@@ -74,42 +73,71 @@ static int query_formats(AVFilterContext *ctx)
return
ff_set_common_samplerates
(
ctx
,
formats
);
}
static
void
filter_flt
(
void
**
d
,
void
**
p
,
const
void
**
s
,
int
nb_samples
,
int
channels
,
float
mult
,
int
clip
)
typedef
struct
ThreadData
{
void
**
d
;
void
**
p
;
const
void
**
s
;
int
nb_samples
;
int
channels
;
float
mult
;
int
clip
;
}
ThreadData
;
static
int
filter_flt
(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
)
{
const
float
*
src
=
s
[
0
];
float
*
dst
=
d
[
0
];
ThreadData
*
td
=
arg
;
void
**
d
=
td
->
d
;
void
**
p
=
td
->
p
;
const
void
**
s
=
td
->
s
;
const
int
nb_samples
=
td
->
nb_samples
;
const
int
channels
=
td
->
channels
;
float
mult
=
td
->
mult
;
const
int
clip
=
td
->
clip
;
const
int
start
=
(
channels
*
jobnr
)
/
nb_jobs
;
const
int
end
=
(
channels
*
(
jobnr
+
1
))
/
nb_jobs
;
float
*
prv
=
p
[
0
];
int
n
,
c
;
for
(
n
=
0
;
n
<
nb_samples
;
n
++
)
{
for
(
c
=
0
;
c
<
channels
;
c
++
)
{
float
current
=
src
[
c
];
for
(
c
=
start
;
c
<
end
;
c
++
)
{
const
float
*
src
=
s
[
0
];
float
*
dst
=
d
[
0
];
for
(
n
=
0
;
n
<
nb_samples
;
n
++
)
{
float
current
=
src
[
c
];
dst
[
c
]
=
current
+
(
current
-
prv
[
c
])
*
mult
;
prv
[
c
]
=
current
;
if
(
clip
)
{
dst
[
c
]
=
av_clipf
(
dst
[
c
],
-
1
,
1
);
}
}
dst
+=
c
;
src
+=
c
;
dst
+=
channels
;
src
+=
channels
;
}
}
return
0
;
}
static
void
filter_dbl
(
void
**
d
,
void
**
p
,
const
void
**
s
,
int
nb_samples
,
int
channels
,
float
mult
,
int
clip
)
static
int
filter_dbl
(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
)
{
const
double
*
src
=
s
[
0
];
double
*
dst
=
d
[
0
];
ThreadData
*
td
=
arg
;
void
**
d
=
td
->
d
;
void
**
p
=
td
->
p
;
const
void
**
s
=
td
->
s
;
const
int
nb_samples
=
td
->
nb_samples
;
const
int
channels
=
td
->
channels
;
float
mult
=
td
->
mult
;
const
int
clip
=
td
->
clip
;
const
int
start
=
(
channels
*
jobnr
)
/
nb_jobs
;
const
int
end
=
(
channels
*
(
jobnr
+
1
))
/
nb_jobs
;
double
*
prv
=
p
[
0
];
int
n
,
c
;
for
(
n
=
0
;
n
<
nb_samples
;
n
++
)
{
for
(
c
=
0
;
c
<
channels
;
c
++
)
{
for
(
c
=
start
;
c
<
end
;
c
++
)
{
const
double
*
src
=
s
[
0
];
double
*
dst
=
d
[
0
];
for
(
n
=
0
;
n
<
nb_samples
;
n
++
)
{
double
current
=
src
[
c
];
dst
[
c
]
=
current
+
(
current
-
prv
[
c
])
*
mult
;
...
...
@@ -117,20 +145,30 @@ static void filter_dbl(void **d, void **p, const void **s,
if
(
clip
)
{
dst
[
c
]
=
av_clipd
(
dst
[
c
],
-
1
,
1
);
}
}
dst
+=
c
;
src
+=
c
;
dst
+=
channels
;
src
+=
channels
;
}
}
return
0
;
}
static
void
filter_fltp
(
void
**
d
,
void
**
p
,
const
void
**
s
,
int
nb_samples
,
int
channels
,
float
mult
,
int
clip
)
static
int
filter_fltp
(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
)
{
ThreadData
*
td
=
arg
;
void
**
d
=
td
->
d
;
void
**
p
=
td
->
p
;
const
void
**
s
=
td
->
s
;
const
int
nb_samples
=
td
->
nb_samples
;
const
int
channels
=
td
->
channels
;
float
mult
=
td
->
mult
;
const
int
clip
=
td
->
clip
;
const
int
start
=
(
channels
*
jobnr
)
/
nb_jobs
;
const
int
end
=
(
channels
*
(
jobnr
+
1
))
/
nb_jobs
;
int
n
,
c
;
for
(
c
=
0
;
c
<
channels
;
c
++
)
{
for
(
c
=
start
;
c
<
end
;
c
++
)
{
const
float
*
src
=
s
[
c
];
float
*
dst
=
d
[
c
];
float
*
prv
=
p
[
c
];
...
...
@@ -145,15 +183,25 @@ static void filter_fltp(void **d, void **p, const void **s,
}
}
}
return
0
;
}
static
void
filter_dblp
(
void
**
d
,
void
**
p
,
const
void
**
s
,
int
nb_samples
,
int
channels
,
float
mult
,
int
clip
)
static
int
filter_dblp
(
AVFilterContext
*
ctx
,
void
*
arg
,
int
jobnr
,
int
nb_jobs
)
{
ThreadData
*
td
=
arg
;
void
**
d
=
td
->
d
;
void
**
p
=
td
->
p
;
const
void
**
s
=
td
->
s
;
const
int
nb_samples
=
td
->
nb_samples
;
const
int
channels
=
td
->
channels
;
float
mult
=
td
->
mult
;
const
int
clip
=
td
->
clip
;
const
int
start
=
(
channels
*
jobnr
)
/
nb_jobs
;
const
int
end
=
(
channels
*
(
jobnr
+
1
))
/
nb_jobs
;
int
n
,
c
;
for
(
c
=
0
;
c
<
channels
;
c
++
)
{
for
(
c
=
start
;
c
<
end
;
c
++
)
{
const
double
*
src
=
s
[
c
];
double
*
dst
=
d
[
c
];
double
*
prv
=
p
[
c
];
...
...
@@ -168,6 +216,8 @@ static void filter_dblp(void **d, void **p, const void **s,
}
}
}
return
0
;
}
static
int
config_input
(
AVFilterLink
*
inlink
)
...
...
@@ -191,6 +241,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
CrystalizerContext
*
s
=
ctx
->
priv
;
AVFrame
*
out
;
ThreadData
td
;
if
(
!
s
->
prev
)
{
s
->
prev
=
ff_get_audio_buffer
(
inlink
,
1
);
...
...
@@ -211,8 +262,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
av_frame_copy_props
(
out
,
in
);
}
s
->
filter
((
void
**
)
out
->
extended_data
,
(
void
**
)
s
->
prev
->
extended_data
,
(
const
void
**
)
in
->
extended_data
,
in
->
nb_samples
,
in
->
channels
,
ctx
->
is_disabled
?
0
.
f
:
s
->
mult
,
s
->
clip
);
td
.
d
=
(
void
**
)
out
->
extended_data
;
td
.
s
=
(
const
void
**
)
in
->
extended_data
;
td
.
p
=
(
void
**
)
s
->
prev
->
extended_data
;
td
.
nb_samples
=
in
->
nb_samples
;
td
.
channels
=
in
->
channels
;
td
.
mult
=
ctx
->
is_disabled
?
0
.
f
:
s
->
mult
;
td
.
clip
=
s
->
clip
;
ctx
->
internal
->
execute
(
ctx
,
s
->
filter
,
&
td
,
NULL
,
FFMIN
(
inlink
->
channels
,
ff_filter_get_nb_threads
(
ctx
)));
if
(
out
!=
in
)
av_frame_free
(
&
in
);
...
...
@@ -254,6 +312,7 @@ AVFilter ff_af_crystalizer = {
.
uninit
=
uninit
,
.
inputs
=
inputs
,
.
outputs
=
outputs
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
,
.
process_command
=
ff_filter_process_command
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
|
AVFILTER_FLAG_SLICE_THREADS
,
};
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录