Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
b607f193
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 搜索 >>
提交
b607f193
编写于
12月 06, 2020
作者:
P
Paul B Mahol
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avfilter: add asuperpass and asuperstop filter
上级
628d02a6
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
185 addition
and
5 deletion
+185
-5
Changelog
Changelog
+1
-0
doc/filters.texi
doc/filters.texi
+50
-0
libavfilter/Makefile
libavfilter/Makefile
+2
-0
libavfilter/af_asupercut.c
libavfilter/af_asupercut.c
+129
-4
libavfilter/allfilters.c
libavfilter/allfilters.c
+2
-0
libavfilter/version.h
libavfilter/version.h
+1
-1
未找到文件。
Changelog
浏览文件 @
b607f193
...
...
@@ -52,6 +52,7 @@ version <next>:
- Microsoft Paint (MSP) version 2 decoder
- Microsoft Paint (MSP) demuxer
- AV1 monochrome encoding support via libaom >= 2.0.1
- asuperpass and asuperstop filter
version 4.3:
...
...
doc/filters.texi
浏览文件 @
b607f193
...
...
@@ -2733,6 +2733,56 @@ Set input gain level. Allowed range is from 0 to 1. Default value is 1.
This filter supports the all above options as @ref{commands}.
@section asuperpass
Apply high order Butterworth band-pass filter.
The filter accepts the following options:
@table @option
@item centerf
Set center frequency in Hertz. Allowed range is 2 to 999999.
Default value is 1000.
@item order
Set filter order. Available values are from 4 to 20.
Default value is 4.
@item qfactor
Set Q-factor. Allowed range is from 0.01 to 100. Default value is 1.
@item level
Set input gain level. Allowed range is from 0 to 2. Default value is 1.
@end table
@subsection Commands
This filter supports the all above options as @ref{commands}.
@section asuperstop
Apply high order Butterworth band-stop filter.
The filter accepts the following options:
@table @option
@item centerf
Set center frequency in Hertz. Allowed range is 2 to 999999.
Default value is 1000.
@item order
Set filter order. Available values are from 4 to 20.
Default value is 4.
@item qfactor
Set Q-factor. Allowed range is from 0.01 to 100. Default value is 1.
@item level
Set input gain level. Allowed range is from 0 to 2. Default value is 1.
@end table
@subsection Commands
This filter supports the all above options as @ref{commands}.
@section atempo
Adjust audio tempo.
...
...
libavfilter/Makefile
浏览文件 @
b607f193
...
...
@@ -92,6 +92,8 @@ OBJS-$(CONFIG_ASTREAMSELECT_FILTER) += f_streamselect.o framesync.o
OBJS-$(CONFIG_ASUBBOOST_FILTER)
+=
af_asubboost.o
OBJS-$(CONFIG_ASUBCUT_FILTER)
+=
af_asupercut.o
OBJS-$(CONFIG_ASUPERCUT_FILTER)
+=
af_asupercut.o
OBJS-$(CONFIG_ASUPERPASS_FILTER)
+=
af_asupercut.o
OBJS-$(CONFIG_ASUPERSTOP_FILTER)
+=
af_asupercut.o
OBJS-$(CONFIG_ATEMPO_FILTER)
+=
af_atempo.o
OBJS-$(CONFIG_ATRIM_FILTER)
+=
trim.o
OBJS-$(CONFIG_AXCORRELATE_FILTER)
+=
af_axcorrelate.o
...
...
libavfilter/af_asupercut.c
浏览文件 @
b607f193
/*
* Copyright (c) 2005 Boðaç Topaktaþ
* Copyright (c) 2020 Paul B Mahol
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
...
...
@@ -33,6 +36,7 @@ typedef struct ASuperCutContext {
double
cutoff
;
double
level
;
double
qfactor
;
int
order
;
int
filter_count
;
...
...
@@ -93,10 +97,11 @@ static int get_coeffs(AVFilterContext *ctx)
if
(
s
->
bypass
)
return
0
;
s
->
filter_count
=
s
->
order
/
2
+
(
s
->
order
&
1
);
calc_q_factors
(
s
->
order
,
q
);
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"asubcut"
))
{
s
->
filter_count
=
s
->
order
/
2
+
(
s
->
order
&
1
);
calc_q_factors
(
s
->
order
,
q
);
if
(
s
->
order
&
1
)
{
BiquadCoeffs
*
coeffs
=
&
s
->
coeffs
[
0
];
double
omega
=
2
.
*
tan
(
M_PI
*
w0
);
...
...
@@ -119,7 +124,11 @@ static int get_coeffs(AVFilterContext *ctx)
coeffs
->
a1
=
-
2
.
0
*
(
K
*
K
-
1
.
0
)
*
norm
;
coeffs
->
a2
=
-
(
1
.
0
-
K
/
q
[
idx
]
+
K
*
K
)
*
norm
;
}
}
else
{
}
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"asupercut"
))
{
s
->
filter_count
=
s
->
order
/
2
+
(
s
->
order
&
1
);
calc_q_factors
(
s
->
order
,
q
);
if
(
s
->
order
&
1
)
{
BiquadCoeffs
*
coeffs
=
&
s
->
coeffs
[
0
];
double
omega
=
2
.
*
tan
(
M_PI
*
w0
);
...
...
@@ -142,6 +151,74 @@ static int get_coeffs(AVFilterContext *ctx)
coeffs
->
a1
=
-
2
.
0
*
(
K
*
K
-
1
.
0
)
*
norm
;
coeffs
->
a2
=
-
(
1
.
0
-
K
/
q
[
idx
]
+
K
*
K
)
*
norm
;
}
}
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"asuperpass"
))
{
double
alpha
,
beta
,
gamma
,
theta
;
double
theta_0
=
2
.
*
M_PI
*
(
s
->
cutoff
/
inlink
->
sample_rate
);
double
d_E
;
s
->
filter_count
=
s
->
order
/
2
;
d_E
=
(
2
.
*
tan
(
theta_0
/
(
2
.
*
s
->
qfactor
)))
/
sin
(
theta_0
);
for
(
int
b
=
0
;
b
<
s
->
filter_count
;
b
+=
2
)
{
double
D
=
2
.
*
sin
(((
b
+
1
)
*
M_PI
)
/
(
2
.
*
s
->
filter_count
));
double
A
=
(
1
.
+
pow
((
d_E
/
2
.),
2
))
/
(
D
*
d_E
/
2
.);
double
d
=
sqrt
((
d_E
*
D
)
/
(
A
+
sqrt
(
A
*
A
-
1
.)));
double
B
=
D
*
(
d_E
/
2
.)
/
d
;
double
W
=
B
+
sqrt
(
B
*
B
-
1
.);
for
(
int
j
=
0
;
j
<
2
;
j
++
)
{
BiquadCoeffs
*
coeffs
=
&
s
->
coeffs
[
b
+
j
];
if
(
j
==
1
)
theta
=
2
.
*
atan
(
tan
(
theta_0
/
2
.)
/
W
);
else
theta
=
2
.
*
atan
(
W
*
tan
(
theta_0
/
2
.));
beta
=
0
.
5
*
((
1
.
-
(
d
/
2
.)
*
sin
(
theta
))
/
(
1
.
+
(
d
/
2
.)
*
sin
(
theta
)));
gamma
=
(
0
.
5
+
beta
)
*
cos
(
theta
);
alpha
=
0
.
5
*
(
0
.
5
-
beta
)
*
sqrt
(
1
.
+
pow
((
W
-
(
1
.
/
W
))
/
d
,
2
.));
coeffs
->
a1
=
2
.
*
gamma
;
coeffs
->
a2
=
-
2
.
*
beta
;
coeffs
->
b0
=
2
.
*
alpha
;
coeffs
->
b1
=
0
.;
coeffs
->
b2
=
-
2
.
*
alpha
;
}
}
}
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"asuperstop"
))
{
double
alpha
,
beta
,
gamma
,
theta
;
double
theta_0
=
2
.
*
M_PI
*
(
s
->
cutoff
/
inlink
->
sample_rate
);
double
d_E
;
s
->
filter_count
=
s
->
order
/
2
;
d_E
=
(
2
.
*
tan
(
theta_0
/
(
2
.
*
s
->
qfactor
)))
/
sin
(
theta_0
);
for
(
int
b
=
0
;
b
<
s
->
filter_count
;
b
+=
2
)
{
double
D
=
2
.
*
sin
(((
b
+
1
)
*
M_PI
)
/
(
2
.
*
s
->
filter_count
));
double
A
=
(
1
.
+
pow
((
d_E
/
2
.),
2
))
/
(
D
*
d_E
/
2
.);
double
d
=
sqrt
((
d_E
*
D
)
/
(
A
+
sqrt
(
A
*
A
-
1
.)));
double
B
=
D
*
(
d_E
/
2
.)
/
d
;
double
W
=
B
+
sqrt
(
B
*
B
-
1
.);
for
(
int
j
=
0
;
j
<
2
;
j
++
)
{
BiquadCoeffs
*
coeffs
=
&
s
->
coeffs
[
b
+
j
];
if
(
j
==
1
)
theta
=
2
.
*
atan
(
tan
(
theta_0
/
2
.)
/
W
);
else
theta
=
2
.
*
atan
(
W
*
tan
(
theta_0
/
2
.));
beta
=
0
.
5
*
((
1
.
-
(
d
/
2
.)
*
sin
(
theta
))
/
(
1
.
+
(
d
/
2
.)
*
sin
(
theta
)));
gamma
=
(
0
.
5
+
beta
)
*
cos
(
theta
);
alpha
=
0
.
5
*
(
0
.
5
+
beta
)
*
((
1
.
-
cos
(
theta
))
/
(
1
.
-
cos
(
theta_0
)));
coeffs
->
a1
=
2
.
*
gamma
;
coeffs
->
a2
=
-
2
.
*
beta
;
coeffs
->
b0
=
2
.
*
alpha
;
coeffs
->
b1
=
-
4
.
*
alpha
*
cos
(
theta_0
);
coeffs
->
b2
=
2
.
*
alpha
;
}
}
}
return
0
;
...
...
@@ -327,3 +404,51 @@ AVFilter ff_af_asubcut = {
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
|
AVFILTER_FLAG_SLICE_THREADS
,
};
static
const
AVOption
asuperpass_options
[]
=
{
{
"centerf"
,
"set center frequency"
,
OFFSET
(
cutoff
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1000
},
2
,
999999
,
FLAGS
},
{
"order"
,
"set filter order"
,
OFFSET
(
order
),
AV_OPT_TYPE_INT
,
{.
i64
=
4
},
4
,
20
,
FLAGS
},
{
"qfactor"
,
"set Q-factor"
,
OFFSET
(
qfactor
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.},
0
.
01
,
100
.,
FLAGS
},
{
"level"
,
"set input level"
,
OFFSET
(
level
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.},
0
.,
2
.,
FLAGS
},
{
NULL
}
};
AVFILTER_DEFINE_CLASS
(
asuperpass
);
AVFilter
ff_af_asuperpass
=
{
.
name
=
"asuperpass"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Apply high order Butterworth band-pass filter."
),
.
query_formats
=
query_formats
,
.
priv_size
=
sizeof
(
ASuperCutContext
),
.
priv_class
=
&
asuperpass_class
,
.
uninit
=
uninit
,
.
inputs
=
inputs
,
.
outputs
=
outputs
,
.
process_command
=
process_command
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
|
AVFILTER_FLAG_SLICE_THREADS
,
};
static
const
AVOption
asuperstop_options
[]
=
{
{
"centerf"
,
"set center frequency"
,
OFFSET
(
cutoff
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1000
},
2
,
999999
,
FLAGS
},
{
"order"
,
"set filter order"
,
OFFSET
(
order
),
AV_OPT_TYPE_INT
,
{.
i64
=
4
},
4
,
20
,
FLAGS
},
{
"qfactor"
,
"set Q-factor"
,
OFFSET
(
qfactor
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.},
0
.
01
,
100
.,
FLAGS
},
{
"level"
,
"set input level"
,
OFFSET
(
level
),
AV_OPT_TYPE_DOUBLE
,
{.
dbl
=
1
.},
0
.,
2
.,
FLAGS
},
{
NULL
}
};
AVFILTER_DEFINE_CLASS
(
asuperstop
);
AVFilter
ff_af_asuperstop
=
{
.
name
=
"asuperstop"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Apply high order Butterworth band-stop filter."
),
.
query_formats
=
query_formats
,
.
priv_size
=
sizeof
(
ASuperCutContext
),
.
priv_class
=
&
asuperstop_class
,
.
uninit
=
uninit
,
.
inputs
=
inputs
,
.
outputs
=
outputs
,
.
process_command
=
process_command
,
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
|
AVFILTER_FLAG_SLICE_THREADS
,
};
libavfilter/allfilters.c
浏览文件 @
b607f193
...
...
@@ -85,6 +85,8 @@ extern AVFilter ff_af_astreamselect;
extern
AVFilter
ff_af_asubboost
;
extern
AVFilter
ff_af_asubcut
;
extern
AVFilter
ff_af_asupercut
;
extern
AVFilter
ff_af_asuperpass
;
extern
AVFilter
ff_af_asuperstop
;
extern
AVFilter
ff_af_atempo
;
extern
AVFilter
ff_af_atrim
;
extern
AVFilter
ff_af_axcorrelate
;
...
...
libavfilter/version.h
浏览文件 @
b607f193
...
...
@@ -30,7 +30,7 @@
#include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 7
#define LIBAVFILTER_VERSION_MINOR 9
2
#define LIBAVFILTER_VERSION_MINOR 9
3
#define LIBAVFILTER_VERSION_MICRO 100
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录