Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
7bfd1766
Commit
7bfd1766
authored
Aug 27, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
binkaudio: use float sample format
Use planar for DCT codec, interleaved for RDFT codec.
parent
0801b597
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
21 additions
and
35 deletions
+21
-35
binkaudio.c
libavcodec/binkaudio.c
+21
-35
No files found.
libavcodec/binkaudio.c
View file @
7bfd1766
...
...
@@ -47,7 +47,6 @@ static float quant_table[96];
typedef
struct
{
AVFrame
frame
;
GetBitContext
gb
;
FmtConvertContext
fmt_conv
;
int
version_b
;
///< Bink version 'b'
int
first
;
int
channels
;
...
...
@@ -58,10 +57,7 @@ typedef struct {
unsigned
int
*
bands
;
float
root
;
DECLARE_ALIGNED
(
32
,
FFTSample
,
coeffs
)[
BINK_BLOCK_MAX_SIZE
];
DECLARE_ALIGNED
(
16
,
int16_t
,
previous
)[
BINK_BLOCK_MAX_SIZE
/
16
];
///< coeffs from previous audio block
DECLARE_ALIGNED
(
16
,
int16_t
,
current
)[
BINK_BLOCK_MAX_SIZE
/
16
];
float
*
coeffs_ptr
[
MAX_CHANNELS
];
///< pointers to the coeffs arrays for float_to_int16_interleave
float
*
prev_ptr
[
MAX_CHANNELS
];
///< pointers to the overlap points in the coeffs array
float
previous
[
MAX_CHANNELS
][
BINK_BLOCK_MAX_SIZE
/
16
];
///< coeffs from previous audio block
uint8_t
*
packet_buffer
;
union
{
RDFTContext
rdft
;
...
...
@@ -78,8 +74,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
int
i
;
int
frame_len_bits
;
ff_fmt_convert_init
(
&
s
->
fmt_conv
,
avctx
);
/* determine frame length */
if
(
avctx
->
sample_rate
<
22050
)
{
frame_len_bits
=
9
;
...
...
@@ -98,12 +92,14 @@ static av_cold int decode_init(AVCodecContext *avctx)
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_BINKAUDIO_RDFT
)
{
// audio is already interleaved for the RDFT format variant
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLT
;
sample_rate
*=
avctx
->
channels
;
s
->
channels
=
1
;
if
(
!
s
->
version_b
)
frame_len_bits
+=
av_log2
(
avctx
->
channels
);
}
else
{
s
->
channels
=
avctx
->
channels
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLTP
;
}
s
->
frame_len
=
1
<<
frame_len_bits
;
...
...
@@ -111,9 +107,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
s
->
block_size
=
(
s
->
frame_len
-
s
->
overlap_len
)
*
s
->
channels
;
sample_rate_half
=
(
sample_rate
+
1
)
/
2
;
if
(
avctx
->
codec
->
id
==
AV_CODEC_ID_BINKAUDIO_RDFT
)
s
->
root
=
2
.
0
/
sqrt
(
s
->
frame_len
);
s
->
root
=
2
.
0
/
(
sqrt
(
s
->
frame_len
)
*
32768
.
0
);
else
s
->
root
=
s
->
frame_len
/
sqrt
(
s
->
frame_len
);
s
->
root
=
s
->
frame_len
/
(
sqrt
(
s
->
frame_len
)
*
32768
.
0
);
for
(
i
=
0
;
i
<
96
;
i
++
)
{
/* constant is result of 0.066399999/log10(M_E) */
quant_table
[
i
]
=
expf
(
i
*
0
.
15289164787221953823
f
)
*
s
->
root
;
...
...
@@ -135,12 +131,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
s
->
bands
[
s
->
num_bands
]
=
s
->
frame_len
;
s
->
first
=
1
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
for
(
i
=
0
;
i
<
s
->
channels
;
i
++
)
{
s
->
coeffs_ptr
[
i
]
=
s
->
coeffs
+
i
*
s
->
frame_len
;
s
->
prev_ptr
[
i
]
=
s
->
coeffs_ptr
[
i
]
+
s
->
frame_len
-
s
->
overlap_len
;
}
if
(
CONFIG_BINKAUDIO_RDFT_DECODER
&&
avctx
->
codec
->
id
==
AV_CODEC_ID_BINKAUDIO_RDFT
)
ff_rdft_init
(
&
s
->
trans
.
rdft
,
frame_len_bits
,
DFT_C2R
);
...
...
@@ -179,7 +169,7 @@ static const uint8_t rle_length_tab[16] = {
* @param[out] out Output buffer (must contain s->block_size elements)
* @return 0 on success, negative error code on failure
*/
static
int
decode_block
(
BinkAudioContext
*
s
,
int16_t
*
out
,
int
use_dct
)
static
int
decode_block
(
BinkAudioContext
*
s
,
float
*
*
out
,
int
use_dct
)
{
int
ch
,
i
,
j
,
k
;
float
q
,
quant
[
25
];
...
...
@@ -190,7 +180,8 @@ static int decode_block(BinkAudioContext *s, int16_t *out, int use_dct)
skip_bits
(
gb
,
2
);
for
(
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
{
FFTSample
*
coeffs
=
s
->
coeffs_ptr
[
ch
];
FFTSample
*
coeffs
=
out
[
ch
];
if
(
s
->
version_b
)
{
if
(
get_bits_left
(
gb
)
<
64
)
return
AVERROR_INVALIDDATA
;
...
...
@@ -265,24 +256,19 @@ static int decode_block(BinkAudioContext *s, int16_t *out, int use_dct)
s
->
trans
.
rdft
.
rdft_calc
(
&
s
->
trans
.
rdft
,
coeffs
);
}
s
->
fmt_conv
.
float_to_int16_interleave
(
s
->
current
,
(
const
float
**
)
s
->
prev_ptr
,
s
->
overlap_len
,
s
->
channels
);
s
->
fmt_conv
.
float_to_int16_interleave
(
out
,
(
const
float
**
)
s
->
coeffs_ptr
,
s
->
frame_len
-
s
->
overlap_len
,
s
->
channels
);
if
(
!
s
->
first
)
{
for
(
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
{
int
j
;
int
count
=
s
->
overlap_len
*
s
->
channels
;
int
shift
=
av_log2
(
count
);
for
(
i
=
0
;
i
<
count
;
i
++
)
{
out
[
i
]
=
(
s
->
previous
[
i
]
*
(
count
-
i
)
+
out
[
i
]
*
i
)
>>
shift
;
if
(
!
s
->
first
)
{
j
=
ch
;
for
(
i
=
0
;
i
<
s
->
overlap_len
;
i
++
,
j
+=
s
->
channels
)
out
[
ch
][
i
]
=
(
s
->
previous
[
ch
][
i
]
*
(
count
-
j
)
+
out
[
ch
][
i
]
*
j
)
/
count
;
}
memcpy
(
s
->
previous
[
ch
],
&
out
[
ch
][
s
->
frame_len
-
s
->
overlap_len
],
s
->
overlap_len
*
sizeof
(
*
s
->
previous
[
ch
]));
}
memcpy
(
s
->
previous
,
s
->
current
,
s
->
overlap_len
*
s
->
channels
*
sizeof
(
*
s
->
previous
));
s
->
first
=
0
;
return
0
;
...
...
@@ -311,7 +297,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
BinkAudioContext
*
s
=
avctx
->
priv_data
;
int16_t
*
samples
;
GetBitContext
*
gb
=
&
s
->
gb
;
int
ret
,
consumed
=
0
;
...
...
@@ -339,19 +324,20 @@ static int decode_frame(AVCodecContext *avctx, void *data,
}
/* get output buffer */
s
->
frame
.
nb_samples
=
s
->
block_size
/
avctx
->
channels
;
s
->
frame
.
nb_samples
=
s
->
frame_len
;
if
((
ret
=
avctx
->
get_buffer
(
avctx
,
&
s
->
frame
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
samples
=
(
int16_t
*
)
s
->
frame
.
data
[
0
];
if
(
decode_block
(
s
,
samples
,
avctx
->
codec
->
id
==
AV_CODEC_ID_BINKAUDIO_DCT
))
{
if
(
decode_block
(
s
,
(
float
**
)
s
->
frame
.
extended_data
,
avctx
->
codec
->
id
==
AV_CODEC_ID_BINKAUDIO_DCT
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Incomplete packet
\n
"
);
return
AVERROR_INVALIDDATA
;
}
get_bits_align32
(
gb
);
s
->
frame
.
nb_samples
=
s
->
block_size
/
avctx
->
channels
;
*
got_frame_ptr
=
1
;
*
(
AVFrame
*
)
data
=
s
->
frame
;
...
...
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