Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
9292fe4a
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,发现更多精彩内容 >>
提交
9292fe4a
编写于
12月 23, 2011
作者:
N
Nathan Caldwell
提交者:
Alex Converse
1月 23, 2012
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
aacenc: Simplify windowing
Signed-off-by:
N
Alex Converse
<
alex.converse@gmail.com
>
上级
7946a5ac
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
68 addition
and
33 deletion
+68
-33
libavcodec/aacenc.c
libavcodec/aacenc.c
+68
-33
未找到文件。
libavcodec/aacenc.c
浏览文件 @
9292fe4a
...
...
@@ -180,45 +180,80 @@ static void put_audio_specific_config(AVCodecContext *avctx)
flush_put_bits
(
&
pb
);
}
#define WINDOW_FUNC(type) \
static void apply_ ##type ##_window(DSPContext *dsp, SingleChannelElement *sce, const float *audio)
WINDOW_FUNC
(
only_long
)
{
const
float
*
lwindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
const
float
*
pwindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
float
*
out
=
sce
->
ret
;
dsp
->
vector_fmul
(
out
,
audio
,
lwindow
,
1024
);
dsp
->
vector_fmul_reverse
(
out
+
1024
,
audio
+
1024
,
pwindow
,
1024
);
}
WINDOW_FUNC
(
long_start
)
{
const
float
*
lwindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
const
float
*
swindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
float
*
out
=
sce
->
ret
;
dsp
->
vector_fmul
(
out
,
audio
,
lwindow
,
1024
);
memcpy
(
out
+
1024
,
audio
,
sizeof
(
out
[
0
])
*
448
);
dsp
->
vector_fmul_reverse
(
out
+
1024
+
448
,
audio
,
swindow
,
128
);
memset
(
out
+
1024
+
576
,
0
,
sizeof
(
out
[
0
])
*
448
);
}
WINDOW_FUNC
(
long_stop
)
{
const
float
*
lwindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
const
float
*
swindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
float
*
out
=
sce
->
ret
;
memset
(
out
,
0
,
sizeof
(
out
[
0
])
*
448
);
dsp
->
vector_fmul
(
out
+
448
,
audio
+
448
,
swindow
,
128
);
memcpy
(
out
+
576
,
audio
+
576
,
sizeof
(
out
[
0
])
*
448
);
dsp
->
vector_fmul_reverse
(
out
+
1024
,
audio
+
1024
,
lwindow
,
1024
);
}
WINDOW_FUNC
(
eight_short
)
{
const
float
*
swindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
const
float
*
pwindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
const
float
*
in
=
audio
+
448
;
float
*
out
=
sce
->
ret
;
for
(
int
w
=
0
;
w
<
8
;
w
++
)
{
dsp
->
vector_fmul
(
out
,
in
,
w
?
pwindow
:
swindow
,
128
);
out
+=
128
;
in
+=
128
;
dsp
->
vector_fmul_reverse
(
out
,
in
,
swindow
,
128
);
out
+=
128
;
}
}
static
void
(
*
const
apply_window
[
4
])(
DSPContext
*
dsp
,
SingleChannelElement
*
sce
,
const
float
*
audio
)
=
{
[
ONLY_LONG_SEQUENCE
]
=
apply_only_long_window
,
[
LONG_START_SEQUENCE
]
=
apply_long_start_window
,
[
EIGHT_SHORT_SEQUENCE
]
=
apply_eight_short_window
,
[
LONG_STOP_SEQUENCE
]
=
apply_long_stop_window
};
static
void
apply_window_and_mdct
(
AACEncContext
*
s
,
SingleChannelElement
*
sce
,
float
*
audio
)
{
int
i
,
k
;
const
float
*
lwindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
const
float
*
swindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
const
float
*
pwindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
int
i
;
float
*
output
=
sce
->
ret
;
if
(
sce
->
ics
.
window_sequence
[
0
]
!=
EIGHT_SHORT_SEQUENCE
)
{
memcpy
(
output
,
audio
,
sizeof
(
output
[
0
])
*
1024
);
if
(
sce
->
ics
.
window_sequence
[
0
]
==
LONG_STOP_SEQUENCE
)
{
memset
(
output
,
0
,
sizeof
(
output
[
0
])
*
448
);
for
(
i
=
448
;
i
<
576
;
i
++
)
output
[
i
]
=
audio
[
i
]
*
pwindow
[
i
-
448
];
}
if
(
sce
->
ics
.
window_sequence
[
0
]
!=
LONG_START_SEQUENCE
)
{
for
(
i
=
0
;
i
<
1024
;
i
++
)
{
output
[
i
+
1024
]
=
audio
[
i
+
1024
]
*
lwindow
[
1024
-
i
-
1
];
audio
[
i
]
=
audio
[
i
+
1024
]
*
lwindow
[
i
];
}
}
else
{
memcpy
(
output
+
1024
,
audio
+
1024
,
sizeof
(
output
[
0
])
*
448
);
for
(;
i
<
576
;
i
++
)
output
[
i
+
1024
]
=
audio
[
i
+
1024
]
*
swindow
[
576
-
i
-
1
];
memset
(
output
+
1024
+
576
,
0
,
sizeof
(
output
[
0
])
*
448
);
memcpy
(
audio
,
audio
+
1024
,
sizeof
(
audio
[
0
])
*
1024
);
}
apply_window
[
sce
->
ics
.
window_sequence
[
0
]](
&
s
->
dsp
,
sce
,
audio
);
if
(
sce
->
ics
.
window_sequence
[
0
]
!=
EIGHT_SHORT_SEQUENCE
)
s
->
mdct1024
.
mdct_calc
(
&
s
->
mdct1024
,
sce
->
coeffs
,
output
);
}
else
{
for
(
k
=
0
;
k
<
1024
;
k
+=
128
)
{
for
(
i
=
448
+
k
;
i
<
448
+
k
+
256
;
i
++
)
output
[
i
-
448
-
k
]
=
audio
[
i
];
s
->
dsp
.
vector_fmul
(
output
,
output
,
k
?
swindow
:
pwindow
,
128
);
s
->
dsp
.
vector_fmul_reverse
(
output
+
128
,
output
+
128
,
swindow
,
128
);
s
->
mdct128
.
mdct_calc
(
&
s
->
mdct128
,
sce
->
coeffs
+
k
,
output
);
}
memcpy
(
audio
,
audio
+
1024
,
sizeof
(
audio
[
0
])
*
1024
);
}
else
for
(
i
=
0
;
i
<
1024
;
i
+=
128
)
s
->
mdct128
.
mdct_calc
(
&
s
->
mdct128
,
sce
->
coeffs
+
i
,
output
+
i
*
2
);
memcpy
(
audio
,
audio
+
1024
,
sizeof
(
audio
[
0
])
*
1024
);
}
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录