Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
7e3f20c4
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 搜索 >>
提交
7e3f20c4
编写于
12月 18, 2020
作者:
P
Paul B Mahol
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avfilter/af_asoftclip: add two more useful options for finer filtering
上级
1eb75195
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
92 addition
and
38 deletion
+92
-38
doc/filters.texi
doc/filters.texi
+6
-0
libavfilter/af_asoftclip.c
libavfilter/af_asoftclip.c
+86
-38
未找到文件。
doc/filters.texi
浏览文件 @
7e3f20c4
...
...
@@ -2454,6 +2454,12 @@ It accepts the following values:
@item erf
@end table
@item threshold
Set threshold from where to start clipping. Default value is 0dB or 1.
@item output
Set gain applied to output. Default value is 0dB or 1.
@item param
Set additional parameter which controls sigmoid function.
...
...
libavfilter/af_asoftclip.c
浏览文件 @
7e3f20c4
...
...
@@ -45,6 +45,8 @@ typedef struct ASoftClipContext {
int
type
;
int
oversample
;
int64_t
delay
;
double
threshold
;
double
output
;
double
param
;
SwrContext
*
up_ctx
;
...
...
@@ -71,6 +73,8 @@ static const AVOption asoftclip_options[] = {
{
"quintic"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ASC_QUINTIC
},
0
,
0
,
A
,
"types"
},
{
"sin"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ASC_SIN
},
0
,
0
,
A
,
"types"
},
{
"erf"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ASC_ERF
},
0
,
0
,
A
,
"types"
},
{
"threshold"
,
"set softclip threshold"
,
OFFSET
(
threshold
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
},
0
.
000001
,
1
,
A
},
{
"output"
,
"set softclip output gain"
,
OFFSET
(
output
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
},
0
.
000001
,
16
,
A
},
{
"param"
,
"set softclip parameter"
,
OFFSET
(
param
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
},
0
.
01
,
3
,
A
},
{
"oversample"
,
"set oversample factor"
,
OFFSET
(
oversample
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
1
,
32
,
F
},
{
NULL
}
...
...
@@ -108,13 +112,14 @@ static int query_formats(AVFilterContext *ctx)
return
ff_set_common_samplerates
(
ctx
,
formats
);
}
#define SQR(x) ((x) * (x))
static
void
filter_flt
(
ASoftClipContext
*
s
,
void
**
dptr
,
const
void
**
sptr
,
int
nb_samples
,
int
channels
,
int
start
,
int
end
)
{
float
threshold
=
s
->
threshold
;
float
gain
=
s
->
output
*
threshold
;
float
factor
=
1
.
f
/
threshold
;
float
param
=
s
->
param
;
for
(
int
c
=
start
;
c
<
end
;
c
++
)
{
...
...
@@ -124,53 +129,73 @@ static void filter_flt(ASoftClipContext *s,
switch
(
s
->
type
)
{
case
ASC_HARD
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
av_clipf
(
src
[
n
],
-
1
.
f
,
1
.
f
);
dst
[
n
]
=
av_clipf
(
src
[
n
]
*
factor
,
-
1
.
f
,
1
.
f
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_TANH
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
tanhf
(
src
[
n
]
*
param
);
dst
[
n
]
=
tanhf
(
src
[
n
]
*
factor
*
param
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ATAN
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
2
.
f
/
M_PI
*
atanf
(
src
[
n
]
*
param
);
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
2
.
f
/
M_PI
*
atanf
(
src
[
n
]
*
factor
*
param
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_CUBIC
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
1
.
5
f
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
float
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
1
.
5
f
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
src
[
n
]
-
0
.
1481
f
*
powf
(
src
[
n
],
3
.
f
);
dst
[
n
]
=
sample
-
0
.
1481
f
*
powf
(
sample
,
3
.
f
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_EXP
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
2
.
f
/
(
1
.
f
+
expf
(
-
2
.
f
*
src
[
n
]))
-
1
.;
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
2
.
f
/
(
1
.
f
+
expf
(
-
2
.
f
*
src
[
n
]
*
factor
))
-
1
.;
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ALG
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
src
[
n
]
/
(
sqrtf
(
param
+
src
[
n
]
*
src
[
n
]));
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
float
sample
=
src
[
n
]
*
factor
;
dst
[
n
]
=
sample
/
(
sqrtf
(
param
+
sample
*
sample
));
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_QUINTIC
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
1
.
25
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
float
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
1
.
25
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
src
[
n
]
-
0
.
08192
f
*
powf
(
src
[
n
],
5
.
f
);
dst
[
n
]
=
sample
-
0
.
08192
f
*
powf
(
sample
,
5
.
f
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_SIN
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
M_PI_2
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
float
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
M_PI_2
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
sinf
(
src
[
n
]);
dst
[
n
]
=
sinf
(
sample
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ERF
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
erff
(
src
[
n
]);
dst
[
n
]
=
erff
(
src
[
n
]
*
factor
);
dst
[
n
]
*=
gain
;
}
break
;
default:
...
...
@@ -184,6 +209,9 @@ static void filter_dbl(ASoftClipContext *s,
int
nb_samples
,
int
channels
,
int
start
,
int
end
)
{
double
threshold
=
s
->
threshold
;
double
gain
=
s
->
output
*
threshold
;
double
factor
=
1
.
/
threshold
;
double
param
=
s
->
param
;
for
(
int
c
=
start
;
c
<
end
;
c
++
)
{
...
...
@@ -193,53 +221,73 @@ static void filter_dbl(ASoftClipContext *s,
switch
(
s
->
type
)
{
case
ASC_HARD
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
av_clipd
(
src
[
n
],
-
1
.,
1
.);
dst
[
n
]
=
av_clipd
(
src
[
n
]
*
factor
,
-
1
.,
1
.);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_TANH
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
tanh
(
src
[
n
]
*
param
);
dst
[
n
]
=
tanh
(
src
[
n
]
*
factor
*
param
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ATAN
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
2
.
/
M_PI
*
atan
(
src
[
n
]
*
param
);
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
2
.
/
M_PI
*
atan
(
src
[
n
]
*
factor
*
param
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_CUBIC
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
1
.
5
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
double
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
1
.
5
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
src
[
n
]
-
0
.
1481
*
pow
(
src
[
n
],
3
.);
dst
[
n
]
=
sample
-
0
.
1481
*
pow
(
sample
,
3
.);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_EXP
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
2
.
/
(
1
.
+
exp
(
-
2
.
*
src
[
n
]))
-
1
.;
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
2
.
/
(
1
.
+
exp
(
-
2
.
*
src
[
n
]
*
factor
))
-
1
.;
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ALG
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
dst
[
n
]
=
src
[
n
]
/
(
sqrt
(
param
+
src
[
n
]
*
src
[
n
]));
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
double
sample
=
src
[
n
]
*
factor
;
dst
[
n
]
=
sample
/
(
sqrt
(
param
+
sample
*
sample
));
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_QUINTIC
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
1
.
25
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
double
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
1
.
25
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
src
[
n
]
-
0
.
08192
*
pow
(
src
[
n
],
5
.);
dst
[
n
]
=
sample
-
0
.
08192
*
pow
(
sample
,
5
.);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_SIN
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
if
(
FFABS
(
src
[
n
])
>=
M_PI_2
)
dst
[
n
]
=
FFSIGN
(
src
[
n
]);
double
sample
=
src
[
n
]
*
factor
;
if
(
FFABS
(
sample
)
>=
M_PI_2
)
dst
[
n
]
=
FFSIGN
(
sample
);
else
dst
[
n
]
=
sin
(
src
[
n
]);
dst
[
n
]
=
sin
(
sample
);
dst
[
n
]
*=
gain
;
}
break
;
case
ASC_ERF
:
for
(
int
n
=
0
;
n
<
nb_samples
;
n
++
)
{
dst
[
n
]
=
erf
(
src
[
n
]);
dst
[
n
]
=
erf
(
src
[
n
]
*
factor
);
dst
[
n
]
*=
gain
;
}
break
;
default:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录