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/macros.h
"
28
29
#include "
mpegaudio.h
"
30
#include "
mpegaudiodata.h
"
31
#include "
mpegaudiodecheader.h
"
32
33
34
int
avpriv_mpegaudio_decode_header
(
MPADecodeHeader
*
s
, uint32_t
header
)
35
{
36
int
sample_rate
,
frame_size
, mpeg25, padding;
37
int
sample_rate_index, bitrate_index;
38
int
ret
;
39
40
ret
=
ff_mpa_check_header
(
header
);
41
if
(
ret
< 0)
42
return
ret
;
43
44
if
(
header
& (1<<20)) {
45
s
->lsf = (
header
& (1<<19)) ? 0 : 1;
46
mpeg25 = 0;
47
}
else
{
48
s
->lsf = 1;
49
mpeg25 = 1;
50
}
51
52
s
->layer = 4 - ((
header
>> 17) & 3);
53
/* extract frequency */
54
sample_rate_index = (
header
>> 10) & 3;
55
if
(sample_rate_index >=
FF_ARRAY_ELEMS
(
ff_mpa_freq_tab
))
56
sample_rate_index = 0;
57
sample_rate
=
ff_mpa_freq_tab
[sample_rate_index] >> (
s
->lsf + mpeg25);
58
sample_rate_index += 3 * (
s
->lsf + mpeg25);
59
s
->sample_rate_index = sample_rate_index;
60
s
->error_protection = ((
header
>> 16) & 1) ^ 1;
61
s
->sample_rate =
sample_rate
;
62
63
bitrate_index = (
header
>> 12) & 0
xf
;
64
padding = (
header
>> 9) & 1;
65
//extension = (header >> 8) & 1;
66
s
->mode = (
header
>> 6) & 3;
67
s
->mode_ext = (
header
>> 4) & 3;
68
//copyright = (header >> 3) & 1;
69
//original = (header >> 2) & 1;
70
//emphasis = header & 3;
71
72
if
(
s
->mode ==
MPA_MONO
)
73
s
->nb_channels = 1;
74
else
75
s
->nb_channels = 2;
76
77
if
(bitrate_index != 0) {
78
frame_size
=
ff_mpa_bitrate_tab
[
s
->lsf][
s
->layer - 1][bitrate_index];
79
s
->bit_rate =
frame_size
* 1000;
80
switch
(
s
->layer) {
81
case
1:
82
frame_size
= (
frame_size
* 12000) /
sample_rate
;
83
frame_size
= (
frame_size
+ padding) * 4;
84
break
;
85
case
2:
86
frame_size
= (
frame_size
* 144000) /
sample_rate
;
87
frame_size
+= padding;
88
break
;
89
default
:
90
case
3:
91
frame_size
= (
frame_size
* 144000) / (
sample_rate
<<
s
->lsf);
92
frame_size
+= padding;
93
break
;
94
}
95
s
->frame_size =
frame_size
;
96
}
else
{
97
/* if no frame size computed, signal it */
98
return
1;
99
}
100
101
#if defined(DEBUG)
102
ff_dlog
(
NULL
,
"layer%d, %d Hz, %d kbits/s, "
,
103
s
->layer,
s
->sample_rate,
s
->bit_rate);
104
if
(
s
->nb_channels == 2) {
105
if
(
s
->layer == 3) {
106
if
(
s
->mode_ext &
MODE_EXT_MS_STEREO
)
107
ff_dlog
(
NULL
,
"ms-"
);
108
if
(
s
->mode_ext &
MODE_EXT_I_STEREO
)
109
ff_dlog
(
NULL
,
"i-"
);
110
}
111
ff_dlog
(
NULL
,
"stereo"
);
112
}
else
{
113
ff_dlog
(
NULL
,
"mono"
);
114
}
115
ff_dlog
(
NULL
,
"\n"
);
116
#endif
117
return
0;
118
}
119
120
int
ff_mpa_decode_header
(uint32_t head,
int
*
sample_rate
,
int
*
channels
,
int
*
frame_size
,
int
*bit_rate,
enum
AVCodecID
*
codec_id
)
121
{
122
MPADecodeHeader
s1
, *
s
= &
s1
;
123
124
if
(
avpriv_mpegaudio_decode_header
(
s
, head) != 0) {
125
return
-1;
126
}
127
128
switch
(
s
->layer) {
129
case
1:
130
*
codec_id
=
AV_CODEC_ID_MP1
;
131
*
frame_size
= 384;
132
break
;
133
case
2:
134
*
codec_id
=
AV_CODEC_ID_MP2
;
135
*
frame_size
= 1152;
136
break
;
137
default
:
138
case
3:
139
if
(*
codec_id
!=
AV_CODEC_ID_MP3ADU
)
140
*
codec_id
=
AV_CODEC_ID_MP3
;
141
if
(
s
->lsf)
142
*
frame_size
= 576;
143
else
144
*
frame_size
= 1152;
145
break
;
146
}
147
148
*
sample_rate
=
s
->sample_rate;
149
*
channels
=
s
->nb_channels;
150
*bit_rate =
s
->bit_rate;
151
return
s
->frame_size;
152
}
MPA_MONO
#define MPA_MONO
Definition:
mpegaudio.h:49
mpegaudiodecheader.h
MPADecodeHeader
Definition:
mpegaudiodecheader.h:47
sample_rate
sample_rate
Definition:
ffmpeg_filter.c:156
AV_CODEC_ID_MP3ADU
@ AV_CODEC_ID_MP3ADU
Definition:
codec_id.h:451
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:120
macros.h
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition:
codec_id.h:439
avpriv_mpegaudio_decode_header
int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
Definition:
mpegaudiodecheader.c:34
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition:
sinewin_tablegen.c:29
MODE_EXT_MS_STEREO
#define MODE_EXT_MS_STEREO
Definition:
mpegaudiodata.h:36
s
#define s(width, name)
Definition:
cbs_vp9.c:256
frame_size
int frame_size
Definition:
mxfenc.c:2205
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition:
codec_id.h:438
s1
#define s1
Definition:
regdef.h:38
channels
channels
Definition:
aptx.h:31
codec_id
enum AVCodecID codec_id
Definition:
vaapi_decode.c:388
NULL
#define NULL
Definition:
coverity.c:32
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition:
codec_id.h:49
ff_dlog
#define ff_dlog(a,...)
Definition:
tableprint_vlc.h:28
ff_mpa_check_header
static int ff_mpa_check_header(uint32_t header)
Definition:
mpegaudiodecheader.h:62
header
static const uint8_t header[24]
Definition:
sdr2.c:67
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition:
cbs_av1.c:664
ff_mpa_bitrate_tab
const uint16_t ff_mpa_bitrate_tab[2][3][15]
Definition:
mpegaudiotabs.h:27
mpegaudio.h
ret
ret
Definition:
filter_design.txt:187
MODE_EXT_I_STEREO
#define MODE_EXT_I_STEREO
Definition:
mpegaudiodata.h:37
ff_mpa_freq_tab
const uint16_t ff_mpa_freq_tab[3]
Definition:
mpegaudiotabs.h:37
mpegaudiodata.h
AV_CODEC_ID_MP1
@ AV_CODEC_ID_MP1
Definition:
codec_id.h:480
Generated on Tue Feb 28 2023 21:33:31 for FFmpeg by
1.8.17