2 * MPEG Audio header decoder
3 * Copyright (c) 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
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.
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.
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
24 * MPEG Audio header decoder.
27 #include "libavutil/common.h"
30 #include "mpegaudio.h"
31 #include "mpegaudiodata.h"
32 #include "mpegaudiodecheader.h"
35 int avpriv_mpegaudio_decode_header(MPADecodeHeader
*s
, uint32_t header
)
37 int sample_rate
, frame_size
, mpeg25
, padding
;
38 int sample_rate_index
, bitrate_index
;
39 if (header
& (1<<20)) {
40 s
->lsf
= (header
& (1<<19)) ? 0 : 1;
47 s
->layer
= 4 - ((header
>> 17) & 3);
48 /* extract frequency */
49 sample_rate_index
= (header
>> 10) & 3;
50 if (sample_rate_index
>= FF_ARRAY_ELEMS(avpriv_mpa_freq_tab
))
51 sample_rate_index
= 0;
52 sample_rate
= avpriv_mpa_freq_tab
[sample_rate_index
] >> (s
->lsf
+ mpeg25
);
53 sample_rate_index
+= 3 * (s
->lsf
+ mpeg25
);
54 s
->sample_rate_index
= sample_rate_index
;
55 s
->error_protection
= ((header
>> 16) & 1) ^ 1;
56 s
->sample_rate
= sample_rate
;
58 bitrate_index
= (header
>> 12) & 0xf;
59 padding
= (header
>> 9) & 1;
60 //extension = (header >> 8) & 1;
61 s
->mode
= (header
>> 6) & 3;
62 s
->mode_ext
= (header
>> 4) & 3;
63 //copyright = (header >> 3) & 1;
64 //original = (header >> 2) & 1;
65 //emphasis = header & 3;
67 if (s
->mode
== MPA_MONO
)
72 if (bitrate_index
!= 0) {
73 frame_size
= avpriv_mpa_bitrate_tab
[s
->lsf
][s
->layer
- 1][bitrate_index
];
74 s
->bit_rate
= frame_size
* 1000;
77 frame_size
= (frame_size
* 12000) / sample_rate
;
78 frame_size
= (frame_size
+ padding
) * 4;
81 frame_size
= (frame_size
* 144000) / sample_rate
;
82 frame_size
+= padding
;
86 frame_size
= (frame_size
* 144000) / (sample_rate
<< s
->lsf
);
87 frame_size
+= padding
;
90 s
->frame_size
= frame_size
;
92 /* if no frame size computed, signal it */
97 av_dlog(NULL
, "layer%d, %d Hz, %d kbits/s, ",
98 s
->layer
, s
->sample_rate
, s
->bit_rate
);
99 if (s
->nb_channels
== 2) {
101 if (s
->mode_ext
& MODE_EXT_MS_STEREO
)
102 av_dlog(NULL
, "ms-");
103 if (s
->mode_ext
& MODE_EXT_I_STEREO
)
106 av_dlog(NULL
, "stereo");
108 av_dlog(NULL
, "mono");
115 int avpriv_mpa_decode_header2(uint32_t head
, int *sample_rate
, int *channels
, int *frame_size
, int *bit_rate
, enum AVCodecID
*codec_id
)
117 MPADecodeHeader s1
, *s
= &s1
;
119 if (ff_mpa_check_header(head
) != 0)
122 if (avpriv_mpegaudio_decode_header(s
, head
) != 0) {
128 *codec_id
= AV_CODEC_ID_MP1
;
132 *codec_id
= AV_CODEC_ID_MP2
;
137 *codec_id
= AV_CODEC_ID_MP3
;
145 *sample_rate
= s
->sample_rate
;
146 *channels
= s
->nb_channels
;
147 *bit_rate
= s
->bit_rate
;
148 return s
->frame_size
;
151 int avpriv_mpa_decode_header(AVCodecContext
*avctx
, uint32_t head
, int *sample_rate
, int *channels
, int *frame_size
, int *bit_rate
)
153 return avpriv_mpa_decode_header2(head
, sample_rate
, channels
, frame_size
, bit_rate
, &avctx
->codec_id
);