Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
云duo
FFmpeg
提交
f1efbca5
F
FFmpeg
项目概览
云duo
/
FFmpeg
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FFmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f1efbca5
编写于
3月 11, 2011
作者:
J
Justin Ruggles
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ac3enc: add SIMD-optimized shifting functions for use with the fixed-point AC3 encoder.
上级
323e6fea
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
120 addition
and
37 deletion
+120
-37
libavcodec/ac3dsp.c
libavcodec/ac3dsp.c
+37
-0
libavcodec/ac3dsp.h
libavcodec/ac3dsp.h
+22
-0
libavcodec/ac3enc_fixed.c
libavcodec/ac3enc_fixed.c
+4
-37
libavcodec/x86/ac3dsp.asm
libavcodec/x86/ac3dsp.asm
+45
-0
libavcodec/x86/ac3dsp_mmx.c
libavcodec/x86/ac3dsp_mmx.c
+12
-0
未找到文件。
libavcodec/ac3dsp.c
浏览文件 @
f1efbca5
...
...
@@ -50,10 +50,47 @@ static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
return
v
;
}
static
void
ac3_lshift_int16_c
(
int16_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
)
{
uint32_t
*
src32
=
(
uint32_t
*
)
src
;
const
uint32_t
mask
=
~
(((
1
<<
shift
)
-
1
)
<<
16
);
int
i
;
len
>>=
1
;
for
(
i
=
0
;
i
<
len
;
i
+=
8
)
{
src32
[
i
]
=
(
src32
[
i
]
<<
shift
)
&
mask
;
src32
[
i
+
1
]
=
(
src32
[
i
+
1
]
<<
shift
)
&
mask
;
src32
[
i
+
2
]
=
(
src32
[
i
+
2
]
<<
shift
)
&
mask
;
src32
[
i
+
3
]
=
(
src32
[
i
+
3
]
<<
shift
)
&
mask
;
src32
[
i
+
4
]
=
(
src32
[
i
+
4
]
<<
shift
)
&
mask
;
src32
[
i
+
5
]
=
(
src32
[
i
+
5
]
<<
shift
)
&
mask
;
src32
[
i
+
6
]
=
(
src32
[
i
+
6
]
<<
shift
)
&
mask
;
src32
[
i
+
7
]
=
(
src32
[
i
+
7
]
<<
shift
)
&
mask
;
}
}
static
void
ac3_rshift_int32_c
(
int32_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
)
{
do
{
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
*
src
++
>>=
shift
;
len
-=
8
;
}
while
(
len
>
0
);
}
av_cold
void
ff_ac3dsp_init
(
AC3DSPContext
*
c
)
{
c
->
ac3_exponent_min
=
ac3_exponent_min_c
;
c
->
ac3_max_msb_abs_int16
=
ac3_max_msb_abs_int16_c
;
c
->
ac3_lshift_int16
=
ac3_lshift_int16_c
;
c
->
ac3_rshift_int32
=
ac3_rshift_int32_c
;
if
(
HAVE_MMX
)
ff_ac3dsp_init_x86
(
c
);
...
...
libavcodec/ac3dsp.h
浏览文件 @
f1efbca5
...
...
@@ -46,6 +46,28 @@ typedef struct AC3DSPContext {
* @return a value with the same MSB as max(abs(src[]))
*/
int
(
*
ac3_max_msb_abs_int16
)(
const
int16_t
*
src
,
int
len
);
/**
* Left-shift each value in an array of int16_t by a specified amount.
* @param src input array
* constraints: align 16
* @param len number of values in the array
* constraints: multiple of 32 greater than 0
* @param shift left shift amount
* constraints: range [0,15]
*/
void
(
*
ac3_lshift_int16
)(
int16_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
/**
* Right-shift each value in an array of int32_t by a specified amount.
* @param src input array
* constraints: align 16
* @param len number of values in the array
* constraints: multiple of 16 greater than 0
* @param shift right shift amount
* constraints: range [0,31]
*/
void
(
*
ac3_rshift_int32
)(
int32_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
}
AC3DSPContext
;
void
ff_ac3dsp_init
(
AC3DSPContext
*
c
);
...
...
libavcodec/ac3enc_fixed.c
浏览文件 @
f1efbca5
...
...
@@ -277,40 +277,6 @@ static int log2_tab(AC3EncodeContext *s, int16_t *src, int len)
}
/**
* Left-shift each value in an array by a specified amount.
* @param tab input array
* @param n number of values in the array
* @param lshift left shift amount
*/
static
void
lshift_tab
(
int16_t
*
tab
,
int
n
,
unsigned
int
lshift
)
{
int
i
;
if
(
lshift
>
0
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
tab
[
i
]
<<=
lshift
;
}
}
/**
* Right-shift each value in an array of int32_t by a specified amount.
* @param src input array
* @param len number of values in the array
* @param shift right shift amount
*/
static
void
ac3_rshift_int32_c
(
int32_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
)
{
int
i
;
if
(
shift
>
0
)
{
for
(
i
=
0
;
i
<
len
;
i
++
)
src
[
i
]
>>=
shift
;
}
}
/**
* Normalize the input samples to use the maximum available precision.
* This assumes signed 16-bit input samples.
...
...
@@ -320,7 +286,8 @@ static void ac3_rshift_int32_c(int32_t *src, unsigned int len, unsigned int shif
static
int
normalize_samples
(
AC3EncodeContext
*
s
)
{
int
v
=
14
-
log2_tab
(
s
,
s
->
windowed_samples
,
AC3_WINDOW_SIZE
);
lshift_tab
(
s
->
windowed_samples
,
AC3_WINDOW_SIZE
,
v
);
if
(
v
>
0
)
s
->
ac3dsp
.
ac3_lshift_int16
(
s
->
windowed_samples
,
AC3_WINDOW_SIZE
,
v
);
/* +6 to right-shift from 31-bit to 25-bit */
return
v
+
6
;
}
...
...
@@ -336,8 +303,8 @@ static void scale_coefficients(AC3EncodeContext *s)
for
(
blk
=
0
;
blk
<
AC3_MAX_BLOCKS
;
blk
++
)
{
AC3Block
*
block
=
&
s
->
blocks
[
blk
];
for
(
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
{
ac3_rshift_int32_c
(
block
->
mdct_coef
[
ch
],
AC3_MAX_COEFS
,
block
->
coeff_shift
[
ch
]);
s
->
ac3dsp
.
ac3_rshift_int32
(
block
->
mdct_coef
[
ch
],
AC3_MAX_COEFS
,
block
->
coeff_shift
[
ch
]);
}
}
}
...
...
libavcodec/x86/ac3dsp.asm
浏览文件 @
f1efbca5
...
...
@@ -133,3 +133,48 @@ INIT_XMM
AC3_MAX_MSB_ABS_INT16
ss
e2
,
min_max
%define ABS2 ABS2_SSSE3
AC3_MAX_MSB_ABS_INT16
ss
se3
,
or_abs
;-----------------------------------------------------------------------------
; macro used for ff_ac3_lshift_int16() and ff_ac3_rshift_int32()
;-----------------------------------------------------------------------------
%macro AC3_SHIFT 4
; l/r, 16/32, shift instruction, instruction set
cglobal
ac3_
%
1
shift_int
%
2
_
%
4
,
3
,
3
,
5
,
src
,
len
,
shift
movd
m0
,
shiftd
.loop:
mova
m1
,
[
srcq
]
mova
m2
,
[
srcq
+
mmsize
]
mova
m3
,
[
srcq
+
mmsize
*
2
]
mova
m4
,
[
srcq
+
mmsize
*
3
]
%3 m1, m0
%3 m2, m0
%3 m3, m0
%3 m4, m0
mova
[
srcq
],
m1
mova
[
srcq
+
mmsize
],
m2
mova
[
srcq
+
mmsize
*
2
],
m3
mova
[
srcq
+
mmsize
*
3
],
m4
add
srcq
,
mmsize
*
4
sub
lend
,
mmsize
*
32
/%
2
ja
.loop
.end:
REP_RET
%endmacro
;-----------------------------------------------------------------------------
; void ff_ac3_lshift_int16(int16_t *src, unsigned int len, unsigned int shift)
;-----------------------------------------------------------------------------
INIT_MMX
AC3_SHIFT
l
,
16
,
psllw
,
mmx
INIT_XMM
AC3_SHIFT
l
,
16
,
psllw
,
ss
e2
;-----------------------------------------------------------------------------
; void ff_ac3_rshift_int32(int32_t *src, unsigned int len, unsigned int shift)
;-----------------------------------------------------------------------------
INIT_MMX
AC3_SHIFT
r
,
32
,
psrad
,
mmx
INIT_XMM
AC3_SHIFT
r
,
32
,
psrad
,
ss
e2
libavcodec/x86/ac3dsp_mmx.c
浏览文件 @
f1efbca5
...
...
@@ -32,6 +32,12 @@ extern int ff_ac3_max_msb_abs_int16_mmxext(const int16_t *src, int len);
extern
int
ff_ac3_max_msb_abs_int16_sse2
(
const
int16_t
*
src
,
int
len
);
extern
int
ff_ac3_max_msb_abs_int16_ssse3
(
const
int16_t
*
src
,
int
len
);
extern
void
ff_ac3_lshift_int16_mmx
(
int16_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
extern
void
ff_ac3_lshift_int16_sse2
(
int16_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
extern
void
ff_ac3_rshift_int32_mmx
(
int32_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
extern
void
ff_ac3_rshift_int32_sse2
(
int32_t
*
src
,
unsigned
int
len
,
unsigned
int
shift
);
av_cold
void
ff_ac3dsp_init_x86
(
AC3DSPContext
*
c
)
{
int
mm_flags
=
av_get_cpu_flags
();
...
...
@@ -40,6 +46,8 @@ av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c)
if
(
mm_flags
&
AV_CPU_FLAG_MMX
)
{
c
->
ac3_exponent_min
=
ff_ac3_exponent_min_mmx
;
c
->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_mmx
;
c
->
ac3_lshift_int16
=
ff_ac3_lshift_int16_mmx
;
c
->
ac3_rshift_int32
=
ff_ac3_rshift_int32_mmx
;
}
if
(
mm_flags
&
AV_CPU_FLAG_MMX2
&&
HAVE_MMX2
)
{
c
->
ac3_exponent_min
=
ff_ac3_exponent_min_mmxext
;
...
...
@@ -48,6 +56,10 @@ av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c)
if
(
mm_flags
&
AV_CPU_FLAG_SSE2
&&
HAVE_SSE
)
{
c
->
ac3_exponent_min
=
ff_ac3_exponent_min_sse2
;
c
->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_sse2
;
if
(
!
(
mm_flags
&
AV_CPU_FLAG_SSE2SLOW
))
{
c
->
ac3_lshift_int16
=
ff_ac3_lshift_int16_sse2
;
c
->
ac3_rshift_int32
=
ff_ac3_rshift_int32_sse2
;
}
}
if
(
mm_flags
&
AV_CPU_FLAG_SSSE3
&&
HAVE_SSSE3
)
{
c
->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_ssse3
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录