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
d2a4e4b9
Commit
d2a4e4b9
authored
Sep 02, 2014
by
Gabriel Dume
Committed by
Diego Biurrun
Sep 03, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wma: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
c487972e
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
371 additions
and
382 deletions
+371
-382
wma.c
libavcodec/wma.c
+80
-89
wma.h
libavcodec/wma.h
+15
-14
wma_common.c
libavcodec/wma_common.c
+9
-12
wmadata.h
libavcodec/wmadata.h
+17
-29
wmadec.c
libavcodec/wmadec.c
+134
-134
wmaenc.c
libavcodec/wmaenc.c
+116
-104
No files found.
libavcodec/wma.c
View file @
d2a4e4b9
...
...
@@ -20,6 +20,7 @@
*/
#include "libavutil/attributes.h"
#include "avcodec.h"
#include "sinewin.h"
#include "wma.h"
...
...
@@ -30,7 +31,7 @@
#include <assert.h>
/* XXX: use same run/length optimization as mpeg decoders */
//FIXME maybe split decode / encode or pass flag
//
FIXME maybe split decode / encode or pass flag
static
av_cold
void
init_coef_vlc
(
VLC
*
vlc
,
uint16_t
**
prun_table
,
float
**
plevel_table
,
uint16_t
**
pint_table
,
const
CoefVLCTable
*
vlc_table
)
...
...
@@ -47,7 +48,7 @@ static av_cold void init_coef_vlc(VLC *vlc, uint16_t **prun_table,
run_table
=
av_malloc
(
n
*
sizeof
(
uint16_t
));
level_table
=
av_malloc
(
n
*
sizeof
(
uint16_t
));
flevel_table
=
av_malloc
(
n
*
sizeof
(
*
flevel_table
));
flevel_table
=
av_malloc
(
n
*
sizeof
(
*
flevel_table
));
int_table
=
av_malloc
(
n
*
sizeof
(
uint16_t
));
i
=
2
;
level
=
1
;
...
...
@@ -58,7 +59,7 @@ static av_cold void init_coef_vlc(VLC *vlc, uint16_t **prun_table,
for
(
j
=
0
;
j
<
l
;
j
++
)
{
run_table
[
i
]
=
j
;
level_table
[
i
]
=
level
;
flevel_table
[
i
]
=
level
;
flevel_table
[
i
]
=
level
;
i
++
;
}
level
++
;
...
...
@@ -78,19 +79,18 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
int
sample_rate1
;
int
coef_vlc_table
;
if
(
avctx
->
sample_rate
<=
0
||
avctx
->
sample_rate
>
50000
||
avctx
->
channels
<=
0
||
avctx
->
channels
>
2
||
avctx
->
bit_rate
<=
0
)
if
(
avctx
->
sample_rate
<=
0
||
avctx
->
sample_rate
>
50000
||
avctx
->
channels
<=
0
||
avctx
->
channels
>
2
||
avctx
->
bit_rate
<=
0
)
return
-
1
;
ff_fmt_convert_init
(
&
s
->
fmt_conv
,
avctx
);
avpriv_float_dsp_init
(
&
s
->
fdsp
,
avctx
->
flags
&
CODEC_FLAG_BITEXACT
);
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV1
)
{
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV1
)
s
->
version
=
1
;
}
else
{
else
s
->
version
=
2
;
}
/* compute MDCT block size */
s
->
frame_len_bits
=
ff_wma_get_frame_len_bits
(
avctx
->
sample_rate
,
...
...
@@ -109,9 +109,8 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
if
(
nb
>
nb_max
)
nb
=
nb_max
;
s
->
nb_block_sizes
=
nb
+
1
;
}
else
{
}
else
s
->
nb_block_sizes
=
1
;
}
/* init rate dependent parameters */
s
->
use_noise_coding
=
1
;
...
...
@@ -120,66 +119,61 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
/* if version 2, then the rates are normalized */
sample_rate1
=
avctx
->
sample_rate
;
if
(
s
->
version
==
2
)
{
if
(
sample_rate1
>=
44100
)
{
if
(
sample_rate1
>=
44100
)
sample_rate1
=
44100
;
}
else
if
(
sample_rate1
>=
22050
)
{
else
if
(
sample_rate1
>=
22050
)
sample_rate1
=
22050
;
}
else
if
(
sample_rate1
>=
16000
)
{
else
if
(
sample_rate1
>=
16000
)
sample_rate1
=
16000
;
}
else
if
(
sample_rate1
>=
11025
)
{
else
if
(
sample_rate1
>=
11025
)
sample_rate1
=
11025
;
}
else
if
(
sample_rate1
>=
8000
)
{
else
if
(
sample_rate1
>=
8000
)
sample_rate1
=
8000
;
}
}
bps
=
(
float
)
avctx
->
bit_rate
/
(
float
)(
avctx
->
channels
*
avctx
->
sample_rate
);
s
->
byte_offset_bits
=
av_log2
((
int
)(
bps
*
s
->
frame_len
/
8
.
0
+
0
.
5
))
+
2
;
bps
=
(
float
)
avctx
->
bit_rate
/
(
float
)
(
avctx
->
channels
*
avctx
->
sample_rate
);
s
->
byte_offset_bits
=
av_log2
((
int
)
(
bps
*
s
->
frame_len
/
8
.
0
+
0
.
5
))
+
2
;
/* compute high frequency value and choose if noise coding should
be activated */
*
be activated */
bps1
=
bps
;
if
(
avctx
->
channels
==
2
)
bps1
=
bps
*
1
.
6
;
if
(
sample_rate1
==
44100
)
{
if
(
bps1
>=
0
.
61
)
{
if
(
bps1
>=
0
.
61
)
s
->
use_noise_coding
=
0
;
}
else
{
else
high_freq
=
high_freq
*
0
.
4
;
}
}
else
if
(
sample_rate1
==
22050
)
{
if
(
bps1
>=
1
.
16
)
{
if
(
bps1
>=
1
.
16
)
s
->
use_noise_coding
=
0
;
}
else
if
(
bps1
>=
0
.
72
)
{
else
if
(
bps1
>=
0
.
72
)
high_freq
=
high_freq
*
0
.
7
;
}
else
{
else
high_freq
=
high_freq
*
0
.
6
;
}
}
else
if
(
sample_rate1
==
16000
)
{
if
(
bps
>
0
.
5
)
{
if
(
bps
>
0
.
5
)
high_freq
=
high_freq
*
0
.
5
;
}
else
{
else
high_freq
=
high_freq
*
0
.
3
;
}
}
else
if
(
sample_rate1
==
11025
)
{
}
else
if
(
sample_rate1
==
11025
)
high_freq
=
high_freq
*
0
.
7
;
}
else
if
(
sample_rate1
==
8000
)
{
if
(
bps
<=
0
.
625
)
{
else
if
(
sample_rate1
==
8000
)
{
if
(
bps
<=
0
.
625
)
high_freq
=
high_freq
*
0
.
5
;
}
else
if
(
bps
>
0
.
75
)
{
else
if
(
bps
>
0
.
75
)
s
->
use_noise_coding
=
0
;
}
else
{
else
high_freq
=
high_freq
*
0
.
65
;
}
}
else
{
if
(
bps
>=
0
.
8
)
{
if
(
bps
>=
0
.
8
)
high_freq
=
high_freq
*
0
.
75
;
}
else
if
(
bps
>=
0
.
6
)
{
else
if
(
bps
>=
0
.
6
)
high_freq
=
high_freq
*
0
.
6
;
}
else
{
else
high_freq
=
high_freq
*
0
.
5
;
}
}
av_dlog
(
s
->
avctx
,
"flags2=0x%x
\n
"
,
flags2
);
av_dlog
(
s
->
avctx
,
"version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d
\n
"
,
s
->
version
,
avctx
->
channels
,
avctx
->
sample_rate
,
avctx
->
bit_rate
,
...
...
@@ -194,11 +188,10 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
int
a
,
b
,
pos
,
lpos
,
k
,
block_len
,
i
,
j
,
n
;
const
uint8_t
*
table
;
if
(
s
->
version
==
1
)
{
if
(
s
->
version
==
1
)
s
->
coefs_start
=
3
;
}
else
{
else
s
->
coefs_start
=
0
;
}
for
(
k
=
0
;
k
<
s
->
nb_block_sizes
;
k
++
)
{
block_len
=
s
->
frame_len
>>
k
;
...
...
@@ -223,14 +216,13 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
table
=
NULL
;
a
=
s
->
frame_len_bits
-
BLOCK_MIN_BITS
-
k
;
if
(
a
<
3
)
{
if
(
avctx
->
sample_rate
>=
44100
)
{
if
(
avctx
->
sample_rate
>=
44100
)
table
=
exponent_band_44100
[
a
];
}
else
if
(
avctx
->
sample_rate
>=
32000
)
{
else
if
(
avctx
->
sample_rate
>=
32000
)
table
=
exponent_band_32000
[
a
];
}
else
if
(
avctx
->
sample_rate
>=
22050
)
{
else
if
(
avctx
->
sample_rate
>=
22050
)
table
=
exponent_band_22050
[
a
];
}
}
if
(
table
)
{
n
=
*
table
++
;
for
(
i
=
0
;
i
<
n
;
i
++
)
...
...
@@ -259,7 +251,7 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
/* max number of coefs */
s
->
coefs_end
[
k
]
=
(
s
->
frame_len
-
((
s
->
frame_len
*
9
)
/
100
))
>>
k
;
/* high freq computation */
s
->
high_band_start
[
k
]
=
(
int
)((
block_len
*
2
*
high_freq
)
/
s
->
high_band_start
[
k
]
=
(
int
)
((
block_len
*
2
*
high_freq
)
/
avctx
->
sample_rate
+
0
.
5
);
n
=
s
->
exponent_sizes
[
k
];
j
=
0
;
...
...
@@ -286,7 +278,7 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
for (j = 0; j < s->exponent_high_sizes[k]; j++)
tprintf(s->avctx, " %d", s->exponent_high_bands[k][j]);
tprintf(s->avctx, "\n");
#endif
#endif
/* 0 */
}
}
...
...
@@ -302,7 +294,7 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
tprintf
(
s
->
avctx
,
"
\n
"
);
}
}
#endif
#endif
/* TRACE */
/* init MDCT windows : simple sine window */
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
{
...
...
@@ -313,13 +305,11 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
s
->
reset_block_lengths
=
1
;
if
(
s
->
use_noise_coding
)
{
/* init the noise generator */
if
(
s
->
use_exp_vlc
)
{
if
(
s
->
use_exp_vlc
)
s
->
noise_mult
=
0
.
02
;
}
else
{
else
s
->
noise_mult
=
0
.
04
;
}
#ifdef TRACE
for
(
i
=
0
;
i
<
NOISE_TAB_SIZE
;
i
++
)
...
...
@@ -329,41 +319,45 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
unsigned
int
seed
;
float
norm
;
seed
=
1
;
norm
=
(
1
.
0
/
(
float
)(
1LL
<<
31
))
*
sqrt
(
3
)
*
s
->
noise_mult
;
norm
=
(
1
.
0
/
(
float
)
(
1LL
<<
31
))
*
sqrt
(
3
)
*
s
->
noise_mult
;
for
(
i
=
0
;
i
<
NOISE_TAB_SIZE
;
i
++
)
{
seed
=
seed
*
314159
+
1
;
s
->
noise_table
[
i
]
=
(
float
)
((
int
)
seed
)
*
norm
;
s
->
noise_table
[
i
]
=
(
float
)
((
int
)
seed
)
*
norm
;
}
}
#endif
#endif
/* TRACE */
}
/* choose the VLC tables for the coefficients */
coef_vlc_table
=
2
;
if
(
avctx
->
sample_rate
>=
32000
)
{
if
(
bps1
<
0
.
72
)
{
if
(
bps1
<
0
.
72
)
coef_vlc_table
=
0
;
}
else
if
(
bps1
<
1
.
16
)
{
else
if
(
bps1
<
1
.
16
)
coef_vlc_table
=
1
;
}
}
s
->
coef_vlcs
[
0
]
=
&
coef_vlcs
[
coef_vlc_table
*
2
];
s
->
coef_vlcs
[
1
]
=
&
coef_vlcs
[
coef_vlc_table
*
2
+
1
];
init_coef_vlc
(
&
s
->
coef_vlc
[
0
],
&
s
->
run_table
[
0
],
&
s
->
level_table
[
0
],
&
s
->
int_table
[
0
],
s
->
coef_vlcs
[
0
]);
init_coef_vlc
(
&
s
->
coef_vlc
[
1
],
&
s
->
run_table
[
1
],
&
s
->
level_table
[
1
],
&
s
->
int_table
[
1
],
s
->
coef_vlcs
[
1
]);
s
->
coef_vlcs
[
0
]
=
&
coef_vlcs
[
coef_vlc_table
*
2
];
s
->
coef_vlcs
[
1
]
=
&
coef_vlcs
[
coef_vlc_table
*
2
+
1
];
init_coef_vlc
(
&
s
->
coef_vlc
[
0
],
&
s
->
run_table
[
0
],
&
s
->
level_table
[
0
],
&
s
->
int_table
[
0
],
s
->
coef_vlcs
[
0
]);
init_coef_vlc
(
&
s
->
coef_vlc
[
1
],
&
s
->
run_table
[
1
],
&
s
->
level_table
[
1
],
&
s
->
int_table
[
1
],
s
->
coef_vlcs
[
1
]);
return
0
;
}
int
ff_wma_total_gain_to_bits
(
int
total_gain
)
{
if
(
total_gain
<
15
)
return
13
;
else
if
(
total_gain
<
32
)
return
12
;
else
if
(
total_gain
<
40
)
return
11
;
else
if
(
total_gain
<
45
)
return
10
;
else
return
9
;
if
(
total_gain
<
15
)
return
13
;
else
if
(
total_gain
<
32
)
return
12
;
else
if
(
total_gain
<
40
)
return
11
;
else
if
(
total_gain
<
45
)
return
10
;
else
return
9
;
}
int
ff_wma_end
(
AVCodecContext
*
avctx
)
...
...
@@ -374,12 +368,10 @@ int ff_wma_end(AVCodecContext *avctx)
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
ff_mdct_end
(
&
s
->
mdct_ctx
[
i
]);
if
(
s
->
use_exp_vlc
)
{
if
(
s
->
use_exp_vlc
)
ff_free_vlc
(
&
s
->
exp_vlc
);
}
if
(
s
->
use_noise_coding
)
{
if
(
s
->
use_noise_coding
)
ff_free_vlc
(
&
s
->
hgain_vlc
);
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
ff_free_vlc
(
&
s
->
coef_vlc
[
i
]);
av_free
(
s
->
run_table
[
i
]);
...
...
@@ -395,7 +387,7 @@ int ff_wma_end(AVCodecContext *avctx)
* @param gb GetBitContext
* @return the decoded coefficient
*/
unsigned
int
ff_wma_get_large_val
(
GetBitContext
*
gb
)
unsigned
int
ff_wma_get_large_val
(
GetBitContext
*
gb
)
{
/** consumes up to 34 bits */
int
n_bits
=
8
;
...
...
@@ -404,11 +396,10 @@ unsigned int ff_wma_get_large_val(GetBitContext* gb)
n_bits
+=
8
;
if
(
get_bits1
(
gb
))
{
n_bits
+=
8
;
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
n_bits
+=
7
;
}
}
}
return
get_bits_long
(
gb
,
n_bits
);
}
...
...
@@ -428,16 +419,16 @@ unsigned int ff_wma_get_large_val(GetBitContext* gb)
* @param coef_nb_bits number of bits for escaped level codes
* @return 0 on success, -1 otherwise
*/
int
ff_wma_run_level_decode
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
VLC
*
vlc
,
const
float
*
level_table
,
const
uint16_t
*
run_table
,
int
version
,
WMACoef
*
ptr
,
int
offset
,
int
num_coefs
,
int
block_len
,
int
frame_len_bits
,
int
ff_wma_run_level_decode
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
VLC
*
vlc
,
const
float
*
level_table
,
const
uint16_t
*
run_table
,
int
version
,
WMACoef
*
ptr
,
int
offset
,
int
num_coefs
,
int
block_len
,
int
frame_len_bits
,
int
coef_nb_bits
)
{
int
code
,
level
,
sign
;
const
uint32_t
*
ilvl
=
(
const
uint32_t
*
)
level_table
;
uint32_t
*
iptr
=
(
uint32_t
*
)
ptr
;
const
uint32_t
*
ilvl
=
(
const
uint32_t
*
)
level_table
;
uint32_t
*
iptr
=
(
uint32_t
*
)
ptr
;
const
unsigned
int
coef_mask
=
block_len
-
1
;
for
(;
offset
<
num_coefs
;
offset
++
)
{
code
=
get_vlc2
(
gb
,
vlc
->
table
,
VLCBITS
,
VLCMAX
);
...
...
@@ -445,7 +436,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
/** normal code */
offset
+=
run_table
[
code
];
sign
=
get_bits1
(
gb
)
-
1
;
iptr
[
offset
&
coef_mask
]
=
ilvl
[
code
]
^
sign
<<
31
;
iptr
[
offset
&
coef_mask
]
=
ilvl
[
code
]
^
sign
<<
31
;
}
else
if
(
code
==
1
)
{
/** EOB */
break
;
...
...
@@ -454,7 +445,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
if
(
!
version
)
{
level
=
get_bits
(
gb
,
coef_nb_bits
);
/** NOTE: this is rather suboptimal. reading
block_len_bits would be better */
*
block_len_bits would be better */
offset
+=
get_bits
(
gb
,
frame_len_bits
);
}
else
{
level
=
ff_wma_get_large_val
(
gb
);
...
...
@@ -462,7 +453,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"broken escape sequence
\n
"
);
return
-
1
;
}
else
...
...
@@ -472,7 +463,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
}
}
sign
=
get_bits1
(
gb
)
-
1
;
ptr
[
offset
&
coef_mask
]
=
(
level
^
sign
)
-
sign
;
ptr
[
offset
&
coef_mask
]
=
(
level
^
sign
)
-
sign
;
}
}
/** NOTE: EOB can be omitted */
...
...
libavcodec/wma.h
View file @
d2a4e4b9
...
...
@@ -23,10 +23,11 @@
#define AVCODEC_WMA_H
#include "libavutil/float_dsp.h"
#include "get_bits.h"
#include "put_bits.h"
#include "fft.h"
#include "fmtconvert.h"
#include "get_bits.h"
#include "put_bits.h"
/* size of blocks */
#define BLOCK_MIN_BITS 7
...
...
@@ -49,9 +50,9 @@
#define LSP_POW_BITS 7
//FIXME should be in wmadec
//
FIXME should be in wmadec
#define VLCBITS 9
#define VLCMAX ((22
+VLCBITS-1)/
VLCBITS)
#define VLCMAX ((22
+ VLCBITS - 1) /
VLCBITS)
typedef
float
WMACoef
;
///< type for decoded coefficients, int16_t would be enough for wma 1/2
...
...
@@ -64,7 +65,7 @@ typedef struct CoefVLCTable {
}
CoefVLCTable
;
typedef
struct
WMACodecContext
{
AVCodecContext
*
avctx
;
AVCodecContext
*
avctx
;
GetBitContext
gb
;
PutBitContext
pb
;
int
version
;
///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2)
...
...
@@ -88,7 +89,7 @@ typedef struct WMACodecContext {
int
high_band_values
[
MAX_CHANNELS
][
HIGH_BAND_MAX_SIZE
];
/* there are two possible tables for spectral coefficients */
//FIXME the following 3 tables should be shared between decoders
//
FIXME the following 3 tables should be shared between decoders
VLC
coef_vlc
[
2
];
uint16_t
*
run_table
[
2
];
float
*
level_table
[
2
];
...
...
@@ -135,7 +136,7 @@ typedef struct WMACodecContext {
#ifdef TRACE
int
frame_count
;
#endif
#endif
/* TRACE */
}
WMACodecContext
;
extern
const
uint16_t
ff_wma_critical_freqs
[
25
];
...
...
@@ -145,15 +146,15 @@ extern const float ff_wma_lsp_codebook[NB_LSP_COEFS][16];
extern
const
uint32_t
ff_aac_scalefactor_code
[
121
];
extern
const
uint8_t
ff_aac_scalefactor_bits
[
121
];
int
ff_wma_init
(
AVCodecContext
*
avctx
,
int
flags2
);
int
ff_wma_init
(
AVCodecContext
*
avctx
,
int
flags2
);
int
ff_wma_total_gain_to_bits
(
int
total_gain
);
int
ff_wma_end
(
AVCodecContext
*
avctx
);
unsigned
int
ff_wma_get_large_val
(
GetBitContext
*
gb
);
int
ff_wma_run_level_decode
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
VLC
*
vlc
,
const
float
*
level_table
,
const
uint16_t
*
run_table
,
int
version
,
WMACoef
*
ptr
,
int
offset
,
int
num_coefs
,
int
block_len
,
int
frame_len_bits
,
unsigned
int
ff_wma_get_large_val
(
GetBitContext
*
gb
);
int
ff_wma_run_level_decode
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
VLC
*
vlc
,
const
float
*
level_table
,
const
uint16_t
*
run_table
,
int
version
,
WMACoef
*
ptr
,
int
offset
,
int
num_coefs
,
int
block_len
,
int
frame_len_bits
,
int
coef_nb_bits
);
#endif
/* AVCODEC_WMA_H */
libavcodec/wma_common.c
View file @
d2a4e4b9
...
...
@@ -19,6 +19,7 @@
*/
#include "libavutil/attributes.h"
#include "wma_common.h"
/**
...
...
@@ -31,32 +32,28 @@
av_cold
int
ff_wma_get_frame_len_bits
(
int
sample_rate
,
int
version
,
unsigned
int
decode_flags
)
{
int
frame_len_bits
;
if
(
sample_rate
<=
16000
)
{
if
(
sample_rate
<=
16000
)
frame_len_bits
=
9
;
}
else
if
(
sample_rate
<=
22050
||
(
sample_rate
<=
32000
&&
version
==
1
))
{
else
if
(
sample_rate
<=
22050
||
(
sample_rate
<=
32000
&&
version
==
1
))
frame_len_bits
=
10
;
}
else
if
(
sample_rate
<=
48000
||
version
<
3
)
{
else
if
(
sample_rate
<=
48000
||
version
<
3
)
frame_len_bits
=
11
;
}
else
if
(
sample_rate
<=
96000
)
{
else
if
(
sample_rate
<=
96000
)
frame_len_bits
=
12
;
}
else
{
else
frame_len_bits
=
13
;
}
if
(
version
==
3
)
{
int
tmp
=
decode_flags
&
0x6
;
if
(
tmp
==
0x2
)
{
if
(
tmp
==
0x2
)
++
frame_len_bits
;
}
else
if
(
tmp
==
0x4
)
{
else
if
(
tmp
==
0x4
)
--
frame_len_bits
;
}
else
if
(
tmp
==
0x6
)
{
else
if
(
tmp
==
0x6
)
frame_len_bits
-=
2
;
}
}
return
frame_len_bits
;
}
libavcodec/wmadata.h
View file @
d2a4e4b9
...
...
@@ -28,6 +28,7 @@
#define AVCODEC_WMADATA_H
#include <stdint.h>
#include "wma.h"
const
uint16_t
ff_wma_critical_freqs
[
25
]
=
{
...
...
@@ -41,7 +42,8 @@ const uint16_t ff_wma_critical_freqs[25] = {
static
const
uint8_t
exponent_band_22050
[
3
][
25
]
=
{
{
10
,
4
,
8
,
4
,
8
,
8
,
12
,
20
,
24
,
24
,
16
,
},
{
14
,
4
,
8
,
8
,
4
,
12
,
12
,
16
,
24
,
16
,
20
,
24
,
32
,
40
,
36
,
},
{
23
,
4
,
4
,
4
,
8
,
4
,
4
,
8
,
8
,
8
,
8
,
8
,
12
,
12
,
16
,
16
,
24
,
24
,
32
,
44
,
48
,
60
,
84
,
72
,
},
{
23
,
4
,
4
,
4
,
8
,
4
,
4
,
8
,
8
,
8
,
8
,
8
,
12
,
12
,
16
,
16
,
24
,
24
,
32
,
44
,
48
,
60
,
84
,
72
,
},
};
static
const
uint8_t
exponent_band_32000
[
3
][
25
]
=
{
...
...
@@ -65,10 +67,8 @@ const uint16_t ff_wma_hgain_huffcodes[37] = {
};
const
uint8_t
ff_wma_hgain_huffbits
[
37
]
=
{
10
,
12
,
10
,
13
,
9
,
13
,
9
,
8
,
7
,
5
,
5
,
4
,
4
,
3
,
3
,
3
,
4
,
3
,
4
,
4
,
5
,
5
,
6
,
8
,
7
,
10
,
8
,
10
,
9
,
8
,
9
,
9
,
10
,
12
,
10
,
13
,
9
,
13
,
9
,
8
,
7
,
5
,
5
,
4
,
4
,
3
,
3
,
3
,
4
,
3
,
4
,
4
,
5
,
5
,
6
,
8
,
7
,
10
,
8
,
10
,
9
,
8
,
9
,
9
,
13
,
10
,
13
,
13
,
13
,
};
...
...
@@ -1269,7 +1269,7 @@ static const uint8_t coef5_huffbits[435] = {
};
static
const
uint16_t
levels0
[
60
]
=
{
317
,
92
,
62
,
60
,
19
,
17
,
10
,
7
,
317
,
92
,
62
,
60
,
19
,
17
,
10
,
7
,
6
,
5
,
5
,
3
,
3
,
3
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
1
,
2
,
2
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
...
...
@@ -1280,7 +1280,7 @@ static const uint16_t levels0[60] = {
};
static
const
uint16_t
levels1
[
40
]
=
{
311
,
91
,
61
,
28
,
10
,
6
,
5
,
2
,
311
,
91
,
61
,
28
,
10
,
6
,
5
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
...
...
@@ -1288,7 +1288,7 @@ static const uint16_t levels1[40] = {
};
static
const
uint16_t
levels2
[
340
]
=
{
181
,
110
,
78
,
63
,
61
,
62
,
60
,
61
,
181
,
110
,
78
,
63
,
61
,
62
,
60
,
61
,
33
,
41
,
41
,
19
,
17
,
19
,
12
,
11
,
9
,
11
,
10
,
6
,
8
,
7
,
6
,
4
,
5
,
5
,
4
,
4
,
3
,
4
,
3
,
5
,
...
...
@@ -1334,7 +1334,7 @@ static const uint16_t levels2[340] = {
};
static
const
uint16_t
levels3
[
180
]
=
{
351
,
122
,
76
,
61
,
41
,
42
,
24
,
30
,
351
,
122
,
76
,
61
,
41
,
42
,
24
,
30
,
22
,
19
,
11
,
9
,
10
,
8
,
5
,
5
,
4
,
5
,
5
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
2
,
2
,
3
,
2
,
2
,
2
,
...
...
@@ -1360,7 +1360,7 @@ static const uint16_t levels3[180] = {
};
static
const
uint16_t
levels4
[
70
]
=
{
113
,
68
,
49
,
42
,
40
,
32
,
27
,
15
,
113
,
68
,
49
,
42
,
40
,
32
,
27
,
15
,
10
,
5
,
3
,
3
,
3
,
3
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
...
...
@@ -1372,7 +1372,7 @@ static const uint16_t levels4[70] = {
};
static
const
uint16_t
levels5
[
40
]
=
{
214
,
72
,
42
,
40
,
18
,
4
,
4
,
2
,
214
,
72
,
42
,
40
,
18
,
4
,
4
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
2
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
...
...
@@ -1380,24 +1380,12 @@ static const uint16_t levels5[40] = {
};
static
const
CoefVLCTable
coef_vlcs
[
6
]
=
{
{
sizeof
(
coef0_huffbits
),
sizeof
(
levels0
)
/
2
,
coef0_huffcodes
,
coef0_huffbits
,
levels0
,
},
{
sizeof
(
coef1_huffbits
),
sizeof
(
levels1
)
/
2
,
coef1_huffcodes
,
coef1_huffbits
,
levels1
,
},
{
sizeof
(
coef2_huffbits
),
sizeof
(
levels2
)
/
2
,
coef2_huffcodes
,
coef2_huffbits
,
levels2
,
},
{
sizeof
(
coef3_huffbits
),
sizeof
(
levels3
)
/
2
,
coef3_huffcodes
,
coef3_huffbits
,
levels3
,
},
{
sizeof
(
coef4_huffbits
),
sizeof
(
levels4
)
/
2
,
coef4_huffcodes
,
coef4_huffbits
,
levels4
,
},
{
sizeof
(
coef5_huffbits
),
sizeof
(
levels5
)
/
2
,
coef5_huffcodes
,
coef5_huffbits
,
levels5
,
},
{
sizeof
(
coef0_huffbits
),
sizeof
(
levels0
)
/
2
,
coef0_huffcodes
,
coef0_huffbits
,
levels0
,
},
{
sizeof
(
coef1_huffbits
),
sizeof
(
levels1
)
/
2
,
coef1_huffcodes
,
coef1_huffbits
,
levels1
,
},
{
sizeof
(
coef2_huffbits
),
sizeof
(
levels2
)
/
2
,
coef2_huffcodes
,
coef2_huffbits
,
levels2
,
},
{
sizeof
(
coef3_huffbits
),
sizeof
(
levels3
)
/
2
,
coef3_huffcodes
,
coef3_huffbits
,
levels3
,
},
{
sizeof
(
coef4_huffbits
),
sizeof
(
levels4
)
/
2
,
coef4_huffcodes
,
coef4_huffbits
,
levels4
,
},
{
sizeof
(
coef5_huffbits
),
sizeof
(
levels5
)
/
2
,
coef5_huffcodes
,
coef5_huffbits
,
levels5
,
},
};
#endif
/* AVCODEC_WMADATA_H */
libavcodec/wmadec.c
View file @
d2a4e4b9
...
...
@@ -34,6 +34,7 @@
*/
#include "libavutil/attributes.h"
#include "avcodec.h"
#include "internal.h"
#include "wma.h"
...
...
@@ -42,20 +43,21 @@
#include <assert.h>
#define EXPVLCBITS 8
#define EXPMAX
((19+EXPVLCBITS-1)/
EXPVLCBITS)
#define EXPMAX
((19 + EXPVLCBITS - 1) /
EXPVLCBITS)
#define HGAINVLCBITS 9
#define HGAINMAX
((13+HGAINVLCBITS-1)/
HGAINVLCBITS)
#define HGAINMAX
((13 + HGAINVLCBITS - 1) /
HGAINVLCBITS)
static
void
wma_lsp_to_curve_init
(
WMACodecContext
*
s
,
int
frame_len
);
#ifdef TRACE
static
void
dump_floats
(
WMACodecContext
*
s
,
const
char
*
name
,
int
prec
,
const
float
*
tab
,
int
n
)
static
void
dump_floats
(
WMACodecContext
*
s
,
const
char
*
name
,
int
prec
,
const
float
*
tab
,
int
n
)
{
int
i
;
tprintf
(
s
->
avctx
,
"%s[%d]:
\n
"
,
name
,
n
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
((
i
&
7
)
==
0
)
tprintf
(
s
->
avctx
,
"%4d: "
,
i
);
tprintf
(
s
->
avctx
,
" %8.*f"
,
prec
,
tab
[
i
]);
...
...
@@ -65,9 +67,9 @@ static void dump_floats(WMACodecContext *s, const char *name, int prec, const fl
if
((
i
&
7
)
!=
0
)
tprintf
(
s
->
avctx
,
"
\n
"
);
}
#endif
#endif
/* TRACE */
static
av_cold
int
wma_decode_init
(
AVCodecContext
*
avctx
)
static
av_cold
int
wma_decode_init
(
AVCodecContext
*
avctx
)
{
WMACodecContext
*
s
=
avctx
->
priv_data
;
int
i
,
flags2
;
...
...
@@ -83,21 +85,20 @@ static av_cold int wma_decode_init(AVCodecContext * avctx)
/* extract flag infos */
flags2
=
0
;
extradata
=
avctx
->
extradata
;
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV1
&&
avctx
->
extradata_size
>=
4
)
{
flags2
=
AV_RL16
(
extradata
+
2
);
}
else
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV2
&&
avctx
->
extradata_size
>=
6
)
{
flags2
=
AV_RL16
(
extradata
+
4
);
}
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV1
&&
avctx
->
extradata_size
>=
4
)
flags2
=
AV_RL16
(
extradata
+
2
);
else
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV2
&&
avctx
->
extradata_size
>=
6
)
flags2
=
AV_RL16
(
extradata
+
4
);
s
->
use_exp_vlc
=
flags2
&
0x0001
;
s
->
use_bit_reservoir
=
flags2
&
0x0002
;
s
->
use_variable_block_len
=
flags2
&
0x0004
;
if
(
ff_wma_init
(
avctx
,
flags2
)
<
0
)
if
(
ff_wma_init
(
avctx
,
flags2
)
<
0
)
return
-
1
;
/* init MDCT */
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
ff_mdct_init
(
&
s
->
mdct_ctx
[
i
],
s
->
frame_len_bits
-
i
+
1
,
1
,
1
.
0
/
32768
.
0
);
if
(
s
->
use_noise_coding
)
{
...
...
@@ -106,13 +107,12 @@ static av_cold int wma_decode_init(AVCodecContext * avctx)
ff_wma_hgain_huffcodes
,
2
,
2
,
0
);
}
if
(
s
->
use_exp_vlc
)
{
init_vlc
(
&
s
->
exp_vlc
,
EXPVLCBITS
,
sizeof
(
ff_aac_scalefactor_bits
),
//FIXME move out of context
if
(
s
->
use_exp_vlc
)
init_vlc
(
&
s
->
exp_vlc
,
EXPVLCBITS
,
sizeof
(
ff_aac_scalefactor_bits
),
//
FIXME move out of context
ff_aac_scalefactor_bits
,
1
,
1
,
ff_aac_scalefactor_code
,
4
,
4
,
0
);
}
else
{
else
wma_lsp_to_curve_init
(
s
,
s
->
frame_len
);
}
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLTP
;
...
...
@@ -150,21 +150,21 @@ static av_cold void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
int
i
,
e
,
m
;
wdel
=
M_PI
/
frame_len
;
for
(
i
=
0
;
i
<
frame_len
;
i
++
)
for
(
i
=
0
;
i
<
frame_len
;
i
++
)
s
->
lsp_cos_table
[
i
]
=
2
.
0
f
*
cos
(
wdel
*
i
);
/* tables for x^-0.25 computation */
for
(
i
=
0
;
i
<
256
;
i
++
)
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
e
=
i
-
126
;
s
->
lsp_pow_e_table
[
i
]
=
pow
(
2
.
0
,
e
*
-
0
.
25
);
}
/* NOTE: these two tables are needed to avoid two operations in
pow_m1_4 */
*
pow_m1_4 */
b
=
1
.
0
;
for
(
i
=
(
1
<<
LSP_POW_BITS
)
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
(
1
<<
LSP_POW_BITS
)
-
1
;
i
>=
0
;
i
--
)
{
m
=
(
1
<<
LSP_POW_BITS
)
+
i
;
a
=
(
float
)
m
*
(
0
.
5
/
(
1
<<
LSP_POW_BITS
));
a
=
(
float
)
m
*
(
0
.
5
/
(
1
<<
LSP_POW_BITS
));
a
=
pow
(
a
,
-
0
.
25
);
s
->
lsp_pow_m_table1
[
i
]
=
2
*
a
-
b
;
s
->
lsp_pow_m_table2
[
i
]
=
b
-
a
;
...
...
@@ -176,19 +176,18 @@ static av_cold void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
* NOTE: We use the same code as Vorbis here
* @todo optimize it further with SSE/3Dnow
*/
static
void
wma_lsp_to_curve
(
WMACodecContext
*
s
,
float
*
out
,
float
*
val_max_ptr
,
static
void
wma_lsp_to_curve
(
WMACodecContext
*
s
,
float
*
out
,
float
*
val_max_ptr
,
int
n
,
float
*
lsp
)
{
int
i
,
j
;
float
p
,
q
,
w
,
v
,
val_max
;
val_max
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
p
=
0
.
5
f
;
q
=
0
.
5
f
;
w
=
s
->
lsp_cos_table
[
i
];
for
(
j
=
1
;
j
<
NB_LSP_COEFS
;
j
+=
2
)
{
for
(
j
=
1
;
j
<
NB_LSP_COEFS
;
j
+=
2
)
{
q
*=
w
-
lsp
[
j
-
1
];
p
*=
w
-
lsp
[
j
];
}
...
...
@@ -211,7 +210,7 @@ static void decode_exp_lsp(WMACodecContext *s, int ch)
float
lsp_coefs
[
NB_LSP_COEFS
];
int
val
,
i
;
for
(
i
=
0
;
i
<
NB_LSP_COEFS
;
i
++
)
{
for
(
i
=
0
;
i
<
NB_LSP_COEFS
;
i
++
)
{
if
(
i
==
0
||
i
>=
8
)
val
=
get_bits
(
&
s
->
gb
,
3
);
else
...
...
@@ -315,10 +314,10 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
float
v
,
max_scale
;
uint32_t
*
q
,
*
q_end
,
iv
;
const
float
*
ptab
=
pow_tab
+
60
;
const
uint32_t
*
iptab
=
(
const
uint32_t
*
)
ptab
;
const
uint32_t
*
iptab
=
(
const
uint32_t
*
)
ptab
;
ptr
=
s
->
exponent_bands
[
s
->
frame_len_bits
-
s
->
block_len_bits
];
q
=
(
uint32_t
*
)
s
->
exponents
[
ch
];
q
=
(
uint32_t
*
)
s
->
exponents
[
ch
];
q_end
=
q
+
s
->
block_len
;
max_scale
=
0
;
if
(
s
->
version
==
1
)
{
...
...
@@ -333,18 +332,18 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
case
2
:
*
q
++
=
iv
;
case
1
:
*
q
++
=
iv
;
}
while
((
n
-=
4
)
>
0
);
}
else
}
else
last_exp
=
36
;
while
(
q
<
q_end
)
{
code
=
get_vlc2
(
&
s
->
gb
,
s
->
exp_vlc
.
table
,
EXPVLCBITS
,
EXPMAX
);
if
(
code
<
0
){
if
(
code
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Exponent vlc invalid
\n
"
);
return
-
1
;
}
/* NOTE: this offset is the same as MPEG4 AAC ! */
last_exp
+=
code
-
60
;
if
((
unsigned
)
last_exp
+
60
>=
FF_ARRAY_ELEMS
(
pow_tab
))
{
if
((
unsigned
)
last_exp
+
60
>=
FF_ARRAY_ELEMS
(
pow_tab
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Exponent out of range: %d
\n
"
,
last_exp
);
return
-
1
;
...
...
@@ -365,7 +364,6 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
return
0
;
}
/**
* Apply MDCT window and add into output.
*
...
...
@@ -384,16 +382,15 @@ static void wma_window(WMACodecContext *s, float *out)
s
->
fdsp
.
vector_fmul_add
(
out
,
in
,
s
->
windows
[
bsize
],
out
,
block_len
);
}
else
{
block_len
=
1
<<
s
->
prev_block_len_bits
;
n
=
(
s
->
block_len
-
block_len
)
/
2
;
bsize
=
s
->
frame_len_bits
-
s
->
prev_block_len_bits
;
s
->
fdsp
.
vector_fmul_add
(
out
+
n
,
in
+
n
,
s
->
windows
[
bsize
],
out
+
n
,
block_len
);
s
->
fdsp
.
vector_fmul_add
(
out
+
n
,
in
+
n
,
s
->
windows
[
bsize
],
out
+
n
,
block_len
);
memcpy
(
out
+
n
+
block_len
,
in
+
n
+
block_len
,
n
*
sizeof
(
float
));
memcpy
(
out
+
n
+
block_len
,
in
+
n
+
block_len
,
n
*
sizeof
(
float
));
}
out
+=
s
->
block_len
;
...
...
@@ -405,21 +402,20 @@ static void wma_window(WMACodecContext *s, float *out)
bsize
=
s
->
frame_len_bits
-
s
->
block_len_bits
;
s
->
fdsp
.
vector_fmul_reverse
(
out
,
in
,
s
->
windows
[
bsize
],
block_len
);
}
else
{
block_len
=
1
<<
s
->
next_block_len_bits
;
n
=
(
s
->
block_len
-
block_len
)
/
2
;
bsize
=
s
->
frame_len_bits
-
s
->
next_block_len_bits
;
memcpy
(
out
,
in
,
n
*
sizeof
(
float
));
memcpy
(
out
,
in
,
n
*
sizeof
(
float
));
s
->
fdsp
.
vector_fmul_reverse
(
out
+
n
,
in
+
n
,
s
->
windows
[
bsize
],
block_len
);
s
->
fdsp
.
vector_fmul_reverse
(
out
+
n
,
in
+
n
,
s
->
windows
[
bsize
],
block_len
);
memset
(
out
+
n
+
block_len
,
0
,
n
*
sizeof
(
float
));
memset
(
out
+
n
+
block_len
,
0
,
n
*
sizeof
(
float
));
}
}
/**
* @return 0 if OK. 1 if last block of frame. return -1 if
* unrecorrable error.
...
...
@@ -433,8 +429,9 @@ static int wma_decode_block(WMACodecContext *s)
FFTContext
*
mdct
;
#ifdef TRACE
tprintf
(
s
->
avctx
,
"***decode_block: %d:%d
\n
"
,
s
->
frame_count
-
1
,
s
->
block_num
);
#endif
tprintf
(
s
->
avctx
,
"***decode_block: %d:%d
\n
"
,
s
->
frame_count
-
1
,
s
->
block_num
);
#endif
/* TRACE */
/* compute current block length */
if
(
s
->
use_variable_block_len
)
{
...
...
@@ -443,14 +440,18 @@ static int wma_decode_block(WMACodecContext *s)
if
(
s
->
reset_block_lengths
)
{
s
->
reset_block_lengths
=
0
;
v
=
get_bits
(
&
s
->
gb
,
n
);
if
(
v
>=
s
->
nb_block_sizes
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"prev_block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
if
(
v
>=
s
->
nb_block_sizes
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"prev_block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
return
-
1
;
}
s
->
prev_block_len_bits
=
s
->
frame_len_bits
-
v
;
v
=
get_bits
(
&
s
->
gb
,
n
);
if
(
v
>=
s
->
nb_block_sizes
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
if
(
v
>=
s
->
nb_block_sizes
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
return
-
1
;
}
s
->
block_len_bits
=
s
->
frame_len_bits
-
v
;
...
...
@@ -460,8 +461,10 @@ static int wma_decode_block(WMACodecContext *s)
s
->
block_len_bits
=
s
->
next_block_len_bits
;
}
v
=
get_bits
(
&
s
->
gb
,
n
);
if
(
v
>=
s
->
nb_block_sizes
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"next_block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
if
(
v
>=
s
->
nb_block_sizes
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"next_block_len_bits %d out of range
\n
"
,
s
->
frame_len_bits
-
v
);
return
-
1
;
}
s
->
next_block_len_bits
=
s
->
frame_len_bits
-
v
;
...
...
@@ -474,16 +477,15 @@ static int wma_decode_block(WMACodecContext *s)
/* now check if the block length is coherent with the frame length */
s
->
block_len
=
1
<<
s
->
block_len_bits
;
if
((
s
->
block_pos
+
s
->
block_len
)
>
s
->
frame_len
){
if
((
s
->
block_pos
+
s
->
block_len
)
>
s
->
frame_len
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"frame_len overflow
\n
"
);
return
-
1
;
}
if
(
s
->
avctx
->
channels
==
2
)
{
if
(
s
->
avctx
->
channels
==
2
)
s
->
ms_stereo
=
get_bits1
(
&
s
->
gb
);
}
v
=
0
;
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
a
=
get_bits1
(
&
s
->
gb
);
s
->
channel_coded
[
ch
]
=
a
;
v
|=
a
;
...
...
@@ -497,30 +499,29 @@ static int wma_decode_block(WMACodecContext *s)
goto
next
;
/* read total gain and extract corresponding number of bits for
coef escape coding */
*
coef escape coding */
total_gain
=
1
;
for
(;;)
{
for
(;;)
{
a
=
get_bits
(
&
s
->
gb
,
7
);
total_gain
+=
a
;
if
(
a
!=
127
)
break
;
}
coef_nb_bits
=
ff_wma_total_gain_to_bits
(
total_gain
);
coef_nb_bits
=
ff_wma_total_gain_to_bits
(
total_gain
);
/* compute number of coefficients */
n
=
s
->
coefs_end
[
bsize
]
-
s
->
coefs_start
;
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
nb_coefs
[
ch
]
=
n
;
/* complex coding */
if
(
s
->
use_noise_coding
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
int
i
,
n
,
a
;
n
=
s
->
exponent_high_sizes
[
bsize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
a
=
get_bits1
(
&
s
->
gb
);
s
->
high_band_coded
[
ch
][
i
]
=
a
;
/* if noise coding, the coefficients are not transmitted */
...
...
@@ -529,20 +530,22 @@ static int wma_decode_block(WMACodecContext *s)
}
}
}
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
int
i
,
n
,
val
,
code
;
n
=
s
->
exponent_high_sizes
[
bsize
];
val
=
(
int
)
0x80000000
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
val
=
(
int
)
0x80000000
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
s
->
high_band_coded
[
ch
][
i
])
{
if
(
val
==
(
int
)
0x80000000
)
{
if
(
val
==
(
int
)
0x80000000
)
{
val
=
get_bits
(
&
s
->
gb
,
7
)
-
19
;
}
else
{
code
=
get_vlc2
(
&
s
->
gb
,
s
->
hgain_vlc
.
table
,
HGAINVLCBITS
,
HGAINMAX
);
if
(
code
<
0
){
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"hgain vlc invalid
\n
"
);
code
=
get_vlc2
(
&
s
->
gb
,
s
->
hgain_vlc
.
table
,
HGAINVLCBITS
,
HGAINMAX
);
if
(
code
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"hgain vlc invalid
\n
"
);
return
-
1
;
}
val
+=
code
-
18
;
...
...
@@ -555,9 +558,8 @@ static int wma_decode_block(WMACodecContext *s)
}
/* exponents can be reused in short blocks. */
if
((
s
->
block_len_bits
==
s
->
frame_len_bits
)
||
get_bits1
(
&
s
->
gb
))
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
((
s
->
block_len_bits
==
s
->
frame_len_bits
)
||
get_bits1
(
&
s
->
gb
))
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
if
(
s
->
use_exp_vlc
)
{
if
(
decode_exp_vlc
(
s
,
ch
)
<
0
)
...
...
@@ -574,10 +576,10 @@ static int wma_decode_block(WMACodecContext *s)
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
int
tindex
;
WMACoef
*
ptr
=
&
s
->
coefs1
[
ch
][
0
];
WMACoef
*
ptr
=
&
s
->
coefs1
[
ch
][
0
];
/* special VLC tables are used for ms stereo because
there is potentially less energy there */
*
there is potentially less energy there */
tindex
=
(
ch
==
1
&&
s
->
ms_stereo
);
memset
(
ptr
,
0
,
s
->
block_len
*
sizeof
(
WMACoef
));
ff_wma_run_level_decode
(
s
->
avctx
,
&
s
->
gb
,
&
s
->
coef_vlc
[
tindex
],
...
...
@@ -585,19 +587,17 @@ static int wma_decode_block(WMACodecContext *s)
0
,
ptr
,
0
,
nb_coefs
[
ch
],
s
->
block_len
,
s
->
frame_len_bits
,
coef_nb_bits
);
}
if
(
s
->
version
==
1
&&
s
->
avctx
->
channels
>=
2
)
{
if
(
s
->
version
==
1
&&
s
->
avctx
->
channels
>=
2
)
align_get_bits
(
&
s
->
gb
);
}
}
/* normalize */
{
int
n4
=
s
->
block_len
/
2
;
mdct_norm
=
1
.
0
/
(
float
)
n4
;
if
(
s
->
version
==
1
)
{
mdct_norm
=
1
.
0
/
(
float
)
n4
;
if
(
s
->
version
==
1
)
mdct_norm
*=
sqrt
(
n4
);
}
}
/* finally compute the MDCT coefficients */
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
...
...
@@ -616,45 +616,44 @@ static int wma_decode_block(WMACodecContext *s)
if
(
s
->
use_noise_coding
)
{
mult1
=
mult
;
/* very low freqs : noise */
for
(
i
=
0
;
i
<
s
->
coefs_start
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
coefs_start
;
i
++
)
{
*
coefs
++
=
s
->
noise_table
[
s
->
noise_index
]
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult1
;
s
->
noise_index
=
(
s
->
noise_index
+
1
)
&
(
NOISE_TAB_SIZE
-
1
);
exponents
[
i
<<
bsize
>>
esize
]
*
mult1
;
s
->
noise_index
=
(
s
->
noise_index
+
1
)
&
(
NOISE_TAB_SIZE
-
1
);
}
n1
=
s
->
exponent_high_sizes
[
bsize
];
/* compute power of high bands */
exponents
=
s
->
exponents
[
ch
]
+
(
s
->
high_band_start
[
bsize
]
<<
bsize
>>
esize
);
(
s
->
high_band_start
[
bsize
]
<<
bsize
>>
esize
);
last_high_band
=
0
;
/* avoid warning */
for
(
j
=
0
;
j
<
n1
;
j
++
)
{
for
(
j
=
0
;
j
<
n1
;
j
++
)
{
n
=
s
->
exponent_high_bands
[
s
->
frame_len_bits
-
s
->
block_len_bits
][
j
];
if
(
s
->
high_band_coded
[
ch
][
j
])
{
float
e2
,
v
;
e2
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
v
=
exponents
[
i
<<
bsize
>>
esize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
v
=
exponents
[
i
<<
bsize
>>
esize
];
e2
+=
v
*
v
;
}
exp_power
[
j
]
=
e2
/
n
;
last_high_band
=
j
;
tprintf
(
s
->
avctx
,
"%d: power=%f (%d)
\n
"
,
j
,
exp_power
[
j
],
n
);
}
exponents
+=
n
<<
bsize
>>
esize
;
exponents
+=
n
<<
bsize
>>
esize
;
}
/* main freqs and high freqs */
exponents
=
s
->
exponents
[
ch
]
+
(
s
->
coefs_start
<<
bsize
>>
esize
);
for
(
j
=-
1
;
j
<
n1
;
j
++
)
{
if
(
j
<
0
)
{
n
=
s
->
high_band_start
[
bsize
]
-
s
->
coefs_start
;
}
else
{
exponents
=
s
->
exponents
[
ch
]
+
(
s
->
coefs_start
<<
bsize
>>
esize
);
for
(
j
=
-
1
;
j
<
n1
;
j
++
)
{
if
(
j
<
0
)
n
=
s
->
high_band_start
[
bsize
]
-
s
->
coefs_start
;
else
n
=
s
->
exponent_high_bands
[
s
->
frame_len_bits
-
s
->
block_len_bits
][
j
];
}
if
(
j
>=
0
&&
s
->
high_band_coded
[
ch
][
j
])
{
/* use noise with specified power */
mult1
=
sqrt
(
exp_power
[
j
]
/
exp_power
[
last_high_band
]);
...
...
@@ -662,42 +661,40 @@ static int wma_decode_block(WMACodecContext *s)
mult1
=
mult1
*
pow
(
10
,
s
->
high_band_values
[
ch
][
j
]
*
0
.
05
);
mult1
=
mult1
/
(
s
->
max_exponent
[
ch
]
*
s
->
noise_mult
);
mult1
*=
mdct_norm
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
noise
=
s
->
noise_table
[
s
->
noise_index
];
s
->
noise_index
=
(
s
->
noise_index
+
1
)
&
(
NOISE_TAB_SIZE
-
1
);
*
coefs
++
=
noise
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult1
;
*
coefs
++
=
noise
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult1
;
}
exponents
+=
n
<<
bsize
>>
esize
;
exponents
+=
n
<<
bsize
>>
esize
;
}
else
{
/* coded values + small noise */
for
(
i
=
0
;
i
<
n
;
i
++
)
{
for
(
i
=
0
;
i
<
n
;
i
++
)
{
noise
=
s
->
noise_table
[
s
->
noise_index
];
s
->
noise_index
=
(
s
->
noise_index
+
1
)
&
(
NOISE_TAB_SIZE
-
1
);
*
coefs
++
=
((
*
coefs1
++
)
+
noise
)
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult
;
exponents
[
i
<<
bsize
>>
esize
]
*
mult
;
}
exponents
+=
n
<<
bsize
>>
esize
;
exponents
+=
n
<<
bsize
>>
esize
;
}
}
/* very high freqs : noise */
n
=
s
->
block_len
-
s
->
coefs_end
[
bsize
];
mult1
=
mult
*
exponents
[((
-
1
<<
bsize
))
>>
esize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
mult1
=
mult
*
exponents
[((
-
1
<<
bsize
))
>>
esize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
*
coefs
++
=
s
->
noise_table
[
s
->
noise_index
]
*
mult1
;
s
->
noise_index
=
(
s
->
noise_index
+
1
)
&
(
NOISE_TAB_SIZE
-
1
);
}
}
else
{
/* XXX: optimize more */
for
(
i
=
0
;
i
<
s
->
coefs_start
;
i
++
)
for
(
i
=
0
;
i
<
s
->
coefs_start
;
i
++
)
*
coefs
++
=
0
.
0
;
n
=
nb_coefs
[
ch
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
*
coefs
++
=
coefs1
[
i
]
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult
;
}
for
(
i
=
0
;
i
<
n
;
i
++
)
*
coefs
++
=
coefs1
[
i
]
*
exponents
[
i
<<
bsize
>>
esize
]
*
mult
;
n
=
s
->
block_len
-
s
->
coefs_end
[
bsize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
for
(
i
=
0
;
i
<
n
;
i
++
)
*
coefs
++
=
0
.
0
;
}
}
...
...
@@ -710,12 +707,12 @@ static int wma_decode_block(WMACodecContext *s)
dump_floats
(
s
,
"coefs"
,
1
,
s
->
coefs
[
ch
],
s
->
block_len
);
}
}
#endif
#endif
/* TRACE */
if
(
s
->
ms_stereo
&&
s
->
channel_coded
[
1
])
{
/* nominal case for ms stereo: we do it before mdct */
/* no need to optimize this case because it should almost
never happen */
*
never happen */
if
(
!
s
->
channel_coded
[
0
])
{
tprintf
(
s
->
avctx
,
"rare ms-stereo case happened
\n
"
);
memset
(
s
->
coefs
[
0
],
0
,
sizeof
(
float
)
*
s
->
block_len
);
...
...
@@ -732,9 +729,9 @@ next:
int
n4
,
index
;
n4
=
s
->
block_len
/
2
;
if
(
s
->
channel_coded
[
ch
]){
if
(
s
->
channel_coded
[
ch
])
mdct
->
imdct_calc
(
mdct
,
s
->
output
,
s
->
coefs
[
ch
]);
}
else
if
(
!
(
s
->
ms_stereo
&&
ch
==
1
))
else
if
(
!
(
s
->
ms_stereo
&&
ch
==
1
))
memset
(
s
->
output
,
0
,
sizeof
(
s
->
output
));
/* multiply by the window and add in the frame */
...
...
@@ -758,13 +755,14 @@ static int wma_decode_frame(WMACodecContext *s, float **samples,
int
ret
,
ch
;
#ifdef TRACE
tprintf
(
s
->
avctx
,
"***decode_frame: %d size=%d
\n
"
,
s
->
frame_count
++
,
s
->
frame_len
);
#endif
tprintf
(
s
->
avctx
,
"***decode_frame: %d size=%d
\n
"
,
s
->
frame_count
++
,
s
->
frame_len
);
#endif
/* TRACE */
/* read each block */
s
->
block_num
=
0
;
s
->
block_pos
=
0
;
for
(;;)
{
for
(;;)
{
ret
=
wma_decode_block
(
s
);
if
(
ret
<
0
)
return
-
1
;
...
...
@@ -781,8 +779,9 @@ static int wma_decode_frame(WMACodecContext *s, float **samples,
s
->
frame_len
*
sizeof
(
*
s
->
frame_out
[
ch
]));
#ifdef TRACE
dump_floats
(
s
,
"samples"
,
6
,
samples
[
ch
]
+
samples_offset
,
s
->
frame_len
);
#endif
dump_floats
(
s
,
"samples"
,
6
,
samples
[
ch
]
+
samples_offset
,
s
->
frame_len
);
#endif
/* TRACE */
}
return
0
;
...
...
@@ -802,7 +801,7 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
tprintf
(
avctx
,
"***decode_superframe:
\n
"
);
if
(
buf_size
==
0
)
{
if
(
buf_size
==
0
)
{
s
->
last_superframe_len
=
0
;
return
0
;
}
...
...
@@ -814,15 +813,14 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
}
buf_size
=
avctx
->
block_align
;
init_get_bits
(
&
s
->
gb
,
buf
,
buf_size
*
8
);
init_get_bits
(
&
s
->
gb
,
buf
,
buf_size
*
8
);
if
(
s
->
use_bit_reservoir
)
{
/* read super frame header */
skip_bits
(
&
s
->
gb
,
4
);
/* super frame index */
nb_frames
=
get_bits
(
&
s
->
gb
,
4
)
-
(
s
->
last_superframe_len
<=
0
);
}
else
{
}
else
nb_frames
=
1
;
}
/* get output buffer */
frame
->
nb_samples
=
nb_frames
*
s
->
frame_len
;
...
...
@@ -830,7 +828,7 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
samples
=
(
float
**
)
frame
->
extended_data
;
samples
=
(
float
**
)
frame
->
extended_data
;
samples_offset
=
0
;
if
(
s
->
use_bit_reservoir
)
{
...
...
@@ -850,21 +848,21 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
q
=
s
->
last_superframe
+
s
->
last_superframe_len
;
len
=
bit_offset
;
while
(
len
>
7
)
{
*
q
++
=
(
get_bits
)(
&
s
->
gb
,
8
);
*
q
++
=
(
get_bits
)
(
&
s
->
gb
,
8
);
len
-=
8
;
}
if
(
len
>
0
)
{
*
q
++
=
(
get_bits
)(
&
s
->
gb
,
len
)
<<
(
8
-
len
);
}
if
(
len
>
0
)
*
q
++
=
(
get_bits
)
(
&
s
->
gb
,
len
)
<<
(
8
-
len
);
memset
(
q
,
0
,
FF_INPUT_BUFFER_PADDING_SIZE
);
/* XXX: bit_offset bits into last frame */
init_get_bits
(
&
s
->
gb
,
s
->
last_superframe
,
s
->
last_superframe_len
*
8
+
bit_offset
);
init_get_bits
(
&
s
->
gb
,
s
->
last_superframe
,
s
->
last_superframe_len
*
8
+
bit_offset
);
/* skip unused bits */
if
(
s
->
last_bitoffset
>
0
)
skip_bits
(
&
s
->
gb
,
s
->
last_bitoffset
);
/* this frame is stored in the last superframe and in the
current one */
*
current one */
if
(
wma_decode_frame
(
s
,
samples
,
samples_offset
)
<
0
)
goto
fail
;
samples_offset
+=
s
->
frame_len
;
...
...
@@ -875,20 +873,21 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
pos
=
bit_offset
+
4
+
4
+
s
->
byte_offset_bits
+
3
;
if
(
pos
>=
MAX_CODED_SUPERFRAME_SIZE
*
8
||
pos
>
buf_size
*
8
)
return
AVERROR_INVALIDDATA
;
init_get_bits
(
&
s
->
gb
,
buf
+
(
pos
>>
3
),
(
buf_size
-
(
pos
>>
3
))
*
8
);
init_get_bits
(
&
s
->
gb
,
buf
+
(
pos
>>
3
),
(
buf_size
-
(
pos
>>
3
))
*
8
);
len
=
pos
&
7
;
if
(
len
>
0
)
skip_bits
(
&
s
->
gb
,
len
);
s
->
reset_block_lengths
=
1
;
for
(
i
=
0
;
i
<
nb_frames
;
i
++
)
{
for
(
i
=
0
;
i
<
nb_frames
;
i
++
)
{
if
(
wma_decode_frame
(
s
,
samples
,
samples_offset
)
<
0
)
goto
fail
;
samples_offset
+=
s
->
frame_len
;
}
/* we copy the end of the frame in the last frame buffer */
pos
=
get_bits_count
(
&
s
->
gb
)
+
((
bit_offset
+
4
+
4
+
s
->
byte_offset_bits
+
3
)
&
~
7
);
pos
=
get_bits_count
(
&
s
->
gb
)
+
((
bit_offset
+
4
+
4
+
s
->
byte_offset_bits
+
3
)
&
~
7
);
s
->
last_bitoffset
=
pos
&
7
;
pos
>>=
3
;
len
=
buf_size
-
pos
;
...
...
@@ -907,12 +906,13 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
av_dlog
(
s
->
avctx
,
"%d %d %d %d outbytes:%td eaten:%d
\n
"
,
s
->
frame_len_bits
,
s
->
block_len_bits
,
s
->
frame_len
,
s
->
block_len
,
(
int8_t
*
)
samples
-
(
int8_t
*
)
data
,
avctx
->
block_align
);
(
int8_t
*
)
samples
-
(
int8_t
*
)
data
,
avctx
->
block_align
);
*
got_frame_ptr
=
1
;
return
avctx
->
block_align
;
fail:
fail:
/* when error, we reset the bit reservoir */
s
->
last_superframe_len
=
0
;
return
-
1
;
...
...
@@ -922,8 +922,8 @@ static av_cold void flush(AVCodecContext *avctx)
{
WMACodecContext
*
s
=
avctx
->
priv_data
;
s
->
last_bitoffset
=
s
->
last_superframe_len
=
0
;
s
->
last_bitoffset
=
s
->
last_superframe_len
=
0
;
}
AVCodec
ff_wmav1_decoder
=
{
...
...
libavcodec/wmaenc.c
View file @
d2a4e4b9
...
...
@@ -20,6 +20,7 @@
*/
#include "libavutil/attributes.h"
#include "avcodec.h"
#include "internal.h"
#include "wma.h"
...
...
@@ -36,8 +37,9 @@ static av_cold int encode_init(AVCodecContext *avctx)
s
->
avctx
=
avctx
;
if
(
avctx
->
channels
>
MAX_CHANNELS
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"too many channels: got %i, need %i or fewer"
,
if
(
avctx
->
channels
>
MAX_CHANNELS
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"too many channels: got %i, need %i or fewer"
,
avctx
->
channels
,
MAX_CHANNELS
);
return
AVERROR
(
EINVAL
);
}
...
...
@@ -48,8 +50,9 @@ static av_cold int encode_init(AVCodecContext *avctx)
return
AVERROR
(
EINVAL
);
}
if
(
avctx
->
bit_rate
<
24
*
1000
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"bitrate too low: got %i, need 24000 or higher
\n
"
,
if
(
avctx
->
bit_rate
<
24
*
1000
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"bitrate too low: got %i, need 24000 or higher
\n
"
,
avctx
->
bit_rate
);
return
AVERROR
(
EINVAL
);
}
...
...
@@ -58,18 +61,19 @@ static av_cold int encode_init(AVCodecContext *avctx)
flags1
=
0
;
flags2
=
1
;
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV1
)
{
extradata
=
av_malloc
(
4
);
avctx
->
extradata_size
=
4
;
extradata
=
av_malloc
(
4
);
avctx
->
extradata_size
=
4
;
AV_WL16
(
extradata
,
flags1
);
AV_WL16
(
extradata
+
2
,
flags2
);
AV_WL16
(
extradata
+
2
,
flags2
);
}
else
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_WMAV2
)
{
extradata
=
av_mallocz
(
10
);
avctx
->
extradata_size
=
10
;
extradata
=
av_mallocz
(
10
);
avctx
->
extradata_size
=
10
;
AV_WL32
(
extradata
,
flags1
);
AV_WL16
(
extradata
+
4
,
flags2
);
}
else
AV_WL16
(
extradata
+
4
,
flags2
);
}
else
{
assert
(
0
);
avctx
->
extradata
=
extradata
;
}
avctx
->
extradata
=
extradata
;
s
->
use_exp_vlc
=
flags2
&
0x0001
;
s
->
use_bit_reservoir
=
flags2
&
0x0002
;
s
->
use_variable_block_len
=
flags2
&
0x0004
;
...
...
@@ -79,44 +83,46 @@ static av_cold int encode_init(AVCodecContext *avctx)
ff_wma_init
(
avctx
,
flags2
);
/* init MDCT */
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
for
(
i
=
0
;
i
<
s
->
nb_block_sizes
;
i
++
)
ff_mdct_init
(
&
s
->
mdct_ctx
[
i
],
s
->
frame_len_bits
-
i
+
1
,
0
,
1
.
0
);
block_align
=
avctx
->
bit_rate
*
(
int64_t
)
s
->
frame_len
/
block_align
=
avctx
->
bit_rate
*
(
int64_t
)
s
->
frame_len
/
(
avctx
->
sample_rate
*
8
);
block_align
=
FFMIN
(
block_align
,
MAX_CODED_SUPERFRAME_SIZE
);
avctx
->
block_align
=
block_align
;
avctx
->
bit_rate
=
avctx
->
block_align
*
8LL
*
avctx
->
sample_rate
/
s
->
frame_len
;
avctx
->
frame_size
=
avctx
->
delay
=
s
->
frame_len
;
avctx
->
frame_size
=
avctx
->
delay
=
s
->
frame_len
;
return
0
;
}
static
void
apply_window_and_mdct
(
AVCodecContext
*
avctx
,
const
AVFrame
*
frame
)
static
void
apply_window_and_mdct
(
AVCodecContext
*
avctx
,
const
AVFrame
*
frame
)
{
WMACodecContext
*
s
=
avctx
->
priv_data
;
float
**
audio
=
(
float
**
)
frame
->
extended_data
;
float
**
audio
=
(
float
**
)
frame
->
extended_data
;
int
len
=
frame
->
nb_samples
;
int
window_index
=
s
->
frame_len_bits
-
s
->
block_len_bits
;
int
window_index
=
s
->
frame_len_bits
-
s
->
block_len_bits
;
FFTContext
*
mdct
=
&
s
->
mdct_ctx
[
window_index
];
int
ch
;
const
float
*
win
=
s
->
windows
[
window_index
];
const
float
*
win
=
s
->
windows
[
window_index
];
int
window_len
=
1
<<
s
->
block_len_bits
;
float
n
=
2
.
0
*
32768
.
0
/
window_len
;
for
(
ch
=
0
;
ch
<
avctx
->
channels
;
ch
++
)
{
memcpy
(
s
->
output
,
s
->
frame_out
[
ch
],
window_len
*
sizeof
(
*
s
->
output
));
s
->
fdsp
.
vector_fmul_scalar
(
s
->
frame_out
[
ch
],
audio
[
ch
],
n
,
len
);
s
->
fdsp
.
vector_fmul_reverse
(
&
s
->
output
[
window_len
],
s
->
frame_out
[
ch
],
win
,
len
);
s
->
fdsp
.
vector_fmul_reverse
(
&
s
->
output
[
window_len
],
s
->
frame_out
[
ch
],
win
,
len
);
s
->
fdsp
.
vector_fmul
(
s
->
frame_out
[
ch
],
s
->
frame_out
[
ch
],
win
,
len
);
mdct
->
mdct_calc
(
mdct
,
s
->
coefs
[
ch
],
s
->
output
);
}
}
//FIXME use for decoding too
static
void
init_exp
(
WMACodecContext
*
s
,
int
ch
,
const
int
*
exp_param
){
// FIXME use for decoding too
static
void
init_exp
(
WMACodecContext
*
s
,
int
ch
,
const
int
*
exp_param
)
{
int
n
;
const
uint16_t
*
ptr
;
float
v
,
*
q
,
max_scale
,
*
q_end
;
...
...
@@ -127,8 +133,8 @@ static void init_exp(WMACodecContext *s, int ch, const int *exp_param){
max_scale
=
0
;
while
(
q
<
q_end
)
{
/* XXX: use a table */
v
=
pow
(
10
,
*
exp_param
++
*
(
1
.
0
/
16
.
0
));
max_scale
=
FFMAX
(
max_scale
,
v
);
v
=
pow
(
10
,
*
exp_param
++
*
(
1
.
0
/
16
.
0
));
max_scale
=
FFMAX
(
max_scale
,
v
);
n
=
*
ptr
++
;
do
{
*
q
++
=
v
;
...
...
@@ -137,7 +143,8 @@ static void init_exp(WMACodecContext *s, int ch, const int *exp_param){
s
->
max_exponent
[
ch
]
=
max_scale
;
}
static
void
encode_exp_vlc
(
WMACodecContext
*
s
,
int
ch
,
const
int
*
exp_param
){
static
void
encode_exp_vlc
(
WMACodecContext
*
s
,
int
ch
,
const
int
*
exp_param
)
{
int
last_exp
;
const
uint16_t
*
ptr
;
float
*
q
,
*
q_end
;
...
...
@@ -146,33 +153,42 @@ static void encode_exp_vlc(WMACodecContext *s, int ch, const int *exp_param){
q
=
s
->
exponents
[
ch
];
q_end
=
q
+
s
->
block_len
;
if
(
s
->
version
==
1
)
{
last_exp
=
*
exp_param
++
;
assert
(
last_exp
-
10
>=
0
&&
last_exp
-
10
<
32
);
last_exp
=
*
exp_param
++
;
assert
(
last_exp
-
10
>=
0
&&
last_exp
-
10
<
32
);
put_bits
(
&
s
->
pb
,
5
,
last_exp
-
10
);
q
+=
*
ptr
++
;
}
else
q
+=
*
ptr
++
;
}
else
last_exp
=
36
;
while
(
q
<
q_end
)
{
int
exp
=
*
exp_param
++
;
int
code
=
exp
-
last_exp
+
60
;
assert
(
code
>=
0
&&
code
<
120
);
put_bits
(
&
s
->
pb
,
ff_aac_scalefactor_bits
[
code
],
ff_aac_scalefactor_code
[
code
]);
put_bits
(
&
s
->
pb
,
ff_aac_scalefactor_bits
[
code
],
ff_aac_scalefactor_code
[
code
]);
/* XXX: use a table */
q
+=
*
ptr
++
;
last_exp
=
exp
;
q
+=
*
ptr
++
;
last_exp
=
exp
;
}
}
static
int
encode_block
(
WMACodecContext
*
s
,
float
(
*
src_coefs
)[
BLOCK_MAX_SIZE
],
int
total_gain
){
static
int
encode_block
(
WMACodecContext
*
s
,
float
(
*
src_coefs
)[
BLOCK_MAX_SIZE
],
int
total_gain
)
{
int
v
,
bsize
,
ch
,
coef_nb_bits
,
parse_exponents
;
float
mdct_norm
;
int
nb_coefs
[
MAX_CHANNELS
];
static
const
int
fixed_exp
[
25
]
=
{
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
};
//FIXME remove duplication relative to decoder
static
const
int
fixed_exp
[
25
]
=
{
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
,
20
};
// FIXME remove duplication relative to decoder
if
(
s
->
use_variable_block_len
)
{
assert
(
0
);
//FIXME not implemented
}
else
{
assert
(
0
);
//
FIXME not implemented
}
else
{
/* fixed block len */
s
->
next_block_len_bits
=
s
->
frame_len_bits
;
s
->
prev_block_len_bits
=
s
->
frame_len_bits
;
...
...
@@ -183,28 +199,26 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
// assert((s->block_pos + s->block_len) <= s->frame_len);
bsize
=
s
->
frame_len_bits
-
s
->
block_len_bits
;
//FIXME factor
//
FIXME factor
v
=
s
->
coefs_end
[
bsize
]
-
s
->
coefs_start
;
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
nb_coefs
[
ch
]
=
v
;
{
int
n4
=
s
->
block_len
/
2
;
mdct_norm
=
1
.
0
/
(
float
)
n4
;
if
(
s
->
version
==
1
)
{
mdct_norm
=
1
.
0
/
(
float
)
n4
;
if
(
s
->
version
==
1
)
mdct_norm
*=
sqrt
(
n4
);
}
}
if
(
s
->
avctx
->
channels
==
2
)
{
if
(
s
->
avctx
->
channels
==
2
)
put_bits
(
&
s
->
pb
,
1
,
!!
s
->
ms_stereo
);
}
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
s
->
channel_coded
[
ch
]
=
1
;
//FIXME only set channel_coded when needed, instead of always
if
(
s
->
channel_coded
[
ch
])
{
// FIXME only set channel_coded when needed, instead of always
s
->
channel_coded
[
ch
]
=
1
;
if
(
s
->
channel_coded
[
ch
])
init_exp
(
s
,
ch
,
fixed_exp
);
}
}
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
...
...
@@ -218,13 +232,13 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
mult
*=
mdct_norm
;
coefs
=
src_coefs
[
ch
];
if
(
s
->
use_noise_coding
&&
0
)
{
assert
(
0
);
//FIXME not implemented
assert
(
0
);
//
FIXME not implemented
}
else
{
coefs
+=
s
->
coefs_start
;
n
=
nb_coefs
[
ch
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
double
t
=
*
coefs
++
/
(
exponents
[
i
]
*
mult
);
if
(
t
<-
32768
||
t
>
32767
)
for
(
i
=
0
;
i
<
n
;
i
++
)
{
double
t
=
*
coefs
++
/
(
exponents
[
i
]
*
mult
);
if
(
t
<
-
32768
||
t
>
32767
)
return
-
1
;
coefs1
[
i
]
=
lrint
(
t
);
...
...
@@ -243,19 +257,19 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
if
(
!
v
)
return
1
;
for
(
v
=
total_gain
-
1
;
v
>=
127
;
v
-=
127
)
for
(
v
=
total_gain
-
1
;
v
>=
127
;
v
-=
127
)
put_bits
(
&
s
->
pb
,
7
,
127
);
put_bits
(
&
s
->
pb
,
7
,
v
);
coef_nb_bits
=
ff_wma_total_gain_to_bits
(
total_gain
);
coef_nb_bits
=
ff_wma_total_gain_to_bits
(
total_gain
);
if
(
s
->
use_noise_coding
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
int
i
,
n
;
n
=
s
->
exponent_high_sizes
[
bsize
];
for
(
i
=
0
;
i
<
n
;
i
++
)
{
put_bits
(
&
s
->
pb
,
1
,
s
->
high_band_coded
[
ch
][
i
]
=
0
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
put_bits
(
&
s
->
pb
,
1
,
s
->
high_band_coded
[
ch
][
i
]
=
0
);
if
(
0
)
nb_coefs
[
ch
]
-=
s
->
exponent_high_bands
[
bsize
][
i
];
}
...
...
@@ -264,9 +278,8 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
}
parse_exponents
=
1
;
if
(
s
->
block_len_bits
!=
s
->
frame_len_bits
)
{
if
(
s
->
block_len_bits
!=
s
->
frame_len_bits
)
put_bits
(
&
s
->
pb
,
1
,
parse_exponents
);
}
if
(
parse_exponents
)
{
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
...
...
@@ -274,14 +287,13 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
if
(
s
->
use_exp_vlc
)
{
encode_exp_vlc
(
s
,
ch
,
fixed_exp
);
}
else
{
assert
(
0
);
//FIXME not implemented
assert
(
0
);
//
FIXME not implemented
// encode_exp_lsp(s, ch);
}
}
}
}
else
{
assert
(
0
);
//FIXME not implemented
}
}
else
assert
(
0
);
// FIXME not implemented
for
(
ch
=
0
;
ch
<
s
->
avctx
->
channels
;
ch
++
)
{
if
(
s
->
channel_coded
[
ch
])
{
...
...
@@ -291,52 +303,52 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
ptr
=
&
s
->
coefs1
[
ch
][
0
];
eptr
=
ptr
+
nb_coefs
[
ch
];
run
=
0
;
for
(;
ptr
<
eptr
;
ptr
++
){
if
(
*
ptr
){
int
level
=
*
ptr
;
int
abs_level
=
FFABS
(
level
);
int
code
=
0
;
if
(
abs_level
<=
s
->
coef_vlcs
[
tindex
]
->
max_level
){
if
(
run
<
s
->
coef_vlcs
[
tindex
]
->
levels
[
abs_level
-
1
])
code
=
run
+
s
->
int_table
[
tindex
][
abs_level
-
1
];
}
run
=
0
;
for
(;
ptr
<
eptr
;
ptr
++
)
{
if
(
*
ptr
)
{
int
level
=
*
ptr
;
int
abs_level
=
FFABS
(
level
);
int
code
=
0
;
if
(
abs_level
<=
s
->
coef_vlcs
[
tindex
]
->
max_level
)
if
(
run
<
s
->
coef_vlcs
[
tindex
]
->
levels
[
abs_level
-
1
])
code
=
run
+
s
->
int_table
[
tindex
][
abs_level
-
1
];
assert
(
code
<
s
->
coef_vlcs
[
tindex
]
->
n
);
put_bits
(
&
s
->
pb
,
s
->
coef_vlcs
[
tindex
]
->
huffbits
[
code
],
s
->
coef_vlcs
[
tindex
]
->
huffcodes
[
code
]);
put_bits
(
&
s
->
pb
,
s
->
coef_vlcs
[
tindex
]
->
huffbits
[
code
],
s
->
coef_vlcs
[
tindex
]
->
huffcodes
[
code
]);
if
(
code
==
0
)
{
if
(
1
<<
coef_nb_bits
<=
abs_level
)
if
(
code
==
0
)
{
if
(
1
<<
coef_nb_bits
<=
abs_level
)
return
-
1
;
put_bits
(
&
s
->
pb
,
coef_nb_bits
,
abs_level
);
put_bits
(
&
s
->
pb
,
s
->
frame_len_bits
,
run
);
}
put_bits
(
&
s
->
pb
,
1
,
level
<
0
);
//FIXME the sign is fliped somewhere
run
=
0
;
}
else
{
// FIXME the sign is flipped somewhere
put_bits
(
&
s
->
pb
,
1
,
level
<
0
);
run
=
0
;
}
else
run
++
;
}
if
(
run
)
put_bits
(
&
s
->
pb
,
s
->
coef_vlcs
[
tindex
]
->
huffbits
[
1
],
s
->
coef_vlcs
[
tindex
]
->
huffcodes
[
1
]);
}
if
(
run
)
put_bits
(
&
s
->
pb
,
s
->
coef_vlcs
[
tindex
]
->
huffbits
[
1
],
s
->
coef_vlcs
[
tindex
]
->
huffcodes
[
1
]);
}
if
(
s
->
version
==
1
&&
s
->
avctx
->
channels
>=
2
)
{
if
(
s
->
version
==
1
&&
s
->
avctx
->
channels
>=
2
)
avpriv_align_put_bits
(
&
s
->
pb
);
}
}
return
0
;
}
static
int
encode_frame
(
WMACodecContext
*
s
,
float
(
*
src_coefs
)[
BLOCK_MAX_SIZE
],
uint8_t
*
buf
,
int
buf_size
,
int
total_gain
){
static
int
encode_frame
(
WMACodecContext
*
s
,
float
(
*
src_coefs
)[
BLOCK_MAX_SIZE
],
uint8_t
*
buf
,
int
buf_size
,
int
total_gain
)
{
init_put_bits
(
&
s
->
pb
,
buf
,
buf_size
);
if
(
s
->
use_bit_reservoir
)
{
assert
(
0
);
//FIXME not implemented
}
else
{
if
(
encode_block
(
s
,
src_coefs
,
total_gain
)
<
0
)
if
(
s
->
use_bit_reservoir
)
assert
(
0
);
// FIXME not implemented
else
if
(
encode_block
(
s
,
src_coefs
,
total_gain
)
<
0
)
return
INT_MAX
;
}
avpriv_align_put_bits
(
&
s
->
pb
);
...
...
@@ -349,7 +361,7 @@ static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
WMACodecContext
*
s
=
avctx
->
priv_data
;
int
i
,
total_gain
,
ret
;
s
->
block_len_bits
=
s
->
frame_len_bits
;
//
required by non variable block len
s
->
block_len_bits
=
s
->
frame_len_bits
;
//
required by non variable block len
s
->
block_len
=
1
<<
s
->
block_len_bits
;
apply_window_and_mdct
(
avctx
,
frame
);
...
...
@@ -358,9 +370,9 @@ static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
float
a
,
b
;
int
i
;
for
(
i
=
0
;
i
<
s
->
block_len
;
i
++
)
{
a
=
s
->
coefs
[
0
][
i
]
*
0
.
5
;
b
=
s
->
coefs
[
1
][
i
]
*
0
.
5
;
for
(
i
=
0
;
i
<
s
->
block_len
;
i
++
)
{
a
=
s
->
coefs
[
0
][
i
]
*
0
.
5
;
b
=
s
->
coefs
[
1
][
i
]
*
0
.
5
;
s
->
coefs
[
0
][
i
]
=
a
+
b
;
s
->
coefs
[
1
][
i
]
=
a
-
b
;
}
...
...
@@ -372,29 +384,29 @@ static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
}
#if 1
total_gain
=
128
;
for
(
i
=
64
;
i
;
i
>>=
1
)
{
total_gain
=
128
;
for
(
i
=
64
;
i
;
i
>>=
1
)
{
int
error
=
encode_frame
(
s
,
s
->
coefs
,
avpkt
->
data
,
avpkt
->
size
,
total_gain
-
i
);
if
(
error
<
0
)
total_gain
-=
i
;
if
(
error
<
0
)
total_gain
-=
i
;
}
#else
total_gain
=
90
;
total_gain
=
90
;
best
=
encode_frame
(
s
,
s
->
coefs
,
avpkt
->
data
,
avpkt
->
size
,
total_gain
);
for
(
i
=
32
;
i
;
i
>>=
1
)
{
for
(
i
=
32
;
i
;
i
>>=
1
)
{
int
scoreL
=
encode_frame
(
s
,
s
->
coefs
,
avpkt
->
data
,
avpkt
->
size
,
total_gain
-
i
);
int
scoreR
=
encode_frame
(
s
,
s
->
coefs
,
avpkt
->
data
,
avpkt
->
size
,
total_gain
+
i
);
av_log
(
NULL
,
AV_LOG_ERROR
,
"%d %d %d (%d)
\n
"
,
scoreL
,
best
,
scoreR
,
total_gain
);
if
(
scoreL
<
FFMIN
(
best
,
scoreR
))
{
if
(
scoreL
<
FFMIN
(
best
,
scoreR
))
{
best
=
scoreL
;
total_gain
-=
i
;
}
else
if
(
scoreR
<
best
)
{
}
else
if
(
scoreR
<
best
)
{
best
=
scoreR
;
total_gain
+=
i
;
}
}
#endif
#endif
/* 1 */
if
((
i
=
encode_frame
(
s
,
s
->
coefs
,
avpkt
->
data
,
avpkt
->
size
,
total_gain
))
>=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"required frame size too large. please "
...
...
@@ -424,7 +436,7 @@ AVCodec ff_wmav1_encoder = {
.
init
=
encode_init
,
.
encode2
=
encode_superframe
,
.
close
=
ff_wma_end
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_FLTP
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_NONE
},
};
...
...
@@ -437,6 +449,6 @@ AVCodec ff_wmav2_encoder = {
.
init
=
encode_init
,
.
encode2
=
encode_superframe
,
.
close
=
ff_wma_end
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_FLTP
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_NONE
},
};
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