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
c3513477
Commit
c3513477
authored
Dec 30, 2011
by
Shitiz Garg
Committed by
Diego Biurrun
Dec 31, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cook: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
9afc025b
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
366 additions
and
364 deletions
+366
-364
cook.c
libavcodec/cook.c
+366
-364
No files found.
libavcodec/cook.c
View file @
c3513477
...
...
@@ -57,7 +57,7 @@
#define MONO 0x1000001
#define STEREO 0x1000002
#define JOINT_STEREO 0x1000003
#define MC_COOK 0x2000000 //multichannel Cook, not supported
#define MC_COOK 0x2000000 //
multichannel Cook, not supported
#define SUBBAND_SIZE 20
#define MAX_SUBPACKETS 5
...
...
@@ -102,24 +102,24 @@ typedef struct cook {
* The following 5 functions provide the lowlevel arithmetic on
* the internal audio buffers.
*/
void
(
*
scalar_dequant
)(
struct
cook
*
q
,
int
index
,
int
quant_index
,
int
*
subband_coef_index
,
int
*
subband_coef_sign
,
float
*
mlt_p
);
void
(
*
scalar_dequant
)(
struct
cook
*
q
,
int
index
,
int
quant_index
,
int
*
subband_coef_index
,
int
*
subband_coef_sign
,
float
*
mlt_p
);
void
(
*
decouple
)
(
struct
cook
*
q
,
void
(
*
decouple
)
(
struct
cook
*
q
,
COOKSubpacket
*
p
,
int
subband
,
float
f1
,
float
f2
,
float
*
decode_buffer
,
float
*
mlt_buffer1
,
float
*
mlt_buffer2
);
void
(
*
imlt_window
)
(
struct
cook
*
q
,
float
*
buffer1
,
void
(
*
imlt_window
)
(
struct
cook
*
q
,
float
*
buffer1
,
cook_gains
*
gains_ptr
,
float
*
previous_buffer
);
void
(
*
interpolate
)
(
struct
cook
*
q
,
float
*
buffer
,
void
(
*
interpolate
)(
struct
cook
*
q
,
float
*
buffer
,
int
gain_index
,
int
gain_index_next
);
void
(
*
saturate_output
)
(
struct
cook
*
q
,
int
chan
,
float
*
out
);
void
(
*
saturate_output
)
(
struct
cook
*
q
,
int
chan
,
float
*
out
);
AVCodecContext
*
avctx
;
AVFrame
frame
;
...
...
@@ -140,7 +140,7 @@ typedef struct cook {
/* VLC data */
VLC
envelope_quant_index
[
13
];
VLC
sqvh
[
7
];
//scalar quantization
VLC
sqvh
[
7
];
//
scalar quantization
/* generatable tables and related variables */
int
gain_size_factor
;
...
...
@@ -165,55 +165,58 @@ static float rootpow2tab[127];
/*************** init functions ***************/
/* table generator */
static
av_cold
void
init_pow2table
(
void
){
static
av_cold
void
init_pow2table
(
void
)
{
int
i
;
for
(
i
=-
63
;
i
<
64
;
i
++
)
{
pow2tab
[
63
+
i
]
=
pow
(
2
,
i
);
rootpow2tab
[
63
+
i
]
=
sqrt
(
pow
(
2
,
i
));
for
(
i
=
-
63
;
i
<
64
;
i
++
)
{
pow2tab
[
63
+
i
]
=
pow
(
2
,
i
);
rootpow2tab
[
63
+
i
]
=
sqrt
(
pow
(
2
,
i
));
}
}
/* table generator */
static
av_cold
void
init_gain_table
(
COOKContext
*
q
)
{
static
av_cold
void
init_gain_table
(
COOKContext
*
q
)
{
int
i
;
q
->
gain_size_factor
=
q
->
samples_per_channel
/
8
;
for
(
i
=
0
;
i
<
23
;
i
++
)
{
q
->
gain_table
[
i
]
=
pow
(
pow2tab
[
i
+
52
]
,
(
1
.
0
/
(
double
)
q
->
gain_size_factor
));
}
q
->
gain_size_factor
=
q
->
samples_per_channel
/
8
;
for
(
i
=
0
;
i
<
23
;
i
++
)
q
->
gain_table
[
i
]
=
pow
(
pow2tab
[
i
+
52
],
(
1
.
0
/
(
double
)
q
->
gain_size_factor
));
}
static
av_cold
int
init_cook_vlc_tables
(
COOKContext
*
q
)
{
static
av_cold
int
init_cook_vlc_tables
(
COOKContext
*
q
)
{
int
i
,
result
;
result
=
0
;
for
(
i
=
0
;
i
<
13
;
i
++
)
{
result
|=
init_vlc
(
&
q
->
envelope_quant_index
[
i
],
9
,
24
,
for
(
i
=
0
;
i
<
13
;
i
++
)
{
result
|=
init_vlc
(
&
q
->
envelope_quant_index
[
i
],
9
,
24
,
envelope_quant_index_huffbits
[
i
],
1
,
1
,
envelope_quant_index_huffcodes
[
i
],
2
,
2
,
0
);
}
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"sqvh VLC init
\n
"
);
for
(
i
=
0
;
i
<
7
;
i
++
)
{
result
|=
init_vlc
(
&
q
->
sqvh
[
i
],
vhvlcsize_tab
[
i
],
vhsize_tab
[
i
],
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"sqvh VLC init
\n
"
);
for
(
i
=
0
;
i
<
7
;
i
++
)
{
result
|=
init_vlc
(
&
q
->
sqvh
[
i
],
vhvlcsize_tab
[
i
],
vhsize_tab
[
i
],
cvh_huffbits
[
i
],
1
,
1
,
cvh_huffcodes
[
i
],
2
,
2
,
0
);
}
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
)
{
if
(
q
->
subpacket
[
i
].
joint_stereo
==
1
)
{
result
|=
init_vlc
(
&
q
->
subpacket
[
i
].
ccpl
,
6
,
(
1
<<
q
->
subpacket
[
i
].
js_vlc_bits
)
-
1
,
ccpl_huffbits
[
q
->
subpacket
[
i
].
js_vlc_bits
-
2
],
1
,
1
,
ccpl_huffcodes
[
q
->
subpacket
[
i
].
js_vlc_bits
-
2
],
2
,
2
,
0
);
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"subpacket %i Joint-stereo VLC used.
\n
"
,
i
);
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
)
{
if
(
q
->
subpacket
[
i
].
joint_stereo
==
1
)
{
result
|=
init_vlc
(
&
q
->
subpacket
[
i
].
ccpl
,
6
,
(
1
<<
q
->
subpacket
[
i
].
js_vlc_bits
)
-
1
,
ccpl_huffbits
[
q
->
subpacket
[
i
].
js_vlc_bits
-
2
],
1
,
1
,
ccpl_huffcodes
[
q
->
subpacket
[
i
].
js_vlc_bits
-
2
],
2
,
2
,
0
);
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"subpacket %i Joint-stereo VLC used.
\n
"
,
i
);
}
}
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"VLC tables initialized.
\n
"
);
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"VLC tables initialized.
\n
"
);
return
result
;
}
static
av_cold
int
init_cook_mlt
(
COOKContext
*
q
)
{
static
av_cold
int
init_cook_mlt
(
COOKContext
*
q
)
{
int
j
,
ret
;
int
mlt_size
=
q
->
samples_per_channel
;
...
...
@@ -222,35 +225,36 @@ static av_cold int init_cook_mlt(COOKContext *q) {
/* Initialize the MLT window: simple sine window. */
ff_sine_window_init
(
q
->
mlt_window
,
mlt_size
);
for
(
j
=
0
;
j
<
mlt_size
;
j
++
)
for
(
j
=
0
;
j
<
mlt_size
;
j
++
)
q
->
mlt_window
[
j
]
*=
sqrt
(
2
.
0
/
q
->
samples_per_channel
);
/* Initialize the MDCT. */
if
((
ret
=
ff_mdct_init
(
&
q
->
mdct_ctx
,
av_log2
(
mlt_size
)
+
1
,
1
,
1
.
0
/
32768
.
0
)))
{
if
((
ret
=
ff_mdct_init
(
&
q
->
mdct_ctx
,
av_log2
(
mlt_size
)
+
1
,
1
,
1
.
0
/
32768
.
0
)))
{
av_free
(
q
->
mlt_window
);
return
ret
;
}
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"MDCT initialized, order = %d.
\n
"
,
av_log2
(
mlt_size
)
+
1
);
av_log
(
q
->
avctx
,
AV_LOG_DEBUG
,
"MDCT initialized, order = %d.
\n
"
,
av_log2
(
mlt_size
)
+
1
);
return
0
;
}
static
const
float
*
maybe_reformat_buffer32
(
COOKContext
*
q
,
const
float
*
ptr
,
int
n
)
static
const
float
*
maybe_reformat_buffer32
(
COOKContext
*
q
,
const
float
*
ptr
,
int
n
)
{
if
(
1
)
return
ptr
;
}
static
av_cold
void
init_cplscales_table
(
COOKContext
*
q
)
{
static
av_cold
void
init_cplscales_table
(
COOKContext
*
q
)
{
int
i
;
for
(
i
=
0
;
i
<
5
;
i
++
)
q
->
cplscales
[
i
]
=
maybe_reformat_buffer32
(
q
,
cplscales
[
i
],
(
1
<<
(
i
+
2
))
-
1
);
for
(
i
=
0
;
i
<
5
;
i
++
)
q
->
cplscales
[
i
]
=
maybe_reformat_buffer32
(
q
,
cplscales
[
i
],
(
1
<<
(
i
+
2
))
-
1
);
}
/*************** init functions end ***********/
#define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)
+
3) % 4)
#define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)
+
3) % 4)
#define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes)))
/**
...
...
@@ -273,27 +277,27 @@ static av_cold void init_cplscales_table (COOKContext *q) {
* @param out pointer to byte array of outdata
* @param bytes number of bytes
*/
static
inline
int
decode_bytes
(
const
uint8_t
*
inbuffer
,
uint8_t
*
out
,
int
bytes
)
{
static
inline
int
decode_bytes
(
const
uint8_t
*
inbuffer
,
uint8_t
*
out
,
int
bytes
)
{
static
const
uint32_t
tab
[
4
]
=
{
AV_BE2NE32C
(
0x37c511f2
),
AV_BE2NE32C
(
0xf237c511
),
AV_BE2NE32C
(
0x11f237c5
),
AV_BE2NE32C
(
0xc511f237
),
};
int
i
,
off
;
uint32_t
c
;
const
uint32_t
*
buf
;
uint32_t
*
obuf
=
(
uint32_t
*
)
out
;
const
uint32_t
*
buf
;
uint32_t
*
obuf
=
(
uint32_t
*
)
out
;
/* FIXME: 64 bit platforms would be able to do 64 bits at a time.
* I'm too lazy though, should be something like
* for
(i=0 ; i<bitamount/64
; i++)
* (int64_t)
out[i] = 0x37c511f237c511f2^av_be2ne64(int64_t)
in[i]);
* for
(i = 0; i < bitamount / 64
; i++)
* (int64_t)
out[i] = 0x37c511f237c511f2 ^ av_be2ne64(int64_t)
in[i]);
* Buffer alignment needs to be checked. */
off
=
(
intptr_t
)
inbuffer
&
3
;
buf
=
(
const
uint32_t
*
)
(
inbuffer
-
off
);
off
=
(
intptr_t
)
inbuffer
&
3
;
buf
=
(
const
uint32_t
*
)
(
inbuffer
-
off
);
c
=
tab
[
off
];
bytes
+=
3
+
off
;
for
(
i
=
0
;
i
<
bytes
/
4
;
i
++
)
for
(
i
=
0
;
i
<
bytes
/
4
;
i
++
)
obuf
[
i
]
=
c
^
buf
[
i
];
return
off
;
...
...
@@ -302,12 +306,11 @@ static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes)
/**
* Cook uninit
*/
static
av_cold
int
cook_decode_close
(
AVCodecContext
*
avctx
)
{
int
i
;
COOKContext
*
q
=
avctx
->
priv_data
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Deallocating memory.
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Deallocating memory.
\n
"
);
/* Free allocated memory buffers. */
av_free
(
q
->
mlt_window
);
...
...
@@ -317,17 +320,14 @@ static av_cold int cook_decode_close(AVCodecContext *avctx)
ff_mdct_end
(
&
q
->
mdct_ctx
);
/* Free the VLC tables. */
for
(
i
=
0
;
i
<
13
;
i
++
)
{
for
(
i
=
0
;
i
<
13
;
i
++
)
free_vlc
(
&
q
->
envelope_quant_index
[
i
]);
}
for
(
i
=
0
;
i
<
7
;
i
++
)
{
for
(
i
=
0
;
i
<
7
;
i
++
)
free_vlc
(
&
q
->
sqvh
[
i
]);
}
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
)
{
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
)
free_vlc
(
&
q
->
subpacket
[
i
].
ccpl
);
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Memory deallocated.
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"Memory deallocated.
\n
"
);
return
0
;
}
...
...
@@ -338,22 +338,26 @@ static av_cold int cook_decode_close(AVCodecContext *avctx)
* @param gb pointer to the GetBitContext
* @param gaininfo array[9] of gain indexes
*/
static
void
decode_gain_info
(
GetBitContext
*
gb
,
int
*
gaininfo
)
{
int
i
,
n
;
while
(
get_bits1
(
gb
))
{}
n
=
get_bits_count
(
gb
)
-
1
;
//amount of elements*2 to update
while
(
get_bits1
(
gb
))
{
/* NOTHING */
}
n
=
get_bits_count
(
gb
)
-
1
;
// amount of elements*2 to update
i
=
0
;
while
(
n
--
)
{
int
index
=
get_bits
(
gb
,
3
);
int
gain
=
get_bits1
(
gb
)
?
get_bits
(
gb
,
4
)
-
7
:
-
1
;
while
(
i
<=
index
)
gaininfo
[
i
++
]
=
gain
;
while
(
i
<=
index
)
gaininfo
[
i
++
]
=
gain
;
}
while
(
i
<=
8
)
gaininfo
[
i
++
]
=
0
;
while
(
i
<=
8
)
gaininfo
[
i
++
]
=
0
;
}
/**
...
...
@@ -362,25 +366,28 @@ static void decode_gain_info(GetBitContext *gb, int *gaininfo)
* @param q pointer to the COOKContext
* @param quant_index_table pointer to the array
*/
static
void
decode_envelope
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
quant_index_table
)
{
int
i
,
j
,
vlc_index
;
static
void
decode_envelope
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
quant_index_table
)
{
int
i
,
j
,
vlc_index
;
quant_index_table
[
0
]
=
get_bits
(
&
q
->
gb
,
6
)
-
6
;
//This is used later in categorize
quant_index_table
[
0
]
=
get_bits
(
&
q
->
gb
,
6
)
-
6
;
// This is used later in categorize
for
(
i
=
1
;
i
<
p
->
total_subbands
;
i
++
)
{
vlc_index
=
i
;
for
(
i
=
1
;
i
<
p
->
total_subbands
;
i
++
)
{
vlc_index
=
i
;
if
(
i
>=
p
->
js_subband_start
*
2
)
{
vlc_index
-=
p
->
js_subband_start
;
vlc_index
-=
p
->
js_subband_start
;
}
else
{
vlc_index
/=
2
;
if
(
vlc_index
<
1
)
vlc_index
=
1
;
vlc_index
/=
2
;
if
(
vlc_index
<
1
)
vlc_index
=
1
;
}
if
(
vlc_index
>
13
)
vlc_index
=
13
;
//the VLC tables >13 are identical to No. 13
if
(
vlc_index
>
13
)
vlc_index
=
13
;
// the VLC tables >13 are identical to No. 13
j
=
get_vlc2
(
&
q
->
gb
,
q
->
envelope_quant_index
[
vlc_index
-
1
].
table
,
q
->
envelope_quant_index
[
vlc_index
-
1
].
bits
,
2
);
quant_index_table
[
i
]
=
quant_index_table
[
i
-
1
]
+
j
-
12
;
//
differential encoding
j
=
get_vlc2
(
&
q
->
gb
,
q
->
envelope_quant_index
[
vlc_index
-
1
].
table
,
q
->
envelope_quant_index
[
vlc_index
-
1
].
bits
,
2
);
quant_index_table
[
i
]
=
quant_index_table
[
i
-
1
]
+
j
-
12
;
//
differential encoding
}
}
...
...
@@ -392,22 +399,22 @@ static void decode_envelope(COOKContext *q, COOKSubpacket *p, int* quant_index_t
* @param category pointer to the category array
* @param category_index pointer to the category_index array
*/
static
void
categorize
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
quant_index_table
,
int
*
category
,
int
*
category_index
)
{
static
void
categorize
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
quant_index_table
,
int
*
category
,
int
*
category_index
)
{
int
exp_idx
,
bias
,
tmpbias1
,
tmpbias2
,
bits_left
,
num_bits
,
index
,
v
,
i
,
j
;
int
exp_index2
[
102
];
int
exp_index1
[
102
];
int
tmp_categorize_array
[
128
*
2
];
int
tmp_categorize_array1_idx
=
p
->
numvector_size
;
int
tmp_categorize_array2_idx
=
p
->
numvector_size
;
int
tmp_categorize_array
[
128
*
2
];
int
tmp_categorize_array1_idx
=
p
->
numvector_size
;
int
tmp_categorize_array2_idx
=
p
->
numvector_size
;
bits_left
=
p
->
bits_per_subpacket
-
get_bits_count
(
&
q
->
gb
);
if
(
bits_left
>
q
->
samples_per_channel
)
{
if
(
bits_left
>
q
->
samples_per_channel
)
{
bits_left
=
q
->
samples_per_channel
+
((
bits_left
-
q
->
samples_per_channel
)
*
5
)
/
8
;
((
bits_left
-
q
->
samples_per_channel
)
*
5
)
/
8
;
//av_log(q->avctx, AV_LOG_ERROR, "bits_left = %d\n",bits_left);
}
...
...
@@ -415,25 +422,24 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
memset
(
&
exp_index2
,
0
,
sizeof
(
exp_index2
));
memset
(
&
tmp_categorize_array
,
0
,
sizeof
(
tmp_categorize_array
));
bias
=
-
32
;
bias
=
-
32
;
/* Estimate bias. */
for
(
i
=
32
;
i
>
0
;
i
=
i
/
2
)
{
for
(
i
=
32
;
i
>
0
;
i
=
i
/
2
)
{
num_bits
=
0
;
index
=
0
;
for
(
j
=
p
->
total_subbands
;
j
>
0
;
j
--
)
{
for
(
j
=
p
->
total_subbands
;
j
>
0
;
j
--
)
{
exp_idx
=
av_clip
((
i
-
quant_index_table
[
index
]
+
bias
)
/
2
,
0
,
7
);
index
++
;
num_bits
+=
expbits_tab
[
exp_idx
];
}
if
(
num_bits
>=
bits_left
-
32
){
bias
+=
i
;
num_bits
+=
expbits_tab
[
exp_idx
];
}
if
(
num_bits
>=
bits_left
-
32
)
bias
+=
i
;
}
/* Calculate total number of bits. */
num_bits
=
0
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
num_bits
=
0
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
exp_idx
=
av_clip
((
bias
-
quant_index_table
[
i
])
/
2
,
0
,
7
);
num_bits
+=
expbits_tab
[
exp_idx
];
exp_index1
[
i
]
=
exp_idx
;
...
...
@@ -441,50 +447,51 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
}
tmpbias1
=
tmpbias2
=
num_bits
;
for
(
j
=
1
;
j
<
p
->
numvector_size
;
j
++
)
{
if
(
tmpbias1
+
tmpbias2
>
2
*
bits_left
)
{
/* ---> */
for
(
j
=
1
;
j
<
p
->
numvector_size
;
j
++
)
{
if
(
tmpbias1
+
tmpbias2
>
2
*
bits_left
)
{
/* ---> */
int
max
=
-
999999
;
index
=
-
1
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
index
=
-
1
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
if
(
exp_index1
[
i
]
<
7
)
{
v
=
(
-
2
*
exp_index1
[
i
])
-
quant_index_table
[
i
]
+
bias
;
if
(
v
>=
max
)
{
v
=
(
-
2
*
exp_index1
[
i
])
-
quant_index_table
[
i
]
+
bias
;
if
(
v
>=
max
)
{
max
=
v
;
index
=
i
;
}
}
}
if
(
index
==-
1
)
break
;
if
(
index
==
-
1
)
break
;
tmp_categorize_array
[
tmp_categorize_array1_idx
++
]
=
index
;
tmpbias1
-=
expbits_tab
[
exp_index1
[
index
]]
-
expbits_tab
[
exp_index1
[
index
]
+
1
];
expbits_tab
[
exp_index1
[
index
]
+
1
];
++
exp_index1
[
index
];
}
else
{
/* <--- */
int
min
=
999999
;
index
=
-
1
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
if
(
exp_index2
[
i
]
>
0
)
{
v
=
(
-
2
*
exp_index2
[
i
])
-
quant_index_table
[
i
]
+
bias
;
if
(
v
<
min
)
{
index
=
-
1
;
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
{
if
(
exp_index2
[
i
]
>
0
)
{
v
=
(
-
2
*
exp_index2
[
i
])
-
quant_index_table
[
i
]
+
bias
;
if
(
v
<
min
)
{
min
=
v
;
index
=
i
;
}
}
}
if
(
index
==
-
1
)
break
;
if
(
index
==
-
1
)
break
;
tmp_categorize_array
[
--
tmp_categorize_array2_idx
]
=
index
;
tmpbias2
-=
expbits_tab
[
exp_index2
[
index
]]
-
expbits_tab
[
exp_index2
[
index
]
-
1
];
expbits_tab
[
exp_index2
[
index
]
-
1
];
--
exp_index2
[
index
];
}
}
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
for
(
i
=
0
;
i
<
p
->
total_subbands
;
i
++
)
category
[
i
]
=
exp_index2
[
i
];
for
(
i
=
0
;
i
<
p
->
numvector_size
-
1
;
i
++
)
for
(
i
=
0
;
i
<
p
->
numvector_size
-
1
;
i
++
)
category_index
[
i
]
=
tmp_categorize_array
[
tmp_categorize_array2_idx
++
];
}
...
...
@@ -495,13 +502,12 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
* @param category pointer to the category array
* @param category_index pointer to the category_index array
*/
static
inline
void
expand_category
(
COOKContext
*
q
,
int
*
category
,
int
*
category_index
)
{
static
inline
void
expand_category
(
COOKContext
*
q
,
int
*
category
,
int
*
category_index
)
{
int
i
;
for
(
i
=
0
;
i
<
q
->
num_vectors
;
i
++
){
for
(
i
=
0
;
i
<
q
->
num_vectors
;
i
++
)
++
category
[
category_index
[
i
]];
}
}
/**
...
...
@@ -514,23 +520,25 @@ static inline void expand_category(COOKContext *q, int* category,
* @param subband_coef_sign signs of coefficients
* @param mlt_p pointer into the mlt buffer
*/
static
void
scalar_dequant_float
(
COOKContext
*
q
,
int
index
,
int
quant_index
,
int
*
subband_coef_index
,
int
*
subband_coef_sign
,
float
*
mlt_p
){
int
*
subband_coef_index
,
int
*
subband_coef_sign
,
float
*
mlt_p
)
{
int
i
;
float
f1
;
for
(
i
=
0
;
i
<
SUBBAND_SIZE
;
i
++
)
{
for
(
i
=
0
;
i
<
SUBBAND_SIZE
;
i
++
)
{
if
(
subband_coef_index
[
i
])
{
f1
=
quant_centroid_tab
[
index
][
subband_coef_index
[
i
]];
if
(
subband_coef_sign
[
i
])
f1
=
-
f1
;
if
(
subband_coef_sign
[
i
])
f1
=
-
f1
;
}
else
{
/* noise coding if subband_coef_index[i] == 0 */
f1
=
dither_tab
[
index
];
if
(
av_lfg_get
(
&
q
->
random_state
)
<
0x80000000
)
f1
=
-
f1
;
if
(
av_lfg_get
(
&
q
->
random_state
)
<
0x80000000
)
f1
=
-
f1
;
}
mlt_p
[
i
]
=
f1
*
rootpow2tab
[
quant_index
+
63
];
mlt_p
[
i
]
=
f1
*
rootpow2tab
[
quant_index
+
63
];
}
}
/**
...
...
@@ -541,35 +549,35 @@ static void scalar_dequant_float(COOKContext *q, int index, int quant_index,
* @param subband_coef_index array of indexes to quant_centroid_tab
* @param subband_coef_sign signs of coefficients
*/
static
int
unpack_SQVH
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
category
,
int
*
subband_coef_index
,
int
*
subband_coef_sign
)
{
int
i
,
j
;
int
vlc
,
vd
,
tmp
,
result
;
static
int
unpack_SQVH
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
category
,
int
*
subband_coef_index
,
int
*
subband_coef_sign
)
{
int
i
,
j
;
int
vlc
,
vd
,
tmp
,
result
;
vd
=
vd_tab
[
category
];
result
=
0
;
for
(
i
=
0
;
i
<
vpr_tab
[
category
]
;
i
++
)
{
for
(
i
=
0
;
i
<
vpr_tab
[
category
];
i
++
)
{
vlc
=
get_vlc2
(
&
q
->
gb
,
q
->
sqvh
[
category
].
table
,
q
->
sqvh
[
category
].
bits
,
3
);
if
(
p
->
bits_per_subpacket
<
get_bits_count
(
&
q
->
gb
)){
if
(
p
->
bits_per_subpacket
<
get_bits_count
(
&
q
->
gb
))
{
vlc
=
0
;
result
=
1
;
}
for
(
j
=
vd
-
1
;
j
>=
0
;
j
--
)
{
tmp
=
(
vlc
*
invradix_tab
[
category
])
/
0x100000
;
subband_coef_index
[
vd
*
i
+
j
]
=
vlc
-
tmp
*
(
kmax_tab
[
category
]
+
1
);
for
(
j
=
vd
-
1
;
j
>=
0
;
j
--
)
{
tmp
=
(
vlc
*
invradix_tab
[
category
])
/
0x100000
;
subband_coef_index
[
vd
*
i
+
j
]
=
vlc
-
tmp
*
(
kmax_tab
[
category
]
+
1
);
vlc
=
tmp
;
}
for
(
j
=
0
;
j
<
vd
;
j
++
)
{
if
(
subband_coef_index
[
i
*
vd
+
j
])
{
if
(
get_bits_count
(
&
q
->
gb
)
<
p
->
bits_per_subpacket
)
{
subband_coef_sign
[
i
*
vd
+
j
]
=
get_bits1
(
&
q
->
gb
);
for
(
j
=
0
;
j
<
vd
;
j
++
)
{
if
(
subband_coef_index
[
i
*
vd
+
j
])
{
if
(
get_bits_count
(
&
q
->
gb
)
<
p
->
bits_per_subpacket
)
{
subband_coef_sign
[
i
*
vd
+
j
]
=
get_bits1
(
&
q
->
gb
);
}
else
{
result
=
1
;
subband_coef_sign
[
i
*
vd
+
j
]
=
0
;
result
=
1
;
subband_coef_sign
[
i
*
vd
+
j
]
=
0
;
}
}
else
{
subband_coef_sign
[
i
*
vd
+
j
]
=
0
;
subband_coef_sign
[
i
*
vd
+
j
]
=
0
;
}
}
}
...
...
@@ -585,10 +593,9 @@ static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category, int* subb
* @param quant_index_table pointer to the array
* @param mlt_buffer pointer to mlt coefficients
*/
static
void
decode_vectors
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
category
,
int
*
quant_index_table
,
float
*
mlt_buffer
){
static
void
decode_vectors
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
*
category
,
int
*
quant_index_table
,
float
*
mlt_buffer
)
{
/* A zero in this table means that the subband coefficient is
random noise coded. */
int
subband_coef_index
[
SUBBAND_SIZE
];
...
...
@@ -596,17 +603,18 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
positive multiplicator. */
int
subband_coef_sign
[
SUBBAND_SIZE
];
int
band
,
j
;
int
index
=
0
;
int
index
=
0
;
for
(
band
=
0
;
band
<
p
->
total_subbands
;
band
++
)
{
for
(
band
=
0
;
band
<
p
->
total_subbands
;
band
++
)
{
index
=
category
[
band
];
if
(
category
[
band
]
<
7
){
if
(
unpack_SQVH
(
q
,
p
,
category
[
band
],
subband_coef_index
,
subband_coef_sign
)){
index
=
7
;
for
(
j
=
0
;
j
<
p
->
total_subbands
;
j
++
)
category
[
band
+
j
]
=
7
;
if
(
category
[
band
]
<
7
)
{
if
(
unpack_SQVH
(
q
,
p
,
category
[
band
],
subband_coef_index
,
subband_coef_sign
))
{
index
=
7
;
for
(
j
=
0
;
j
<
p
->
total_subbands
;
j
++
)
category
[
band
+
j
]
=
7
;
}
}
if
(
index
>=
7
)
{
if
(
index
>=
7
)
{
memset
(
subband_coef_index
,
0
,
sizeof
(
subband_coef_index
));
memset
(
subband_coef_sign
,
0
,
sizeof
(
subband_coef_sign
));
}
...
...
@@ -615,9 +623,9 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
&
mlt_buffer
[
band
*
SUBBAND_SIZE
]);
}
if
(
p
->
total_subbands
*
SUBBAND_SIZE
>=
q
->
samples_per_channel
){
/* FIXME: should this be removed, or moved into loop above? */
if
(
p
->
total_subbands
*
SUBBAND_SIZE
>=
q
->
samples_per_channel
)
return
;
}
/* FIXME: should this be removed, or moved into loop above? */
}
...
...
@@ -627,9 +635,8 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
* @param q pointer to the COOKContext
* @param mlt_buffer pointer to mlt coefficients
*/
static
void
mono_decode
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
float
*
mlt_buffer
)
{
static
void
mono_decode
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
float
*
mlt_buffer
)
{
int
category_index
[
128
];
int
quant_index_table
[
102
];
int
category
[
128
];
...
...
@@ -638,7 +645,7 @@ static void mono_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer) {
memset
(
&
category_index
,
0
,
sizeof
(
category_index
));
decode_envelope
(
q
,
p
,
quant_index_table
);
q
->
num_vectors
=
get_bits
(
&
q
->
gb
,
p
->
log2_numvector_size
);
q
->
num_vectors
=
get_bits
(
&
q
->
gb
,
p
->
log2_numvector_size
);
categorize
(
q
,
p
,
quant_index_table
,
category
,
category_index
);
expand_category
(
q
,
category
,
category_index
);
decode_vectors
(
q
,
p
,
category
,
quant_index_table
,
mlt_buffer
);
...
...
@@ -653,22 +660,21 @@ static void mono_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer) {
* @param gain_index index for the block multiplier
* @param gain_index_next index for the next block multiplier
*/
static
void
interpolate_float
(
COOKContext
*
q
,
float
*
buffer
,
int
gain_index
,
int
gain_index_next
)
{
static
void
interpolate_float
(
COOKContext
*
q
,
float
*
buffer
,
int
gain_index
,
int
gain_index_next
)
{
int
i
;
float
fc1
,
fc2
;
fc1
=
pow2tab
[
gain_index
+
63
];
fc1
=
pow2tab
[
gain_index
+
63
];
if
(
gain_index
==
gain_index_next
){
//static gain
for
(
i
=
0
;
i
<
q
->
gain_size_factor
;
i
++
){
buffer
[
i
]
*=
fc1
;
}
}
else
{
//smooth gain
fc2
=
q
->
gain_table
[
11
+
(
gain_index_next
-
gain_index
)];
for
(
i
=
0
;
i
<
q
->
gain_size_factor
;
i
++
){
buffer
[
i
]
*=
fc1
;
fc1
*=
fc2
;
if
(
gain_index
==
gain_index_next
)
{
// static gain
for
(
i
=
0
;
i
<
q
->
gain_size_factor
;
i
++
)
buffer
[
i
]
*=
fc1
;
}
else
{
// smooth gain
fc2
=
q
->
gain_table
[
11
+
(
gain_index_next
-
gain_index
)];
for
(
i
=
0
;
i
<
q
->
gain_size_factor
;
i
++
)
{
buffer
[
i
]
*=
fc1
;
fc1
*=
fc2
;
}
}
}
...
...
@@ -681,8 +687,7 @@ static void interpolate_float(COOKContext *q, float* buffer,
* @param gains_ptr current and previous gains
* @param previous_buffer pointer to the previous buffer to be used for overlapping
*/
static
void
imlt_window_float
(
COOKContext
*
q
,
float
*
inbuffer
,
static
void
imlt_window_float
(
COOKContext
*
q
,
float
*
inbuffer
,
cook_gains
*
gains_ptr
,
float
*
previous_buffer
)
{
const
float
fc
=
pow2tab
[
gains_ptr
->
previous
[
0
]
+
63
];
...
...
@@ -694,10 +699,9 @@ static void imlt_window_float (COOKContext *q, float *inbuffer,
*/
/* Apply window and overlap */
for
(
i
=
0
;
i
<
q
->
samples_per_channel
;
i
++
){
for
(
i
=
0
;
i
<
q
->
samples_per_channel
;
i
++
)
inbuffer
[
i
]
=
inbuffer
[
i
]
*
fc
*
q
->
mlt_window
[
i
]
-
previous_buffer
[
i
]
*
q
->
mlt_window
[
q
->
samples_per_channel
-
1
-
i
];
}
}
/**
...
...
@@ -711,9 +715,8 @@ static void imlt_window_float (COOKContext *q, float *inbuffer,
* @param gains_ptr current and previous gains
* @param previous_buffer pointer to the previous buffer to be used for overlapping
*/
static
void
imlt_gain
(
COOKContext
*
q
,
float
*
inbuffer
,
cook_gains
*
gains_ptr
,
float
*
previous_buffer
)
cook_gains
*
gains_ptr
,
float
*
previous_buffer
)
{
float
*
buffer0
=
q
->
mono_mdct_output
;
float
*
buffer1
=
q
->
mono_mdct_output
+
q
->
samples_per_channel
;
...
...
@@ -722,14 +725,13 @@ static void imlt_gain(COOKContext *q, float *inbuffer,
/* Inverse modified discrete cosine transform */
q
->
mdct_ctx
.
imdct_calc
(
&
q
->
mdct_ctx
,
q
->
mono_mdct_output
,
inbuffer
);
q
->
imlt_window
(
q
,
buffer1
,
gains_ptr
,
previous_buffer
);
q
->
imlt_window
(
q
,
buffer1
,
gains_ptr
,
previous_buffer
);
/* Apply gain profile */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
if
(
gains_ptr
->
now
[
i
]
||
gains_ptr
->
now
[
i
+
1
])
q
->
interpolate
(
q
,
&
buffer1
[
q
->
gain_size_factor
*
i
],
gains_ptr
->
now
[
i
],
gains_ptr
->
now
[
i
+
1
]);
}
/* Save away the current to be previous block. */
memcpy
(
previous_buffer
,
buffer0
,
...
...
@@ -749,19 +751,18 @@ static void decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
int
i
;
int
vlc
=
get_bits1
(
&
q
->
gb
);
int
start
=
cplband
[
p
->
js_subband_start
];
int
end
=
cplband
[
p
->
subbands
-
1
];
int
end
=
cplband
[
p
->
subbands
-
1
];
int
length
=
end
-
start
+
1
;
if
(
start
>
end
)
return
;
if
(
vlc
)
{
if
(
vlc
)
for
(
i
=
0
;
i
<
length
;
i
++
)
decouple_tab
[
start
+
i
]
=
get_vlc2
(
&
q
->
gb
,
p
->
ccpl
.
table
,
p
->
ccpl
.
bits
,
2
);
}
else
{
else
for
(
i
=
0
;
i
<
length
;
i
++
)
decouple_tab
[
start
+
i
]
=
get_bits
(
&
q
->
gb
,
p
->
js_vlc_bits
);
}
}
/*
...
...
@@ -775,7 +776,7 @@ static void decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
* @param mlt_buffer1 pointer to left channel mlt coefficients
* @param mlt_buffer2 pointer to right channel mlt coefficients
*/
static
void
decouple_float
(
COOKContext
*
q
,
static
void
decouple_float
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
int
subband
,
float
f1
,
float
f2
,
...
...
@@ -783,10 +784,10 @@ static void decouple_float (COOKContext *q,
float
*
mlt_buffer1
,
float
*
mlt_buffer2
)
{
int
j
,
tmp_idx
;
for
(
j
=
0
;
j
<
SUBBAND_SIZE
;
j
++
)
{
tmp_idx
=
((
p
->
js_subband_start
+
subband
)
*
SUBBAND_SIZE
)
+
j
;
mlt_buffer1
[
SUBBAND_SIZE
*
subband
+
j
]
=
f1
*
decode_buffer
[
tmp_idx
];
mlt_buffer2
[
SUBBAND_SIZE
*
subband
+
j
]
=
f2
*
decode_buffer
[
tmp_idx
];
for
(
j
=
0
;
j
<
SUBBAND_SIZE
;
j
++
)
{
tmp_idx
=
((
p
->
js_subband_start
+
subband
)
*
SUBBAND_SIZE
)
+
j
;
mlt_buffer1
[
SUBBAND_SIZE
*
subband
+
j
]
=
f1
*
decode_buffer
[
tmp_idx
];
mlt_buffer2
[
SUBBAND_SIZE
*
subband
+
j
]
=
f2
*
decode_buffer
[
tmp_idx
];
}
}
...
...
@@ -797,15 +798,15 @@ static void decouple_float (COOKContext *q,
* @param mlt_buffer1 pointer to left channel mlt coefficients
* @param mlt_buffer2 pointer to right channel mlt coefficients
*/
static
void
joint_decode
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
float
*
mlt_buffer1
,
float
*
mlt_buffer2
)
{
int
i
,
j
;
static
void
joint_decode
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
float
*
mlt_buffer1
,
float
*
mlt_buffer2
)
{
int
i
,
j
;
int
decouple_tab
[
SUBBAND_SIZE
];
float
*
decode_buffer
=
q
->
decode_buffer_0
;
int
idx
,
cpl_tmp
;
float
f1
,
f2
;
const
float
*
cplscale
;
float
f1
,
f2
;
const
float
*
cplscale
;
memset
(
decouple_tab
,
0
,
sizeof
(
decouple_tab
));
memset
(
decode_buffer
,
0
,
sizeof
(
q
->
decode_buffer_0
));
...
...
@@ -817,23 +818,23 @@ static void joint_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer1,
mono_decode
(
q
,
p
,
decode_buffer
);
/* The two channels are stored interleaved in decode_buffer. */
for
(
i
=
0
;
i
<
p
->
js_subband_start
;
i
++
)
{
for
(
j
=
0
;
j
<
SUBBAND_SIZE
;
j
++
)
{
mlt_buffer1
[
i
*
20
+
j
]
=
decode_buffer
[
i
*
40
+
j
];
mlt_buffer2
[
i
*
20
+
j
]
=
decode_buffer
[
i
*
40
+
20
+
j
];
for
(
i
=
0
;
i
<
p
->
js_subband_start
;
i
++
)
{
for
(
j
=
0
;
j
<
SUBBAND_SIZE
;
j
++
)
{
mlt_buffer1
[
i
*
20
+
j
]
=
decode_buffer
[
i
*
40
+
j
];
mlt_buffer2
[
i
*
20
+
j
]
=
decode_buffer
[
i
*
40
+
20
+
j
];
}
}
/* When we reach js_subband_start (the higher frequencies)
the coefficients are stored in a coupling scheme. */
idx
=
(
1
<<
p
->
js_vlc_bits
)
-
1
;
for
(
i
=
p
->
js_subband_start
;
i
<
p
->
subbands
;
i
++
)
{
for
(
i
=
p
->
js_subband_start
;
i
<
p
->
subbands
;
i
++
)
{
cpl_tmp
=
cplband
[
i
];
idx
-=
decouple_tab
[
cpl_tmp
];
cplscale
=
q
->
cplscales
[
p
->
js_vlc_bits
-
2
];
//
choose decoupler table
idx
-=
decouple_tab
[
cpl_tmp
];
cplscale
=
q
->
cplscales
[
p
->
js_vlc_bits
-
2
];
//
choose decoupler table
f1
=
cplscale
[
decouple_tab
[
cpl_tmp
]];
f2
=
cplscale
[
idx
-
1
];
q
->
decouple
(
q
,
p
,
i
,
f1
,
f2
,
decode_buffer
,
mlt_buffer1
,
mlt_buffer2
);
f2
=
cplscale
[
idx
-
1
];
q
->
decouple
(
q
,
p
,
i
,
f1
,
f2
,
decode_buffer
,
mlt_buffer1
,
mlt_buffer2
);
idx
=
(
1
<<
p
->
js_vlc_bits
)
-
1
;
}
}
...
...
@@ -846,15 +847,14 @@ static void joint_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer1,
* @param inbuffer pointer to raw stream data
* @param gains_ptr array of current/prev gain pointers
*/
static
inline
void
decode_bytes_and_gain
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
const
uint8_t
*
inbuffer
,
static
inline
void
decode_bytes_and_gain
(
COOKContext
*
q
,
COOKSubpacket
*
p
,
const
uint8_t
*
inbuffer
,
cook_gains
*
gains_ptr
)
{
int
offset
;
offset
=
decode_bytes
(
inbuffer
,
q
->
decoded_bytes_buffer
,
p
->
bits_per_subpacket
/
8
);
p
->
bits_per_subpacket
/
8
);
init_get_bits
(
&
q
->
gb
,
q
->
decoded_bytes_buffer
+
offset
,
p
->
bits_per_subpacket
);
decode_gain_info
(
&
q
->
gb
,
gains_ptr
->
now
);
...
...
@@ -863,7 +863,7 @@ decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer,
FFSWAP
(
int
*
,
gains_ptr
->
now
,
gains_ptr
->
previous
);
}
/**
/**
* Saturate the output signal and interleave.
*
* @param q pointer to the COOKContext
...
...
@@ -891,9 +891,7 @@ static void saturate_output_float(COOKContext *q, int chan, float *out)
* @param out pointer to the output buffer
* @param chan 0: left or single channel, 1: right channel
*/
static
inline
void
mlt_compensate_output
(
COOKContext
*
q
,
float
*
decode_buffer
,
static
inline
void
mlt_compensate_output
(
COOKContext
*
q
,
float
*
decode_buffer
,
cook_gains
*
gains_ptr
,
float
*
previous_buffer
,
float
*
out
,
int
chan
)
{
...
...
@@ -916,11 +914,10 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
{
int
sub_packet_size
=
p
->
size
;
/* packet dump */
// for (i=0 ; i<sub_packet_size ; i++) {
// av_log(q->avctx, AV_LOG_ERROR, "%02x", inbuffer[i]);
// }
// av_log(q->avctx, AV_LOG_ERROR, "\n");
memset
(
q
->
decode_buffer_1
,
0
,
sizeof
(
q
->
decode_buffer_1
));
// for (i = 0; i < sub_packet_size ; i++)
// av_log(q->avctx, AV_LOG_ERROR, "%02x", inbuffer[i]);
// av_log(q->avctx, AV_LOG_ERROR, "\n");
memset
(
q
->
decode_buffer_1
,
0
,
sizeof
(
q
->
decode_buffer_1
));
decode_bytes_and_gain
(
q
,
p
,
inbuffer
,
&
p
->
gains1
);
if
(
p
->
joint_stereo
)
{
...
...
@@ -929,7 +926,7 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
mono_decode
(
q
,
p
,
q
->
decode_buffer_1
);
if
(
p
->
num_channels
==
2
)
{
decode_bytes_and_gain
(
q
,
p
,
inbuffer
+
sub_packet_size
/
2
,
&
p
->
gains2
);
decode_bytes_and_gain
(
q
,
p
,
inbuffer
+
sub_packet_size
/
2
,
&
p
->
gains2
);
mono_decode
(
q
,
p
,
q
->
decode_buffer_2
);
}
}
...
...
@@ -937,16 +934,13 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
mlt_compensate_output
(
q
,
q
->
decode_buffer_1
,
&
p
->
gains1
,
p
->
mono_previous_buffer1
,
outbuffer
,
p
->
ch_idx
);
if
(
p
->
num_channels
==
2
)
{
if
(
p
->
joint_stereo
)
{
if
(
p
->
num_channels
==
2
)
if
(
p
->
joint_stereo
)
mlt_compensate_output
(
q
,
q
->
decode_buffer_2
,
&
p
->
gains1
,
p
->
mono_previous_buffer2
,
outbuffer
,
p
->
ch_idx
+
1
);
}
else
{
else
mlt_compensate_output
(
q
,
q
->
decode_buffer_2
,
&
p
->
gains2
,
p
->
mono_previous_buffer2
,
outbuffer
,
p
->
ch_idx
+
1
);
}
}
}
...
...
@@ -955,7 +949,6 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
*
* @param avctx pointer to the AVCodecContext
*/
static
int
cook_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
...
...
@@ -977,30 +970,37 @@ static int cook_decode_frame(AVCodecContext *avctx, void *data,
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
samples
=
(
float
*
)
q
->
frame
.
data
[
0
];
samples
=
(
float
*
)
q
->
frame
.
data
[
0
];
}
/* estimate subpacket sizes */
q
->
subpacket
[
0
].
size
=
avctx
->
block_align
;
for
(
i
=
1
;
i
<
q
->
num_subpackets
;
i
++
)
{
for
(
i
=
1
;
i
<
q
->
num_subpackets
;
i
++
)
{
q
->
subpacket
[
i
].
size
=
2
*
buf
[
avctx
->
block_align
-
q
->
num_subpackets
+
i
];
q
->
subpacket
[
0
].
size
-=
q
->
subpacket
[
i
].
size
+
1
;
if
(
q
->
subpacket
[
0
].
size
<
0
)
{
av_log
(
avctx
,
AV_LOG_DEBUG
,
"frame subpacket size total > avctx->block_align!
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"frame subpacket size total > avctx->block_align!
\n
"
);
return
AVERROR_INVALIDDATA
;
}
}
/* decode supbackets */
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
){
q
->
subpacket
[
i
].
bits_per_subpacket
=
(
q
->
subpacket
[
i
].
size
*
8
)
>>
q
->
subpacket
[
i
].
bits_per_subpdiv
;
for
(
i
=
0
;
i
<
q
->
num_subpackets
;
i
++
)
{
q
->
subpacket
[
i
].
bits_per_subpacket
=
(
q
->
subpacket
[
i
].
size
*
8
)
>>
q
->
subpacket
[
i
].
bits_per_subpdiv
;
q
->
subpacket
[
i
].
ch_idx
=
chidx
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i] size %i js %i %i block_align %i
\n
"
,
i
,
q
->
subpacket
[
i
].
size
,
q
->
subpacket
[
i
].
joint_stereo
,
offset
,
avctx
->
block_align
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i] size %i js %i %i block_align %i
\n
"
,
i
,
q
->
subpacket
[
i
].
size
,
q
->
subpacket
[
i
].
joint_stereo
,
offset
,
avctx
->
block_align
);
decode_subpacket
(
q
,
&
q
->
subpacket
[
i
],
buf
+
offset
,
samples
);
offset
+=
q
->
subpacket
[
i
].
size
;
chidx
+=
q
->
subpacket
[
i
].
num_channels
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i] %i %i
\n
"
,
i
,
q
->
subpacket
[
i
].
size
*
8
,
get_bits_count
(
&
q
->
gb
));
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i] %i %i
\n
"
,
i
,
q
->
subpacket
[
i
].
size
*
8
,
get_bits_count
(
&
q
->
gb
));
}
/* Discard the first two frames: no valid audio. */
...
...
@@ -1011,7 +1011,7 @@ static int cook_decode_frame(AVCodecContext *avctx, void *data,
}
*
got_frame_ptr
=
1
;
*
(
AVFrame
*
)
data
=
q
->
frame
;
*
(
AVFrame
*
)
data
=
q
->
frame
;
return
avctx
->
block_align
;
}
...
...
@@ -1020,34 +1020,34 @@ static int cook_decode_frame(AVCodecContext *avctx, void *data,
static
void
dump_cook_context
(
COOKContext
*
q
)
{
//int i=0;
#define PRINT(a,
b) av_log(q->avctx,AV_LOG_ERROR,
" %s = %d\n", a, b);
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"COOKextradata
\n
"
);
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"cookversion=%x
\n
"
,
q
->
subpacket
[
0
].
cookversion
);
#define PRINT(a,
b) av_log(q->avctx, AV_LOG_ERROR,
" %s = %d\n", a, b);
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"COOKextradata
\n
"
);
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"cookversion=%x
\n
"
,
q
->
subpacket
[
0
].
cookversion
);
if
(
q
->
subpacket
[
0
].
cookversion
>
STEREO
)
{
PRINT
(
"js_subband_start"
,
q
->
subpacket
[
0
].
js_subband_start
);
PRINT
(
"js_vlc_bits"
,
q
->
subpacket
[
0
].
js_vlc_bits
);
}
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"COOKContext
\n
"
);
PRINT
(
"nb_channels"
,
q
->
nb_channels
);
PRINT
(
"bit_rate"
,
q
->
bit_rate
);
PRINT
(
"sample_rate"
,
q
->
sample_rate
);
PRINT
(
"samples_per_channel"
,
q
->
subpacket
[
0
].
samples_per_channel
);
PRINT
(
"samples_per_frame"
,
q
->
subpacket
[
0
].
samples_per_frame
);
PRINT
(
"subbands"
,
q
->
subpacket
[
0
].
subbands
);
PRINT
(
"js_subband_start"
,
q
->
subpacket
[
0
].
js_subband_start
);
PRINT
(
"log2_numvector_size"
,
q
->
subpacket
[
0
].
log2_numvector_size
);
PRINT
(
"numvector_size"
,
q
->
subpacket
[
0
].
numvector_size
);
PRINT
(
"total_subbands"
,
q
->
subpacket
[
0
].
total_subbands
);
PRINT
(
"js_subband_start"
,
q
->
subpacket
[
0
].
js_subband_start
);
PRINT
(
"js_vlc_bits"
,
q
->
subpacket
[
0
].
js_vlc_bits
);
}
av_log
(
q
->
avctx
,
AV_LOG_ERROR
,
"COOKContext
\n
"
);
PRINT
(
"nb_channels"
,
q
->
nb_channels
);
PRINT
(
"bit_rate"
,
q
->
bit_rate
);
PRINT
(
"sample_rate"
,
q
->
sample_rate
);
PRINT
(
"samples_per_channel"
,
q
->
subpacket
[
0
].
samples_per_channel
);
PRINT
(
"samples_per_frame"
,
q
->
subpacket
[
0
].
samples_per_frame
);
PRINT
(
"subbands"
,
q
->
subpacket
[
0
].
subbands
);
PRINT
(
"js_subband_start"
,
q
->
subpacket
[
0
].
js_subband_start
);
PRINT
(
"log2_numvector_size"
,
q
->
subpacket
[
0
].
log2_numvector_size
);
PRINT
(
"numvector_size"
,
q
->
subpacket
[
0
].
numvector_size
);
PRINT
(
"total_subbands"
,
q
->
subpacket
[
0
].
total_subbands
);
}
#endif
static
av_cold
int
cook_count_channels
(
unsigned
int
mask
){
static
av_cold
int
cook_count_channels
(
unsigned
int
mask
)
{
int
i
;
int
channels
=
0
;
for
(
i
=
0
;
i
<
32
;
i
++
){
if
(
mask
&
(
1
<<
i
))
for
(
i
=
0
;
i
<
32
;
i
++
)
if
(
mask
&
(
1
<<
i
))
++
channels
;
}
return
channels
;
}
...
...
@@ -1056,7 +1056,6 @@ static av_cold int cook_count_channels(unsigned int mask){
*
* @param avctx pointer to the AVCodecContext
*/
static
av_cold
int
cook_decode_init
(
AVCodecContext
*
avctx
)
{
COOKContext
*
q
=
avctx
->
priv_data
;
...
...
@@ -1070,10 +1069,10 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
/* Take care of the codec specific extradata. */
if
(
extradata_size
<=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Necessary extradata missing!
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Necessary extradata missing!
\n
"
);
return
AVERROR_INVALIDDATA
;
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"codecdata_length=%d
\n
"
,
avctx
->
extradata_size
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"codecdata_length=%d
\n
"
,
avctx
->
extradata_size
);
/* Take data from the AVCodecContext (RM container). */
q
->
sample_rate
=
avctx
->
sample_rate
;
...
...
@@ -1083,17 +1082,17 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
/* Initialize RNG. */
av_lfg_init
(
&
q
->
random_state
,
0
);
while
(
edata_ptr
<
edata_ptr_end
)
{
while
(
edata_ptr
<
edata_ptr_end
)
{
/* 8 for mono, 16 for stereo, ? for multichannel
Swap to right endianness so we don't need to care later on. */
if
(
extradata_size
>=
8
){
if
(
extradata_size
>=
8
)
{
q
->
subpacket
[
s
].
cookversion
=
bytestream_get_be32
(
&
edata_ptr
);
q
->
subpacket
[
s
].
samples_per_frame
=
bytestream_get_be16
(
&
edata_ptr
);
q
->
subpacket
[
s
].
subbands
=
bytestream_get_be16
(
&
edata_ptr
);
extradata_size
-=
8
;
}
if
(
extradata_size
>=
8
)
{
bytestream_get_be32
(
&
edata_ptr
);
//Unknown unused
bytestream_get_be32
(
&
edata_ptr
);
//
Unknown unused
q
->
subpacket
[
s
].
js_subband_start
=
bytestream_get_be16
(
&
edata_ptr
);
q
->
subpacket
[
s
].
js_vlc_bits
=
bytestream_get_be16
(
&
edata_ptr
);
extradata_size
-=
8
;
...
...
@@ -1110,7 +1109,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
/* Initialize version-dependent variables */
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i].cookversion=%x
\n
"
,
s
,
q
->
subpacket
[
s
].
cookversion
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"subpacket[%i].cookversion=%x
\n
"
,
s
,
q
->
subpacket
[
s
].
cookversion
);
q
->
subpacket
[
s
].
joint_stereo
=
0
;
switch
(
q
->
subpacket
[
s
].
cookversion
)
{
case
MONO
:
...
...
@@ -1118,23 +1118,24 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
av_log_ask_for_sample
(
avctx
,
"Container channels != 1.
\n
"
);
return
AVERROR_PATCHWELCOME
;
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"MONO
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"MONO
\n
"
);
break
;
case
STEREO
:
if
(
q
->
nb_channels
!=
1
)
{
q
->
subpacket
[
s
].
bits_per_subpdiv
=
1
;
q
->
subpacket
[
s
].
num_channels
=
2
;
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"STEREO
\n
"
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"STEREO
\n
"
);
break
;
case
JOINT_STEREO
:
if
(
q
->
nb_channels
!=
2
)
{
av_log_ask_for_sample
(
avctx
,
"Container channels != 2.
\n
"
);
return
AVERROR_PATCHWELCOME
;
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"JOINT_STEREO
\n
"
);
if
(
avctx
->
extradata_size
>=
16
){
q
->
subpacket
[
s
].
total_subbands
=
q
->
subpacket
[
s
].
subbands
+
q
->
subpacket
[
s
].
js_subband_start
;
av_log
(
avctx
,
AV_LOG_DEBUG
,
"JOINT_STEREO
\n
"
);
if
(
avctx
->
extradata_size
>=
16
)
{
q
->
subpacket
[
s
].
total_subbands
=
q
->
subpacket
[
s
].
subbands
+
q
->
subpacket
[
s
].
js_subband_start
;
q
->
subpacket
[
s
].
joint_stereo
=
1
;
q
->
subpacket
[
s
].
num_channels
=
2
;
}
...
...
@@ -1146,12 +1147,13 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
}
break
;
case
MC_COOK
:
av_log
(
avctx
,
AV_LOG_DEBUG
,
"MULTI_CHANNEL
\n
"
);
if
(
extradata_size
>=
4
)
av_log
(
avctx
,
AV_LOG_DEBUG
,
"MULTI_CHANNEL
\n
"
);
if
(
extradata_size
>=
4
)
channel_mask
|=
q
->
subpacket
[
s
].
channel_mask
=
bytestream_get_be32
(
&
edata_ptr
);
if
(
cook_count_channels
(
q
->
subpacket
[
s
].
channel_mask
)
>
1
){
q
->
subpacket
[
s
].
total_subbands
=
q
->
subpacket
[
s
].
subbands
+
q
->
subpacket
[
s
].
js_subband_start
;
if
(
cook_count_channels
(
q
->
subpacket
[
s
].
channel_mask
)
>
1
)
{
q
->
subpacket
[
s
].
total_subbands
=
q
->
subpacket
[
s
].
subbands
+
q
->
subpacket
[
s
].
js_subband_start
;
q
->
subpacket
[
s
].
joint_stereo
=
1
;
q
->
subpacket
[
s
].
num_channels
=
2
;
q
->
subpacket
[
s
].
samples_per_channel
=
q
->
subpacket
[
s
].
samples_per_frame
>>
1
;
...
...
@@ -1162,7 +1164,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
if
(
q
->
subpacket
[
s
].
samples_per_channel
>
512
)
{
q
->
subpacket
[
s
].
log2_numvector_size
=
7
;
}
}
else
}
else
q
->
subpacket
[
s
].
samples_per_channel
=
q
->
subpacket
[
s
].
samples_per_frame
;
break
;
...
...
@@ -1171,8 +1173,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return
AVERROR_PATCHWELCOME
;
}
if
(
s
>
1
&&
q
->
subpacket
[
s
].
samples_per_channel
!=
q
->
samples_per_channel
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"different number of samples per channel!
\n
"
);
if
(
s
>
1
&&
q
->
subpacket
[
s
].
samples_per_channel
!=
q
->
samples_per_channel
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"different number of samples per channel!
\n
"
);
return
AVERROR_INVALIDDATA
;
}
else
q
->
samples_per_channel
=
q
->
subpacket
[
0
].
samples_per_channel
;
...
...
@@ -1187,9 +1189,10 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return
AVERROR_PATCHWELCOME
;
}
if
((
q
->
subpacket
[
s
].
js_vlc_bits
>
6
)
||
(
q
->
subpacket
[
s
].
js_vlc_bits
<
2
*
q
->
subpacket
[
s
].
joint_stereo
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"js_vlc_bits = %d, only >= %d and <= 6 allowed!
\n
"
,
q
->
subpacket
[
s
].
js_vlc_bits
,
2
*
q
->
subpacket
[
s
].
joint_stereo
);
if
((
q
->
subpacket
[
s
].
js_vlc_bits
>
6
)
||
(
q
->
subpacket
[
s
].
js_vlc_bits
<
2
*
q
->
subpacket
[
s
].
joint_stereo
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"js_vlc_bits = %d, only >= %d and <= 6 allowed!
\n
"
,
q
->
subpacket
[
s
].
js_vlc_bits
,
2
*
q
->
subpacket
[
s
].
joint_stereo
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -1218,7 +1221,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return
ret
;
if
(
avctx
->
block_align
>=
UINT_MAX
/
2
)
if
(
avctx
->
block_align
>=
UINT_MAX
/
2
)
return
AVERROR
(
EINVAL
);
/* Pad the databuffer with:
...
...
@@ -1245,7 +1248,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
}
/* Try to catch some obviously faulty streams, othervise it might be exploitable */
if
((
q
->
samples_per_channel
==
256
)
||
(
q
->
samples_per_channel
==
512
)
||
(
q
->
samples_per_channel
==
1024
))
{
if
((
q
->
samples_per_channel
==
256
)
||
(
q
->
samples_per_channel
==
512
)
||
(
q
->
samples_per_channel
==
1024
))
{
}
else
{
av_log_ask_for_sample
(
avctx
,
"unknown amount of samples_per_channel = %d
\n
"
,
...
...
@@ -1257,7 +1261,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
if
(
channel_mask
)
avctx
->
channel_layout
=
channel_mask
;
else
avctx
->
channel_layout
=
(
avctx
->
channels
==
2
)
?
AV_CH_LAYOUT_STEREO
:
AV_CH_LAYOUT_MONO
;
avctx
->
channel_layout
=
(
avctx
->
channels
==
2
)
?
AV_CH_LAYOUT_STEREO
:
AV_CH_LAYOUT_MONO
;
avcodec_get_frame_defaults
(
&
q
->
frame
);
avctx
->
coded_frame
=
&
q
->
frame
;
...
...
@@ -1268,9 +1272,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return
0
;
}
AVCodec
ff_cook_decoder
=
{
AVCodec
ff_cook_decoder
=
{
.
name
=
"cook"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
CODEC_ID_COOK
,
...
...
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