Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
930fe4b1
Commit
930fe4b1
authored
Jul 01, 2017
by
foo86
Committed by
Paul B Mahol
Jul 19, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: add Dolby E decoder
parent
22b72de0
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1453 additions
and
1 deletion
+1453
-1
configure
configure
+1
-0
general.texi
doc/general.texi
+1
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
codec_desc.c
libavcodec/codec_desc.c
+7
-0
dolby_e.c
libavcodec/dolby_e.c
+707
-0
dolby_e.h
libavcodec/dolby_e.h
+733
-0
version.h
libavcodec/version.h
+1
-1
No files found.
configure
View file @
930fe4b1
...
...
@@ -2402,6 +2402,7 @@ dds_decoder_select="texturedsp"
dirac_decoder_select
=
"dirac_parse dwt golomb videodsp mpegvideoenc"
dnxhd_decoder_select
=
"blockdsp idctdsp"
dnxhd_encoder_select
=
"aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
dolby_e_decoder_select
=
"mdct"
dvvideo_decoder_select
=
"dvprofile idctdsp"
dvvideo_encoder_select
=
"dvprofile fdctdsp me_cmp pixblockdsp"
dxa_decoder_select
=
"zlib"
...
...
doc/general.texi
View file @
930fe4b1
...
...
@@ -1001,6 +1001,7 @@ following image formats are supported:
@tab All versions except 5.1 are supported.
@item DCA (DTS Coherent Acoustics) @tab X @tab X
@tab supported extensions: XCh, XXCH, X96, XBR, XLL, LBR (partially)
@item Dolby E @tab @tab X
@item DPCM id RoQ @tab X @tab X
@tab Used in Quake III, Jedi Knight 2 and other computer games.
@item DPCM Interplay @tab @tab X
...
...
libavcodec/Makefile
View file @
930fe4b1
...
...
@@ -251,6 +251,7 @@ OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o diractab
OBJS-$(CONFIG_DFA_DECODER)
+=
dfa.o
OBJS-$(CONFIG_DNXHD_DECODER)
+=
dnxhddec.o
dnxhddata.o
OBJS-$(CONFIG_DNXHD_ENCODER)
+=
dnxhdenc.o
dnxhddata.o
OBJS-$(CONFIG_DOLBY_E_DECODER)
+=
dolby_e.o
kbdwin.o
OBJS-$(CONFIG_DPX_DECODER)
+=
dpx.o
OBJS-$(CONFIG_DPX_ENCODER)
+=
dpxenc.o
OBJS-$(CONFIG_DSD_LSBF_DECODER)
+=
dsddec.o
dsd.o
...
...
libavcodec/allcodecs.c
View file @
930fe4b1
...
...
@@ -423,6 +423,7 @@ static void register_all(void)
REGISTER_DECODER
(
BMV_AUDIO
,
bmv_audio
);
REGISTER_DECODER
(
COOK
,
cook
);
REGISTER_ENCDEC
(
DCA
,
dca
);
REGISTER_DECODER
(
DOLBY_E
,
dolby_e
);
REGISTER_DECODER
(
DSD_LSBF
,
dsd_lsbf
);
REGISTER_DECODER
(
DSD_MSBF
,
dsd_msbf
);
REGISTER_DECODER
(
DSD_LSBF_PLANAR
,
dsd_lsbf_planar
);
...
...
libavcodec/avcodec.h
View file @
930fe4b1
...
...
@@ -639,6 +639,7 @@ enum AVCodecID {
AV_CODEC_ID_DST
,
AV_CODEC_ID_ATRAC3AL
,
AV_CODEC_ID_ATRAC3PAL
,
AV_CODEC_ID_DOLBY_E
,
/* subtitle codecs */
AV_CODEC_ID_FIRST_SUBTITLE
=
0x17000
,
///< A dummy ID pointing at the start of subtitle codecs.
...
...
libavcodec/codec_desc.c
View file @
930fe4b1
...
...
@@ -2670,6 +2670,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Digital Speech Standard - Standard Play mode (DSS SP)"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
{
.
id
=
AV_CODEC_ID_DOLBY_E
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
name
=
"dolby_e"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Dolby E"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
{
.
id
=
AV_CODEC_ID_G729
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
...
...
libavcodec/dolby_e.c
0 → 100644
View file @
930fe4b1
/*
* Copyright (C) 2017 foo86
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/float_dsp.h"
#include "libavutil/thread.h"
#include "libavutil/mem.h"
#include "internal.h"
#include "get_bits.h"
#include "put_bits.h"
#include "dolby_e.h"
#include "fft.h"
static
void
skip_input
(
DBEContext
*
s
,
int
nb_words
)
{
s
->
input
+=
nb_words
*
s
->
word_bytes
;
s
->
input_size
-=
nb_words
;
}
static
int
parse_key
(
DBEContext
*
s
)
{
int
key
=
0
;
if
(
s
->
key_present
&&
s
->
input_size
>
0
)
key
=
AV_RB24
(
s
->
input
)
>>
24
-
s
->
word_bits
;
skip_input
(
s
,
s
->
key_present
);
return
key
;
}
static
int
convert_input
(
DBEContext
*
s
,
int
nb_words
,
int
key
)
{
uint8_t
*
src
=
s
->
input
;
uint8_t
*
dst
=
s
->
buffer
;
PutBitContext
pb
;
int
i
;
av_assert0
(
nb_words
<=
1024u
);
if
(
nb_words
>
s
->
input_size
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Packet too short
\n
"
);
return
AVERROR_INVALIDDATA
;
}
switch
(
s
->
word_bits
)
{
case
16
:
for
(
i
=
0
;
i
<
nb_words
;
i
++
,
src
+=
2
,
dst
+=
2
)
AV_WB16
(
dst
,
AV_RB16
(
src
)
^
key
);
break
;
case
20
:
init_put_bits
(
&
pb
,
s
->
buffer
,
sizeof
(
s
->
buffer
));
for
(
i
=
0
;
i
<
nb_words
;
i
++
,
src
+=
3
)
put_bits
(
&
pb
,
20
,
AV_RB24
(
src
)
>>
4
^
key
);
flush_put_bits
(
&
pb
);
break
;
case
24
:
for
(
i
=
0
;
i
<
nb_words
;
i
++
,
src
+=
3
,
dst
+=
3
)
AV_WB24
(
dst
,
AV_RB24
(
src
)
^
key
);
break
;
default:
av_assert0
(
0
);
}
return
init_get_bits
(
&
s
->
gb
,
s
->
buffer
,
nb_words
*
s
->
word_bits
);
}
static
int
parse_metadata
(
DBEContext
*
s
)
{
int
i
,
ret
,
key
=
parse_key
(
s
),
mtd_size
;
if
((
ret
=
convert_input
(
s
,
1
,
key
))
<
0
)
return
ret
;
skip_bits
(
&
s
->
gb
,
4
);
mtd_size
=
get_bits
(
&
s
->
gb
,
10
);
if
(
!
mtd_size
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid metadata size
\n
"
);
return
AVERROR_INVALIDDATA
;
}
if
((
ret
=
convert_input
(
s
,
mtd_size
,
key
))
<
0
)
return
ret
;
skip_bits
(
&
s
->
gb
,
14
);
s
->
prog_conf
=
get_bits
(
&
s
->
gb
,
6
);
if
(
s
->
prog_conf
>
MAX_PROG_CONF
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid program configuration
\n
"
);
return
AVERROR_INVALIDDATA
;
}
s
->
nb_channels
=
nb_channels_tab
[
s
->
prog_conf
];
s
->
nb_programs
=
nb_programs_tab
[
s
->
prog_conf
];
s
->
fr_code
=
get_bits
(
&
s
->
gb
,
4
);
s
->
fr_code_orig
=
get_bits
(
&
s
->
gb
,
4
);
if
(
!
sample_rate_tab
[
s
->
fr_code
]
||
!
sample_rate_tab
[
s
->
fr_code_orig
])
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid frame rate code
\n
"
);
return
AVERROR_INVALIDDATA
;
}
skip_bits_long
(
&
s
->
gb
,
88
);
for
(
i
=
0
;
i
<
s
->
nb_channels
;
i
++
)
s
->
ch_size
[
i
]
=
get_bits
(
&
s
->
gb
,
10
);
s
->
mtd_ext_size
=
get_bits
(
&
s
->
gb
,
8
);
s
->
meter_size
=
get_bits
(
&
s
->
gb
,
8
);
skip_bits_long
(
&
s
->
gb
,
10
*
s
->
nb_programs
);
for
(
i
=
0
;
i
<
s
->
nb_channels
;
i
++
)
{
s
->
rev_id
[
i
]
=
get_bits
(
&
s
->
gb
,
4
);
skip_bits1
(
&
s
->
gb
);
s
->
begin_gain
[
i
]
=
get_bits
(
&
s
->
gb
,
10
);
s
->
end_gain
[
i
]
=
get_bits
(
&
s
->
gb
,
10
);
}
if
(
get_bits_left
(
&
s
->
gb
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Read past end of metadata
\n
"
);
return
AVERROR_INVALIDDATA
;
}
skip_input
(
s
,
mtd_size
+
1
);
return
0
;
}
static
int
parse_metadata_ext
(
DBEContext
*
s
)
{
if
(
s
->
mtd_ext_size
)
skip_input
(
s
,
s
->
key_present
+
s
->
mtd_ext_size
+
1
);
return
0
;
}
static
void
unbias_exponents
(
DBEContext
*
s
,
DBEChannel
*
c
,
DBEGroup
*
g
)
{
int
mstr_exp
[
MAX_MSTR_EXP
];
int
bias_exp
[
MAX_BIAS_EXP
];
int
i
,
j
,
k
;
for
(
i
=
0
;
i
<
c
->
nb_mstr_exp
;
i
++
)
mstr_exp
[
i
]
=
get_bits
(
&
s
->
gb
,
2
)
*
6
;
for
(
i
=
0
;
i
<
g
->
nb_exponent
;
i
++
)
bias_exp
[
i
]
=
get_bits
(
&
s
->
gb
,
5
);
for
(
i
=
k
=
0
;
i
<
c
->
nb_mstr_exp
;
i
++
)
for
(
j
=
0
;
j
<
g
->
nb_bias_exp
[
i
];
j
++
,
k
++
)
c
->
exponents
[
g
->
exp_ofs
+
k
]
=
mstr_exp
[
i
]
+
bias_exp
[
k
];
}
static
int
parse_exponents
(
DBEContext
*
s
,
DBEChannel
*
c
)
{
DBEGroup
*
p
,
*
g
;
int
i
;
for
(
i
=
0
,
p
=
NULL
,
g
=
c
->
groups
;
i
<
c
->
nb_groups
;
i
++
,
p
=
g
,
g
++
)
{
c
->
exp_strategy
[
i
]
=
!
i
||
g
->
nb_exponent
!=
p
->
nb_exponent
||
get_bits1
(
&
s
->
gb
);
if
(
c
->
exp_strategy
[
i
])
{
unbias_exponents
(
s
,
c
,
g
);
}
else
{
memcpy
(
c
->
exponents
+
g
->
exp_ofs
,
c
->
exponents
+
p
->
exp_ofs
,
g
->
nb_exponent
*
sizeof
(
c
->
exponents
[
0
]));
}
}
return
0
;
}
static
inline
int
log_add
(
int
a
,
int
b
)
{
int
c
=
FFABS
(
a
-
b
)
>>
1
;
return
FFMAX
(
a
,
b
)
+
log_add_tab
[
FFMIN
(
c
,
211
)];
}
static
void
calc_lowcomp
(
int
*
msk_val
)
{
int
lwc_val
[
17
]
=
{
0
};
int
i
,
j
,
k
;
for
(
i
=
0
;
i
<
11
;
i
++
)
{
int
max_j
=
0
;
int
max_v
=
INT_MIN
;
int
thr
=
0
;
for
(
j
=
FFMAX
(
i
-
3
,
0
),
k
=
0
;
j
<=
i
+
3
;
j
++
,
k
++
)
{
int
v
=
msk_val
[
j
]
+
lwc_gain_tab
[
i
][
k
];
if
(
v
>
max_v
)
{
max_j
=
j
;
max_v
=
v
;
}
thr
=
log_add
(
thr
,
v
);
}
if
(
msk_val
[
i
]
<
thr
)
{
for
(
j
=
FFMAX
(
max_j
-
3
,
0
),
k
=
FFMAX
(
3
-
max_j
,
0
);
j
<=
max_j
+
3
;
j
++
,
k
++
)
lwc_val
[
j
]
+=
lwc_adj_tab
[
k
];
}
}
for
(
i
=
0
;
i
<
16
;
i
++
)
{
int
v
=
FFMAX
(
lwc_val
[
i
],
-
512
);
msk_val
[
i
]
=
FFMAX
(
msk_val
[
i
]
+
v
,
0
);
}
}
static
void
bit_allocate
(
int
nb_exponent
,
int
nb_code
,
int
fr_code
,
int
*
exp
,
int
*
bap
,
int
fg_spc
,
int
fg_ofs
,
int
msk_mod
,
int
snr_ofs
)
{
int
msk_val
[
MAX_BIAS_EXP
];
int
psd_val
[
MAX_BIAS_EXP
];
int
fast_leak
=
0
;
int
slow_leak
=
0
;
int
dc_code
=
dc_code_tab
[
fr_code
-
1
];
int
ht_code
=
ht_code_tab
[
fr_code
-
1
];
int
fast_gain
=
fast_gain_tab
[
fg_ofs
];
int
slow_decay
=
slow_decay_tab
[
dc_code
][
msk_mod
];
int
misc_decay
=
misc_decay_tab
[
nb_code
][
dc_code
][
msk_mod
];
const
uint16_t
*
slow_gain
=
slow_gain_tab
[
nb_code
][
msk_mod
];
const
uint16_t
*
fast_decay
=
fast_decay_tab
[
nb_code
][
dc_code
][
msk_mod
];
const
uint16_t
*
fast_gain_adj
=
fast_gain_adj_tab
[
nb_code
][
dc_code
];
const
uint16_t
*
hearing_thresh
=
hearing_thresh_tab
[
nb_code
][
ht_code
];
int
i
;
for
(
i
=
0
;
i
<
nb_exponent
;
i
++
)
psd_val
[
i
]
=
(
48
-
exp
[
i
])
*
64
;
fast_gain_adj
+=
band_ofs_tab
[
nb_code
][
fg_spc
];
for
(
i
=
0
;
i
<
nb_exponent
;
i
++
)
{
fast_leak
=
log_add
(
fast_leak
-
fast_decay
[
i
],
psd_val
[
i
]
-
fast_gain
+
fast_gain_adj
[
i
]);
slow_leak
=
log_add
(
slow_leak
-
slow_decay
,
psd_val
[
i
]
-
slow_gain
[
i
]);
msk_val
[
i
]
=
FFMAX
(
fast_leak
,
slow_leak
);
}
fast_leak
=
0
;
for
(
i
=
nb_exponent
-
1
;
i
>
band_low_tab
[
nb_code
];
i
--
)
{
fast_leak
=
log_add
(
fast_leak
-
misc_decay
,
psd_val
[
i
]
-
fast_gain
);
msk_val
[
i
]
=
FFMAX
(
msk_val
[
i
],
fast_leak
);
}
for
(
i
=
0
;
i
<
nb_exponent
;
i
++
)
msk_val
[
i
]
=
FFMAX
(
msk_val
[
i
],
hearing_thresh
[
i
]);
if
(
!
nb_code
)
calc_lowcomp
(
msk_val
);
for
(
i
=
0
;
i
<
nb_exponent
;
i
++
)
{
int
v
=
16
*
(
snr_ofs
-
64
)
+
psd_val
[
i
]
-
msk_val
[
i
]
>>
5
;
bap
[
i
]
=
bap_tab
[
av_clip
(
v
,
0
,
63
)];
}
}
static
int
parse_bit_alloc
(
DBEContext
*
s
,
DBEChannel
*
c
)
{
DBEGroup
*
p
,
*
g
;
int
bap_strategy
[
MAX_GROUPS
],
fg_spc
[
MAX_GROUPS
];
int
fg_ofs
[
MAX_GROUPS
],
msk_mod
[
MAX_GROUPS
];
int
i
,
snr_ofs
;
for
(
i
=
0
;
i
<
c
->
nb_groups
;
i
++
)
{
bap_strategy
[
i
]
=
!
i
||
get_bits1
(
&
s
->
gb
);
if
(
bap_strategy
[
i
])
{
fg_spc
[
i
]
=
get_bits
(
&
s
->
gb
,
2
);
fg_ofs
[
i
]
=
get_bits
(
&
s
->
gb
,
3
);
msk_mod
[
i
]
=
get_bits1
(
&
s
->
gb
);
}
else
{
fg_spc
[
i
]
=
fg_spc
[
i
-
1
];
fg_ofs
[
i
]
=
fg_ofs
[
i
-
1
];
msk_mod
[
i
]
=
msk_mod
[
i
-
1
];
}
}
if
(
get_bits1
(
&
s
->
gb
))
{
avpriv_report_missing_feature
(
s
->
avctx
,
"Delta bit allocation"
);
return
AVERROR_PATCHWELCOME
;
}
snr_ofs
=
get_bits
(
&
s
->
gb
,
8
);
if
(
!
snr_ofs
)
{
memset
(
c
->
bap
,
0
,
sizeof
(
c
->
bap
));
return
0
;
}
for
(
i
=
0
,
p
=
NULL
,
g
=
c
->
groups
;
i
<
c
->
nb_groups
;
i
++
,
p
=
g
,
g
++
)
{
if
(
c
->
exp_strategy
[
i
]
||
bap_strategy
[
i
])
{
bit_allocate
(
g
->
nb_exponent
,
g
->
imdct_idx
,
s
->
fr_code
,
c
->
exponents
+
g
->
exp_ofs
,
c
->
bap
+
g
->
exp_ofs
,
fg_spc
[
i
],
fg_ofs
[
i
],
msk_mod
[
i
],
snr_ofs
);
}
else
{
memcpy
(
c
->
bap
+
g
->
exp_ofs
,
c
->
bap
+
p
->
exp_ofs
,
g
->
nb_exponent
*
sizeof
(
c
->
bap
[
0
]));
}
}
return
0
;
}
static
int
parse_indices
(
DBEContext
*
s
,
DBEChannel
*
c
)
{
DBEGroup
*
p
,
*
g
;
int
i
,
j
;
for
(
i
=
0
,
p
=
NULL
,
g
=
c
->
groups
;
i
<
c
->
nb_groups
;
i
++
,
p
=
g
,
g
++
)
{
if
(
get_bits1
(
&
s
->
gb
))
{
int
start
=
get_bits
(
&
s
->
gb
,
6
);
if
(
start
>
g
->
nb_exponent
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid start index
\n
"
);
return
AVERROR_INVALIDDATA
;
}
for
(
j
=
0
;
j
<
start
;
j
++
)
c
->
idx
[
g
->
exp_ofs
+
j
]
=
0
;
for
(;
j
<
g
->
nb_exponent
;
j
++
)
c
->
idx
[
g
->
exp_ofs
+
j
]
=
get_bits
(
&
s
->
gb
,
2
);
}
else
if
(
i
&&
g
->
nb_exponent
==
p
->
nb_exponent
)
{
memcpy
(
c
->
idx
+
g
->
exp_ofs
,
c
->
idx
+
p
->
exp_ofs
,
g
->
nb_exponent
*
sizeof
(
c
->
idx
[
0
]));
}
else
{
memset
(
c
->
idx
+
g
->
exp_ofs
,
0
,
g
->
nb_exponent
*
sizeof
(
c
->
idx
[
0
]));
}
}
return
0
;
}
static
int
parse_mantissas
(
DBEContext
*
s
,
DBEChannel
*
c
)
{
DBEGroup
*
g
;
int
i
,
j
,
k
;
for
(
i
=
0
,
g
=
c
->
groups
;
i
<
c
->
nb_groups
;
i
++
,
g
++
)
{
float
*
mnt
=
c
->
mantissas
+
g
->
mnt_ofs
;
for
(
j
=
0
;
j
<
g
->
nb_exponent
;
j
++
)
{
int
bap
=
c
->
bap
[
g
->
exp_ofs
+
j
];
int
idx
=
c
->
idx
[
g
->
exp_ofs
+
j
];
int
size1
=
mantissa_size1
[
bap
][
idx
];
int
count
=
g
->
nb_mantissa
[
j
];
float
exp
=
exponent_tab
[
c
->
exponents
[
g
->
exp_ofs
+
j
]];
float
scale
=
mantissa_tab1
[
size1
][
idx
]
*
exp
;
if
(
!
size1
)
{
memset
(
mnt
,
0
,
count
*
sizeof
(
*
mnt
));
}
else
if
(
idx
)
{
int
values
[
100
];
int
escape
=
-
(
1
<<
size1
-
1
);
for
(
k
=
0
;
k
<
count
;
k
++
)
values
[
k
]
=
get_sbits
(
&
s
->
gb
,
size1
);
for
(
k
=
0
;
k
<
count
;
k
++
)
{
if
(
values
[
k
]
!=
escape
)
{
mnt
[
k
]
=
values
[
k
]
*
scale
;
}
else
{
int
size2
=
mantissa_size2
[
bap
][
idx
];
int
value
=
get_sbits
(
&
s
->
gb
,
size2
);
float
a
=
mantissa_tab2
[
size2
][
idx
];
float
b
=
mantissa_tab3
[
size2
][
idx
];
if
(
value
<
0
)
mnt
[
k
]
=
((
value
+
1
)
*
a
-
b
)
*
exp
;
else
mnt
[
k
]
=
(
value
*
a
+
b
)
*
exp
;
}
}
}
else
{
for
(
k
=
0
;
k
<
count
;
k
++
)
mnt
[
k
]
=
get_sbits
(
&
s
->
gb
,
size1
)
*
scale
;
}
mnt
+=
count
;
}
for
(;
j
<
g
->
nb_exponent
+
c
->
bw_code
;
j
++
)
{
memset
(
mnt
,
0
,
g
->
nb_mantissa
[
j
]
*
sizeof
(
*
mnt
));
mnt
+=
g
->
nb_mantissa
[
j
];
}
}
return
0
;
}
static
int
parse_channel
(
DBEContext
*
s
,
int
ch
,
int
seg_id
)
{
DBEChannel
*
c
=
&
s
->
channels
[
seg_id
][
ch
];
int
i
,
ret
;
if
(
s
->
rev_id
[
ch
]
>
1
)
{
avpriv_report_missing_feature
(
s
->
avctx
,
"Encoder revision %d"
,
s
->
rev_id
[
ch
]);
return
AVERROR_PATCHWELCOME
;
}
if
(
ch
==
lfe_channel_tab
[
s
->
prog_conf
])
{
c
->
gr_code
=
3
;
c
->
bw_code
=
29
;
}
else
{
c
->
gr_code
=
get_bits
(
&
s
->
gb
,
2
);
c
->
bw_code
=
get_bits
(
&
s
->
gb
,
3
);
if
(
c
->
gr_code
==
3
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid group type code
\n
"
);
return
AVERROR_INVALIDDATA
;
}
}
c
->
nb_groups
=
nb_groups_tab
[
c
->
gr_code
];
c
->
nb_mstr_exp
=
nb_mstr_exp_tab
[
c
->
gr_code
];
for
(
i
=
0
;
i
<
c
->
nb_groups
;
i
++
)
{
c
->
groups
[
i
]
=
frm_ofs_tab
[
seg_id
][
c
->
gr_code
][
i
];
if
(
c
->
nb_mstr_exp
==
2
)
{
c
->
groups
[
i
].
nb_exponent
-=
c
->
bw_code
;
c
->
groups
[
i
].
nb_bias_exp
[
1
]
-=
c
->
bw_code
;
}
}
if
((
ret
=
parse_exponents
(
s
,
c
))
<
0
)
return
ret
;
if
((
ret
=
parse_bit_alloc
(
s
,
c
))
<
0
)
return
ret
;
if
((
ret
=
parse_indices
(
s
,
c
))
<
0
)
return
ret
;
if
((
ret
=
parse_mantissas
(
s
,
c
))
<
0
)
return
ret
;
if
(
get_bits_left
(
&
s
->
gb
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Read past end of channel %d
\n
"
,
ch
);
return
AVERROR_INVALIDDATA
;
}
return
0
;
}
static
int
parse_audio
(
DBEContext
*
s
,
int
start
,
int
end
,
int
seg_id
)
{
int
ch
,
ret
,
key
=
parse_key
(
s
);
for
(
ch
=
start
;
ch
<
end
;
ch
++
)
{
if
(
!
s
->
ch_size
[
ch
])
{
s
->
channels
[
seg_id
][
ch
].
nb_groups
=
0
;
continue
;
}
if
((
ret
=
convert_input
(
s
,
s
->
ch_size
[
ch
],
key
))
<
0
)
return
ret
;
if
((
ret
=
parse_channel
(
s
,
ch
,
seg_id
))
<
0
)
{
if
(
s
->
avctx
->
err_recognition
&
AV_EF_EXPLODE
)
return
ret
;
s
->
channels
[
seg_id
][
ch
].
nb_groups
=
0
;
}
skip_input
(
s
,
s
->
ch_size
[
ch
]);
}
skip_input
(
s
,
1
);
return
0
;
}
static
int
parse_meter
(
DBEContext
*
s
)
{
if
(
s
->
meter_size
)
skip_input
(
s
,
s
->
key_present
+
s
->
meter_size
+
1
);
return
0
;
}
static
void
imdct_calc
(
DBEContext
*
s
,
DBEGroup
*
g
,
float
*
result
,
float
*
values
)
{
FFTContext
*
imdct
=
&
s
->
imdct
[
g
->
imdct_idx
];
int
n
=
1
<<
imdct_bits_tab
[
g
->
imdct_idx
];
int
n2
=
n
>>
1
;
int
i
;
switch
(
g
->
imdct_phs
)
{
case
0
:
imdct
->
imdct_half
(
imdct
,
result
,
values
);
for
(
i
=
0
;
i
<
n2
;
i
++
)
result
[
n2
+
i
]
=
result
[
n2
-
i
-
1
];
break
;
case
1
:
imdct
->
imdct_calc
(
imdct
,
result
,
values
);
break
;
case
2
:
imdct
->
imdct_half
(
imdct
,
result
+
n2
,
values
);
for
(
i
=
0
;
i
<
n2
;
i
++
)
result
[
i
]
=
-
result
[
n
-
i
-
1
];
break
;
default:
av_assert0
(
0
);
}
}
static
void
transform
(
DBEContext
*
s
,
DBEChannel
*
c
,
float
*
history
,
float
*
output
)
{
LOCAL_ALIGNED_32
(
float
,
buffer
,
[
2048
]);
LOCAL_ALIGNED_32
(
float
,
result
,
[
1152
]);
DBEGroup
*
g
;
int
i
;
memset
(
result
,
0
,
1152
*
sizeof
(
float
));
for
(
i
=
0
,
g
=
c
->
groups
;
i
<
c
->
nb_groups
;
i
++
,
g
++
)
{
float
*
src
=
buffer
+
g
->
src_ofs
;
float
*
dst
=
result
+
g
->
dst_ofs
;
float
*
win
=
window
+
g
->
win_ofs
;
imdct_calc
(
s
,
g
,
buffer
,
c
->
mantissas
+
g
->
mnt_ofs
);
s
->
fdsp
->
vector_fmul_add
(
dst
,
src
,
win
,
dst
,
g
->
win_len
);
}
for
(
i
=
0
;
i
<
256
;
i
++
)
output
[
i
]
=
history
[
i
]
+
result
[
i
];
for
(
i
=
256
;
i
<
896
;
i
++
)
output
[
i
]
=
result
[
i
];
for
(
i
=
0
;
i
<
256
;
i
++
)
history
[
i
]
=
result
[
896
+
i
];
}
static
void
apply_gain
(
DBEContext
*
s
,
int
begin
,
int
end
,
float
*
output
)
{
if
(
begin
==
960
&&
end
==
960
)
return
;
if
(
begin
==
end
)
{
s
->
fdsp
->
vector_fmul_scalar
(
output
,
output
,
gain_tab
[
end
],
FRAME_SAMPLES
);
}
else
{
float
a
=
gain_tab
[
begin
]
*
(
1
.
0
f
/
(
FRAME_SAMPLES
-
1
));
float
b
=
gain_tab
[
end
]
*
(
1
.
0
f
/
(
FRAME_SAMPLES
-
1
));
int
i
;
for
(
i
=
0
;
i
<
FRAME_SAMPLES
;
i
++
)
output
[
i
]
*=
a
*
(
FRAME_SAMPLES
-
i
-
1
)
+
b
*
i
;
}
}
static
int
filter_frame
(
DBEContext
*
s
,
AVFrame
*
frame
)
{
const
uint8_t
*
reorder
;
int
ch
,
ret
;
if
(
s
->
nb_channels
==
4
)
reorder
=
ch_reorder_4
;
else
if
(
s
->
nb_channels
==
6
)
reorder
=
ch_reorder_6
;
else
if
(
s
->
nb_programs
==
1
&&
!
(
s
->
avctx
->
request_channel_layout
&
AV_CH_LAYOUT_NATIVE
))
reorder
=
ch_reorder_8
;
else
reorder
=
ch_reorder_n
;
frame
->
nb_samples
=
FRAME_SAMPLES
;
if
((
ret
=
ff_get_buffer
(
s
->
avctx
,
frame
,
0
))
<
0
)
return
ret
;
for
(
ch
=
0
;
ch
<
s
->
nb_channels
;
ch
++
)
{
float
*
output
=
(
float
*
)
frame
->
extended_data
[
reorder
[
ch
]];
transform
(
s
,
&
s
->
channels
[
0
][
ch
],
s
->
history
[
ch
],
output
);
transform
(
s
,
&
s
->
channels
[
1
][
ch
],
s
->
history
[
ch
],
output
+
FRAME_SAMPLES
/
2
);
apply_gain
(
s
,
s
->
begin_gain
[
ch
],
s
->
end_gain
[
ch
],
output
);
}
return
0
;
}
static
int
dolby_e_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
DBEContext
*
s
=
avctx
->
priv_data
;
int
i
,
j
,
hdr
,
ret
;
if
(
avpkt
->
size
<
3
)
return
AVERROR_INVALIDDATA
;
hdr
=
AV_RB24
(
avpkt
->
data
);
if
((
hdr
&
0xfffffe
)
==
0x7888e
)
{
s
->
word_bits
=
24
;
}
else
if
((
hdr
&
0xffffe0
)
==
0x788e0
)
{
s
->
word_bits
=
20
;
}
else
if
((
hdr
&
0xfffe00
)
==
0x78e00
)
{
s
->
word_bits
=
16
;
}
else
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid frame header
\n
"
);
return
AVERROR_INVALIDDATA
;
}
s
->
word_bytes
=
s
->
word_bits
+
7
>>
3
;
s
->
input
=
avpkt
->
data
+
s
->
word_bytes
;
s
->
input_size
=
avpkt
->
size
/
s
->
word_bytes
-
1
;
s
->
key_present
=
hdr
>>
24
-
s
->
word_bits
&
1
;
if
((
ret
=
parse_metadata
(
s
))
<
0
)
return
ret
;
if
(
s
->
nb_programs
>
1
&&
!
s
->
multi_prog_warned
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Stream has %d programs (configuration %d), "
"channels will be output in native order.
\n
"
,
s
->
nb_programs
,
s
->
prog_conf
);
s
->
multi_prog_warned
=
1
;
}
switch
(
s
->
nb_channels
)
{
case
4
:
avctx
->
channel_layout
=
AV_CH_LAYOUT_4POINT0
;
break
;
case
6
:
avctx
->
channel_layout
=
AV_CH_LAYOUT_5POINT1
;
break
;
case
8
:
avctx
->
channel_layout
=
AV_CH_LAYOUT_7POINT1
;
break
;
}
avctx
->
channels
=
s
->
nb_channels
;
avctx
->
sample_rate
=
sample_rate_tab
[
s
->
fr_code
];
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLTP
;
i
=
s
->
nb_channels
/
2
;
j
=
s
->
nb_channels
;
if
((
ret
=
parse_audio
(
s
,
0
,
i
,
0
))
<
0
)
return
ret
;
if
((
ret
=
parse_audio
(
s
,
i
,
j
,
0
))
<
0
)
return
ret
;
if
((
ret
=
parse_metadata_ext
(
s
))
<
0
)
return
ret
;
if
((
ret
=
parse_audio
(
s
,
0
,
i
,
1
))
<
0
)
return
ret
;
if
((
ret
=
parse_audio
(
s
,
i
,
j
,
1
))
<
0
)
return
ret
;
if
((
ret
=
parse_meter
(
s
))
<
0
)
return
ret
;
if
((
ret
=
filter_frame
(
s
,
data
))
<
0
)
return
ret
;
*
got_frame_ptr
=
1
;
return
avpkt
->
size
;
}
static
av_cold
void
dolby_e_flush
(
AVCodecContext
*
avctx
)
{
DBEContext
*
s
=
avctx
->
priv_data
;
memset
(
s
->
history
,
0
,
sizeof
(
s
->
history
));
}
static
av_cold
int
dolby_e_close
(
AVCodecContext
*
avctx
)
{
DBEContext
*
s
=
avctx
->
priv_data
;
int
i
;
for
(
i
=
0
;
i
<
3
;
i
++
)
ff_mdct_end
(
&
s
->
imdct
[
i
]);
av_freep
(
&
s
->
fdsp
);
return
0
;
}
static
av_cold
int
dolby_e_init
(
AVCodecContext
*
avctx
)
{
static
AVOnce
init_once
=
AV_ONCE_INIT
;
DBEContext
*
s
=
avctx
->
priv_data
;
int
i
;
if
(
ff_thread_once
(
&
init_once
,
init_tables
))
return
AVERROR_UNKNOWN
;
for
(
i
=
0
;
i
<
3
;
i
++
)
if
(
ff_mdct_init
(
&
s
->
imdct
[
i
],
imdct_bits_tab
[
i
],
1
,
2
.
0
)
<
0
)
return
AVERROR
(
ENOMEM
);
if
(
!
(
s
->
fdsp
=
avpriv_float_dsp_alloc
(
0
)))
return
AVERROR
(
ENOMEM
);
s
->
multi_prog_warned
=
!!
(
avctx
->
request_channel_layout
&
AV_CH_LAYOUT_NATIVE
);
s
->
avctx
=
avctx
;
return
0
;
}
AVCodec
ff_dolby_e_decoder
=
{
.
name
=
"dolby_e"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Dolby E"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_DOLBY_E
,
.
priv_data_size
=
sizeof
(
DBEContext
),
.
init
=
dolby_e_init
,
.
decode
=
dolby_e_decode_frame
,
.
close
=
dolby_e_close
,
.
flush
=
dolby_e_flush
,
.
capabilities
=
AV_CODEC_CAP_DR1
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_NONE
},
.
caps_internal
=
FF_CODEC_CAP_INIT_THREADSAFE
|
FF_CODEC_CAP_INIT_CLEANUP
,
};
libavcodec/dolby_e.h
0 → 100644
View file @
930fe4b1
/*
* Copyright (C) 2017 foo86
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_DOLBY_E_H
#define AVCODEC_DOLBY_E_H
#include "libavutil/float_dsp.h"
#include "libavutil/libm.h"
#include "libavutil/mem.h"
#include "internal.h"
#include "get_bits.h"
#include "kbdwin.h"
#include "fft.h"
#define FRAME_SAMPLES 1792
#define MAX_PROG_CONF 23
#define MAX_PROGRAMS 8
#define MAX_CHANNELS 8
#define MAX_SEGMENTS 2
#define MAX_GROUPS 8
#define MAX_EXPONENTS 304
#define MAX_MANTISSAS 1024
#define MAX_MSTR_EXP 2
#define MAX_BIAS_EXP 50
typedef
struct
DBEGroup
{
uint8_t
nb_exponent
;
uint8_t
nb_bias_exp
[
MAX_MSTR_EXP
];
uint16_t
exp_ofs
;
uint16_t
mnt_ofs
;
const
uint8_t
*
nb_mantissa
;
uint8_t
imdct_idx
;
uint8_t
imdct_phs
;
uint16_t
win_len
;
uint16_t
dst_ofs
;
uint16_t
win_ofs
;
uint16_t
src_ofs
;
}
DBEGroup
;
typedef
struct
DBEChannel
{
int
gr_code
;
int
bw_code
;
int
nb_groups
;
int
nb_mstr_exp
;
DBEGroup
groups
[
MAX_GROUPS
];
int
exp_strategy
[
MAX_GROUPS
];
int
exponents
[
MAX_EXPONENTS
];
int
bap
[
MAX_EXPONENTS
];
int
idx
[
MAX_EXPONENTS
];
DECLARE_ALIGNED
(
32
,
float
,
mantissas
)[
MAX_MANTISSAS
];
}
DBEChannel
;
typedef
struct
DBEContext
{
AVCodecContext
*
avctx
;
GetBitContext
gb
;
uint8_t
*
input
;
int
input_size
;
int
word_bits
;
int
word_bytes
;
int
key_present
;
int
prog_conf
;
int
nb_channels
;
int
nb_programs
;
int
fr_code
;
int
fr_code_orig
;
int
ch_size
[
MAX_CHANNELS
];
int
mtd_ext_size
;
int
meter_size
;
int
rev_id
[
MAX_CHANNELS
];
int
begin_gain
[
MAX_CHANNELS
];
int
end_gain
[
MAX_CHANNELS
];
int
multi_prog_warned
;
DBEChannel
channels
[
MAX_SEGMENTS
][
MAX_CHANNELS
];
DECLARE_ALIGNED
(
32
,
float
,
history
)[
MAX_CHANNELS
][
256
];
FFTContext
imdct
[
3
];
AVFloatDSPContext
*
fdsp
;
uint8_t
buffer
[
1024
*
3
+
AV_INPUT_BUFFER_PADDING_SIZE
];
}
DBEContext
;
static
const
uint8_t
nb_programs_tab
[
MAX_PROG_CONF
+
1
]
=
{
2
,
3
,
2
,
3
,
4
,
5
,
4
,
5
,
6
,
7
,
8
,
1
,
2
,
3
,
3
,
4
,
5
,
6
,
1
,
2
,
3
,
4
,
1
,
1
};
static
const
uint8_t
nb_channels_tab
[
MAX_PROG_CONF
+
1
]
=
{
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
4
,
4
,
4
,
4
,
8
,
8
};
static
const
int8_t
lfe_channel_tab
[
MAX_PROG_CONF
+
1
]
=
{
5
,
5
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
4
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
5
,
5
};
static
const
uint8_t
ch_reorder_4
[
4
]
=
{
0
,
2
,
1
,
3
};
static
const
uint8_t
ch_reorder_6
[
6
]
=
{
0
,
2
,
4
,
1
,
3
,
5
};
static
const
uint8_t
ch_reorder_8
[
8
]
=
{
0
,
2
,
6
,
4
,
1
,
3
,
7
,
5
};
static
const
uint8_t
ch_reorder_n
[
8
]
=
{
0
,
2
,
4
,
6
,
1
,
3
,
5
,
7
};
static
const
uint16_t
sample_rate_tab
[
16
]
=
{
0
,
42965
,
43008
,
44800
,
53706
,
53760
};
static
const
uint8_t
nb_groups_tab
[
4
]
=
{
1
,
8
,
7
,
1
};
static
const
uint8_t
nb_mstr_exp_tab
[
4
]
=
{
2
,
2
,
2
,
1
};
static
const
uint8_t
nb_mantissa_38
[
38
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
4
,
4
,
4
,
5
,
5
,
6
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
};
static
const
uint8_t
nb_mantissa_44
[
44
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
5
,
5
,
6
,
7
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
15
,
16
,
18
,
20
,
22
,
25
,
};
static
const
uint8_t
nb_mantissa_50
[
50
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
5
,
5
,
6
,
6
,
7
,
8
,
9
,
9
,
10
,
12
,
13
,
14
,
16
,
18
,
19
,
22
,
24
,
27
,
29
,
32
,
36
,
40
,
44
,
49
,
54
,
60
,
66
,
74
,
82
,
90
,
100
,
};
static
const
uint8_t
imdct_bits_tab
[
3
]
=
{
8
,
9
,
11
};
static
const
DBEGroup
grp_tab_0
[
1
]
=
{
{
50
,
{
27
,
23
},
0
,
0
,
nb_mantissa_50
,
2
,
0
,
1152
,
0
,
1408
,
0
},
};
static
const
DBEGroup
grp_tab_1
[
8
]
=
{
{
38
,
{
12
,
26
},
0
,
0
,
nb_mantissa_38
,
0
,
0
,
192
,
0
,
256
,
0
},
{
38
,
{
12
,
26
},
38
,
128
,
nb_mantissa_38
,
0
,
1
,
256
,
64
,
448
,
0
},
{
38
,
{
12
,
26
},
76
,
256
,
nb_mantissa_38
,
0
,
1
,
256
,
192
,
704
,
0
},
{
38
,
{
12
,
26
},
114
,
384
,
nb_mantissa_38
,
0
,
1
,
256
,
320
,
0
,
0
},
{
38
,
{
12
,
26
},
152
,
512
,
nb_mantissa_38
,
0
,
1
,
256
,
448
,
0
,
0
},
{
38
,
{
12
,
26
},
190
,
640
,
nb_mantissa_38
,
0
,
1
,
256
,
576
,
0
,
0
},
{
38
,
{
12
,
26
},
228
,
768
,
nb_mantissa_38
,
0
,
1
,
256
,
704
,
0
,
0
},
{
38
,
{
12
,
26
},
266
,
896
,
nb_mantissa_38
,
0
,
1
,
256
,
832
,
0
,
0
},
};
static
const
DBEGroup
grp_tab_2
[
7
]
=
{
{
38
,
{
12
,
26
},
0
,
0
,
nb_mantissa_38
,
0
,
0
,
192
,
0
,
256
,
0
},
{
38
,
{
12
,
26
},
38
,
128
,
nb_mantissa_38
,
0
,
1
,
256
,
64
,
448
,
0
},
{
38
,
{
12
,
26
},
76
,
256
,
nb_mantissa_38
,
0
,
1
,
256
,
192
,
704
,
0
},
{
38
,
{
12
,
26
},
114
,
384
,
nb_mantissa_38
,
0
,
1
,
256
,
320
,
0
,
0
},
{
38
,
{
12
,
26
},
152
,
512
,
nb_mantissa_38
,
0
,
1
,
256
,
448
,
0
,
0
},
{
38
,
{
12
,
26
},
190
,
640
,
nb_mantissa_38
,
0
,
1
,
256
,
576
,
0
,
0
},
{
44
,
{
19
,
25
},
228
,
768
,
nb_mantissa_44
,
1
,
1
,
448
,
704
,
960
,
64
},
};
static
const
DBEGroup
grp_tab_3
[
1
]
=
{
{
21
,
{
21
},
0
,
0
,
nb_mantissa_50
,
2
,
0
,
1152
,
0
,
1408
,
0
},
};
static
const
DBEGroup
grp_tab_4
[
1
]
=
{
{
50
,
{
27
,
23
},
0
,
0
,
nb_mantissa_50
,
2
,
2
,
1152
,
0
,
1408
,
896
},
};
static
const
DBEGroup
grp_tab_5
[
8
]
=
{
{
38
,
{
12
,
26
},
0
,
0
,
nb_mantissa_38
,
0
,
1
,
256
,
64
,
0
,
0
},
{
38
,
{
12
,
26
},
38
,
128
,
nb_mantissa_38
,
0
,
1
,
256
,
192
,
0
,
0
},
{
38
,
{
12
,
26
},
76
,
256
,
nb_mantissa_38
,
0
,
1
,
256
,
320
,
0
,
0
},
{
38
,
{
12
,
26
},
114
,
384
,
nb_mantissa_38
,
0
,
1
,
256
,
448
,
0
,
0
},
{
38
,
{
12
,
26
},
152
,
512
,
nb_mantissa_38
,
0
,
1
,
256
,
576
,
0
,
0
},
{
38
,
{
12
,
26
},
190
,
640
,
nb_mantissa_38
,
0
,
1
,
256
,
704
,
3008
,
0
},
{
38
,
{
12
,
26
},
228
,
768
,
nb_mantissa_38
,
0
,
1
,
256
,
832
,
2752
,
0
},
{
38
,
{
12
,
26
},
266
,
896
,
nb_mantissa_38
,
0
,
2
,
192
,
960
,
2560
,
64
},
};
static
const
DBEGroup
grp_tab_6
[
7
]
=
{
{
44
,
{
19
,
25
},
0
,
0
,
nb_mantissa_44
,
1
,
1
,
448
,
0
,
3264
,
0
},
{
38
,
{
12
,
26
},
44
,
256
,
nb_mantissa_38
,
0
,
1
,
256
,
320
,
0
,
0
},
{
38
,
{
12
,
26
},
82
,
384
,
nb_mantissa_38
,
0
,
1
,
256
,
448
,
0
,
0
},
{
38
,
{
12
,
26
},
120
,
512
,
nb_mantissa_38
,
0
,
1
,
256
,
576
,
0
,
0
},
{
38
,
{
12
,
26
},
158
,
640
,
nb_mantissa_38
,
0
,
1
,
256
,
704
,
3008
,
0
},
{
38
,
{
12
,
26
},
196
,
768
,
nb_mantissa_38
,
0
,
1
,
256
,
832
,
2752
,
0
},
{
38
,
{
12
,
26
},
234
,
896
,
nb_mantissa_38
,
0
,
2
,
192
,
960
,
2560
,
64
},
};
static
const
DBEGroup
grp_tab_7
[
1
]
=
{
{
21
,
{
21
},
0
,
0
,
nb_mantissa_50
,
2
,
2
,
1152
,
0
,
1408
,
896
},
};
static
const
DBEGroup
*
const
frm_ofs_tab
[
2
][
4
]
=
{
{
grp_tab_0
,
grp_tab_1
,
grp_tab_2
,
grp_tab_3
},
{
grp_tab_4
,
grp_tab_5
,
grp_tab_6
,
grp_tab_7
}
};
static
const
uint8_t
mantissa_size1
[
16
][
4
]
=
{
{
0
,
0
,
0
,
0
},
{
2
,
1
,
1
,
1
},
{
3
,
2
,
1
,
1
},
{
4
,
3
,
2
,
1
},
{
5
,
4
,
3
,
2
},
{
6
,
5
,
4
,
3
},
{
7
,
6
,
5
,
4
},
{
8
,
7
,
6
,
5
},
{
9
,
8
,
7
,
6
},
{
10
,
9
,
8
,
7
},
{
11
,
10
,
9
,
8
},
{
12
,
11
,
10
,
9
},
{
13
,
12
,
11
,
10
},
{
14
,
13
,
12
,
11
},
{
15
,
14
,
13
,
12
},
{
16
,
15
,
14
,
13
},
};
static
const
uint8_t
mantissa_size2
[
16
][
4
]
=
{
{
0
,
0
,
0
,
0
},
{
2
,
1
,
2
,
2
},
{
3
,
2
,
3
,
3
},
{
4
,
3
,
4
,
4
},
{
5
,
4
,
5
,
5
},
{
6
,
5
,
6
,
6
},
{
7
,
6
,
7
,
7
},
{
8
,
7
,
8
,
8
},
{
9
,
8
,
9
,
9
},
{
10
,
9
,
10
,
10
},
{
11
,
10
,
11
,
11
},
{
12
,
11
,
12
,
12
},
{
13
,
12
,
13
,
13
},
{
14
,
13
,
14
,
14
},
{
15
,
14
,
15
,
15
},
{
16
,
15
,
16
,
16
},
};
static
const
float
start_window
[
192
]
=
{
0
.
0016156
9379826
,
0
.
001
85748233347
,
0
.
001
98562758548
,
0
.
00207
834078104
,
0
.
0021571774
8523
,
0
.
002230670
96393
,
0
.
002302
99213147
,
0
.
002376512153
96
,
0
.
00245275561606
,
0
.
002532
81402069
,
0
.
00261754673613
,
0
.
0027076
8786168
,
0
.
002
80390761895
,
0
.
002
90684998656
,
0
.
00301715751161
,
0
.
0031354
8872798
,
0
.
00326253122
934
,
0
.
0033
9901215995
,
0
.
00354570716636
,
0
.
00370344
845023
,
0
.
003
87313232586
,
0
.
00405572653
911
,
0
.
00425227750
970
,
0
.
004463
91759265
,
0
.
0046
9187240551
,
0
.
004
93746822816
,
0
.
00520213
944619
,
0
.
0054
8743597507
,
0
.
0057
9503056737
,
0
.
006126725
86953
,
0
.
0064
8446105606
,
0
.
006
87031782873
,
0
.
0072
8652552677
,
0
.
00773546505205
,
0
.
00
821967127415
,
0
.
00
874183354619
,
0
.
00
930479393832
,
0
.
00
991154278653
,
0
.
010565211166
92
,
0
.
01126
905994567
,
0
.
01202646513050
,
0
.
012
84089936559
,
0
.
013715
90957417
,
0
.
0146550
9096066
,
0
.
015662057
83408
,
0
.
016740411
99523
,
0
.
017
89370972358
,
0
.
01
912542867865
,
0
.
02043
893626265
,
0
.
021
83746113793
,
0
.
02332406
961796
,
0
.
024
90164852364
,
0
.
026572
89580178
,
0
.
02
834031974193
,
0
.
03020624702
903
,
0
.
032172
83918354
,
0
.
03424211623
810
,
0
.
036415
98586180
,
0
.
03
869627565015
,
0
.
0410
8476601498
,
0
.
0435
8322107390
,
0
.
0461
9341515939
,
0
.
04
891715301882
,
0
.
0517562
8239149
,
0
.
05471237327267
,
0
.
0577
8734733755
,
0
.
060
98291402413
,
0
.
064301013520
84
,
0
.
067743452121
86
,
0
.
071311
88644726
,
0
.
075007
80649199
,
0
.
07
883251748595
,
0
.
08278712056651
,
0
.
08687249228061
,
0
.
09108926295730
,
0
.
09543779401074
,
0
.
09991815425851
,
0
.
10453009536427
,
0
.
10927302653894
,
0
.
11414598865987
,
0
.
11914762799220
,
0
.
12427616972097
,
0
.
12952939152560
,
0
.
13490459744934
,
0
.
14039859233595
,
0
.
14600765712201
,
0
.
15172752528722
,
0
.
15755336077528
,
0
.
16347973770491
,
0
.
16950062219342
,
0
.
17560935661442
,
0
.
18179864660619
,
0
.
18806055113821
,
0
.
19438647593012
,
0
.
20076717050010
,
0
.
20719272909882
,
0
.
21365259576030
,
0
.
22013557367283
,
0
.
22662983904194
,
0
.
23312295958328
,
0
.
23960191774666
,
0
.
24605313873388
,
0
.
25246252333253
,
0
.
25881548554631
,
0
.
26509699495987
,
0
.
27129162373316
,
0
.
27738359807707
,
0
.
28335685401987
,
0
.
28919509723179
,
0
.
29488186663467
,
0
.
30040060148455
,
0
.
30573471157819
,
0
.
31086765019993
,
0
.
31578298939317
,
0
.
32046449711227
,
0
.
32489621578468
,
0
.
32906254179156
,
0
.
33294830535654
,
0
.
33653885031840
,
0
.
33982011325336
,
0
.
34277870140679
,
0
.
34540196889300
,
0
.
34767809062480
,
0
.
34959613344194
,
0
.
35114612391958
,
0
.
35231911235422
,
0
.
35310723244504
,
0
.
35350375621308
,
0
.
35350314372945
,
0
.
35310108725579
,
0
.
35229454943591
,
0
.
35108179521634
,
0
.
34946241721522
,
0
.
34743735430290
,
0
.
34500890320420
,
0
.
34218072298001
,
0
.
33895783229541
,
0
.
33534659943168
,
0
.
33135472505060
,
0
.
32699121776996
,
0
.
32226636266000
,
0
.
31719168282019
,
0
.
31177989424432
,
0
.
30604485422875
,
0
.
30000150362379
,
0
.
29366580327088
,
0
.
28705466500775
,
0
.
28018587766131
,
0
.
27307802848095
,
0
.
26575042049535
,
0
.
25822298630189
,
0
.
25051619882000
,
0
.
24265097955783
,
0
.
23464860495522
,
0
.
22653061137548
,
0
.
21831869932335
,
0
.
21003463746705
,
0
.
20170016703857
,
0
.
19333690717811
,
0
.
18496626177620
,
0
.
17660932835062
,
0
.
16828680947474
,
0
.
16001892724986
,
0
.
15182534128597
,
0
.
14372507062477
,
0
.
13573642000364
,
0
.
12787691082233
,
0
.
12016321713317
,
0
.
11261110693234
,
0
.
10523538898282
,
0
.
09804986534955
,
0
.
09106728977263
,
0
.
08429933194438
,
0
.
0777565476
8810
,
0
.
07144
835495683
,
0
.
0653
8301547324
,
0
.
05
956762170687
,
0
.
05400
808871425
,
0
.
04
870915012107
,
0
.
04367435714
993
,
0
.
03
890607899172
,
0
.
0344055017
9663
,
0
.
03017262174627
,
0
.
0262062242
8513
,
0
.
022503
83492507
,
0
.
01
906161305732
,
0
.
015
87412848221
,
0
.
012
93388032354
,
0
.
0102301
9677288
,
0
.
00774641320626
,
0
.
0054510
9736891
,
0
.
00325
868651263
,
};
static
const
float
short_window2
[
192
]
=
{
0
.
0001
8861094606
,
0
.
00033433010202
,
0
.
0005030
9624485
,
0
.
0007030616174
8
,
0
.
000
93995174533
,
0
.
00121
913067128
,
0
.
0015460650556
8
,
0
.
001
92647806126
,
0
.
0023664124
8692
,
0
.
002
87225985240
,
0
.
00345077377440
,
0
.
00410
907465023
,
0
.
004
85464855241
,
0
.
0056
9534163219
,
0
.
00663
935063508
,
0
.
0076
9520981249
,
0
.
00
887177436246
,
0
.
01017
820046395
,
0
.
011623
92194150
,
0
.
01321
862359335
,
0
.
014
97221122468
,
0
.
016
89477844427
,
0
.
01
899657030441
,
0
.
0212
8794388846
,
0
.
02377
932597692
,
0
.
0264
8116795039
,
0
.
02
940389811590
,
0
.
032557
87167130
,
0
.
035
95331854986
,
0
.
03
960028941437
,
0
.
04350
860009563
,
0
.
0476
8777479454
,
0
.
052146
98838949
,
0
.
056
89500821121
,
0
.
061
94013566525
,
0
.
0672
9014809766
,
0
.
072
95224131210
,
0
.
07
893297315602
,
0
.
08523820859989
,
0
.
09187306673620
,
0
.
09884187012422
,
0
.
10614809690222
,
0
.
11379433608064
,
0
.
12178224641797
,
0
.
13011251926531
,
0
.
13878484574660
,
0
.
14779788861830
,
0
.
15714925912610
,
0
.
16683549914631
,
0
.
17685206886673
,
0
.
18719334022589
,
0
.
19785259629099
,
0
.
20882203671372
,
0
.
22009278936030
,
0
.
23165492816694
,
0
.
24349749722585
,
0
.
25560854105961
,
0
.
26797514099368
,
0
.
28058345748882
,
0
.
29341877824732
,
0
.
30646557185942
,
0
.
31970754671026
,
0
.
33312771482295
,
0
.
34670846027024
,
0
.
36043161174692
,
0
.
37427851885723
,
0
.
38823013163645
,
0
.
40226708279486
,
0
.
41636977214436
,
0
.
43051845264462
,
0
.
44469331748632
,
0
.
45887458761470
,
0
.
47304259908636
,
0
.
48717788964798
,
0
.
50126128392546
,
0
.
51527397661778
,
0
.
52919761310050
,
0
.
54301436685998
,
0
.
55670701320069
,
0
.
57025899869448
,
0
.
58365450587230
,
0
.
59687851269542
,
0
.
60991684638414
,
0
.
62275623122793
,
0
.
63538433005035
,
0
.
64778977905593
,
0
.
65996221584264
,
0
.
67189230042379
,
0
.
68357172916486
,
0
.
69499324160511
,
0
.
70615062019861
,
0
.
71703868307548
,
0
.
72765326998919
,
0
.
73799122168099
,
0
.
74805035295521
,
0
.
75782941981995
,
0
.
76732808110520
,
0
.
77654685502339
,
0
.
78548707118622
,
0
.
79415081863423
,
0
.
80254089047207
,
0
.
81066072573188
,
0
.
81851434910893
,
0
.
82610630922734
,
0
.
83344161609862
,
0
.
84052567843230
,
0
.
84736424144524
,
0
.
85396332579459
,
0
.
86032916822973
,
0
.
86646816451999
,
0
.
87238681516918
,
0
.
87809167437532
,
0
.
88358930263537
,
0
.
88888622333073
,
0
.
89398888356256
,
0
.
89890361943564
,
0
.
90363662591861
,
0
.
90819393133744
,
0
.
91258137648979
,
0
.
91680459830070
,
0
.
92086901787718
,
0
.
92477983276087
,
0
.
92854201312583
,
0
.
93216030163834
,
0
.
93563921662343
,
0
.
93898305819384
,
0
.
94219591693690
,
0
.
94528168477979
,
0
.
94823843319821
,
0
.
95106834367330
,
0
.
95377776558539
,
0
.
95636718335775
,
0
.
95883679961479
,
0
.
96118650212341
,
0
.
96341583179195
,
0
.
96552395212906
,
0
.
96750962060547
,
0
.
96937116231768
,
0
.
97110644638309
,
0
.
97271286544154
,
0
.
97418731862798
,
0
.
97552619834964
,
0
.
97672538116257
,
0
.
97778022299974
,
0
.
97868555895586
,
0
.
97943570778357
,
0
.
98002448120255
,
0
.
98044519806866
,
0
.
98069070339493
,
0
.
98075339216123
,
0
.
98062523779637
,
0
.
98029782516478
,
0
.
97976238784222
,
0
.
97900984942031
,
0
.
97803086854002
,
0
.
97681588731895
,
0
.
97535518280755
,
0
.
97363892108474
,
0
.
97165721358452
,
0
.
96940017523145
,
0
.
96685798395452
,
0
.
96402094114589
,
0
.
96087953263194
,
0
.
95742448973047
,
0
.
95364684997699
,
0
.
94953801711660
,
0
.
94508981997396
,
0
.
94029456983253
,
0
.
93514511597504
,
0
.
92963489905951
,
0
.
92375800202883
,
0
.
91750919827624
,
0
.
91088399681406
,
0
.
90387868421832
,
0
.
89649036314692
,
0
.
88871698725397
,
0
.
88055739234735
,
0
.
87201132366062
,
0
.
86307945913336
,
0
.
85376342861693
,
0
.
84406582894455
,
0
.
83399023482637
,
0
.
82354120554757
,
0
.
81272428745995
,
0
.
80154601230457
,
0
.
79001389138101
,
0
.
77813640562199
,
0
.
76592299164227
,
0
.
75338402384395
,
0
.
74053079267526
,
0
.
72737547915460
,
0
.
71393112578527
,
};
static
const
float
short_window3
[
64
]
=
{
0
.
00326
887936450
,
0
.
00550242
900936
,
0
.
007
86846643791
,
0
.
010456
83453520
,
0
.
01330402120132
,
0
.
01643221072
863
,
0
.
01
985798040609
,
0
.
0235
9509464766
,
0
.
0276555
9221954
,
0
.
03205025
893128
,
0
.
0367
8884369614
,
0
.
041
88015679495
,
0
.
04733210
987781
,
0
.
053151725
83924
,
0
.
05
934513287609
,
0
.
065
91755045290
,
0
.
072
87327156378
,
0
.
08021564389822
,
0
.
08794705152307
,
0
.
09606889811179
,
0
.
10458159240070
,
0
.
11348453632940
,
0
.
12277611617809
,
0
.
13245369691511
,
0
.
14251361989876
,
0
.
15295120402567
,
0
.
16376075037904
,
0
.
17493555039885
,
0
.
18646789757072
,
0
.
19834910260891
,
0
.
21056951208995
,
0
.
22311853047787
,
0
.
23598464546683
,
0
.
24915545655419
,
0
.
26261770674500
,
0
.
27635731727778
,
0
.
29035942525136
,
0
.
30460842402318
,
0
.
31908800624032
,
0
.
33378120935681
,
0
.
34867046348260
,
0
.
36373764140285
,
0
.
37896411059909
,
0
.
39433078709788
,
0
.
40981819096657
,
0
.
42540650327031
,
0
.
44107562429959
,
0
.
45680523287270
,
0
.
47257484651351
,
0
.
48836388230077
,
0
.
50415171818214
,
0
.
51991775454258
,
0
.
53564147581496
,
0
.
55130251191887
,
0
.
56688069931047
,
0
.
58235614142007
,
0
.
59770926827271
,
0
.
61292089506118
,
0
.
62797227945823
,
0
.
64284517745255
,
0
.
65752189749349
,
0
.
67198535273209
,
0
.
68621911114984
,
0
.
70020744337099
,
};
static
const
uint8_t
dc_code_tab
[
5
]
=
{
0
,
0
,
0
,
1
,
1
};
static
const
uint8_t
ht_code_tab
[
5
]
=
{
0
,
0
,
1
,
2
,
2
};
static
const
uint8_t
band_ofs_tab
[
3
][
4
]
=
{
{
12
,
8
,
4
,
0
},
{
14
,
10
,
6
,
0
},
{
12
,
8
,
4
,
0
}
};
static
const
uint8_t
band_low_tab
[
3
]
=
{
9
,
17
,
24
};
static
const
uint16_t
fast_gain_tab
[
8
]
=
{
128
,
256
,
384
,
512
,
640
,
768
,
896
,
1024
};
static
const
uint16_t
slow_decay_tab
[
2
][
2
]
=
{
{
27
,
-
1
},
{
32
,
21
}
};
static
const
uint16_t
misc_decay_tab
[
3
][
2
][
2
]
=
{
{
{
354
,
-
1
},
{
425
,
425
}
},
{
{
266
,
-
1
},
{
320
,
-
1
}
},
{
{
213
,
-
1
},
{
256
,
-
1
}
}
};
static
const
uint16_t
fast_decay_tab
[
3
][
2
][
2
][
50
]
=
{
{{{
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
142
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}},
{{
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
170
,
},
{
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
64
,
}}},
{{{
266
,
266
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}},
{{
319
,
319
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}}},
{{{
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
106
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}},
{{
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}}}
};
static
const
uint16_t
fast_gain_adj_tab
[
3
][
2
][
62
]
=
{
{{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
2
,
4
,
7
,
11
,
16
,
29
,
44
,
59
,
76
,
94
,
116
,
142
,
179
,
221
,
252
,
285
,
312
,
334
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
5
,
8
,
10
,
15
,
28
,
42
,
57
,
75
,
93
,
115
,
140
,
177
,
219
,
247
,
280
,
308
,
330
,
427
,
533
,
}},
{{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
5
,
8
,
12
,
21
,
35
,
51
,
69
,
89
,
111
,
138
,
176
,
220
,
251
,
284
,
312
,
334
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
5
,
8
,
11
,
18
,
33
,
49
,
65
,
84
,
106
,
132
,
168
,
214
,
245
,
279
,
308
,
329
,
427
,
533
,
}},
{{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
4
,
7
,
10
,
17
,
31
,
47
,
65
,
84
,
107
,
134
,
171
,
215
,
250
,
283
,
312
,
334
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
6
,
9
,
13
,
27
,
43
,
60
,
79
,
100
,
126
,
160
,
207
,
242
,
276
,
307
,
329
,
427
,
533
,
}}
};
static
const
uint16_t
slow_gain_tab
[
3
][
2
][
50
]
=
{
{{
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
1063
,
},
{
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
850
,
}},
{{
3072
,
1212
,
1212
,
1212
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}},
{{
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
3072
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
999
,
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
}}
};
static
const
uint16_t
hearing_thresh_tab
[
3
][
3
][
50
]
=
{
{{
1403
,
1141
,
1000
,
959
,
948
,
957
,
946
,
925
,
899
,
871
,
843
,
815
,
789
,
766
,
745
,
727
,
705
,
687
,
681
,
686
,
701
,
725
,
768
,
854
,
940
,
1018
,
1075
,
1103
,
1111
,
1106
,
1098
,
1105
,
1142
,
1237
,
1419
,
1721
,
2169
,
2805
,
},
{
1401
,
1130
,
995
,
957
,
947
,
955
,
941
,
918
,
890
,
861
,
831
,
803
,
777
,
754
,
734
,
717
,
698
,
684
,
682
,
692
,
712
,
743
,
798
,
894
,
976
,
1045
,
1091
,
1109
,
1110
,
1102
,
1098
,
1116
,
1174
,
1300
,
1526
,
1884
,
2401
,
3072
,
},
{
1393
,
1086
,
974
,
949
,
957
,
941
,
913
,
878
,
843
,
808
,
777
,
750
,
727
,
708
,
695
,
686
,
681
,
689
,
714
,
752
,
811
,
888
,
971
,
1044
,
1087
,
1108
,
1110
,
1102
,
1098
,
1115
,
1172
,
1290
,
1489
,
1812
,
2293
,
2964
,
3072
,
3072
,
}},
{{
1412
,
1343
,
1141
,
1047
,
1000
,
974
,
959
,
951
,
948
,
947
,
957
,
953
,
946
,
936
,
925
,
906
,
878
,
850
,
822
,
795
,
771
,
745
,
719
,
700
,
687
,
681
,
685
,
701
,
733
,
784
,
885
,
977
,
1047
,
1092
,
1110
,
1108
,
1099
,
1102
,
1138
,
1233
,
1413
,
1711
,
2157
,
2797
,
},
{
1412
,
1336
,
1130
,
1040
,
995
,
970
,
957
,
950
,
947
,
947
,
955
,
950
,
941
,
930
,
918
,
897
,
868
,
838
,
810
,
783
,
759
,
734
,
710
,
693
,
684
,
681
,
690
,
712
,
752
,
823
,
924
,
1009
,
1069
,
1102
,
1111
,
1104
,
1098
,
1111
,
1168
,
1295
,
1518
,
1873
,
2388
,
3072
,
},
{
1411
,
1293
,
1086
,
1009
,
974
,
957
,
949
,
947
,
957
,
951
,
941
,
928
,
913
,
896
,
878
,
852
,
817
,
785
,
756
,
732
,
713
,
695
,
683
,
682
,
689
,
710
,
746
,
811
,
906
,
992
,
1061
,
1099
,
1111
,
1106
,
1098
,
1107
,
1155
,
1266
,
1471
,
1799
,
2277
,
2945
,
3072
,
3072
,
}},
{{
1431
,
1412
,
1403
,
1379
,
1343
,
1293
,
1229
,
1180
,
1125
,
1075
,
1040
,
1014
,
996
,
979
,
965
,
957
,
951
,
948
,
947
,
957
,
951
,
940
,
924
,
903
,
877
,
846
,
815
,
785
,
753
,
725
,
702
,
686
,
681
,
689
,
714
,
760
,
847
,
947
,
1028
,
1083
,
1108
,
1109
,
1101
,
1100
,
1132
,
1222
,
1402
,
1705
,
2160
,
2803
,
},
{
1431
,
1412
,
1401
,
1375
,
1336
,
1278
,
1215
,
1168
,
1115
,
1066
,
1032
,
1008
,
991
,
975
,
962
,
954
,
950
,
947
,
947
,
955
,
948
,
935
,
916
,
894
,
866
,
835
,
803
,
772
,
742
,
715
,
695
,
683
,
683
,
697
,
729
,
784
,
887
,
982
,
1054
,
1096
,
1111
,
1106
,
1098
,
1107
,
1159
,
1281
,
1505
,
1865
,
2391
,
3072
,
},
{
1427
,
1411
,
1393
,
1353
,
1293
,
1215
,
1160
,
1118
,
1072
,
1031
,
1003
,
984
,
971
,
960
,
952
,
948
,
947
,
957
,
952
,
941
,
924
,
902
,
876
,
847
,
815
,
781
,
750
,
723
,
700
,
685
,
681
,
691
,
719
,
766
,
858
,
958
,
1039
,
1089
,
1109
,
1108
,
1099
,
1102
,
1141
,
1245
,
1442
,
1766
,
2250
,
2930
,
3072
,
3072
,
}}
};
static
const
int16_t
lwc_gain_tab
[
11
][
7
]
=
{
{
-
21
,
-
197
,
-
271
,
-
466
,
32767
,
32767
,
32767
},
{
-
197
,
-
29
,
-
244
,
-
271
,
-
540
,
32767
,
32767
},
{
-
271
,
-
244
,
-
29
,
-
249
,
-
271
,
-
593
,
32767
},
{
-
466
,
-
271
,
-
249
,
-
29
,
-
251
,
-
271
,
-
632
},
{
-
540
,
-
271
,
-
251
,
-
29
,
-
251
,
-
271
,
-
664
},
{
-
593
,
-
271
,
-
251
,
-
29
,
-
252
,
-
271
,
-
690
},
{
-
632
,
-
271
,
-
252
,
-
29
,
-
252
,
-
271
,
-
711
},
{
-
664
,
-
271
,
-
252
,
-
29
,
-
252
,
-
271
,
-
730
},
{
-
690
,
-
271
,
-
252
,
-
29
,
-
252
,
-
271
,
-
745
},
{
-
711
,
-
271
,
-
252
,
-
29
,
-
253
,
-
271
,
-
759
},
{
-
730
,
-
271
,
-
253
,
-
29
,
-
253
,
-
271
,
-
771
},
};
static
const
int16_t
lwc_adj_tab
[
7
]
=
{
-
192
,
-
320
,
-
448
,
-
512
,
-
448
,
-
320
,
-
192
,
};
static
const
uint8_t
log_add_tab
[
212
]
=
{
64
,
63
,
62
,
61
,
60
,
59
,
58
,
57
,
56
,
55
,
54
,
53
,
52
,
52
,
51
,
50
,
49
,
48
,
47
,
47
,
46
,
45
,
44
,
44
,
43
,
42
,
41
,
41
,
40
,
39
,
38
,
38
,
37
,
36
,
36
,
35
,
35
,
34
,
33
,
33
,
32
,
32
,
31
,
30
,
30
,
29
,
29
,
28
,
28
,
27
,
27
,
26
,
26
,
25
,
25
,
24
,
24
,
23
,
23
,
22
,
22
,
21
,
21
,
21
,
20
,
20
,
19
,
19
,
19
,
18
,
18
,
18
,
17
,
17
,
17
,
16
,
16
,
16
,
15
,
15
,
15
,
14
,
14
,
14
,
13
,
13
,
13
,
13
,
12
,
12
,
12
,
12
,
11
,
11
,
11
,
11
,
10
,
10
,
10
,
10
,
10
,
9
,
9
,
9
,
9
,
9
,
8
,
8
,
8
,
8
,
8
,
8
,
7
,
7
,
7
,
7
,
7
,
7
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
};
static
const
uint8_t
bap_tab
[
64
]
=
{
0
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
9
,
9
,
9
,
9
,
10
,
10
,
10
,
10
,
11
,
11
,
11
,
11
,
12
,
12
,
12
,
12
,
13
,
13
,
13
,
13
,
14
,
14
,
14
,
14
,
15
,
15
,
15
,
15
,
15
,
};
static
float
mantissa_tab1
[
17
][
4
];
static
float
mantissa_tab2
[
17
][
4
];
static
float
mantissa_tab3
[
17
][
4
];
static
float
exponent_tab
[
50
];
static
float
gain_tab
[
1024
];
DECLARE_ALIGNED
(
32
,
static
float
,
window
)[
3712
];
static
av_cold
void
init_tables
(
void
)
{
int
i
,
j
;
for
(
i
=
1
;
i
<
17
;
i
++
)
mantissa_tab1
[
i
][
0
]
=
1
.
0
/
(
1
<<
i
-
1
);
for
(
i
=
2
;
i
<
16
;
i
++
)
{
mantissa_tab1
[
i
][
1
]
=
1
.
0
/
((
1
<<
i
)
-
1
);
mantissa_tab1
[
i
][
2
]
=
0
.
5
/
((
1
<<
i
)
-
1
);
mantissa_tab1
[
i
][
3
]
=
0
.
25
/
((
1
<<
i
)
-
1
);
}
mantissa_tab1
[
i
][
1
]
=
0
.
5
/
(
1
<<
15
);
mantissa_tab1
[
i
][
2
]
=
0
.
75
/
(
1
<<
15
);
mantissa_tab1
[
i
][
3
]
=
0
.
875
/
(
1
<<
15
);
for
(
i
=
1
;
i
<
17
;
i
++
)
{
mantissa_tab2
[
i
][
1
]
=
mantissa_tab1
[
i
][
0
]
*
0
.
5
;
mantissa_tab2
[
i
][
2
]
=
mantissa_tab1
[
i
][
0
]
*
0
.
75
;
mantissa_tab2
[
i
][
3
]
=
mantissa_tab1
[
i
][
0
]
*
0
.
875
;
for
(
j
=
1
;
j
<
4
;
j
++
)
mantissa_tab3
[
i
][
j
]
=
1
.
0
/
(
1
<<
i
)
+
1
.
0
/
(
1
<<
j
)
-
1
.
0
/
(
1
<<
i
+
j
);
}
mantissa_tab3
[
1
][
3
]
=
0
.
6875
;
for
(
i
=
0
;
i
<
25
;
i
++
)
{
exponent_tab
[
i
*
2
]
=
1
.
0
/
(
1
<<
i
);
exponent_tab
[
i
*
2
+
1
]
=
M_SQRT1_2
/
(
1
<<
i
);
}
for
(
i
=
1
;
i
<
1024
;
i
++
)
gain_tab
[
i
]
=
exp2f
((
i
-
960
)
/
64
.
0
f
);
// short 1
ff_kbd_window_init
(
window
,
3
.
0
,
128
);
for
(
i
=
0
;
i
<
128
;
i
++
)
window
[
128
+
i
]
=
window
[
127
-
i
];
// start
for
(
i
=
0
;
i
<
192
;
i
++
)
window
[
256
+
i
]
=
start_window
[
i
];
// short 2
for
(
i
=
0
;
i
<
192
;
i
++
)
window
[
448
+
i
]
=
short_window2
[
i
];
for
(
i
=
0
;
i
<
64
;
i
++
)
window
[
640
+
i
]
=
window
[
63
-
i
];
// short 3
for
(
i
=
0
;
i
<
64
;
i
++
)
window
[
704
+
i
]
=
short_window3
[
i
];
for
(
i
=
0
;
i
<
192
;
i
++
)
window
[
768
+
i
]
=
window
[
64
+
i
];
// bridge
for
(
i
=
0
;
i
<
128
;
i
++
)
window
[
960
+
i
]
=
window
[
i
];
for
(
i
=
0
;
i
<
64
;
i
++
)
window
[
1088
+
i
]
=
1
.
0
;
// long
ff_kbd_window_init
(
window
+
1408
,
3
.
0
,
256
);
for
(
i
=
0
;
i
<
640
;
i
++
)
window
[
1664
+
i
]
=
1
.
0
;
for
(
i
=
0
;
i
<
256
;
i
++
)
window
[
2304
+
i
]
=
window
[
1152
+
i
]
=
window
[
1663
-
i
];
// reverse start
for
(
i
=
0
;
i
<
192
;
i
++
)
window
[
2560
+
i
]
=
window
[
447
-
i
];
// reverse short 2
for
(
i
=
0
;
i
<
256
;
i
++
)
window
[
2752
+
i
]
=
window
[
703
-
i
];
// reverse short 3
for
(
i
=
0
;
i
<
256
;
i
++
)
window
[
3008
+
i
]
=
window
[
959
-
i
];
// reverse bridge
for
(
i
=
0
;
i
<
448
;
i
++
)
window
[
3264
+
i
]
=
window
[
1407
-
i
];
}
#endif
libavcodec/version.h
View file @
930fe4b1
...
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MINOR 10
1
#define LIBAVCODEC_VERSION_MINOR 10
2
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment