Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
5ce21342
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,发现更多精彩内容 >>
提交
5ce21342
编写于
12月 09, 2007
作者:
J
Justin Ruggles
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cosmetics: rename ac3 bit allocation variables
Originally committed as revision 11194 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
66ecf18e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
193 addition
and
192 deletion
+193
-192
libavcodec/ac3.c
libavcodec/ac3.c
+56
-56
libavcodec/ac3.h
libavcodec/ac3.h
+25
-24
libavcodec/ac3_parser.c
libavcodec/ac3_parser.c
+14
-14
libavcodec/ac3dec.c
libavcodec/ac3dec.c
+34
-34
libavcodec/ac3enc.c
libavcodec/ac3enc.c
+64
-64
未找到文件。
libavcodec/ac3.c
浏览文件 @
5ce21342
...
...
@@ -28,8 +28,8 @@
#include "ac3.h"
#include "bitstream.h"
static
uint8_t
b
nd
tab
[
51
];
static
uint8_t
mask
tab
[
253
];
static
uint8_t
b
and_start_
tab
[
51
];
static
uint8_t
bin_to_band_
tab
[
253
];
static
inline
int
calc_lowcomp1
(
int
a
,
int
b0
,
int
b1
,
int
c
)
{
...
...
@@ -53,7 +53,7 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin)
}
void
ff_ac3_bit_alloc_calc_psd
(
int8_t
*
exp
,
int
start
,
int
end
,
int16_t
*
psd
,
int16_t
*
b
nd
psd
)
int16_t
*
b
and_
psd
)
{
int
bin
,
i
,
j
,
k
,
end1
,
v
;
...
...
@@ -64,26 +64,26 @@ void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
/* PSD integration */
j
=
start
;
k
=
mask
tab
[
start
];
k
=
bin_to_band_
tab
[
start
];
do
{
v
=
psd
[
j
];
j
++
;
end1
=
FFMIN
(
b
nd
tab
[
k
+
1
],
end
);
end1
=
FFMIN
(
b
and_start_
tab
[
k
+
1
],
end
);
for
(
i
=
j
;
i
<
end1
;
i
++
)
{
/* logadd */
int
adr
=
FFMIN
(
FFABS
(
v
-
psd
[
j
])
>>
1
,
255
);
v
=
FFMAX
(
v
,
psd
[
j
])
+
ff_ac3_log_add_tab
[
adr
];
j
++
;
}
b
nd
psd
[
k
]
=
v
;
b
and_
psd
[
k
]
=
v
;
k
++
;
}
while
(
end
>
b
nd
tab
[
k
]);
}
while
(
end
>
b
and_start_
tab
[
k
]);
}
void
ff_ac3_bit_alloc_calc_mask
(
AC3BitAllocParameters
*
s
,
int16_t
*
b
nd
psd
,
int
start
,
int
end
,
int
fgain
,
int
is_lfe
,
int
d
eltbae
,
int
deltnseg
,
uint8_t
*
deltoffst
,
uint8_t
*
d
eltlen
,
uint8_t
*
deltba
,
void
ff_ac3_bit_alloc_calc_mask
(
AC3BitAllocParameters
*
s
,
int16_t
*
b
and_
psd
,
int
start
,
int
end
,
int
f
ast_
gain
,
int
is_lfe
,
int
d
ba_mode
,
int
dba_nsegs
,
uint8_t
*
dba_offsets
,
uint8_t
*
d
ba_lengths
,
uint8_t
*
dba_values
,
int16_t
*
mask
)
{
int16_t
excite
[
50
];
/* excitation */
...
...
@@ -92,24 +92,24 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
int
lowcomp
,
fastleak
,
slowleak
;
/* excitation function */
bndstrt
=
mask
tab
[
start
];
bndend
=
mask
tab
[
end
-
1
]
+
1
;
bndstrt
=
bin_to_band_
tab
[
start
];
bndend
=
bin_to_band_
tab
[
end
-
1
]
+
1
;
if
(
bndstrt
==
0
)
{
lowcomp
=
0
;
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
ndpsd
[
0
],
bnd
psd
[
1
],
384
);
excite
[
0
]
=
b
ndpsd
[
0
]
-
f
gain
-
lowcomp
;
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
ndpsd
[
1
],
bnd
psd
[
2
],
384
);
excite
[
1
]
=
b
ndpsd
[
1
]
-
f
gain
-
lowcomp
;
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
and_psd
[
0
],
band_
psd
[
1
],
384
);
excite
[
0
]
=
b
and_psd
[
0
]
-
fast_
gain
-
lowcomp
;
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
and_psd
[
1
],
band_
psd
[
2
],
384
);
excite
[
1
]
=
b
and_psd
[
1
]
-
fast_
gain
-
lowcomp
;
begin
=
7
;
for
(
bin
=
2
;
bin
<
7
;
bin
++
)
{
if
(
!
(
is_lfe
&&
bin
==
6
))
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
ndpsd
[
bin
],
bnd
psd
[
bin
+
1
],
384
);
fastleak
=
b
ndpsd
[
bin
]
-
f
gain
;
slowleak
=
b
ndpsd
[
bin
]
-
s
->
s
gain
;
lowcomp
=
calc_lowcomp1
(
lowcomp
,
b
and_psd
[
bin
],
band_
psd
[
bin
+
1
],
384
);
fastleak
=
b
and_psd
[
bin
]
-
fast_
gain
;
slowleak
=
b
and_psd
[
bin
]
-
s
->
slow_
gain
;
excite
[
bin
]
=
fastleak
-
lowcomp
;
if
(
!
(
is_lfe
&&
bin
==
6
))
{
if
(
b
ndpsd
[
bin
]
<=
bnd
psd
[
bin
+
1
])
{
if
(
b
and_psd
[
bin
]
<=
band_
psd
[
bin
+
1
])
{
begin
=
bin
+
1
;
break
;
}
...
...
@@ -121,10 +121,10 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
for
(
bin
=
begin
;
bin
<
end1
;
bin
++
)
{
if
(
!
(
is_lfe
&&
bin
==
6
))
lowcomp
=
calc_lowcomp
(
lowcomp
,
b
ndpsd
[
bin
],
bnd
psd
[
bin
+
1
],
bin
);
lowcomp
=
calc_lowcomp
(
lowcomp
,
b
and_psd
[
bin
],
band_
psd
[
bin
+
1
],
bin
);
fastleak
=
FFMAX
(
fastleak
-
s
->
f
decay
,
bndpsd
[
bin
]
-
f
gain
);
slowleak
=
FFMAX
(
slowleak
-
s
->
s
decay
,
bndpsd
[
bin
]
-
s
->
s
gain
);
fastleak
=
FFMAX
(
fastleak
-
s
->
f
ast_decay
,
band_psd
[
bin
]
-
fast_
gain
);
slowleak
=
FFMAX
(
slowleak
-
s
->
s
low_decay
,
band_psd
[
bin
]
-
s
->
slow_
gain
);
excite
[
bin
]
=
FFMAX
(
fastleak
-
lowcomp
,
slowleak
);
}
begin
=
22
;
...
...
@@ -132,39 +132,39 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
/* coupling channel */
begin
=
bndstrt
;
fastleak
=
(
s
->
cpl
f
leak
<<
8
)
+
768
;
slowleak
=
(
s
->
cpl
s
leak
<<
8
)
+
768
;
fastleak
=
(
s
->
cpl
_fast_
leak
<<
8
)
+
768
;
slowleak
=
(
s
->
cpl
_slow_
leak
<<
8
)
+
768
;
}
for
(
bin
=
begin
;
bin
<
bndend
;
bin
++
)
{
fastleak
=
FFMAX
(
fastleak
-
s
->
f
decay
,
bndpsd
[
bin
]
-
f
gain
);
slowleak
=
FFMAX
(
slowleak
-
s
->
s
decay
,
bndpsd
[
bin
]
-
s
->
s
gain
);
fastleak
=
FFMAX
(
fastleak
-
s
->
f
ast_decay
,
band_psd
[
bin
]
-
fast_
gain
);
slowleak
=
FFMAX
(
slowleak
-
s
->
s
low_decay
,
band_psd
[
bin
]
-
s
->
slow_
gain
);
excite
[
bin
]
=
FFMAX
(
fastleak
,
slowleak
);
}
/* compute masking curve */
for
(
bin
=
bndstrt
;
bin
<
bndend
;
bin
++
)
{
tmp
=
s
->
db
knee
-
bnd
psd
[
bin
];
tmp
=
s
->
db
_per_bit
-
band_
psd
[
bin
];
if
(
tmp
>
0
)
{
excite
[
bin
]
+=
tmp
>>
2
;
}
mask
[
bin
]
=
FFMAX
(
ff_ac3_hearing_threshold_tab
[
bin
>>
s
->
halfratecod
][
s
->
fscod
],
excite
[
bin
]);
mask
[
bin
]
=
FFMAX
(
ff_ac3_hearing_threshold_tab
[
bin
>>
s
->
sr_shift
][
s
->
sr_code
],
excite
[
bin
]);
}
/* delta bit allocation */
if
(
d
eltbae
==
DBA_REUSE
||
deltba
e
==
DBA_NEW
)
{
if
(
d
ba_mode
==
DBA_REUSE
||
dba_mod
e
==
DBA_NEW
)
{
int
band
,
seg
,
delta
;
band
=
0
;
for
(
seg
=
0
;
seg
<
d
eltnseg
;
seg
++
)
{
band
+=
d
eltoffst
[
seg
];
if
(
d
eltba
[
seg
]
>=
4
)
{
delta
=
(
d
eltba
[
seg
]
-
3
)
<<
7
;
for
(
seg
=
0
;
seg
<
d
ba_nsegs
;
seg
++
)
{
band
+=
d
ba_offsets
[
seg
];
if
(
d
ba_values
[
seg
]
>=
4
)
{
delta
=
(
d
ba_values
[
seg
]
-
3
)
<<
7
;
}
else
{
delta
=
(
d
eltba
[
seg
]
-
4
)
<<
7
;
delta
=
(
d
ba_values
[
seg
]
-
4
)
<<
7
;
}
for
(
k
=
0
;
k
<
d
eltlen
[
seg
];
k
++
)
{
for
(
k
=
0
;
k
<
d
ba_lengths
[
seg
];
k
++
)
{
mask
[
band
]
+=
delta
;
band
++
;
}
...
...
@@ -173,49 +173,49 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
}
void
ff_ac3_bit_alloc_calc_bap
(
int16_t
*
mask
,
int16_t
*
psd
,
int
start
,
int
end
,
int
snroffset
,
int
floor
,
uint8_t
*
bap
)
int
snr
_
offset
,
int
floor
,
uint8_t
*
bap
)
{
int
i
,
j
,
k
,
end1
,
v
,
address
;
/* special case, if snroffset is -960, set all bap's to zero */
if
(
snroffset
==
-
960
)
{
/* special case, if snr
offset is -960, set all bap's to zero */
if
(
snr
_
offset
==
-
960
)
{
memset
(
bap
,
0
,
256
);
return
;
}
i
=
start
;
j
=
mask
tab
[
start
];
j
=
bin_to_band_
tab
[
start
];
do
{
v
=
(
FFMAX
(
mask
[
j
]
-
snroffset
-
floor
,
0
)
&
0x1FE0
)
+
floor
;
end1
=
FFMIN
(
b
nd
tab
[
j
]
+
ff_ac3_critical_band_size_tab
[
j
],
end
);
v
=
(
FFMAX
(
mask
[
j
]
-
snr
_
offset
-
floor
,
0
)
&
0x1FE0
)
+
floor
;
end1
=
FFMIN
(
b
and_start_
tab
[
j
]
+
ff_ac3_critical_band_size_tab
[
j
],
end
);
for
(
k
=
i
;
k
<
end1
;
k
++
)
{
address
=
av_clip
((
psd
[
i
]
-
v
)
>>
5
,
0
,
63
);
bap
[
i
]
=
ff_ac3_bap_tab
[
address
];
i
++
;
}
}
while
(
end
>
b
nd
tab
[
j
++
]);
}
while
(
end
>
b
and_start_
tab
[
j
++
]);
}
/* AC3 bit allocation. The algorithm is the one described in the AC3
spec. */
void
ac3_parametric_bit_allocation
(
AC3BitAllocParameters
*
s
,
uint8_t
*
bap
,
int8_t
*
exp
,
int
start
,
int
end
,
int
snr
offset
,
int
f
gain
,
int
is_lfe
,
int
d
eltbae
,
int
deltnseg
,
uint8_t
*
d
eltoffst
,
uint8_t
*
deltlen
,
uint8_t
*
d
eltba
)
int
snr
_offset
,
int
fast_
gain
,
int
is_lfe
,
int
d
ba_mode
,
int
dba_nsegs
,
uint8_t
*
d
ba_offsets
,
uint8_t
*
dba_lengths
,
uint8_t
*
d
ba_values
)
{
int16_t
psd
[
256
];
/* scaled exponents */
int16_t
b
nd
psd
[
50
];
/* interpolated exponents */
int16_t
b
and_
psd
[
50
];
/* interpolated exponents */
int16_t
mask
[
50
];
/* masking value */
ff_ac3_bit_alloc_calc_psd
(
exp
,
start
,
end
,
psd
,
b
nd
psd
);
ff_ac3_bit_alloc_calc_psd
(
exp
,
start
,
end
,
psd
,
b
and_
psd
);
ff_ac3_bit_alloc_calc_mask
(
s
,
b
ndpsd
,
start
,
end
,
f
gain
,
is_lfe
,
d
eltbae
,
deltnseg
,
deltoffst
,
deltlen
,
deltba
,
ff_ac3_bit_alloc_calc_mask
(
s
,
b
and_psd
,
start
,
end
,
fast_
gain
,
is_lfe
,
d
ba_mode
,
dba_nsegs
,
dba_offsets
,
dba_lengths
,
dba_values
,
mask
);
ff_ac3_bit_alloc_calc_bap
(
mask
,
psd
,
start
,
end
,
snroffset
,
s
->
floor
,
bap
);
ff_ac3_bit_alloc_calc_bap
(
mask
,
psd
,
start
,
end
,
snr
_
offset
,
s
->
floor
,
bap
);
}
/**
...
...
@@ -230,10 +230,10 @@ void ac3_common_init(void)
k
=
0
;
l
=
0
;
for
(
i
=
0
;
i
<
50
;
i
++
)
{
b
nd
tab
[
i
]
=
l
;
b
and_start_
tab
[
i
]
=
l
;
v
=
ff_ac3_critical_band_size_tab
[
i
];
for
(
j
=
0
;
j
<
v
;
j
++
)
mask
tab
[
k
++
]
=
i
;
for
(
j
=
0
;
j
<
v
;
j
++
)
bin_to_band_
tab
[
k
++
]
=
i
;
l
+=
v
;
}
b
nd
tab
[
50
]
=
l
;
b
and_start_
tab
[
50
]
=
l
;
}
libavcodec/ac3.h
浏览文件 @
5ce21342
...
...
@@ -64,10 +64,10 @@ typedef enum {
}
AC3ChannelMode
;
typedef
struct
AC3BitAllocParameters
{
int
fscod
;
/* frequency */
int
halfratecod
;
int
s
gain
,
sdecay
,
fdecay
,
dbknee
,
floor
;
int
cpl
fleak
,
cpls
leak
;
int
sr_code
;
int
sr_shift
;
int
s
low_gain
,
slow_decay
,
fast_decay
,
db_per_bit
,
floor
;
int
cpl
_fast_leak
,
cpl_slow_
leak
;
}
AC3BitAllocParameters
;
/**
...
...
@@ -80,7 +80,7 @@ typedef struct {
*/
uint16_t
sync_word
;
uint16_t
crc1
;
uint8_t
fscod
;
uint8_t
sr_code
;
uint8_t
frmsizecod
;
uint8_t
bsid
;
uint8_t
bsmod
;
...
...
@@ -94,7 +94,7 @@ typedef struct {
/** @defgroup derived Derived values
* @{
*/
uint8_t
halfratecod
;
uint8_t
sr_shift
;
uint16_t
sample_rate
;
uint32_t
bit_rate
;
uint8_t
channels
;
...
...
@@ -117,10 +117,10 @@ void ac3_common_init(void);
* @param[in] start starting bin location
* @param[in] end ending bin location
* @param[out] psd signal power for each frequency bin
* @param[out] b
ndpsd
signal power for each critical band
* @param[out] b
and_psd
signal power for each critical band
*/
void
ff_ac3_bit_alloc_calc_psd
(
int8_t
*
exp
,
int
start
,
int
end
,
int16_t
*
psd
,
int16_t
*
b
nd
psd
);
int16_t
*
b
and_
psd
);
/**
* Calculates the masking curve.
...
...
@@ -131,22 +131,22 @@ void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
* curve, usually to give a closer match to a better psychoacoustic model.
*
* @param[in] s adjustable bit allocation parameters
* @param[in] b
nd
psd signal power for each critical band
* @param[in] b
and_
psd signal power for each critical band
* @param[in] start starting bin location
* @param[in] end ending bin location
* @param[in] f
gain
fast gain (estimated signal-to-mask ratio)
* @param[in] f
ast_gain
fast gain (estimated signal-to-mask ratio)
* @param[in] is_lfe whether or not the channel being processed is the LFE
* @param[in] d
eltbae delta bit allocation exists
(none, reuse, or new)
* @param[in] d
eltnseg
number of delta segments
* @param[in] d
eltoffst
location offsets for each segment
* @param[in] d
eltlen
length of each segment
* @param[in] d
eltba
delta bit allocation for each segment
* @param[in] d
ba_mode delta bit allocation mode
(none, reuse, or new)
* @param[in] d
ba_nsegs
number of delta segments
* @param[in] d
ba_offsets
location offsets for each segment
* @param[in] d
ba_lengths
length of each segment
* @param[in] d
ba_values
delta bit allocation for each segment
* @param[out] mask calculated masking curve
*/
void
ff_ac3_bit_alloc_calc_mask
(
AC3BitAllocParameters
*
s
,
int16_t
*
b
nd
psd
,
int
start
,
int
end
,
int
fgain
,
int
is_lfe
,
int
d
eltbae
,
int
deltnseg
,
uint8_t
*
deltoffst
,
uint8_t
*
d
eltlen
,
uint8_t
*
deltba
,
void
ff_ac3_bit_alloc_calc_mask
(
AC3BitAllocParameters
*
s
,
int16_t
*
b
and_
psd
,
int
start
,
int
end
,
int
f
ast_
gain
,
int
is_lfe
,
int
d
ba_mode
,
int
dba_nsegs
,
uint8_t
*
dba_offsets
,
uint8_t
*
d
ba_lengths
,
uint8_t
*
dba_values
,
int16_t
*
mask
);
/**
...
...
@@ -159,17 +159,18 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
* @param[in] psd signal power for each frequency bin
* @param[in] start starting bin location
* @param[in] end ending bin location
* @param[in] snr
offset
SNR adjustment
* @param[in] snr
_offset
SNR adjustment
* @param[in] floor noise floor
* @param[out] bap bit allocation pointers
*/
void
ff_ac3_bit_alloc_calc_bap
(
int16_t
*
mask
,
int16_t
*
psd
,
int
start
,
int
end
,
int
snroffset
,
int
floor
,
uint8_t
*
bap
);
int
snr
_
offset
,
int
floor
,
uint8_t
*
bap
);
void
ac3_parametric_bit_allocation
(
AC3BitAllocParameters
*
s
,
uint8_t
*
bap
,
int8_t
*
exp
,
int
start
,
int
end
,
int
snroffset
,
int
fgain
,
int
is_lfe
,
int
deltbae
,
int
deltnseg
,
uint8_t
*
deltoffst
,
uint8_t
*
deltlen
,
uint8_t
*
deltba
);
int
snr_offset
,
int
fast_gain
,
int
is_lfe
,
int
dba_mode
,
int
dba_nsegs
,
uint8_t
*
dba_offsets
,
uint8_t
*
dba_lengths
,
uint8_t
*
dba_values
);
#endif
/* FFMPEG_AC3_H */
libavcodec/ac3_parser.c
浏览文件 @
5ce21342
...
...
@@ -52,8 +52,8 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
return
AC3_PARSE_ERROR_BSID
;
hdr
->
crc1
=
get_bits
(
&
gbc
,
16
);
hdr
->
fscod
=
get_bits
(
&
gbc
,
2
);
if
(
hdr
->
fscod
==
3
)
hdr
->
sr_code
=
get_bits
(
&
gbc
,
2
);
if
(
hdr
->
sr_code
==
3
)
return
AC3_PARSE_ERROR_SAMPLE_RATE
;
hdr
->
frmsizecod
=
get_bits
(
&
gbc
,
6
);
...
...
@@ -75,11 +75,11 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
}
hdr
->
lfeon
=
get_bits1
(
&
gbc
);
hdr
->
halfratecod
=
FFMAX
(
hdr
->
bsid
,
8
)
-
8
;
hdr
->
sample_rate
=
ff_ac3_sample_rate_tab
[
hdr
->
fscod
]
>>
hdr
->
halfratecod
;
hdr
->
bit_rate
=
(
ff_ac3_bitrate_tab
[
hdr
->
frmsizecod
>>
1
]
*
1000
)
>>
hdr
->
halfratecod
;
hdr
->
sr_shift
=
FFMAX
(
hdr
->
bsid
,
8
)
-
8
;
hdr
->
sample_rate
=
ff_ac3_sample_rate_tab
[
hdr
->
sr_code
]
>>
hdr
->
sr_shift
;
hdr
->
bit_rate
=
(
ff_ac3_bitrate_tab
[
hdr
->
frmsizecod
>>
1
]
*
1000
)
>>
hdr
->
sr_shift
;
hdr
->
channels
=
ff_ac3_channels_tab
[
hdr
->
acmod
]
+
hdr
->
lfeon
;
hdr
->
frame_size
=
ff_ac3_frame_size_tab
[
hdr
->
frmsizecod
][
hdr
->
fscod
]
*
2
;
hdr
->
frame_size
=
ff_ac3_frame_size_tab
[
hdr
->
frmsizecod
][
hdr
->
sr_code
]
*
2
;
return
0
;
}
...
...
@@ -88,8 +88,8 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
int
*
bit_rate
,
int
*
samples
)
{
int
err
;
unsigned
int
fscod
,
acmod
,
bsid
,
lfeon
;
unsigned
int
strmtyp
,
substreamid
,
frmsiz
,
fscod
2
,
numblkscod
;
unsigned
int
sr_code
,
acmod
,
bsid
,
lfeon
;
unsigned
int
strmtyp
,
substreamid
,
frmsiz
,
sr_code
2
,
numblkscod
;
GetBitContext
bits
;
AC3HeaderInfo
hdr
;
...
...
@@ -117,19 +117,19 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
if
(
frmsiz
*
2
<
AC3_HEADER_SIZE
)
return
0
;
fscod
=
get_bits
(
&
bits
,
2
);
if
(
fscod
==
3
)
{
fscod
2
=
get_bits
(
&
bits
,
2
);
sr_code
=
get_bits
(
&
bits
,
2
);
if
(
sr_code
==
3
)
{
sr_code
2
=
get_bits
(
&
bits
,
2
);
numblkscod
=
3
;
if
(
fscod
2
==
3
)
if
(
sr_code
2
==
3
)
return
0
;
*
sample_rate
=
ff_ac3_sample_rate_tab
[
fscod
2
]
/
2
;
*
sample_rate
=
ff_ac3_sample_rate_tab
[
sr_code
2
]
/
2
;
}
else
{
numblkscod
=
get_bits
(
&
bits
,
2
);
*
sample_rate
=
ff_ac3_sample_rate_tab
[
fscod
];
*
sample_rate
=
ff_ac3_sample_rate_tab
[
sr_code
];
}
acmod
=
get_bits
(
&
bits
,
3
);
...
...
libavcodec/ac3dec.c
浏览文件 @
5ce21342
...
...
@@ -141,13 +141,13 @@ typedef struct {
int
nrematbnd
;
///< number of rematrixing bands
int
rematflg
[
4
];
///< rematrixing flags
int
expstr
[
AC3_MAX_CHANNELS
];
///< exponent strategies
int
snr
offst
[
AC3_MAX_CHANNELS
];
///< signal-to-noise ratio offsets
int
f
gain
[
AC3_MAX_CHANNELS
];
///< fast gain values (signal-to-mask ratio)
int
d
eltbae
[
AC3_MAX_CHANNELS
];
///< delta bit allocation exists
int
d
eltnseg
[
AC3_MAX_CHANNELS
];
///< number of delta segments
uint8_t
d
eltoffst
[
AC3_MAX_CHANNELS
][
8
];
///< delta segment offsets
uint8_t
d
eltlen
[
AC3_MAX_CHANNELS
][
8
];
///< delta segment lengths
uint8_t
d
eltba
[
AC3_MAX_CHANNELS
][
8
];
///< delta values for each segment
int
snr
_offset
[
AC3_MAX_CHANNELS
];
///< signal-to-noise ratio offsets
int
f
ast_gain
[
AC3_MAX_CHANNELS
];
///< fast gain values (signal-to-mask ratio)
int
d
ba_mode
[
AC3_MAX_CHANNELS
];
///< delta bit allocation mode
int
d
ba_nsegs
[
AC3_MAX_CHANNELS
];
///< number of delta segments
uint8_t
d
ba_offsets
[
AC3_MAX_CHANNELS
][
8
];
///< delta segment offsets
uint8_t
d
ba_lengths
[
AC3_MAX_CHANNELS
][
8
];
///< delta segment lengths
uint8_t
d
ba_values
[
AC3_MAX_CHANNELS
][
8
];
///< delta values for each segment
int
sampling_rate
;
///< sample frequency, in Hz
int
bit_rate
;
///< stream bit rate, in bits-per-second
...
...
@@ -173,7 +173,7 @@ typedef struct {
int8_t
dexps
[
AC3_MAX_CHANNELS
][
256
];
///< decoded exponents
uint8_t
bap
[
AC3_MAX_CHANNELS
][
256
];
///< bit allocation pointers
int16_t
psd
[
AC3_MAX_CHANNELS
][
256
];
///< scaled exponents
int16_t
b
ndpsd
[
AC3_MAX_CHANNELS
][
50
];
///< interpolated exponents
int16_t
b
and_psd
[
AC3_MAX_CHANNELS
][
50
];
///< interpolated exponents
int16_t
mask
[
AC3_MAX_CHANNELS
][
50
];
///< masking curve values
DECLARE_ALIGNED_16
(
float
,
transform_coeffs
[
AC3_MAX_CHANNELS
][
256
]);
///< transform coefficients
...
...
@@ -344,13 +344,13 @@ static int ac3_parse_header(AC3DecodeContext *ctx)
return
err
;
/* get decoding parameters from header info */
ctx
->
bit_alloc_params
.
fscod
=
hdr
.
fscod
;
ctx
->
bit_alloc_params
.
sr_code
=
hdr
.
sr_code
;
ctx
->
acmod
=
hdr
.
acmod
;
cmixlev
=
gain_levels
[
clevs
[
hdr
.
cmixlev
]];
surmixlev
=
gain_levels
[
slevs
[
hdr
.
surmixlev
]];
ctx
->
dsurmod
=
hdr
.
dsurmod
;
ctx
->
lfeon
=
hdr
.
lfeon
;
ctx
->
bit_alloc_params
.
halfratecod
=
hdr
.
halfratecod
;
ctx
->
bit_alloc_params
.
sr_shift
=
hdr
.
sr_shift
;
ctx
->
sampling_rate
=
hdr
.
sample_rate
;
ctx
->
bit_rate
=
hdr
.
bit_rate
;
ctx
->
nchans
=
hdr
.
channels
;
...
...
@@ -947,10 +947,10 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
/* bit allocation information */
if
(
get_bits1
(
gb
))
{
ctx
->
bit_alloc_params
.
s
decay
=
ff_ac3_slow_decay_tab
[
get_bits
(
gb
,
2
)]
>>
ctx
->
bit_alloc_params
.
halfratecod
;
ctx
->
bit_alloc_params
.
f
decay
=
ff_ac3_fast_decay_tab
[
get_bits
(
gb
,
2
)]
>>
ctx
->
bit_alloc_params
.
halfratecod
;
ctx
->
bit_alloc_params
.
sgain
=
ff_ac3_slow_gain_tab
[
get_bits
(
gb
,
2
)];
ctx
->
bit_alloc_params
.
db
knee
=
ff_ac3_db_per_bit_tab
[
get_bits
(
gb
,
2
)];
ctx
->
bit_alloc_params
.
s
low_decay
=
ff_ac3_slow_decay_tab
[
get_bits
(
gb
,
2
)]
>>
ctx
->
bit_alloc_params
.
sr_shift
;
ctx
->
bit_alloc_params
.
f
ast_decay
=
ff_ac3_fast_decay_tab
[
get_bits
(
gb
,
2
)]
>>
ctx
->
bit_alloc_params
.
sr_shift
;
ctx
->
bit_alloc_params
.
s
low_
gain
=
ff_ac3_slow_gain_tab
[
get_bits
(
gb
,
2
)];
ctx
->
bit_alloc_params
.
db
_per_bit
=
ff_ac3_db_per_bit_tab
[
get_bits
(
gb
,
2
)];
ctx
->
bit_alloc_params
.
floor
=
ff_ac3_floor_tab
[
get_bits
(
gb
,
3
)];
for
(
ch
=!
ctx
->
cplinu
;
ch
<=
ctx
->
nchans
;
ch
++
)
{
bit_alloc_stages
[
ch
]
=
FFMAX
(
bit_alloc_stages
[
ch
],
2
);
...
...
@@ -962,16 +962,16 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
int
csnr
;
csnr
=
(
get_bits
(
gb
,
6
)
-
15
)
<<
4
;
for
(
ch
=
!
ctx
->
cplinu
;
ch
<=
ctx
->
nchans
;
ch
++
)
{
/* snr offset and fast gain */
ctx
->
snr
offs
t
[
ch
]
=
(
csnr
+
get_bits
(
gb
,
4
))
<<
2
;
ctx
->
fgain
[
ch
]
=
ff_ac3_fast_gain_tab
[
get_bits
(
gb
,
3
)];
ctx
->
snr
_offse
t
[
ch
]
=
(
csnr
+
get_bits
(
gb
,
4
))
<<
2
;
ctx
->
f
ast_
gain
[
ch
]
=
ff_ac3_fast_gain_tab
[
get_bits
(
gb
,
3
)];
}
memset
(
bit_alloc_stages
,
3
,
AC3_MAX_CHANNELS
);
}
/* coupling leak information */
if
(
ctx
->
cplinu
&&
get_bits1
(
gb
))
{
ctx
->
bit_alloc_params
.
cpl
f
leak
=
get_bits
(
gb
,
3
);
ctx
->
bit_alloc_params
.
cpl
s
leak
=
get_bits
(
gb
,
3
);
ctx
->
bit_alloc_params
.
cpl
_fast_
leak
=
get_bits
(
gb
,
3
);
ctx
->
bit_alloc_params
.
cpl
_slow_
leak
=
get_bits
(
gb
,
3
);
bit_alloc_stages
[
CPL_CH
]
=
FFMAX
(
bit_alloc_stages
[
CPL_CH
],
2
);
}
...
...
@@ -979,8 +979,8 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
if
(
get_bits1
(
gb
))
{
/* delta bit allocation exists (strategy) */
for
(
ch
=
!
ctx
->
cplinu
;
ch
<=
nfchans
;
ch
++
)
{
ctx
->
d
eltba
e
[
ch
]
=
get_bits
(
gb
,
2
);
if
(
ctx
->
d
eltba
e
[
ch
]
==
DBA_RESERVED
)
{
ctx
->
d
ba_mod
e
[
ch
]
=
get_bits
(
gb
,
2
);
if
(
ctx
->
d
ba_mod
e
[
ch
]
==
DBA_RESERVED
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"delta bit allocation strategy reserved
\n
"
);
return
-
1
;
}
...
...
@@ -988,18 +988,18 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
}
/* channel delta offset, len and bit allocation */
for
(
ch
=
!
ctx
->
cplinu
;
ch
<=
nfchans
;
ch
++
)
{
if
(
ctx
->
d
eltba
e
[
ch
]
==
DBA_NEW
)
{
ctx
->
d
eltnseg
[
ch
]
=
get_bits
(
gb
,
3
);
for
(
seg
=
0
;
seg
<=
ctx
->
d
eltnseg
[
ch
];
seg
++
)
{
ctx
->
d
eltoffst
[
ch
][
seg
]
=
get_bits
(
gb
,
5
);
ctx
->
d
eltlen
[
ch
][
seg
]
=
get_bits
(
gb
,
4
);
ctx
->
d
eltba
[
ch
][
seg
]
=
get_bits
(
gb
,
3
);
if
(
ctx
->
d
ba_mod
e
[
ch
]
==
DBA_NEW
)
{
ctx
->
d
ba_nsegs
[
ch
]
=
get_bits
(
gb
,
3
);
for
(
seg
=
0
;
seg
<=
ctx
->
d
ba_nsegs
[
ch
];
seg
++
)
{
ctx
->
d
ba_offsets
[
ch
][
seg
]
=
get_bits
(
gb
,
5
);
ctx
->
d
ba_lengths
[
ch
][
seg
]
=
get_bits
(
gb
,
4
);
ctx
->
d
ba_values
[
ch
][
seg
]
=
get_bits
(
gb
,
3
);
}
}
}
}
else
if
(
blk
==
0
)
{
for
(
ch
=
0
;
ch
<=
ctx
->
nchans
;
ch
++
)
{
ctx
->
d
eltba
e
[
ch
]
=
DBA_NONE
;
ctx
->
d
ba_mod
e
[
ch
]
=
DBA_NONE
;
}
}
...
...
@@ -1009,23 +1009,23 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
/* Exponent mapping into PSD and PSD integration */
ff_ac3_bit_alloc_calc_psd
(
ctx
->
dexps
[
ch
],
ctx
->
startmant
[
ch
],
ctx
->
endmant
[
ch
],
ctx
->
psd
[
ch
],
ctx
->
b
nd
psd
[
ch
]);
ctx
->
psd
[
ch
],
ctx
->
b
and_
psd
[
ch
]);
}
if
(
bit_alloc_stages
[
ch
]
>
1
)
{
/* Compute excitation function, Compute masking curve, and
Apply delta bit allocation */
ff_ac3_bit_alloc_calc_mask
(
&
ctx
->
bit_alloc_params
,
ctx
->
b
nd
psd
[
ch
],
ff_ac3_bit_alloc_calc_mask
(
&
ctx
->
bit_alloc_params
,
ctx
->
b
and_
psd
[
ch
],
ctx
->
startmant
[
ch
],
ctx
->
endmant
[
ch
],
ctx
->
fgain
[
ch
],
(
ch
==
ctx
->
lfe_ch
),
ctx
->
d
eltbae
[
ch
],
ctx
->
deltnseg
[
ch
],
ctx
->
d
eltoffst
[
ch
],
ctx
->
deltlen
[
ch
],
ctx
->
d
eltba
[
ch
],
ctx
->
mask
[
ch
]);
ctx
->
f
ast_
gain
[
ch
],
(
ch
==
ctx
->
lfe_ch
),
ctx
->
d
ba_mode
[
ch
],
ctx
->
dba_nsegs
[
ch
],
ctx
->
d
ba_offsets
[
ch
],
ctx
->
dba_lengths
[
ch
],
ctx
->
d
ba_values
[
ch
],
ctx
->
mask
[
ch
]);
}
if
(
bit_alloc_stages
[
ch
]
>
0
)
{
/* Compute bit allocation */
ff_ac3_bit_alloc_calc_bap
(
ctx
->
mask
[
ch
],
ctx
->
psd
[
ch
],
ctx
->
startmant
[
ch
],
ctx
->
endmant
[
ch
],
ctx
->
snr
offs
t
[
ch
],
ctx
->
snr
_offse
t
[
ch
],
ctx
->
bit_alloc_params
.
floor
,
ctx
->
bap
[
ch
]);
}
...
...
libavcodec/ac3enc.c
浏览文件 @
5ce21342
...
...
@@ -42,9 +42,9 @@ typedef struct AC3EncodeContext {
unsigned
int
frame_size
;
/* current frame size in words */
unsigned
int
bits_written
;
unsigned
int
samples_written
;
int
halfratecod
;
int
sr_shift
;
unsigned
int
frmsizecod
;
unsigned
int
fscod
;
/* frequency */
unsigned
int
sr_code
;
/* frequency */
unsigned
int
acmod
;
int
lfe
;
unsigned
int
bsmod
;
...
...
@@ -53,11 +53,11 @@ typedef struct AC3EncodeContext {
int
nb_coefs
[
AC3_MAX_CHANNELS
];
/* bitrate allocation control */
int
s
gaincod
,
sdecaycod
,
fdecaycod
,
dbkneecod
,
floorcod
;
int
s
low_gain_code
,
slow_decay_code
,
fast_decay_code
,
db_per_bit_code
,
floor_code
;
AC3BitAllocParameters
bit_alloc
;
int
c
snroffs
t
;
int
f
gaincod
[
AC3_MAX_CHANNELS
];
int
f
snroffs
t
[
AC3_MAX_CHANNELS
];
int
c
oarse_snr_offse
t
;
int
f
ast_gain_code
[
AC3_MAX_CHANNELS
];
int
f
ine_snr_offse
t
[
AC3_MAX_CHANNELS
];
/* mantissa encoding */
int
mant1_cnt
,
mant2_cnt
,
mant4_cnt
;
}
AC3EncodeContext
;
...
...
@@ -438,7 +438,7 @@ static void bit_alloc_masking(AC3EncodeContext *s,
int16_t
mask
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
50
])
{
int
blk
,
ch
;
int16_t
b
nd
psd
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
50
];
int16_t
b
and_
psd
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
50
];
for
(
blk
=
0
;
blk
<
NB_BLOCKS
;
blk
++
)
{
for
(
ch
=
0
;
ch
<
s
->
nb_all_channels
;
ch
++
)
{
...
...
@@ -448,10 +448,10 @@ static void bit_alloc_masking(AC3EncodeContext *s,
}
else
{
ff_ac3_bit_alloc_calc_psd
(
encoded_exp
[
blk
][
ch
],
0
,
s
->
nb_coefs
[
ch
],
psd
[
blk
][
ch
],
b
nd
psd
[
blk
][
ch
]);
ff_ac3_bit_alloc_calc_mask
(
&
s
->
bit_alloc
,
b
nd
psd
[
blk
][
ch
],
psd
[
blk
][
ch
],
b
and_
psd
[
blk
][
ch
]);
ff_ac3_bit_alloc_calc_mask
(
&
s
->
bit_alloc
,
b
and_
psd
[
blk
][
ch
],
0
,
s
->
nb_coefs
[
ch
],
ff_ac3_fast_gain_tab
[
s
->
f
gaincod
[
ch
]],
ff_ac3_fast_gain_tab
[
s
->
f
ast_gain_code
[
ch
]],
ch
==
s
->
lfe_channel
,
DBA_NONE
,
0
,
NULL
,
NULL
,
NULL
,
mask
[
blk
][
ch
]);
...
...
@@ -464,12 +464,12 @@ static int bit_alloc(AC3EncodeContext *s,
int16_t
mask
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
50
],
int16_t
psd
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
N
/
2
],
uint8_t
bap
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
N
/
2
],
int
frame_bits
,
int
c
snroffst
,
int
fsnroffs
t
)
int
frame_bits
,
int
c
oarse_snr_offset
,
int
fine_snr_offse
t
)
{
int
i
,
ch
;
int
snroffset
;
int
snr
_
offset
;
snr
offset
=
(((
csnroffst
-
15
)
<<
4
)
+
fsnroffs
t
)
<<
2
;
snr
_offset
=
(((
coarse_snr_offset
-
15
)
<<
4
)
+
fine_snr_offse
t
)
<<
2
;
/* compute size */
for
(
i
=
0
;
i
<
NB_BLOCKS
;
i
++
)
{
...
...
@@ -478,7 +478,7 @@ static int bit_alloc(AC3EncodeContext *s,
s
->
mant4_cnt
=
0
;
for
(
ch
=
0
;
ch
<
s
->
nb_all_channels
;
ch
++
)
{
ff_ac3_bit_alloc_calc_bap
(
mask
[
i
][
ch
],
psd
[
i
][
ch
],
0
,
s
->
nb_coefs
[
ch
],
snroffset
,
s
->
nb_coefs
[
ch
],
snr
_
offset
,
s
->
bit_alloc
.
floor
,
bap
[
i
][
ch
]);
frame_bits
+=
compute_mantissa_size
(
s
,
bap
[
i
][
ch
],
s
->
nb_coefs
[
ch
]);
...
...
@@ -486,7 +486,7 @@ static int bit_alloc(AC3EncodeContext *s,
}
#if 0
printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n",
c
snroffst, fsnroffs
t, frame_bits,
c
oarse_snr_offset, fine_snr_offse
t, frame_bits,
16 * s->frame_size - ((frame_bits + 7) & ~7));
#endif
return
16
*
s
->
frame_size
-
frame_bits
;
...
...
@@ -501,29 +501,29 @@ static int compute_bit_allocation(AC3EncodeContext *s,
int
frame_bits
)
{
int
i
,
ch
;
int
c
snroffst
,
fsnroffs
t
;
int
c
oarse_snr_offset
,
fine_snr_offse
t
;
uint8_t
bap1
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
N
/
2
];
int16_t
psd
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
N
/
2
];
int16_t
mask
[
NB_BLOCKS
][
AC3_MAX_CHANNELS
][
50
];
static
int
frame_bits_inc
[
8
]
=
{
0
,
0
,
2
,
2
,
2
,
4
,
2
,
4
};
/* init default parameters */
s
->
s
decaycod
=
2
;
s
->
f
decaycod
=
1
;
s
->
s
gaincod
=
1
;
s
->
db
kneecod
=
2
;
s
->
floor
cod
=
4
;
s
->
s
low_decay_code
=
2
;
s
->
f
ast_decay_code
=
1
;
s
->
s
low_gain_code
=
1
;
s
->
db
_per_bit_code
=
2
;
s
->
floor
_code
=
4
;
for
(
ch
=
0
;
ch
<
s
->
nb_all_channels
;
ch
++
)
s
->
f
gaincod
[
ch
]
=
4
;
s
->
f
ast_gain_code
[
ch
]
=
4
;
/* compute real values */
s
->
bit_alloc
.
fscod
=
s
->
fscod
;
s
->
bit_alloc
.
halfratecod
=
s
->
halfratecod
;
s
->
bit_alloc
.
s
decay
=
ff_ac3_slow_decay_tab
[
s
->
sdecaycod
]
>>
s
->
halfratecod
;
s
->
bit_alloc
.
f
decay
=
ff_ac3_fast_decay_tab
[
s
->
fdecaycod
]
>>
s
->
halfratecod
;
s
->
bit_alloc
.
s
gain
=
ff_ac3_slow_gain_tab
[
s
->
sgaincod
];
s
->
bit_alloc
.
db
knee
=
ff_ac3_db_per_bit_tab
[
s
->
dbkneecod
];
s
->
bit_alloc
.
floor
=
ff_ac3_floor_tab
[
s
->
floor
cod
];
s
->
bit_alloc
.
sr_code
=
s
->
sr_code
;
s
->
bit_alloc
.
sr_shift
=
s
->
sr_shift
;
s
->
bit_alloc
.
s
low_decay
=
ff_ac3_slow_decay_tab
[
s
->
slow_decay_code
]
>>
s
->
sr_shift
;
s
->
bit_alloc
.
f
ast_decay
=
ff_ac3_fast_decay_tab
[
s
->
fast_decay_code
]
>>
s
->
sr_shift
;
s
->
bit_alloc
.
s
low_gain
=
ff_ac3_slow_gain_tab
[
s
->
slow_gain_code
];
s
->
bit_alloc
.
db
_per_bit
=
ff_ac3_db_per_bit_tab
[
s
->
db_per_bit_code
];
s
->
bit_alloc
.
floor
=
ff_ac3_floor_tab
[
s
->
floor
_code
];
/* header size */
frame_bits
+=
65
;
...
...
@@ -568,43 +568,43 @@ static int compute_bit_allocation(AC3EncodeContext *s,
/* now the big work begins : do the bit allocation. Modify the snr
offset until we can pack everything in the requested frame size */
c
snroffst
=
s
->
csnroffs
t
;
while
(
c
snroffs
t
>=
0
&&
bit_alloc
(
s
,
mask
,
psd
,
bap
,
frame_bits
,
c
snroffs
t
,
0
)
<
0
)
c
snroffs
t
-=
SNR_INC1
;
if
(
c
snroffs
t
<
0
)
{
c
oarse_snr_offset
=
s
->
coarse_snr_offse
t
;
while
(
c
oarse_snr_offse
t
>=
0
&&
bit_alloc
(
s
,
mask
,
psd
,
bap
,
frame_bits
,
c
oarse_snr_offse
t
,
0
)
<
0
)
c
oarse_snr_offse
t
-=
SNR_INC1
;
if
(
c
oarse_snr_offse
t
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Bit allocation failed, try increasing the bitrate, -ab 384k for example!
\n
"
);
return
-
1
;
}
while
((
c
snroffs
t
+
SNR_INC1
)
<=
63
&&
while
((
c
oarse_snr_offse
t
+
SNR_INC1
)
<=
63
&&
bit_alloc
(
s
,
mask
,
psd
,
bap1
,
frame_bits
,
c
snroffs
t
+
SNR_INC1
,
0
)
>=
0
)
{
c
snroffs
t
+=
SNR_INC1
;
c
oarse_snr_offse
t
+
SNR_INC1
,
0
)
>=
0
)
{
c
oarse_snr_offse
t
+=
SNR_INC1
;
memcpy
(
bap
,
bap1
,
sizeof
(
bap1
));
}
while
((
c
snroffs
t
+
1
)
<=
63
&&
bit_alloc
(
s
,
mask
,
psd
,
bap1
,
frame_bits
,
c
snroffs
t
+
1
,
0
)
>=
0
)
{
c
snroffs
t
++
;
while
((
c
oarse_snr_offse
t
+
1
)
<=
63
&&
bit_alloc
(
s
,
mask
,
psd
,
bap1
,
frame_bits
,
c
oarse_snr_offse
t
+
1
,
0
)
>=
0
)
{
c
oarse_snr_offse
t
++
;
memcpy
(
bap
,
bap1
,
sizeof
(
bap1
));
}
f
snroffs
t
=
0
;
while
((
f
snroffs
t
+
SNR_INC1
)
<=
15
&&
f
ine_snr_offse
t
=
0
;
while
((
f
ine_snr_offse
t
+
SNR_INC1
)
<=
15
&&
bit_alloc
(
s
,
mask
,
psd
,
bap1
,
frame_bits
,
c
snroffst
,
fsnroffs
t
+
SNR_INC1
)
>=
0
)
{
f
snroffs
t
+=
SNR_INC1
;
c
oarse_snr_offset
,
fine_snr_offse
t
+
SNR_INC1
)
>=
0
)
{
f
ine_snr_offse
t
+=
SNR_INC1
;
memcpy
(
bap
,
bap1
,
sizeof
(
bap1
));
}
while
((
f
snroffs
t
+
1
)
<=
15
&&
while
((
f
ine_snr_offse
t
+
1
)
<=
15
&&
bit_alloc
(
s
,
mask
,
psd
,
bap1
,
frame_bits
,
c
snroffst
,
fsnroffs
t
+
1
)
>=
0
)
{
f
snroffs
t
++
;
c
oarse_snr_offset
,
fine_snr_offse
t
+
1
)
>=
0
)
{
f
ine_snr_offse
t
++
;
memcpy
(
bap
,
bap1
,
sizeof
(
bap1
));
}
s
->
c
snroffst
=
csnroffs
t
;
s
->
c
oarse_snr_offset
=
coarse_snr_offse
t
;
for
(
ch
=
0
;
ch
<
s
->
nb_all_channels
;
ch
++
)
s
->
f
snroffst
[
ch
]
=
fsnroffs
t
;
s
->
f
ine_snr_offset
[
ch
]
=
fine_snr_offse
t
;
#if defined(DEBUG_BITALLOC)
{
int
j
;
...
...
@@ -663,22 +663,22 @@ static int AC3_encode_init(AVCodecContext *avctx)
return
-
1
;
found:
s
->
sample_rate
=
freq
;
s
->
halfratecod
=
i
;
s
->
fscod
=
j
;
s
->
bsid
=
8
+
s
->
halfratecod
;
s
->
sr_shift
=
i
;
s
->
sr_code
=
j
;
s
->
bsid
=
8
+
s
->
sr_shift
;
s
->
bsmod
=
0
;
/* complete main audio service */
/* bitrate & frame size */
bitrate
/=
1000
;
for
(
i
=
0
;
i
<
19
;
i
++
)
{
if
((
ff_ac3_bitrate_tab
[
i
]
>>
s
->
halfratecod
)
==
bitrate
)
if
((
ff_ac3_bitrate_tab
[
i
]
>>
s
->
sr_shift
)
==
bitrate
)
break
;
}
if
(
i
==
19
)
return
-
1
;
s
->
bit_rate
=
bitrate
;
s
->
frmsizecod
=
i
<<
1
;
s
->
frame_size_min
=
ff_ac3_frame_size_tab
[
s
->
frmsizecod
][
s
->
fscod
];
s
->
frame_size_min
=
ff_ac3_frame_size_tab
[
s
->
frmsizecod
][
s
->
sr_code
];
s
->
bits_written
=
0
;
s
->
samples_written
=
0
;
s
->
frame_size
=
s
->
frame_size_min
;
...
...
@@ -695,7 +695,7 @@ static int AC3_encode_init(AVCodecContext *avctx)
s
->
nb_coefs
[
s
->
lfe_channel
]
=
7
;
/* fixed */
}
/* initial snr offset */
s
->
c
snroffs
t
=
40
;
s
->
c
oarse_snr_offse
t
=
40
;
/* mdct init */
fft_init
(
MDCT_NBITS
-
2
);
...
...
@@ -718,7 +718,7 @@ static void output_frame_header(AC3EncodeContext *s, unsigned char *frame)
put_bits
(
&
s
->
pb
,
16
,
0x0b77
);
/* frame header */
put_bits
(
&
s
->
pb
,
16
,
0
);
/* crc1: will be filled later */
put_bits
(
&
s
->
pb
,
2
,
s
->
fscod
);
put_bits
(
&
s
->
pb
,
2
,
s
->
sr_code
);
put_bits
(
&
s
->
pb
,
6
,
s
->
frmsizecod
+
(
s
->
frame_size
-
s
->
frame_size_min
));
put_bits
(
&
s
->
pb
,
5
,
s
->
bsid
);
put_bits
(
&
s
->
pb
,
3
,
s
->
bsmod
);
...
...
@@ -900,20 +900,20 @@ static void output_audio_block(AC3EncodeContext *s,
baie
=
(
block_num
==
0
);
put_bits
(
&
s
->
pb
,
1
,
baie
);
if
(
baie
)
{
put_bits
(
&
s
->
pb
,
2
,
s
->
s
decaycod
);
put_bits
(
&
s
->
pb
,
2
,
s
->
f
decaycod
);
put_bits
(
&
s
->
pb
,
2
,
s
->
s
gaincod
);
put_bits
(
&
s
->
pb
,
2
,
s
->
db
kneecod
);
put_bits
(
&
s
->
pb
,
3
,
s
->
floor
cod
);
put_bits
(
&
s
->
pb
,
2
,
s
->
s
low_decay_code
);
put_bits
(
&
s
->
pb
,
2
,
s
->
f
ast_decay_code
);
put_bits
(
&
s
->
pb
,
2
,
s
->
s
low_gain_code
);
put_bits
(
&
s
->
pb
,
2
,
s
->
db
_per_bit_code
);
put_bits
(
&
s
->
pb
,
3
,
s
->
floor
_code
);
}
/* snr offset */
put_bits
(
&
s
->
pb
,
1
,
baie
);
/* always present with bai */
if
(
baie
)
{
put_bits
(
&
s
->
pb
,
6
,
s
->
c
snroffs
t
);
put_bits
(
&
s
->
pb
,
6
,
s
->
c
oarse_snr_offse
t
);
for
(
ch
=
0
;
ch
<
s
->
nb_all_channels
;
ch
++
)
{
put_bits
(
&
s
->
pb
,
4
,
s
->
f
snroffs
t
[
ch
]);
put_bits
(
&
s
->
pb
,
3
,
s
->
f
gaincod
[
ch
]);
put_bits
(
&
s
->
pb
,
4
,
s
->
f
ine_snr_offse
t
[
ch
]);
put_bits
(
&
s
->
pb
,
3
,
s
->
f
ast_gain_code
[
ch
]);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录