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
d073f122
Commit
d073f122
authored
May 22, 2012
by
Kostya Shishkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
imc: some cosmetics
parent
177bcc95
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
204 additions
and
181 deletions
+204
-181
imc.c
libavcodec/imc.c
+204
-181
No files found.
libavcodec/imc.c
View file @
d073f122
...
@@ -89,7 +89,7 @@ typedef struct {
...
@@ -89,7 +89,7 @@ typedef struct {
DSPContext
dsp
;
DSPContext
dsp
;
FFTContext
fft
;
FFTContext
fft
;
DECLARE_ALIGNED
(
32
,
FFTComplex
,
samples
)[
COEFFS
/
2
];
DECLARE_ALIGNED
(
32
,
FFTComplex
,
samples
)[
COEFFS
/
2
];
float
*
out_samples
;
float
*
out_samples
;
}
IMCContext
;
}
IMCContext
;
...
@@ -99,11 +99,12 @@ static VLC huffman_vlc[4][4];
...
@@ -99,11 +99,12 @@ static VLC huffman_vlc[4][4];
static
const
int
vlc_offsets
[
17
]
=
{
static
const
int
vlc_offsets
[
17
]
=
{
0
,
640
,
1156
,
1732
,
2308
,
2852
,
3396
,
3924
,
0
,
640
,
1156
,
1732
,
2308
,
2852
,
3396
,
3924
,
4452
,
5220
,
5860
,
6628
,
7268
,
7908
,
8424
,
8936
,
VLC_TABLES_SIZE
};
4452
,
5220
,
5860
,
6628
,
7268
,
7908
,
8424
,
8936
,
VLC_TABLES_SIZE
};
static
VLC_TYPE
vlc_tables
[
VLC_TABLES_SIZE
][
2
];
static
VLC_TYPE
vlc_tables
[
VLC_TABLES_SIZE
][
2
];
static
av_cold
int
imc_decode_init
(
AVCodecContext
*
avctx
)
static
av_cold
int
imc_decode_init
(
AVCodecContext
*
avctx
)
{
{
int
i
,
j
,
ret
;
int
i
,
j
,
ret
;
IMCContext
*
q
=
avctx
->
priv_data
;
IMCContext
*
q
=
avctx
->
priv_data
;
...
@@ -116,27 +117,24 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
...
@@ -116,27 +117,24 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
q
->
decoder_reset
=
1
;
q
->
decoder_reset
=
1
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
q
->
old_floor
[
i
]
=
1
.
0
;
q
->
old_floor
[
i
]
=
1
.
0
;
/* Build mdct window, a simple sine window normalized with sqrt(2) */
/* Build mdct window, a simple sine window normalized with sqrt(2) */
ff_sine_window_init
(
q
->
mdct_sine_window
,
COEFFS
);
ff_sine_window_init
(
q
->
mdct_sine_window
,
COEFFS
);
for
(
i
=
0
;
i
<
COEFFS
;
i
++
)
for
(
i
=
0
;
i
<
COEFFS
;
i
++
)
q
->
mdct_sine_window
[
i
]
*=
sqrt
(
2
.
0
);
q
->
mdct_sine_window
[
i
]
*=
sqrt
(
2
.
0
);
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
)
{
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
)
{
q
->
post_cos
[
i
]
=
(
1
.
0
f
/
32768
)
*
cos
(
i
/
256
.
0
*
M_PI
);
q
->
post_cos
[
i
]
=
(
1
.
0
f
/
32768
)
*
cos
(
i
/
256
.
0
*
M_PI
);
q
->
post_sin
[
i
]
=
(
1
.
0
f
/
32768
)
*
sin
(
i
/
256
.
0
*
M_PI
);
q
->
post_sin
[
i
]
=
(
1
.
0
f
/
32768
)
*
sin
(
i
/
256
.
0
*
M_PI
);
r1
=
sin
((
i
*
4
.
0
+
1
.
0
)
/
1024
.
0
*
M_PI
);
r1
=
sin
((
i
*
4
.
0
+
1
.
0
)
/
1024
.
0
*
M_PI
);
r2
=
cos
((
i
*
4
.
0
+
1
.
0
)
/
1024
.
0
*
M_PI
);
r2
=
cos
((
i
*
4
.
0
+
1
.
0
)
/
1024
.
0
*
M_PI
);
if
(
i
&
0x1
)
if
(
i
&
0x1
)
{
{
q
->
pre_coef1
[
i
]
=
(
r1
+
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef1
[
i
]
=
(
r1
+
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef2
[
i
]
=
-
(
r1
-
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef2
[
i
]
=
-
(
r1
-
r2
)
*
sqrt
(
2
.
0
);
}
}
else
{
else
{
q
->
pre_coef1
[
i
]
=
-
(
r1
+
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef1
[
i
]
=
-
(
r1
+
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef2
[
i
]
=
(
r1
-
r2
)
*
sqrt
(
2
.
0
);
q
->
pre_coef2
[
i
]
=
(
r1
-
r2
)
*
sqrt
(
2
.
0
);
}
}
...
@@ -146,13 +144,12 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
...
@@ -146,13 +144,12 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
/* Generate a square root table */
/* Generate a square root table */
for
(
i
=
0
;
i
<
30
;
i
++
)
{
for
(
i
=
0
;
i
<
30
;
i
++
)
q
->
sqrt_tab
[
i
]
=
sqrt
(
i
);
q
->
sqrt_tab
[
i
]
=
sqrt
(
i
);
}
/* initialize the VLC tables */
/* initialize the VLC tables */
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
huffman_vlc
[
i
][
j
].
table
=
&
vlc_tables
[
vlc_offsets
[
i
*
4
+
j
]];
huffman_vlc
[
i
][
j
].
table
=
&
vlc_tables
[
vlc_offsets
[
i
*
4
+
j
]];
huffman_vlc
[
i
][
j
].
table_allocated
=
vlc_offsets
[
i
*
4
+
j
+
1
]
-
vlc_offsets
[
i
*
4
+
j
];
huffman_vlc
[
i
][
j
].
table_allocated
=
vlc_offsets
[
i
*
4
+
j
+
1
]
-
vlc_offsets
[
i
*
4
+
j
];
init_vlc
(
&
huffman_vlc
[
i
][
j
],
9
,
imc_huffman_sizes
[
i
],
init_vlc
(
&
huffman_vlc
[
i
][
j
],
9
,
imc_huffman_sizes
[
i
],
...
@@ -160,7 +157,7 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
...
@@ -160,7 +157,7 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
imc_huffman_bits
[
i
][
j
],
2
,
2
,
INIT_VLC_USE_NEW_STATIC
);
imc_huffman_bits
[
i
][
j
],
2
,
2
,
INIT_VLC_USE_NEW_STATIC
);
}
}
}
}
q
->
one_div_log2
=
1
/
log
(
2
);
q
->
one_div_log2
=
1
/
log
(
2
);
if
((
ret
=
ff_fft_init
(
&
q
->
fft
,
7
,
1
)))
{
if
((
ret
=
ff_fft_init
(
&
q
->
fft
,
7
,
1
)))
{
av_log
(
avctx
,
AV_LOG_INFO
,
"FFT init failed
\n
"
);
av_log
(
avctx
,
AV_LOG_INFO
,
"FFT init failed
\n
"
);
...
@@ -176,8 +173,9 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
...
@@ -176,8 +173,9 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
return
0
;
return
0
;
}
}
static
void
imc_calculate_coeffs
(
IMCContext
*
q
,
float
*
flcoeffs1
,
float
*
flcoeffs2
,
int
*
bandWidthT
,
static
void
imc_calculate_coeffs
(
IMCContext
*
q
,
float
*
flcoeffs1
,
float
*
flcoeffs3
,
float
*
flcoeffs5
)
float
*
flcoeffs2
,
int
*
bandWidthT
,
float
*
flcoeffs3
,
float
*
flcoeffs5
)
{
{
float
workT1
[
BANDS
];
float
workT1
[
BANDS
];
float
workT2
[
BANDS
];
float
workT2
[
BANDS
];
...
@@ -186,9 +184,9 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
...
@@ -186,9 +184,9 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
float
accum
=
0
.
0
;
float
accum
=
0
.
0
;
int
i
,
cnt2
;
int
i
,
cnt2
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
flcoeffs5
[
i
]
=
workT2
[
i
]
=
0
.
0
;
flcoeffs5
[
i
]
=
workT2
[
i
]
=
0
.
0
;
if
(
bandWidthT
[
i
]){
if
(
bandWidthT
[
i
])
{
workT1
[
i
]
=
flcoeffs1
[
i
]
*
flcoeffs1
[
i
];
workT1
[
i
]
=
flcoeffs1
[
i
]
*
flcoeffs1
[
i
];
flcoeffs3
[
i
]
=
2
.
0
*
flcoeffs2
[
i
];
flcoeffs3
[
i
]
=
2
.
0
*
flcoeffs2
[
i
];
}
else
{
}
else
{
...
@@ -200,37 +198,38 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
...
@@ -200,37 +198,38 @@ static void imc_calculate_coeffs(IMCContext* q, float* flcoeffs1, float* flcoeff
workT3
[
i
]
=
0
.
0
;
workT3
[
i
]
=
0
.
0
;
}
}
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
cnt2
=
i
;
cnt2
<
cyclTab
[
i
];
cnt2
++
)
for
(
cnt2
=
i
;
cnt2
<
cyclTab
[
i
];
cnt2
++
)
flcoeffs5
[
cnt2
]
=
flcoeffs5
[
cnt2
]
+
workT3
[
i
];
flcoeffs5
[
cnt2
]
=
flcoeffs5
[
cnt2
]
+
workT3
[
i
];
workT2
[
cnt2
-
1
]
=
workT2
[
cnt2
-
1
]
+
workT3
[
i
];
workT2
[
cnt2
-
1
]
=
workT2
[
cnt2
-
1
]
+
workT3
[
i
];
}
}
for
(
i
=
1
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
1
;
i
<
BANDS
;
i
++
)
{
accum
=
(
workT2
[
i
-
1
]
+
accum
)
*
imc_weights1
[
i
-
1
];
accum
=
(
workT2
[
i
-
1
]
+
accum
)
*
imc_weights1
[
i
-
1
];
flcoeffs5
[
i
]
+=
accum
;
flcoeffs5
[
i
]
+=
accum
;
}
}
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
workT2
[
i
]
=
0
.
0
;
workT2
[
i
]
=
0
.
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
cnt2
=
i
-
1
;
cnt2
>
cyclTab2
[
i
];
cnt2
--
)
for
(
cnt2
=
i
-
1
;
cnt2
>
cyclTab2
[
i
];
cnt2
--
)
flcoeffs5
[
cnt2
]
+=
workT3
[
i
];
flcoeffs5
[
cnt2
]
+=
workT3
[
i
];
workT2
[
cnt2
+
1
]
+=
workT3
[
i
];
workT2
[
cnt2
+
1
]
+=
workT3
[
i
];
}
}
accum
=
0
.
0
;
accum
=
0
.
0
;
for
(
i
=
BANDS
-
2
;
i
>=
0
;
i
--
)
{
for
(
i
=
BANDS
-
2
;
i
>=
0
;
i
--
)
{
accum
=
(
workT2
[
i
+
1
]
+
accum
)
*
imc_weights2
[
i
];
accum
=
(
workT2
[
i
+
1
]
+
accum
)
*
imc_weights2
[
i
];
flcoeffs5
[
i
]
+=
accum
;
flcoeffs5
[
i
]
+=
accum
;
//there is missing code here, but it seems to never be triggered
//
there is missing code here, but it seems to never be triggered
}
}
}
}
static
void
imc_read_level_coeffs
(
IMCContext
*
q
,
int
stream_format_code
,
int
*
levlCoeffs
)
static
void
imc_read_level_coeffs
(
IMCContext
*
q
,
int
stream_format_code
,
int
*
levlCoeffs
)
{
{
int
i
;
int
i
;
VLC
*
hufftab
[
4
];
VLC
*
hufftab
[
4
];
...
@@ -245,41 +244,42 @@ static void imc_read_level_coeffs(IMCContext* q, int stream_format_code, int* le
...
@@ -245,41 +244,42 @@ static void imc_read_level_coeffs(IMCContext* q, int stream_format_code, int* le
hufftab
[
3
]
=
&
huffman_vlc
[
s
][
3
];
hufftab
[
3
]
=
&
huffman_vlc
[
s
][
3
];
cb_sel
=
imc_cb_select
[
s
];
cb_sel
=
imc_cb_select
[
s
];
if
(
stream_format_code
&
4
)
if
(
stream_format_code
&
4
)
start
=
1
;
start
=
1
;
if
(
start
)
if
(
start
)
levlCoeffs
[
0
]
=
get_bits
(
&
q
->
gb
,
7
);
levlCoeffs
[
0
]
=
get_bits
(
&
q
->
gb
,
7
);
for
(
i
=
start
;
i
<
BANDS
;
i
++
){
for
(
i
=
start
;
i
<
BANDS
;
i
++
)
{
levlCoeffs
[
i
]
=
get_vlc2
(
&
q
->
gb
,
hufftab
[
cb_sel
[
i
]]
->
table
,
hufftab
[
cb_sel
[
i
]]
->
bits
,
2
);
levlCoeffs
[
i
]
=
get_vlc2
(
&
q
->
gb
,
hufftab
[
cb_sel
[
i
]]
->
table
,
if
(
levlCoeffs
[
i
]
==
17
)
hufftab
[
cb_sel
[
i
]]
->
bits
,
2
);
if
(
levlCoeffs
[
i
]
==
17
)
levlCoeffs
[
i
]
+=
get_bits
(
&
q
->
gb
,
4
);
levlCoeffs
[
i
]
+=
get_bits
(
&
q
->
gb
,
4
);
}
}
}
}
static
void
imc_decode_level_coefficients
(
IMCContext
*
q
,
int
*
levlCoeffBuf
,
float
*
flcoeffs1
,
static
void
imc_decode_level_coefficients
(
IMCContext
*
q
,
int
*
levlCoeffBuf
,
float
*
flcoeffs2
)
float
*
flcoeffs1
,
float
*
flcoeffs2
)
{
{
int
i
,
level
;
int
i
,
level
;
float
tmp
,
tmp2
;
float
tmp
,
tmp2
;
//maybe some frequency division thingy
//
maybe some frequency division thingy
flcoeffs1
[
0
]
=
20000
.
0
/
pow
(
2
,
levlCoeffBuf
[
0
]
*
0
.
18945
);
// 0.18945 = log2(10) * 0.05703125
flcoeffs1
[
0
]
=
20000
.
0
/
pow
(
2
,
levlCoeffBuf
[
0
]
*
0
.
18945
);
// 0.18945 = log2(10) * 0.05703125
flcoeffs2
[
0
]
=
log
(
flcoeffs1
[
0
])
/
log
(
2
);
flcoeffs2
[
0
]
=
log
(
flcoeffs1
[
0
])
/
log
(
2
);
tmp
=
flcoeffs1
[
0
];
tmp
=
flcoeffs1
[
0
];
tmp2
=
flcoeffs2
[
0
];
tmp2
=
flcoeffs2
[
0
];
for
(
i
=
1
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
1
;
i
<
BANDS
;
i
++
)
{
level
=
levlCoeffBuf
[
i
];
level
=
levlCoeffBuf
[
i
];
if
(
level
==
16
)
{
if
(
level
==
16
)
{
flcoeffs1
[
i
]
=
1
.
0
;
flcoeffs1
[
i
]
=
1
.
0
;
flcoeffs2
[
i
]
=
0
.
0
;
flcoeffs2
[
i
]
=
0
.
0
;
}
else
{
}
else
{
if
(
level
<
17
)
if
(
level
<
17
)
level
-=
7
;
level
-=
7
;
else
if
(
level
<=
24
)
else
if
(
level
<=
24
)
level
-=
32
;
level
-=
32
;
else
else
level
-=
16
;
level
-=
16
;
tmp
*=
imc_exp_tab
[
15
+
level
];
tmp
*=
imc_exp_tab
[
15
+
level
];
tmp2
+=
0
.
83048
*
level
;
// 0.83048 = log2(10) * 0.25
tmp2
+=
0
.
83048
*
level
;
// 0.83048 = log2(10) * 0.25
...
@@ -290,17 +290,20 @@ static void imc_decode_level_coefficients(IMCContext* q, int* levlCoeffBuf, floa
...
@@ -290,17 +290,20 @@ static void imc_decode_level_coefficients(IMCContext* q, int* levlCoeffBuf, floa
}
}
static
void
imc_decode_level_coefficients2
(
IMCContext
*
q
,
int
*
levlCoeffBuf
,
float
*
old_floor
,
float
*
flcoeffs1
,
static
void
imc_decode_level_coefficients2
(
IMCContext
*
q
,
int
*
levlCoeffBuf
,
float
*
flcoeffs2
)
{
float
*
old_floor
,
float
*
flcoeffs1
,
float
*
flcoeffs2
)
{
int
i
;
int
i
;
//FIXME maybe flag_buf = noise coding and flcoeffs1 = new scale factors
/* FIXME maybe flag_buf = noise coding and flcoeffs1 = new scale factors
// and flcoeffs2 old scale factors
* and flcoeffs2 old scale factors
// might be incomplete due to a missing table that is in the binary code
* might be incomplete due to a missing table that is in the binary code
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
*/
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
flcoeffs1
[
i
]
=
0
;
flcoeffs1
[
i
]
=
0
;
if
(
levlCoeffBuf
[
i
]
<
16
)
{
if
(
levlCoeffBuf
[
i
]
<
16
)
{
flcoeffs1
[
i
]
=
imc_exp_tab2
[
levlCoeffBuf
[
i
]]
*
old_floor
[
i
];
flcoeffs1
[
i
]
=
imc_exp_tab2
[
levlCoeffBuf
[
i
]]
*
old_floor
[
i
];
flcoeffs2
[
i
]
=
(
levlCoeffBuf
[
i
]
-
7
)
*
0
.
83048
+
flcoeffs2
[
i
];
// 0.83048 = log2(10) * 0.25
flcoeffs2
[
i
]
=
(
levlCoeffBuf
[
i
]
-
7
)
*
0
.
83048
+
flcoeffs2
[
i
];
// 0.83048 = log2(10) * 0.25
}
else
{
}
else
{
flcoeffs1
[
i
]
=
old_floor
[
i
];
flcoeffs1
[
i
]
=
old_floor
[
i
];
}
}
...
@@ -310,7 +313,9 @@ static void imc_decode_level_coefficients2(IMCContext* q, int* levlCoeffBuf, flo
...
@@ -310,7 +313,9 @@ static void imc_decode_level_coefficients2(IMCContext* q, int* levlCoeffBuf, flo
/**
/**
* Perform bit allocation depending on bits available
* Perform bit allocation depending on bits available
*/
*/
static
int
bit_allocation
(
IMCContext
*
q
,
int
stream_format_code
,
int
freebits
,
int
flag
)
{
static
int
bit_allocation
(
IMCContext
*
q
,
int
stream_format_code
,
int
freebits
,
int
flag
)
{
int
i
,
j
;
int
i
,
j
;
const
float
limit
=
-
1.e20
;
const
float
limit
=
-
1.e20
;
float
highest
=
0
.
0
;
float
highest
=
0
.
0
;
...
@@ -327,31 +332,30 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -327,31 +332,30 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
int
flg
;
int
flg
;
int
found_indx
=
0
;
int
found_indx
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
highest
=
FFMAX
(
highest
,
q
->
flcoeffs1
[
i
]);
highest
=
FFMAX
(
highest
,
q
->
flcoeffs1
[
i
]);
for
(
i
=
0
;
i
<
BANDS
-
1
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
-
1
;
i
++
)
q
->
flcoeffs4
[
i
]
=
q
->
flcoeffs3
[
i
]
-
log
(
q
->
flcoeffs5
[
i
])
/
log
(
2
);
q
->
flcoeffs4
[
i
]
=
q
->
flcoeffs3
[
i
]
-
log
(
q
->
flcoeffs5
[
i
])
/
log
(
2
);
}
q
->
flcoeffs4
[
BANDS
-
1
]
=
limit
;
q
->
flcoeffs4
[
BANDS
-
1
]
=
limit
;
highest
=
highest
*
0
.
25
;
highest
=
highest
*
0
.
25
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
indx
=
-
1
;
indx
=
-
1
;
if
((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
==
q
->
bandWidthT
[
i
])
if
((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
==
q
->
bandWidthT
[
i
])
indx
=
0
;
indx
=
0
;
if
((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
>
q
->
bandWidthT
[
i
])
if
((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
>
q
->
bandWidthT
[
i
])
indx
=
1
;
indx
=
1
;
if
(((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
/
2
)
>=
q
->
bandWidthT
[
i
])
if
(((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
/
2
)
>=
q
->
bandWidthT
[
i
])
indx
=
2
;
indx
=
2
;
if
(
indx
==
-
1
)
if
(
indx
==
-
1
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
q
->
flcoeffs4
[
i
]
=
q
->
flcoeffs4
[
i
]
+
xTab
[(
indx
*
2
+
(
q
->
flcoeffs1
[
i
]
<
highest
))
*
2
+
flag
];
q
->
flcoeffs4
[
i
]
+=
xTab
[(
indx
*
2
+
(
q
->
flcoeffs1
[
i
]
<
highest
))
*
2
+
flag
];
}
}
if
(
stream_format_code
&
0x2
)
{
if
(
stream_format_code
&
0x2
)
{
...
@@ -361,22 +365,23 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -361,22 +365,23 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
q
->
flcoeffs4
[
3
]
=
limit
;
q
->
flcoeffs4
[
3
]
=
limit
;
}
}
for
(
i
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
i
<
BANDS
-
1
;
i
++
)
{
for
(
i
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
i
<
BANDS
-
1
;
i
++
)
{
iacc
+=
q
->
bandWidthT
[
i
];
iacc
+=
q
->
bandWidthT
[
i
];
summa
+=
q
->
bandWidthT
[
i
]
*
q
->
flcoeffs4
[
i
];
summa
+=
q
->
bandWidthT
[
i
]
*
q
->
flcoeffs4
[
i
];
}
}
q
->
bandWidthT
[
BANDS
-
1
]
=
0
;
q
->
bandWidthT
[
BANDS
-
1
]
=
0
;
summa
=
(
summa
*
0
.
5
-
freebits
)
/
iacc
;
summa
=
(
summa
*
0
.
5
-
freebits
)
/
iacc
;
for
(
i
=
0
;
i
<
BANDS
/
2
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
/
2
;
i
++
)
{
rres
=
summer
-
freebits
;
rres
=
summer
-
freebits
;
if
((
rres
>=
-
8
)
&&
(
rres
<=
8
))
break
;
if
((
rres
>=
-
8
)
&&
(
rres
<=
8
))
break
;
summer
=
0
;
summer
=
0
;
iacc
=
0
;
iacc
=
0
;
for
(
j
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
j
<
BANDS
;
j
++
)
{
for
(
j
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
j
<
BANDS
;
j
++
)
{
cwlen
=
av_clipf
(((
q
->
flcoeffs4
[
j
]
*
0
.
5
)
-
summa
+
0
.
5
),
0
,
6
);
cwlen
=
av_clipf
(((
q
->
flcoeffs4
[
j
]
*
0
.
5
)
-
summa
+
0
.
5
),
0
,
6
);
q
->
bitsBandT
[
j
]
=
cwlen
;
q
->
bitsBandT
[
j
]
=
cwlen
;
...
@@ -392,32 +397,33 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -392,32 +397,33 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
t2
=
-
1
;
t2
=
-
1
;
if
(
i
==
0
)
if
(
i
==
0
)
flg
=
t2
;
flg
=
t2
;
if
(
flg
!=
t2
)
if
(
flg
!=
t2
)
t1
++
;
t1
++
;
summa
=
(
float
)(
summer
-
freebits
)
/
((
t1
+
1
)
*
iacc
)
+
summa
;
summa
=
(
float
)(
summer
-
freebits
)
/
((
t1
+
1
)
*
iacc
)
+
summa
;
}
}
for
(
i
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
(
stream_format_code
&
0x2
)
?
4
:
0
;
i
<
BANDS
;
i
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
q
->
CWlengthT
[
j
]
=
q
->
bitsBandT
[
i
];
q
->
CWlengthT
[
j
]
=
q
->
bitsBandT
[
i
];
}
}
if
(
freebits
>
summer
)
{
if
(
freebits
>
summer
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
workT
[
i
]
=
(
q
->
bitsBandT
[
i
]
==
6
)
?
-
1.e20
:
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
-
0
.
415
);
workT
[
i
]
=
(
q
->
bitsBandT
[
i
]
==
6
)
?
-
1.e20
:
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
-
0
.
415
);
}
}
highest
=
0
.
0
;
highest
=
0
.
0
;
do
{
do
{
if
(
highest
<=
-
1.e20
)
if
(
highest
<=
-
1.e20
)
break
;
break
;
found_indx
=
0
;
found_indx
=
0
;
highest
=
-
1.e20
;
highest
=
-
1.e20
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
workT
[
i
]
>
highest
)
{
if
(
workT
[
i
]
>
highest
)
{
highest
=
workT
[
i
];
highest
=
workT
[
i
];
found_indx
=
i
;
found_indx
=
i
;
...
@@ -426,19 +432,20 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -426,19 +432,20 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
if
(
highest
>
-
1.e20
)
{
if
(
highest
>
-
1.e20
)
{
workT
[
found_indx
]
-=
2
.
0
;
workT
[
found_indx
]
-=
2
.
0
;
if
(
++
(
q
->
bitsBandT
[
found_indx
])
==
6
)
if
(
++
q
->
bitsBandT
[
found_indx
]
==
6
)
workT
[
found_indx
]
=
-
1.e20
;
workT
[
found_indx
]
=
-
1.e20
;
for
(
j
=
band_tab
[
found_indx
];
j
<
band_tab
[
found_indx
+
1
]
&&
(
freebits
>
summer
);
j
++
)
{
for
(
j
=
band_tab
[
found_indx
];
j
<
band_tab
[
found_indx
+
1
]
&&
(
freebits
>
summer
);
j
++
)
{
q
->
CWlengthT
[
j
]
++
;
q
->
CWlengthT
[
j
]
++
;
summer
++
;
summer
++
;
}
}
}
}
}
while
(
freebits
>
summer
);
}
while
(
freebits
>
summer
);
}
}
if
(
freebits
<
summer
)
{
if
(
freebits
<
summer
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
workT
[
i
]
=
q
->
bitsBandT
[
i
]
?
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
+
1
.
585
)
:
1.e20
;
workT
[
i
]
=
q
->
bitsBandT
[
i
]
?
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
+
1
.
585
)
:
1.e20
;
}
}
if
(
stream_format_code
&
0x2
)
{
if
(
stream_format_code
&
0x2
)
{
workT
[
0
]
=
1.e20
;
workT
[
0
]
=
1.e20
;
...
@@ -446,23 +453,24 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -446,23 +453,24 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
workT
[
2
]
=
1.e20
;
workT
[
2
]
=
1.e20
;
workT
[
3
]
=
1.e20
;
workT
[
3
]
=
1.e20
;
}
}
while
(
freebits
<
summer
){
while
(
freebits
<
summer
)
{
lowest
=
1.e10
;
lowest
=
1.e10
;
low_indx
=
0
;
low_indx
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
workT
[
i
]
<
lowest
)
{
if
(
workT
[
i
]
<
lowest
)
{
lowest
=
workT
[
i
];
lowest
=
workT
[
i
];
low_indx
=
i
;
low_indx
=
i
;
}
}
}
}
//if(lowest >= 1.e10) break;
// if (lowest >= 1.e10)
// break;
workT
[
low_indx
]
=
lowest
+
2
.
0
;
workT
[
low_indx
]
=
lowest
+
2
.
0
;
if
(
!
(
--
q
->
bitsBandT
[
low_indx
])
)
if
(
!
--
q
->
bitsBandT
[
low_indx
]
)
workT
[
low_indx
]
=
1.e20
;
workT
[
low_indx
]
=
1.e20
;
for
(
j
=
band_tab
[
low_indx
];
j
<
band_tab
[
low_indx
+
1
]
&&
(
freebits
<
summer
);
j
++
)
{
for
(
j
=
band_tab
[
low_indx
];
j
<
band_tab
[
low_indx
+
1
]
&&
(
freebits
<
summer
);
j
++
)
{
if
(
q
->
CWlengthT
[
j
]
>
0
)
{
if
(
q
->
CWlengthT
[
j
]
>
0
)
{
q
->
CWlengthT
[
j
]
--
;
q
->
CWlengthT
[
j
]
--
;
summer
--
;
summer
--
;
}
}
...
@@ -472,49 +480,51 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
...
@@ -472,49 +480,51 @@ static int bit_allocation (IMCContext* q, int stream_format_code, int freebits,
return
0
;
return
0
;
}
}
static
void
imc_get_skip_coeff
(
IMCContext
*
q
)
{
static
void
imc_get_skip_coeff
(
IMCContext
*
q
)
{
int
i
,
j
;
int
i
,
j
;
memset
(
q
->
skipFlagBits
,
0
,
sizeof
(
q
->
skipFlagBits
));
memset
(
q
->
skipFlagBits
,
0
,
sizeof
(
q
->
skipFlagBits
));
memset
(
q
->
skipFlagCount
,
0
,
sizeof
(
q
->
skipFlagCount
));
memset
(
q
->
skipFlagCount
,
0
,
sizeof
(
q
->
skipFlagCount
));
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
!
q
->
bandFlagsBuf
[
i
]
||
!
q
->
bandWidthT
[
i
])
if
(
!
q
->
bandFlagsBuf
[
i
]
||
!
q
->
bandWidthT
[
i
])
continue
;
continue
;
if
(
!
q
->
skipFlagRaw
[
i
])
{
if
(
!
q
->
skipFlagRaw
[
i
])
{
q
->
skipFlagBits
[
i
]
=
band_tab
[
i
+
1
]
-
band_tab
[
i
];
q
->
skipFlagBits
[
i
]
=
band_tab
[
i
+
1
]
-
band_tab
[
i
];
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
if
((
q
->
skipFlags
[
j
]
=
get_bits1
(
&
q
->
gb
)))
q
->
skipFlags
[
j
]
=
get_bits1
(
&
q
->
gb
);
if
(
q
->
skipFlags
[
j
])
q
->
skipFlagCount
[
i
]
++
;
q
->
skipFlagCount
[
i
]
++
;
}
}
}
else
{
}
else
{
for
(
j
=
band_tab
[
i
];
j
<
(
band_tab
[
i
+
1
]
-
1
)
;
j
+=
2
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
]
-
1
;
j
+=
2
)
{
if
(
!
get_bits1
(
&
q
->
gb
)){
//
0
if
(
!
get_bits1
(
&
q
->
gb
))
{
//
0
q
->
skipFlagBits
[
i
]
++
;
q
->
skipFlagBits
[
i
]
++
;
q
->
skipFlags
[
j
]
=
1
;
q
->
skipFlags
[
j
]
=
1
;
q
->
skipFlags
[
j
+
1
]
=
1
;
q
->
skipFlags
[
j
+
1
]
=
1
;
q
->
skipFlagCount
[
i
]
+=
2
;
q
->
skipFlagCount
[
i
]
+=
2
;
}
else
{
}
else
{
if
(
get_bits1
(
&
q
->
gb
)){
//
11
if
(
get_bits1
(
&
q
->
gb
))
{
//
11
q
->
skipFlagBits
[
i
]
+=
2
;
q
->
skipFlagBits
[
i
]
+=
2
;
q
->
skipFlags
[
j
]
=
0
;
q
->
skipFlags
[
j
]
=
0
;
q
->
skipFlags
[
j
+
1
]
=
1
;
q
->
skipFlags
[
j
+
1
]
=
1
;
q
->
skipFlagCount
[
i
]
++
;
q
->
skipFlagCount
[
i
]
++
;
}
else
{
}
else
{
q
->
skipFlagBits
[
i
]
+=
3
;
q
->
skipFlagBits
[
i
]
+=
3
;
q
->
skipFlags
[
j
+
1
]
=
0
;
q
->
skipFlags
[
j
+
1
]
=
0
;
if
(
!
get_bits1
(
&
q
->
gb
)){
//
100
if
(
!
get_bits1
(
&
q
->
gb
))
{
//
100
q
->
skipFlags
[
j
]
=
1
;
q
->
skipFlags
[
j
]
=
1
;
q
->
skipFlagCount
[
i
]
++
;
q
->
skipFlagCount
[
i
]
++
;
}
else
{
//
101
}
else
{
//
101
q
->
skipFlags
[
j
]
=
0
;
q
->
skipFlags
[
j
]
=
0
;
}
}
}
}
}
}
}
}
if
(
j
<
band_tab
[
i
+
1
])
{
if
(
j
<
band_tab
[
i
+
1
])
{
q
->
skipFlagBits
[
i
]
++
;
q
->
skipFlagBits
[
i
]
++
;
if
((
q
->
skipFlags
[
j
]
=
get_bits1
(
&
q
->
gb
)))
if
((
q
->
skipFlags
[
j
]
=
get_bits1
(
&
q
->
gb
)))
q
->
skipFlagCount
[
i
]
++
;
q
->
skipFlagCount
[
i
]
++
;
...
@@ -526,24 +536,26 @@ static void imc_get_skip_coeff(IMCContext* q) {
...
@@ -526,24 +536,26 @@ static void imc_get_skip_coeff(IMCContext* q) {
/**
/**
* Increase highest' band coefficient sizes as some bits won't be used
* Increase highest' band coefficient sizes as some bits won't be used
*/
*/
static
void
imc_adjust_bit_allocation
(
IMCContext
*
q
,
int
summer
)
{
static
void
imc_adjust_bit_allocation
(
IMCContext
*
q
,
int
summer
)
{
float
workT
[
32
];
float
workT
[
32
];
int
corrected
=
0
;
int
corrected
=
0
;
int
i
,
j
;
int
i
,
j
;
float
highest
=
0
;
float
highest
=
0
;
int
found_indx
=
0
;
int
found_indx
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
workT
[
i
]
=
(
q
->
bitsBandT
[
i
]
==
6
)
?
-
1.e20
:
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
-
0
.
415
);
workT
[
i
]
=
(
q
->
bitsBandT
[
i
]
==
6
)
?
-
1.e20
:
(
q
->
bitsBandT
[
i
]
*
-
2
+
q
->
flcoeffs4
[
i
]
-
0
.
415
);
}
}
while
(
corrected
<
summer
)
{
while
(
corrected
<
summer
)
{
if
(
highest
<=
-
1.e20
)
if
(
highest
<=
-
1.e20
)
break
;
break
;
highest
=
-
1.e20
;
highest
=
-
1.e20
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
workT
[
i
]
>
highest
)
{
if
(
workT
[
i
]
>
highest
)
{
highest
=
workT
[
i
];
highest
=
workT
[
i
];
found_indx
=
i
;
found_indx
=
i
;
...
@@ -555,7 +567,7 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
...
@@ -555,7 +567,7 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
if
(
++
(
q
->
bitsBandT
[
found_indx
])
==
6
)
if
(
++
(
q
->
bitsBandT
[
found_indx
])
==
6
)
workT
[
found_indx
]
=
-
1.e20
;
workT
[
found_indx
]
=
-
1.e20
;
for
(
j
=
band_tab
[
found_indx
];
j
<
band_tab
[
found_indx
+
1
]
&&
(
corrected
<
summer
);
j
++
)
{
for
(
j
=
band_tab
[
found_indx
];
j
<
band_tab
[
found_indx
+
1
]
&&
(
corrected
<
summer
);
j
++
)
{
if
(
!
q
->
skipFlags
[
j
]
&&
(
q
->
CWlengthT
[
j
]
<
6
))
{
if
(
!
q
->
skipFlags
[
j
]
&&
(
q
->
CWlengthT
[
j
]
<
6
))
{
q
->
CWlengthT
[
j
]
++
;
q
->
CWlengthT
[
j
]
++
;
corrected
++
;
corrected
++
;
...
@@ -565,39 +577,43 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
...
@@ -565,39 +577,43 @@ static void imc_adjust_bit_allocation (IMCContext* q, int summer) {
}
}
}
}
static
void
imc_imdct256
(
IMCContext
*
q
)
{
static
void
imc_imdct256
(
IMCContext
*
q
)
{
int
i
;
int
i
;
float
re
,
im
;
float
re
,
im
;
/* prerotation */
/* prerotation */
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
)
{
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
)
{
q
->
samples
[
i
].
re
=
-
(
q
->
pre_coef1
[
i
]
*
q
->
CWdecoded
[
COEFFS
-
1
-
i
*
2
])
-
q
->
samples
[
i
].
re
=
-
(
q
->
pre_coef1
[
i
]
*
q
->
CWdecoded
[
COEFFS
-
1
-
i
*
2
])
-
(
q
->
pre_coef2
[
i
]
*
q
->
CWdecoded
[
i
*
2
]);
(
q
->
pre_coef2
[
i
]
*
q
->
CWdecoded
[
i
*
2
]);
q
->
samples
[
i
].
im
=
(
q
->
pre_coef2
[
i
]
*
q
->
CWdecoded
[
COEFFS
-
1
-
i
*
2
])
-
q
->
samples
[
i
].
im
=
(
q
->
pre_coef2
[
i
]
*
q
->
CWdecoded
[
COEFFS
-
1
-
i
*
2
])
-
(
q
->
pre_coef1
[
i
]
*
q
->
CWdecoded
[
i
*
2
]);
(
q
->
pre_coef1
[
i
]
*
q
->
CWdecoded
[
i
*
2
]);
}
}
/* FFT */
/* FFT */
q
->
fft
.
fft_permute
(
&
q
->
fft
,
q
->
samples
);
q
->
fft
.
fft_permute
(
&
q
->
fft
,
q
->
samples
);
q
->
fft
.
fft_calc
(
&
q
->
fft
,
q
->
samples
);
q
->
fft
.
fft_calc
(
&
q
->
fft
,
q
->
samples
);
/* postrotation, window and reorder */
/* postrotation, window and reorder */
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
){
for
(
i
=
0
;
i
<
COEFFS
/
2
;
i
++
)
{
re
=
(
q
->
samples
[
i
].
re
*
q
->
post_cos
[
i
])
+
(
-
q
->
samples
[
i
].
im
*
q
->
post_sin
[
i
]);
re
=
(
q
->
samples
[
i
].
re
*
q
->
post_cos
[
i
])
+
(
-
q
->
samples
[
i
].
im
*
q
->
post_sin
[
i
]);
im
=
(
-
q
->
samples
[
i
].
im
*
q
->
post_cos
[
i
])
-
(
q
->
samples
[
i
].
re
*
q
->
post_sin
[
i
]);
im
=
(
-
q
->
samples
[
i
].
im
*
q
->
post_cos
[
i
])
-
(
q
->
samples
[
i
].
re
*
q
->
post_sin
[
i
]);
q
->
out_samples
[
i
*
2
]
=
(
q
->
mdct_sine_window
[
COEFFS
-
1
-
i
*
2
]
*
q
->
last_fft_im
[
i
])
+
(
q
->
mdct_sine_window
[
i
*
2
]
*
re
);
q
->
out_samples
[
i
*
2
]
=
(
q
->
mdct_sine_window
[
COEFFS
-
1
-
i
*
2
]
*
q
->
last_fft_im
[
i
])
q
->
out_samples
[
COEFFS
-
1
-
i
*
2
]
=
(
q
->
mdct_sine_window
[
i
*
2
]
*
q
->
last_fft_im
[
i
])
-
(
q
->
mdct_sine_window
[
COEFFS
-
1
-
i
*
2
]
*
re
);
+
(
q
->
mdct_sine_window
[
i
*
2
]
*
re
);
q
->
out_samples
[
COEFFS
-
1
-
i
*
2
]
=
(
q
->
mdct_sine_window
[
i
*
2
]
*
q
->
last_fft_im
[
i
])
-
(
q
->
mdct_sine_window
[
COEFFS
-
1
-
i
*
2
]
*
re
);
q
->
last_fft_im
[
i
]
=
im
;
q
->
last_fft_im
[
i
]
=
im
;
}
}
}
}
static
int
inverse_quant_coeff
(
IMCContext
*
q
,
int
stream_format_code
)
{
static
int
inverse_quant_coeff
(
IMCContext
*
q
,
int
stream_format_code
)
{
int
i
,
j
;
int
i
,
j
;
int
middle_value
,
cw_len
,
max_size
;
int
middle_value
,
cw_len
,
max_size
;
const
float
*
quantizer
;
const
float
*
quantizer
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
q
->
CWdecoded
[
j
]
=
0
;
q
->
CWdecoded
[
j
]
=
0
;
cw_len
=
q
->
CWlengthT
[
j
];
cw_len
=
q
->
CWlengthT
[
j
];
...
@@ -610,7 +626,7 @@ static int inverse_quant_coeff (IMCContext* q, int stream_format_code) {
...
@@ -610,7 +626,7 @@ static int inverse_quant_coeff (IMCContext* q, int stream_format_code) {
if
(
q
->
codewords
[
j
]
>=
max_size
||
q
->
codewords
[
j
]
<
0
)
if
(
q
->
codewords
[
j
]
>=
max_size
||
q
->
codewords
[
j
]
<
0
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
if
(
cw_len
>=
4
){
if
(
cw_len
>=
4
)
{
quantizer
=
imc_quantizer2
[(
stream_format_code
&
2
)
>>
1
];
quantizer
=
imc_quantizer2
[(
stream_format_code
&
2
)
>>
1
];
if
(
q
->
codewords
[
j
]
>=
middle_value
)
if
(
q
->
codewords
[
j
]
>=
middle_value
)
q
->
CWdecoded
[
j
]
=
quantizer
[
q
->
codewords
[
j
]
-
8
]
*
q
->
flcoeffs6
[
i
];
q
->
CWdecoded
[
j
]
=
quantizer
[
q
->
codewords
[
j
]
-
8
]
*
q
->
flcoeffs6
[
i
];
...
@@ -629,22 +645,24 @@ static int inverse_quant_coeff (IMCContext* q, int stream_format_code) {
...
@@ -629,22 +645,24 @@ static int inverse_quant_coeff (IMCContext* q, int stream_format_code) {
}
}
static
int
imc_get_coeffs
(
IMCContext
*
q
)
{
static
int
imc_get_coeffs
(
IMCContext
*
q
)
{
int
i
,
j
,
cw_len
,
cw
;
int
i
,
j
,
cw_len
,
cw
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
!
q
->
sumLenArr
[
i
])
continue
;
if
(
!
q
->
sumLenArr
[
i
])
continue
;
if
(
q
->
bandFlagsBuf
[
i
]
||
q
->
bandWidthT
[
i
])
{
if
(
q
->
bandFlagsBuf
[
i
]
||
q
->
bandWidthT
[
i
])
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
cw_len
=
q
->
CWlengthT
[
j
];
cw_len
=
q
->
CWlengthT
[
j
];
cw
=
0
;
cw
=
0
;
if
(
get_bits_count
(
&
q
->
gb
)
+
cw_len
>
512
){
if
(
get_bits_count
(
&
q
->
gb
)
+
cw_len
>
512
)
{
//av_log(NULL,0,"Band %i coeff %i cw_len %i\n",i,j,
cw_len);
// av_log(NULL, 0, "Band %i coeff %i cw_len %i\n", i, j,
cw_len);
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
cw_len
&&
(
!
q
->
bandFlagsBuf
[
i
]
||
!
q
->
skipFlags
[
j
]))
if
(
cw_len
&&
(
!
q
->
bandFlagsBuf
[
i
]
||
!
q
->
skipFlags
[
j
]))
cw
=
get_bits
(
&
q
->
gb
,
cw_len
);
cw
=
get_bits
(
&
q
->
gb
,
cw_len
);
q
->
codewords
[
j
]
=
cw
;
q
->
codewords
[
j
]
=
cw
;
...
@@ -654,7 +672,7 @@ static int imc_get_coeffs (IMCContext* q) {
...
@@ -654,7 +672,7 @@ static int imc_get_coeffs (IMCContext* q) {
return
0
;
return
0
;
}
}
static
int
imc_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
static
int
imc_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
{
const
uint8_t
*
buf
=
avpkt
->
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
...
@@ -680,7 +698,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -680,7 +698,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
return
ret
;
}
}
q
->
out_samples
=
(
float
*
)
q
->
frame
.
data
[
0
];
q
->
out_samples
=
(
float
*
)
q
->
frame
.
data
[
0
];
q
->
dsp
.
bswap16_buf
(
buf16
,
(
const
uint16_t
*
)
buf
,
IMC_BLOCK_SIZE
/
2
);
q
->
dsp
.
bswap16_buf
(
buf16
,
(
const
uint16_t
*
)
buf
,
IMC_BLOCK_SIZE
/
2
);
...
@@ -695,7 +713,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -695,7 +713,7 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
}
}
stream_format_code
=
get_bits
(
&
q
->
gb
,
3
);
stream_format_code
=
get_bits
(
&
q
->
gb
,
3
);
if
(
stream_format_code
&
1
)
{
if
(
stream_format_code
&
1
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Stream code format %X is not supported
\n
"
,
stream_format_code
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Stream code format %X is not supported
\n
"
,
stream_format_code
);
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
...
@@ -705,10 +723,12 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -705,10 +723,12 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
if
(
stream_format_code
&
0x04
)
if
(
stream_format_code
&
0x04
)
q
->
decoder_reset
=
1
;
q
->
decoder_reset
=
1
;
if
(
q
->
decoder_reset
)
{
if
(
q
->
decoder_reset
)
{
memset
(
q
->
out_samples
,
0
,
sizeof
(
q
->
out_samples
));
memset
(
q
->
out_samples
,
0
,
sizeof
(
q
->
out_samples
));
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
q
->
old_floor
[
i
]
=
1
.
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
for
(
i
=
0
;
i
<
COEFFS
;
i
++
)
q
->
CWdecoded
[
i
]
=
0
;
q
->
old_floor
[
i
]
=
1
.
0
;
for
(
i
=
0
;
i
<
COEFFS
;
i
++
)
q
->
CWdecoded
[
i
]
=
0
;
q
->
decoder_reset
=
0
;
q
->
decoder_reset
=
0
;
}
}
...
@@ -716,22 +736,24 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -716,22 +736,24 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
imc_read_level_coeffs
(
q
,
stream_format_code
,
q
->
levlCoeffBuf
);
imc_read_level_coeffs
(
q
,
stream_format_code
,
q
->
levlCoeffBuf
);
if
(
stream_format_code
&
0x4
)
if
(
stream_format_code
&
0x4
)
imc_decode_level_coefficients
(
q
,
q
->
levlCoeffBuf
,
q
->
flcoeffs1
,
q
->
flcoeffs2
);
imc_decode_level_coefficients
(
q
,
q
->
levlCoeffBuf
,
q
->
flcoeffs1
,
q
->
flcoeffs2
);
else
else
imc_decode_level_coefficients2
(
q
,
q
->
levlCoeffBuf
,
q
->
old_floor
,
q
->
flcoeffs1
,
q
->
flcoeffs2
);
imc_decode_level_coefficients2
(
q
,
q
->
levlCoeffBuf
,
q
->
old_floor
,
q
->
flcoeffs1
,
q
->
flcoeffs2
);
memcpy
(
q
->
old_floor
,
q
->
flcoeffs1
,
32
*
sizeof
(
float
));
memcpy
(
q
->
old_floor
,
q
->
flcoeffs1
,
32
*
sizeof
(
float
));
counter
=
0
;
counter
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
q
->
levlCoeffBuf
[
i
]
==
16
)
{
if
(
q
->
levlCoeffBuf
[
i
]
==
16
)
{
q
->
bandWidthT
[
i
]
=
0
;
q
->
bandWidthT
[
i
]
=
0
;
counter
++
;
counter
++
;
}
else
}
else
q
->
bandWidthT
[
i
]
=
band_tab
[
i
+
1
]
-
band_tab
[
i
];
q
->
bandWidthT
[
i
]
=
band_tab
[
i
+
1
]
-
band_tab
[
i
];
}
}
memset
(
q
->
bandFlagsBuf
,
0
,
BANDS
*
sizeof
(
int
));
memset
(
q
->
bandFlagsBuf
,
0
,
BANDS
*
sizeof
(
int
));
for
(
i
=
0
;
i
<
BANDS
-
1
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
-
1
;
i
++
)
{
if
(
q
->
bandWidthT
[
i
])
if
(
q
->
bandWidthT
[
i
])
q
->
bandFlagsBuf
[
i
]
=
get_bits1
(
&
q
->
gb
);
q
->
bandFlagsBuf
[
i
]
=
get_bits1
(
&
q
->
gb
);
}
}
...
@@ -747,51 +769,52 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -747,51 +769,52 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
q
->
CWlengthT
[
0
]
=
5
;
q
->
CWlengthT
[
0
]
=
5
;
q
->
CWlengthT
[
1
]
=
5
;
q
->
CWlengthT
[
1
]
=
5
;
q
->
CWlengthT
[
2
]
=
5
;
q
->
CWlengthT
[
2
]
=
5
;
for
(
i
=
1
;
i
<
4
;
i
++
)
{
for
(
i
=
1
;
i
<
4
;
i
++
)
{
bits
=
(
q
->
levlCoeffBuf
[
i
]
==
16
)
?
0
:
5
;
bits
=
(
q
->
levlCoeffBuf
[
i
]
==
16
)
?
0
:
5
;
q
->
bitsBandT
[
i
]
=
bits
;
q
->
bitsBandT
[
i
]
=
bits
;
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
q
->
CWlengthT
[
j
]
=
bits
;
q
->
CWlengthT
[
j
]
=
bits
;
bitscount
+=
bits
;
bitscount
+=
bits
;
}
}
}
}
}
}
if
((
ret
=
bit_allocation
(
q
,
stream_format_code
,
if
((
ret
=
bit_allocation
(
q
,
stream_format_code
,
512
-
bitscount
-
get_bits_count
(
&
q
->
gb
),
flag
))
<
0
)
{
512
-
bitscount
-
get_bits_count
(
&
q
->
gb
),
flag
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Bit allocations failed
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Bit allocations failed
\n
"
);
q
->
decoder_reset
=
1
;
q
->
decoder_reset
=
1
;
return
ret
;
return
ret
;
}
}
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
q
->
sumLenArr
[
i
]
=
0
;
q
->
sumLenArr
[
i
]
=
0
;
q
->
skipFlagRaw
[
i
]
=
0
;
q
->
skipFlagRaw
[
i
]
=
0
;
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
q
->
sumLenArr
[
i
]
+=
q
->
CWlengthT
[
j
];
q
->
sumLenArr
[
i
]
+=
q
->
CWlengthT
[
j
];
if
(
q
->
bandFlagsBuf
[
i
])
if
(
q
->
bandFlagsBuf
[
i
])
if
(
(((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
*
1
.
5
)
>
q
->
sumLenArr
[
i
])
&&
(
q
->
sumLenArr
[
i
]
>
0
))
if
((((
band_tab
[
i
+
1
]
-
band_tab
[
i
])
*
1
.
5
)
>
q
->
sumLenArr
[
i
])
&&
(
q
->
sumLenArr
[
i
]
>
0
))
q
->
skipFlagRaw
[
i
]
=
1
;
q
->
skipFlagRaw
[
i
]
=
1
;
}
}
imc_get_skip_coeff
(
q
);
imc_get_skip_coeff
(
q
);
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
q
->
flcoeffs6
[
i
]
=
q
->
flcoeffs1
[
i
];
q
->
flcoeffs6
[
i
]
=
q
->
flcoeffs1
[
i
];
/* band has flag set and at least one coded coefficient */
/* band has flag set and at least one coded coefficient */
if
(
q
->
bandFlagsBuf
[
i
]
&&
(
band_tab
[
i
+
1
]
-
band_tab
[
i
])
!=
q
->
skipFlagCount
[
i
])
{
if
(
q
->
bandFlagsBuf
[
i
]
&&
(
band_tab
[
i
+
1
]
-
band_tab
[
i
])
!=
q
->
skipFlagCount
[
i
])
{
q
->
flcoeffs6
[
i
]
*=
q
->
sqrt_tab
[
band_tab
[
i
+
1
]
-
band_tab
[
i
]]
/
q
->
flcoeffs6
[
i
]
*=
q
->
sqrt_tab
[
band_tab
[
i
+
1
]
-
band_tab
[
i
]]
/
q
->
sqrt_tab
[(
band_tab
[
i
+
1
]
-
band_tab
[
i
]
-
q
->
skipFlagCount
[
i
])];
q
->
sqrt_tab
[(
band_tab
[
i
+
1
]
-
band_tab
[
i
]
-
q
->
skipFlagCount
[
i
])];
}
}
}
}
/* calculate bits left, bits needed and adjust bit allocation */
/* calculate bits left, bits needed and adjust bit allocation */
bits
=
summer
=
0
;
bits
=
summer
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
if
(
q
->
bandFlagsBuf
[
i
])
{
if
(
q
->
bandFlagsBuf
[
i
])
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
{
if
(
q
->
skipFlags
[
j
])
{
if
(
q
->
skipFlags
[
j
])
{
summer
+=
q
->
CWlengthT
[
j
];
summer
+=
q
->
CWlengthT
[
j
];
q
->
CWlengthT
[
j
]
=
0
;
q
->
CWlengthT
[
j
]
=
0
;
}
}
...
@@ -802,23 +825,23 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
...
@@ -802,23 +825,23 @@ static int imc_decode_frame(AVCodecContext * avctx, void *data,
}
}
imc_adjust_bit_allocation
(
q
,
summer
);
imc_adjust_bit_allocation
(
q
,
summer
);
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
for
(
i
=
0
;
i
<
BANDS
;
i
++
)
{
q
->
sumLenArr
[
i
]
=
0
;
q
->
sumLenArr
[
i
]
=
0
;
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
for
(
j
=
band_tab
[
i
];
j
<
band_tab
[
i
+
1
];
j
++
)
if
(
!
q
->
skipFlags
[
j
])
if
(
!
q
->
skipFlags
[
j
])
q
->
sumLenArr
[
i
]
+=
q
->
CWlengthT
[
j
];
q
->
sumLenArr
[
i
]
+=
q
->
CWlengthT
[
j
];
}
}
memset
(
q
->
codewords
,
0
,
sizeof
(
q
->
codewords
));
memset
(
q
->
codewords
,
0
,
sizeof
(
q
->
codewords
));
if
(
imc_get_coeffs
(
q
)
<
0
)
{
if
(
imc_get_coeffs
(
q
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Read coefficients failed
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Read coefficients failed
\n
"
);
q
->
decoder_reset
=
1
;
q
->
decoder_reset
=
1
;
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
inverse_quant_coeff
(
q
,
stream_format_code
)
<
0
)
{
if
(
inverse_quant_coeff
(
q
,
stream_format_code
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Inverse quantization of coefficients failed
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Inverse quantization of coefficients failed
\n
"
);
q
->
decoder_reset
=
1
;
q
->
decoder_reset
=
1
;
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
...
...
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