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
3ffed68c
Commit
3ffed68c
authored
Aug 27, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpegaudiodec: use planar sample format for output unless packed is requested
parent
2d3993ce
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
48 deletions
+61
-48
mpegaudiodec.c
libavcodec/mpegaudiodec.c
+47
-48
mpegaudiodec_float.c
libavcodec/mpegaudiodec_float.c
+14
-0
No files found.
libavcodec/mpegaudiodec.c
View file @
3ffed68c
...
...
@@ -93,7 +93,8 @@ typedef struct MPADecodeContext {
# define MULH3(x, y, s) ((s)*(y)*(x))
# define MULLx(x, y, s) ((y)*(x))
# define RENAME(a) a ## _float
# define OUT_FMT AV_SAMPLE_FMT_FLT
# define OUT_FMT AV_SAMPLE_FMT_FLT
# define OUT_FMT_P AV_SAMPLE_FMT_FLTP
#else
# define SHR(a,b) ((a)>>(b))
/* WARNING: only correct for positive numbers */
...
...
@@ -103,7 +104,8 @@ typedef struct MPADecodeContext {
# define MULH3(x, y, s) MULH((s)*(x), y)
# define MULLx(x, y, s) MULL(x,y,s)
# define RENAME(a) a ## _fixed
# define OUT_FMT AV_SAMPLE_FMT_S16
# define OUT_FMT AV_SAMPLE_FMT_S16
# define OUT_FMT_P AV_SAMPLE_FMT_S16P
#endif
/****************/
...
...
@@ -434,7 +436,11 @@ static av_cold int decode_init(AVCodecContext * avctx)
ff_mpadsp_init
(
&
s
->
mpadsp
);
ff_dsputil_init
(
&
s
->
dsp
,
avctx
);
avctx
->
sample_fmt
=
OUT_FMT
;
if
(
avctx
->
request_sample_fmt
==
OUT_FMT
&&
avctx
->
codec_id
!=
AV_CODEC_ID_MP3ON4
)
avctx
->
sample_fmt
=
OUT_FMT
;
else
avctx
->
sample_fmt
=
OUT_FMT_P
;
s
->
err_recognition
=
avctx
->
err_recognition
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_MP3ADU
)
...
...
@@ -1546,7 +1552,7 @@ static int mp_decode_layer3(MPADecodeContext *s)
return
nb_granules
*
18
;
}
static
int
mp_decode_frame
(
MPADecodeContext
*
s
,
OUT_INT
*
samples
,
static
int
mp_decode_frame
(
MPADecodeContext
*
s
,
OUT_INT
*
*
samples
,
const
uint8_t
*
buf
,
int
buf_size
)
{
int
i
,
nb_frames
,
ch
,
ret
;
...
...
@@ -1609,20 +1615,26 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT *samples,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
samples
=
(
OUT_INT
*
)
s
->
frame
.
data
[
0
]
;
samples
=
(
OUT_INT
*
*
)
s
->
frame
.
extended_data
;
}
/* apply the synthesis filter */
for
(
ch
=
0
;
ch
<
s
->
nb_channels
;
ch
++
)
{
samples_ptr
=
samples
+
ch
;
int
sample_stride
;
if
(
s
->
avctx
->
sample_fmt
==
OUT_FMT_P
)
{
samples_ptr
=
samples
[
ch
];
sample_stride
=
1
;
}
else
{
samples_ptr
=
samples
[
0
]
+
ch
;
sample_stride
=
s
->
nb_channels
;
}
for
(
i
=
0
;
i
<
nb_frames
;
i
++
)
{
RENAME
(
ff_mpa_synth_filter
)(
&
s
->
mpadsp
,
s
->
synth_buf
[
ch
],
&
(
s
->
synth_buf_offset
[
ch
]),
RENAME
(
ff_mpa_synth_window
),
&
s
->
dither_state
,
samples_ptr
,
s
->
nb_channels
,
s
->
sb_samples
[
ch
][
i
]);
samples_ptr
+=
32
*
s
->
nb_channels
;
RENAME
(
ff_mpa_synth_filter
)(
&
s
->
mpadsp
,
s
->
synth_buf
[
ch
],
&
(
s
->
synth_buf_offset
[
ch
]),
RENAME
(
ff_mpa_synth_window
),
&
s
->
dither_state
,
samples_ptr
,
sample_stride
,
s
->
sb_samples
[
ch
][
i
]);
samples_ptr
+=
32
*
sample_stride
;
}
}
...
...
@@ -1760,7 +1772,6 @@ typedef struct MP3On4DecodeContext {
int
syncword
;
///< syncword patch
const
uint8_t
*
coff
;
///< channel offsets in output buffer
MPADecodeContext
*
mp3decctx
[
5
];
///< MPADecodeContext for every decoder instance
OUT_INT
*
decoded_buf
;
///< output buffer for decoded samples
}
MP3On4DecodeContext
;
#include "mpeg4audio.h"
...
...
@@ -1802,8 +1813,6 @@ static av_cold int decode_close_mp3on4(AVCodecContext * avctx)
for
(
i
=
0
;
i
<
s
->
frames
;
i
++
)
av_free
(
s
->
mp3decctx
[
i
]);
av_freep
(
&
s
->
decoded_buf
);
return
0
;
}
...
...
@@ -1864,14 +1873,6 @@ static int decode_init_mp3on4(AVCodecContext * avctx)
s
->
mp3decctx
[
i
]
->
mpadsp
=
s
->
mp3decctx
[
0
]
->
mpadsp
;
}
/* Allocate buffer for multi-channel output if needed */
if
(
s
->
frames
>
1
)
{
s
->
decoded_buf
=
av_malloc
(
MPA_FRAME_SIZE
*
MPA_MAX_CHANNELS
*
sizeof
(
*
s
->
decoded_buf
));
if
(
!
s
->
decoded_buf
)
goto
alloc_fail
;
}
return
0
;
alloc_fail:
decode_close_mp3on4
(
avctx
);
...
...
@@ -1898,9 +1899,9 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data,
MPADecodeContext
*
m
;
int
fsize
,
len
=
buf_size
,
out_size
=
0
;
uint32_t
header
;
OUT_INT
*
out_samples
;
OUT_INT
*
outptr
,
*
bp
;
int
fr
,
j
,
n
,
ch
,
ret
;
OUT_INT
*
*
out_samples
;
OUT_INT
*
outptr
[
2
]
;
int
fr
,
ch
,
ret
;
/* get output buffer */
s
->
frame
->
nb_samples
=
MPA_FRAME_SIZE
;
...
...
@@ -1908,15 +1909,12 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data,
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
out_samples
=
(
OUT_INT
*
)
s
->
frame
->
data
[
0
]
;
out_samples
=
(
OUT_INT
*
*
)
s
->
frame
->
extended_data
;
// Discard too short frames
if
(
buf_size
<
HEADER_SIZE
)
return
AVERROR_INVALIDDATA
;
// If only one decoder interleave is not needed
outptr
=
s
->
frames
==
1
?
out_samples
:
s
->
decoded_buf
;
avctx
->
bit_rate
=
0
;
ch
=
0
;
...
...
@@ -1944,6 +1942,10 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data,
}
ch
+=
m
->
nb_channels
;
outptr
[
0
]
=
out_samples
[
s
->
coff
[
fr
]];
if
(
m
->
nb_channels
>
1
)
outptr
[
1
]
=
out_samples
[
s
->
coff
[
fr
]
+
1
];
if
((
ret
=
mp_decode_frame
(
m
,
outptr
,
buf
,
fsize
))
<
0
)
return
ret
;
...
...
@@ -1951,23 +1953,6 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data,
buf
+=
fsize
;
len
-=
fsize
;
if
(
s
->
frames
>
1
)
{
n
=
m
->
avctx
->
frame_size
*
m
->
nb_channels
;
/* interleave output data */
bp
=
out_samples
+
s
->
coff
[
fr
];
if
(
m
->
nb_channels
==
1
)
{
for
(
j
=
0
;
j
<
n
;
j
++
)
{
*
bp
=
s
->
decoded_buf
[
j
];
bp
+=
avctx
->
channels
;
}
}
else
{
for
(
j
=
0
;
j
<
n
;
j
++
)
{
bp
[
0
]
=
s
->
decoded_buf
[
j
++
];
bp
[
1
]
=
s
->
decoded_buf
[
j
];
bp
+=
avctx
->
channels
;
}
}
}
avctx
->
bit_rate
+=
m
->
bit_rate
;
}
...
...
@@ -1994,6 +1979,9 @@ AVCodec ff_mp1_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP1 (MPEG audio layer 1)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP2_DECODER
...
...
@@ -2007,6 +1995,9 @@ AVCodec ff_mp2_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP2 (MPEG audio layer 2)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3_DECODER
...
...
@@ -2020,6 +2011,9 @@ AVCodec ff_mp3_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP3 (MPEG audio layer 3)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3ADU_DECODER
...
...
@@ -2033,6 +2027,9 @@ AVCodec ff_mp3adu_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"ADU (Application Data Unit) MP3 (MPEG audio layer 3)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3ON4_DECODER
...
...
@@ -2047,6 +2044,8 @@ AVCodec ff_mp3on4_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush_mp3on4
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP3onMP4"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#endif
libavcodec/mpegaudiodec_float.c
View file @
3ffed68c
...
...
@@ -33,6 +33,9 @@ AVCodec ff_mp1float_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP1 (MPEG audio layer 1)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_FLT
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP2FLOAT_DECODER
...
...
@@ -46,6 +49,9 @@ AVCodec ff_mp2float_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP2 (MPEG audio layer 2)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_FLT
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3FLOAT_DECODER
...
...
@@ -59,6 +65,9 @@ AVCodec ff_mp3float_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP3 (MPEG audio layer 3)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_FLT
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3ADUFLOAT_DECODER
...
...
@@ -72,6 +81,9 @@ AVCodec ff_mp3adufloat_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"ADU (Application Data Unit) MP3 (MPEG audio layer 3)"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_FLT
,
AV_SAMPLE_FMT_NONE
},
};
#endif
#if CONFIG_MP3ON4FLOAT_DECODER
...
...
@@ -86,5 +98,7 @@ AVCodec ff_mp3on4float_decoder = {
.
capabilities
=
CODEC_CAP_DR1
,
.
flush
=
flush_mp3on4
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"MP3onMP4"
),
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_FLTP
,
AV_SAMPLE_FMT_NONE
},
};
#endif
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