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