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
7ebfe5b4
Commit
7ebfe5b4
authored
Aug 29, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wmadec: use float planar sample format output
parent
977eb7d5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
37 deletions
+28
-37
wmadec.c
libavcodec/wmadec.c
+28
-37
No files found.
libavcodec/wmadec.c
View file @
7ebfe5b4
...
...
@@ -48,20 +48,6 @@
static
void
wma_lsp_to_curve_init
(
WMACodecContext
*
s
,
int
frame_len
);
#ifdef TRACE
static
void
dump_shorts
(
WMACodecContext
*
s
,
const
char
*
name
,
const
short
*
tab
,
int
n
)
{
int
i
;
tprintf
(
s
->
avctx
,
"%s[%d]:
\n
"
,
name
,
n
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
((
i
&
7
)
==
0
)
tprintf
(
s
->
avctx
,
"%4d: "
,
i
);
tprintf
(
s
->
avctx
,
" %5d.0"
,
tab
[
i
]);
if
((
i
&
7
)
==
7
)
tprintf
(
s
->
avctx
,
"
\n
"
);
}
}
static
void
dump_floats
(
WMACodecContext
*
s
,
const
char
*
name
,
int
prec
,
const
float
*
tab
,
int
n
)
{
int
i
;
...
...
@@ -105,7 +91,7 @@ static int wma_decode_init(AVCodecContext * avctx)
/* init MDCT */
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
);
ff_mdct_init
(
&
s
->
mdct_ctx
[
i
],
s
->
frame_len_bits
-
i
+
1
,
1
,
1
.
0
/
32768
.
0
);
if
(
s
->
use_noise_coding
)
{
init_vlc
(
&
s
->
hgain_vlc
,
HGAINVLCBITS
,
sizeof
(
ff_wma_hgain_huffbits
),
...
...
@@ -121,7 +107,7 @@ static int wma_decode_init(AVCodecContext * avctx)
wma_lsp_to_curve_init
(
s
,
s
->
frame_len
);
}
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_
S16
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_
FLTP
;
avcodec_get_frame_defaults
(
&
s
->
frame
);
avctx
->
coded_frame
=
&
s
->
frame
;
...
...
@@ -762,10 +748,10 @@ next:
}
/* decode a frame of frame_len samples */
static
int
wma_decode_frame
(
WMACodecContext
*
s
,
int16_t
*
samples
)
static
int
wma_decode_frame
(
WMACodecContext
*
s
,
float
**
samples
,
int
samples_offset
)
{
int
ret
,
n
,
ch
,
incr
;
const
float
*
output
[
MAX_CHANNELS
];
int
ret
,
ch
;
#ifdef TRACE
tprintf
(
s
->
avctx
,
"***decode_frame: %d size=%d
\n
"
,
s
->
frame_count
++
,
s
->
frame_len
);
...
...
@@ -782,20 +768,19 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
break
;
}
/* convert frame to integer */
n
=
s
->
frame_len
;
incr
=
s
->
nb_channels
;
for
(
ch
=
0
;
ch
<
MAX_CHANNELS
;
ch
++
)
output
[
ch
]
=
s
->
frame_out
[
ch
];
s
->
fmt_conv
.
float_to_int16_interleave
(
samples
,
output
,
n
,
incr
);
for
(
ch
=
0
;
ch
<
incr
;
ch
++
)
{
for
(
ch
=
0
;
ch
<
s
->
nb_channels
;
ch
++
)
{
/* copy current block to output */
memcpy
(
samples
[
ch
]
+
samples_offset
,
s
->
frame_out
[
ch
],
s
->
frame_len
*
sizeof
(
*
s
->
frame_out
[
ch
]));
/* prepare for next block */
memmove
(
&
s
->
frame_out
[
ch
][
0
],
&
s
->
frame_out
[
ch
][
n
],
n
*
sizeof
(
float
));
}
memmove
(
&
s
->
frame_out
[
ch
][
0
],
&
s
->
frame_out
[
ch
][
s
->
frame_len
],
s
->
frame_len
*
sizeof
(
*
s
->
frame_out
[
ch
]));
#ifdef TRACE
dump_shorts
(
s
,
"samples"
,
samples
,
n
*
s
->
nb_channels
);
dump_floats
(
s
,
"samples"
,
6
,
samples
[
ch
]
+
samples_offset
,
s
->
frame_len
);
#endif
}
return
0
;
}
...
...
@@ -807,7 +792,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
WMACodecContext
*
s
=
avctx
->
priv_data
;
int
nb_frames
,
bit_offset
,
i
,
pos
,
len
,
ret
;
uint8_t
*
q
;
int16_t
*
samples
;
float
**
samples
;
int
samples_offset
;
tprintf
(
avctx
,
"***decode_superframe:
\n
"
);
...
...
@@ -839,7 +825,8 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
samples
=
(
int16_t
*
)
s
->
frame
.
data
[
0
];
samples
=
(
float
**
)
s
->
frame
.
extended_data
;
samples_offset
=
0
;
if
(
s
->
use_bit_reservoir
)
{
bit_offset
=
get_bits
(
&
s
->
gb
,
s
->
byte_offset_bits
+
3
);
...
...
@@ -873,9 +860,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
skip_bits
(
&
s
->
gb
,
s
->
last_bitoffset
);
/* this frame is stored in the last superframe and in the
current one */
if
(
wma_decode_frame
(
s
,
samples
)
<
0
)
if
(
wma_decode_frame
(
s
,
samples
,
samples_offset
)
<
0
)
goto
fail
;
samples
+=
s
->
nb_channels
*
s
->
frame_len
;
samples
_offset
+=
s
->
frame_len
;
nb_frames
--
;
}
...
...
@@ -890,9 +877,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
s
->
reset_block_lengths
=
1
;
for
(
i
=
0
;
i
<
nb_frames
;
i
++
)
{
if
(
wma_decode_frame
(
s
,
samples
)
<
0
)
if
(
wma_decode_frame
(
s
,
samples
,
samples_offset
)
<
0
)
goto
fail
;
samples
+=
s
->
nb_channels
*
s
->
frame_len
;
samples
_offset
+=
s
->
frame_len
;
}
/* we copy the end of the frame in the last frame buffer */
...
...
@@ -908,9 +895,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
memcpy
(
s
->
last_superframe
,
buf
+
pos
,
len
);
}
else
{
/* single frame decode */
if
(
wma_decode_frame
(
s
,
samples
)
<
0
)
if
(
wma_decode_frame
(
s
,
samples
,
samples_offset
)
<
0
)
goto
fail
;
samples
+=
s
->
nb_channels
*
s
->
frame_len
;
samples
_offset
+=
s
->
frame_len
;
}
av_dlog
(
s
->
avctx
,
"%d %d %d %d outbytes:%td eaten:%d
\n
"
,
...
...
@@ -946,6 +933,8 @@ AVCodec ff_wmav1_decoder = {
.
flush
=
flush
,
.
capabilities
=
CODEC_CAP_DR1
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Windows Media Audio 1"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_NONE
},
};
AVCodec
ff_wmav2_decoder
=
{
...
...
@@ -959,4 +948,6 @@ AVCodec ff_wmav2_decoder = {
.
flush
=
flush
,
.
capabilities
=
CODEC_CAP_DR1
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Windows Media Audio 2"
),
.
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