FFmpeg
libavcodec
mpegaudiodecheader.c
Go to the documentation of this file.
1
/*
2
* MPEG Audio header decoder
3
* Copyright (c) 2001, 2002 Fabrice Bellard
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
/**
23
* @file
24
* MPEG Audio header decoder.
25
*/
26
27
#include "
libavutil/common.h
"
28
29
#include "
avcodec.h
"
30
#include "
internal.h
"
31
#include "
mpegaudio.h
"
32
#include "
mpegaudiodata.h
"
33
#include "
mpegaudiodecheader.h
"
34
35
36
int
avpriv_mpegaudio_decode_header
(
MPADecodeHeader
*
s
, uint32_t
header
)
37
{
38
int
sample_rate
,
frame_size
, mpeg25, padding;
39
int
sample_rate_index, bitrate_index;
40
int
ret
;
41
42
ret
=
ff_mpa_check_header
(
header
);
43
if
(
ret
< 0)
44
return
ret
;
45
46
if
(
header
& (1<<20)) {
47
s
->lsf = (
header
& (1<<19)) ? 0 : 1;
48
mpeg25 = 0;
49
}
else
{
50
s
->lsf = 1;
51
mpeg25 = 1;
52
}
53
54
s
->layer = 4 - ((
header
>> 17) & 3);
55
/* extract frequency */
56
sample_rate_index = (
header
>> 10) & 3;
57
if
(sample_rate_index >=
FF_ARRAY_ELEMS
(
avpriv_mpa_freq_tab
))
58
sample_rate_index = 0;
59
sample_rate
=
avpriv_mpa_freq_tab
[sample_rate_index] >> (
s
->lsf + mpeg25);
60
sample_rate_index += 3 * (
s
->lsf + mpeg25);
61
s
->sample_rate_index = sample_rate_index;
62
s
->error_protection = ((
header
>> 16) & 1) ^ 1;
63
s
->sample_rate =
sample_rate
;
64
65
bitrate_index = (
header
>> 12) & 0
xf
;
66
padding = (
header
>> 9) & 1;
67
//extension = (header >> 8) & 1;
68
s
->mode = (
header
>> 6) & 3;
69
s
->mode_ext = (
header
>> 4) & 3;
70
//copyright = (header >> 3) & 1;
71
//original = (header >> 2) & 1;
72
//emphasis = header & 3;
73
74
if
(
s
->mode ==
MPA_MONO
)
75
s
->nb_channels = 1;
76
else
77
s
->nb_channels = 2;
78
79
if
(bitrate_index != 0) {
80
frame_size
=
avpriv_mpa_bitrate_tab
[
s
->lsf][
s
->layer - 1][bitrate_index];
81
s
->bit_rate =
frame_size
* 1000;
82
switch
(
s
->layer) {
83
case
1:
84
frame_size
= (
frame_size
* 12000) /
sample_rate
;
85
frame_size
= (
frame_size
+ padding) * 4;
86
break
;
87
case
2:
88
frame_size
= (
frame_size
* 144000) /
sample_rate
;
89
frame_size
+= padding;
90
break
;
91
default
:
92
case
3:
93
frame_size
= (
frame_size
* 144000) / (
sample_rate
<<
s
->lsf);
94
frame_size
+= padding;
95
break
;
96
}
97
s
->frame_size =
frame_size
;
98
}
else
{
99
/* if no frame size computed, signal it */
100
return
1;
101
}
102
103
#if defined(DEBUG)
104
ff_dlog
(
NULL
,
"layer%d, %d Hz, %d kbits/s, "
,
105
s
->layer,
s
->sample_rate,
s
->bit_rate);
106
if
(
s
->nb_channels == 2) {
107
if
(
s
->layer == 3) {
108
if
(
s
->mode_ext &
MODE_EXT_MS_STEREO
)
109
ff_dlog
(
NULL
,
"ms-"
);
110
if
(
s
->mode_ext &
MODE_EXT_I_STEREO
)
111
ff_dlog
(
NULL
,
"i-"
);
112
}
113
ff_dlog
(
NULL
,
"stereo"
);
114
}
else
{
115
ff_dlog
(
NULL
,
"mono"
);
116
}
117
ff_dlog
(
NULL
,
"\n"
);
118
#endif
119
return
0;
120
}
121
122
int
ff_mpa_decode_header
(uint32_t head,
int
*
sample_rate
,
int
*
channels
,
int
*
frame_size
,
int
*bit_rate,
enum
AVCodecID
*
codec_id
)
123
{
124
MPADecodeHeader
s1
, *
s
= &
s1
;
125
126
if
(
avpriv_mpegaudio_decode_header
(
s
, head) != 0) {
127
return
-1;
128
}
129
130
switch
(
s
->layer) {
131
case
1:
132
*
codec_id
=
AV_CODEC_ID_MP1
;
133
*
frame_size
= 384;
134
break
;
135
case
2:
136
*
codec_id
=
AV_CODEC_ID_MP2
;
137
*
frame_size
= 1152;
138
break
;
139
default
:
140
case
3:
141
if
(*
codec_id
!=
AV_CODEC_ID_MP3ADU
)
142
*
codec_id
=
AV_CODEC_ID_MP3
;
143
if
(
s
->lsf)
144
*
frame_size
= 576;
145
else
146
*
frame_size
= 1152;
147
break
;
148
}
149
150
*
sample_rate
=
s
->sample_rate;
151
*
channels
=
s
->nb_channels;
152
*bit_rate =
s
->bit_rate;
153
return
s
->frame_size;
154
}
MPA_MONO
#define MPA_MONO
Definition:
mpegaudio.h:49
codec_id
enum AVCodecID codec_id
Definition:
qsv.c:72
avpriv_mpa_freq_tab
const uint16_t avpriv_mpa_freq_tab[3]
Definition:
mpegaudiodata.c:40
avpriv_mpa_bitrate_tab
const uint16_t avpriv_mpa_bitrate_tab[2][3][15]
Definition:
mpegaudiodata.c:30
mpegaudiodecheader.h
internal.h
MPADecodeHeader
Definition:
mpegaudiodecheader.h:46
channels
channels
Definition:
aptx.c:30
sample_rate
sample_rate
Definition:
ffmpeg_filter.c:191
AV_CODEC_ID_MP3ADU
@ AV_CODEC_ID_MP3ADU
Definition:
avcodec.h:577
ff_mpa_decode_header
int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id)
Definition:
mpegaudiodecheader.c:122
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition:
avcodec.h:565
avpriv_mpegaudio_decode_header
int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
Definition:
mpegaudiodecheader.c:36
MODE_EXT_MS_STEREO
#define MODE_EXT_MS_STEREO
Definition:
mpegaudiodata.h:34
s
#define s(width, name)
Definition:
cbs_vp9.c:257
frame_size
int frame_size
Definition:
mxfenc.c:2215
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition:
avcodec.h:564
s1
#define s1
Definition:
regdef.h:38
NULL
#define NULL
Definition:
coverity.c:32
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition:
avcodec.h:215
ff_dlog
#define ff_dlog(a,...)
Definition:
tableprint_vlc.h:29
ff_mpa_check_header
static int ff_mpa_check_header(uint32_t header)
Definition:
mpegaudiodecheader.h:61
header
static const uint8_t header[24]
Definition:
sdr2.c:67
common.h
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition:
cbs_av1.c:668
mpegaudio.h
avcodec.h
ret
ret
Definition:
filter_design.txt:187
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition:
sinewin_tablegen_template.c:38
MODE_EXT_I_STEREO
#define MODE_EXT_I_STEREO
Definition:
mpegaudiodata.h:35
mpegaudiodata.h
AV_CODEC_ID_MP1
@ AV_CODEC_ID_MP1
Definition:
avcodec.h:606
Generated on Wed Aug 24 2022 21:26:52 for FFmpeg by
1.8.17