yading@11
|
1 /*
|
yading@11
|
2 * MP3 demuxer
|
yading@11
|
3 * Copyright (c) 2003 Fabrice Bellard
|
yading@11
|
4 *
|
yading@11
|
5 * This file is part of FFmpeg.
|
yading@11
|
6 *
|
yading@11
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
9 * License as published by the Free Software Foundation; either
|
yading@11
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
11 *
|
yading@11
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
15 * Lesser General Public License for more details.
|
yading@11
|
16 *
|
yading@11
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
20 */
|
yading@11
|
21
|
yading@11
|
22 #include "libavutil/avstring.h"
|
yading@11
|
23 #include "libavutil/intreadwrite.h"
|
yading@11
|
24 #include "libavutil/dict.h"
|
yading@11
|
25 #include "libavutil/mathematics.h"
|
yading@11
|
26 #include "avformat.h"
|
yading@11
|
27 #include "internal.h"
|
yading@11
|
28 #include "id3v2.h"
|
yading@11
|
29 #include "id3v1.h"
|
yading@11
|
30 #include "libavcodec/mpegaudiodecheader.h"
|
yading@11
|
31
|
yading@11
|
32 #define XING_FLAG_FRAMES 0x01
|
yading@11
|
33 #define XING_FLAG_SIZE 0x02
|
yading@11
|
34 #define XING_FLAG_TOC 0x04
|
yading@11
|
35
|
yading@11
|
36 #define XING_TOC_COUNT 100
|
yading@11
|
37
|
yading@11
|
38 typedef struct {
|
yading@11
|
39 int64_t filesize;
|
yading@11
|
40 int xing_toc;
|
yading@11
|
41 int start_pad;
|
yading@11
|
42 int end_pad;
|
yading@11
|
43 } MP3DecContext;
|
yading@11
|
44
|
yading@11
|
45 /* mp3 read */
|
yading@11
|
46
|
yading@11
|
47 static int mp3_read_probe(AVProbeData *p)
|
yading@11
|
48 {
|
yading@11
|
49 int max_frames, first_frames = 0;
|
yading@11
|
50 int fsize, frames, sample_rate;
|
yading@11
|
51 uint32_t header;
|
yading@11
|
52 const uint8_t *buf, *buf0, *buf2, *end;
|
yading@11
|
53 AVCodecContext avctx;
|
yading@11
|
54
|
yading@11
|
55 buf0 = p->buf;
|
yading@11
|
56 end = p->buf + p->buf_size - sizeof(uint32_t);
|
yading@11
|
57 while(buf0 < end && !*buf0)
|
yading@11
|
58 buf0++;
|
yading@11
|
59
|
yading@11
|
60 max_frames = 0;
|
yading@11
|
61 buf = buf0;
|
yading@11
|
62
|
yading@11
|
63 for(; buf < end; buf= buf2+1) {
|
yading@11
|
64 buf2 = buf;
|
yading@11
|
65
|
yading@11
|
66 for(frames = 0; buf2 < end; frames++) {
|
yading@11
|
67 header = AV_RB32(buf2);
|
yading@11
|
68 fsize = avpriv_mpa_decode_header(&avctx, header, &sample_rate, &sample_rate, &sample_rate, &sample_rate);
|
yading@11
|
69 if(fsize < 0)
|
yading@11
|
70 break;
|
yading@11
|
71 buf2 += fsize;
|
yading@11
|
72 }
|
yading@11
|
73 max_frames = FFMAX(max_frames, frames);
|
yading@11
|
74 if(buf == buf0)
|
yading@11
|
75 first_frames= frames;
|
yading@11
|
76 }
|
yading@11
|
77 // keep this in sync with ac3 probe, both need to avoid
|
yading@11
|
78 // issues with MPEG-files!
|
yading@11
|
79 if (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
|
yading@11
|
80 else if(max_frames>200)return AVPROBE_SCORE_MAX/2;
|
yading@11
|
81 else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
|
yading@11
|
82 else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size)
|
yading@11
|
83 return AVPROBE_SCORE_MAX/8;
|
yading@11
|
84 else if(max_frames>=1) return 1;
|
yading@11
|
85 else return 0;
|
yading@11
|
86 //mpegps_mp3_unrecognized_format.mpg has max_frames=3
|
yading@11
|
87 }
|
yading@11
|
88
|
yading@11
|
89 static void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration)
|
yading@11
|
90 {
|
yading@11
|
91 int i;
|
yading@11
|
92 MP3DecContext *mp3 = s->priv_data;
|
yading@11
|
93
|
yading@11
|
94 if (!filesize &&
|
yading@11
|
95 !(filesize = avio_size(s->pb))) {
|
yading@11
|
96 av_log(s, AV_LOG_WARNING, "Cannot determine file size, skipping TOC table.\n");
|
yading@11
|
97 return;
|
yading@11
|
98 }
|
yading@11
|
99
|
yading@11
|
100 for (i = 0; i < XING_TOC_COUNT; i++) {
|
yading@11
|
101 uint8_t b = avio_r8(s->pb);
|
yading@11
|
102
|
yading@11
|
103 av_add_index_entry(s->streams[0],
|
yading@11
|
104 av_rescale(b, filesize, 256),
|
yading@11
|
105 av_rescale(i, duration, XING_TOC_COUNT),
|
yading@11
|
106 0, 0, AVINDEX_KEYFRAME);
|
yading@11
|
107 }
|
yading@11
|
108 mp3->xing_toc = 1;
|
yading@11
|
109 }
|
yading@11
|
110
|
yading@11
|
111 /**
|
yading@11
|
112 * Try to find Xing/Info/VBRI tags and compute duration from info therein
|
yading@11
|
113 */
|
yading@11
|
114 static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
|
yading@11
|
115 {
|
yading@11
|
116 MP3DecContext *mp3 = s->priv_data;
|
yading@11
|
117 uint32_t v, spf;
|
yading@11
|
118 unsigned frames = 0; /* Total number of frames in file */
|
yading@11
|
119 unsigned size = 0; /* Total number of bytes in the stream */
|
yading@11
|
120 const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}};
|
yading@11
|
121 MPADecodeHeader c;
|
yading@11
|
122 int vbrtag_size = 0;
|
yading@11
|
123 int is_cbr;
|
yading@11
|
124
|
yading@11
|
125 v = avio_rb32(s->pb);
|
yading@11
|
126 if(ff_mpa_check_header(v) < 0)
|
yading@11
|
127 return -1;
|
yading@11
|
128
|
yading@11
|
129 if (avpriv_mpegaudio_decode_header(&c, v) == 0)
|
yading@11
|
130 vbrtag_size = c.frame_size;
|
yading@11
|
131 if(c.layer != 3)
|
yading@11
|
132 return -1;
|
yading@11
|
133
|
yading@11
|
134 spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */
|
yading@11
|
135
|
yading@11
|
136 /* Check for Xing / Info tag */
|
yading@11
|
137 avio_skip(s->pb, xing_offtbl[c.lsf == 1][c.nb_channels == 1]);
|
yading@11
|
138 v = avio_rb32(s->pb);
|
yading@11
|
139 is_cbr = v == MKBETAG('I', 'n', 'f', 'o');
|
yading@11
|
140 if (v == MKBETAG('X', 'i', 'n', 'g') || is_cbr) {
|
yading@11
|
141 v = avio_rb32(s->pb);
|
yading@11
|
142 if(v & XING_FLAG_FRAMES)
|
yading@11
|
143 frames = avio_rb32(s->pb);
|
yading@11
|
144 if(v & XING_FLAG_SIZE)
|
yading@11
|
145 size = avio_rb32(s->pb);
|
yading@11
|
146 if (v & XING_FLAG_TOC && frames)
|
yading@11
|
147 read_xing_toc(s, size, av_rescale_q(frames, (AVRational){spf, c.sample_rate},
|
yading@11
|
148 st->time_base));
|
yading@11
|
149 if(v & 8)
|
yading@11
|
150 avio_skip(s->pb, 4);
|
yading@11
|
151
|
yading@11
|
152 v = avio_rb32(s->pb);
|
yading@11
|
153 if(v == MKBETAG('L', 'A', 'M', 'E') || v == MKBETAG('L', 'a', 'v', 'f')) {
|
yading@11
|
154 avio_skip(s->pb, 21-4);
|
yading@11
|
155 v= avio_rb24(s->pb);
|
yading@11
|
156 mp3->start_pad = v>>12;
|
yading@11
|
157 mp3-> end_pad = v&4095;
|
yading@11
|
158 st->skip_samples = mp3->start_pad + 528 + 1;
|
yading@11
|
159 av_log(s, AV_LOG_DEBUG, "pad %d %d\n", mp3->start_pad, mp3-> end_pad);
|
yading@11
|
160 }
|
yading@11
|
161 }
|
yading@11
|
162
|
yading@11
|
163 /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */
|
yading@11
|
164 avio_seek(s->pb, base + 4 + 32, SEEK_SET);
|
yading@11
|
165 v = avio_rb32(s->pb);
|
yading@11
|
166 if(v == MKBETAG('V', 'B', 'R', 'I')) {
|
yading@11
|
167 /* Check tag version */
|
yading@11
|
168 if(avio_rb16(s->pb) == 1) {
|
yading@11
|
169 /* skip delay and quality */
|
yading@11
|
170 avio_skip(s->pb, 4);
|
yading@11
|
171 size = avio_rb32(s->pb);
|
yading@11
|
172 frames = avio_rb32(s->pb);
|
yading@11
|
173 }
|
yading@11
|
174 }
|
yading@11
|
175
|
yading@11
|
176 if(!frames && !size)
|
yading@11
|
177 return -1;
|
yading@11
|
178
|
yading@11
|
179 /* Skip the vbr tag frame */
|
yading@11
|
180 avio_seek(s->pb, base + vbrtag_size, SEEK_SET);
|
yading@11
|
181
|
yading@11
|
182 if(frames)
|
yading@11
|
183 st->duration = av_rescale_q(frames, (AVRational){spf, c.sample_rate},
|
yading@11
|
184 st->time_base);
|
yading@11
|
185 if (size && frames && !is_cbr)
|
yading@11
|
186 st->codec->bit_rate = av_rescale(size, 8 * c.sample_rate, frames * (int64_t)spf);
|
yading@11
|
187
|
yading@11
|
188 return 0;
|
yading@11
|
189 }
|
yading@11
|
190
|
yading@11
|
191 static int mp3_read_header(AVFormatContext *s)
|
yading@11
|
192 {
|
yading@11
|
193 MP3DecContext *mp3 = s->priv_data;
|
yading@11
|
194 AVStream *st;
|
yading@11
|
195 int64_t off;
|
yading@11
|
196
|
yading@11
|
197 st = avformat_new_stream(s, NULL);
|
yading@11
|
198 if (!st)
|
yading@11
|
199 return AVERROR(ENOMEM);
|
yading@11
|
200
|
yading@11
|
201 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
|
yading@11
|
202 st->codec->codec_id = AV_CODEC_ID_MP3;
|
yading@11
|
203 st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
|
yading@11
|
204 st->start_time = 0;
|
yading@11
|
205
|
yading@11
|
206 // lcm of all mp3 sample rates
|
yading@11
|
207 avpriv_set_pts_info(st, 64, 1, 14112000);
|
yading@11
|
208
|
yading@11
|
209 s->pb->maxsize = -1;
|
yading@11
|
210 off = avio_tell(s->pb);
|
yading@11
|
211
|
yading@11
|
212 if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
|
yading@11
|
213 ff_id3v1_read(s);
|
yading@11
|
214
|
yading@11
|
215 if(s->pb->seekable)
|
yading@11
|
216 mp3->filesize = avio_size(s->pb);
|
yading@11
|
217
|
yading@11
|
218 if (mp3_parse_vbr_tags(s, st, off) < 0)
|
yading@11
|
219 avio_seek(s->pb, off, SEEK_SET);
|
yading@11
|
220
|
yading@11
|
221 /* the parameters will be extracted from the compressed bitstream */
|
yading@11
|
222 return 0;
|
yading@11
|
223 }
|
yading@11
|
224
|
yading@11
|
225 #define MP3_PACKET_SIZE 1024
|
yading@11
|
226
|
yading@11
|
227 static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
228 {
|
yading@11
|
229 MP3DecContext *mp3 = s->priv_data;
|
yading@11
|
230 int ret, size;
|
yading@11
|
231 int64_t pos;
|
yading@11
|
232
|
yading@11
|
233 size= MP3_PACKET_SIZE;
|
yading@11
|
234 pos = avio_tell(s->pb);
|
yading@11
|
235 if(mp3->filesize > ID3v1_TAG_SIZE && pos < mp3->filesize)
|
yading@11
|
236 size= FFMIN(size, mp3->filesize - pos);
|
yading@11
|
237
|
yading@11
|
238 ret= av_get_packet(s->pb, pkt, size);
|
yading@11
|
239 if (ret <= 0) {
|
yading@11
|
240 if(ret<0)
|
yading@11
|
241 return ret;
|
yading@11
|
242 return AVERROR_EOF;
|
yading@11
|
243 }
|
yading@11
|
244
|
yading@11
|
245 pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
|
yading@11
|
246 pkt->stream_index = 0;
|
yading@11
|
247
|
yading@11
|
248 if (ret >= ID3v1_TAG_SIZE &&
|
yading@11
|
249 memcmp(&pkt->data[ret - ID3v1_TAG_SIZE], "TAG", 3) == 0)
|
yading@11
|
250 ret -= ID3v1_TAG_SIZE;
|
yading@11
|
251
|
yading@11
|
252 /* note: we need to modify the packet size here to handle the last
|
yading@11
|
253 packet */
|
yading@11
|
254 pkt->size = ret;
|
yading@11
|
255 return ret;
|
yading@11
|
256 }
|
yading@11
|
257
|
yading@11
|
258 static int check(AVFormatContext *s, int64_t pos)
|
yading@11
|
259 {
|
yading@11
|
260 int64_t ret = avio_seek(s->pb, pos, SEEK_SET);
|
yading@11
|
261 unsigned header;
|
yading@11
|
262 MPADecodeHeader sd;
|
yading@11
|
263 if (ret < 0)
|
yading@11
|
264 return ret;
|
yading@11
|
265 header = avio_rb32(s->pb);
|
yading@11
|
266 if (ff_mpa_check_header(header) < 0)
|
yading@11
|
267 return -1;
|
yading@11
|
268 if (avpriv_mpegaudio_decode_header(&sd, header) == 1)
|
yading@11
|
269 return -1;
|
yading@11
|
270 return sd.frame_size;
|
yading@11
|
271 }
|
yading@11
|
272
|
yading@11
|
273 static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
|
yading@11
|
274 int flags)
|
yading@11
|
275 {
|
yading@11
|
276 MP3DecContext *mp3 = s->priv_data;
|
yading@11
|
277 AVIndexEntry *ie;
|
yading@11
|
278 AVStream *st = s->streams[0];
|
yading@11
|
279 int64_t ret = av_index_search_timestamp(st, timestamp, flags);
|
yading@11
|
280 int i, j;
|
yading@11
|
281
|
yading@11
|
282 if (!mp3->xing_toc) {
|
yading@11
|
283 st->skip_samples = timestamp <= 0 ? mp3->start_pad + 528 + 1 : 0;
|
yading@11
|
284
|
yading@11
|
285 return -1;
|
yading@11
|
286 }
|
yading@11
|
287
|
yading@11
|
288 if (ret < 0)
|
yading@11
|
289 return ret;
|
yading@11
|
290
|
yading@11
|
291 ie = &st->index_entries[ret];
|
yading@11
|
292 ret = avio_seek(s->pb, ie->pos, SEEK_SET);
|
yading@11
|
293 if (ret < 0)
|
yading@11
|
294 return ret;
|
yading@11
|
295
|
yading@11
|
296 #define MIN_VALID 3
|
yading@11
|
297 for(i=0; i<4096; i++) {
|
yading@11
|
298 int64_t pos = ie->pos + i;
|
yading@11
|
299 for(j=0; j<MIN_VALID; j++) {
|
yading@11
|
300 ret = check(s, pos);
|
yading@11
|
301 if(ret < 0)
|
yading@11
|
302 break;
|
yading@11
|
303 pos += ret;
|
yading@11
|
304 }
|
yading@11
|
305 if(j==MIN_VALID)
|
yading@11
|
306 break;
|
yading@11
|
307 }
|
yading@11
|
308 if(j!=MIN_VALID)
|
yading@11
|
309 i=0;
|
yading@11
|
310
|
yading@11
|
311 ret = avio_seek(s->pb, ie->pos + i, SEEK_SET);
|
yading@11
|
312 if (ret < 0)
|
yading@11
|
313 return ret;
|
yading@11
|
314 ff_update_cur_dts(s, st, ie->timestamp);
|
yading@11
|
315 st->skip_samples = ie->timestamp <= 0 ? mp3->start_pad + 528 + 1 : 0;
|
yading@11
|
316 return 0;
|
yading@11
|
317 }
|
yading@11
|
318
|
yading@11
|
319 AVInputFormat ff_mp3_demuxer = {
|
yading@11
|
320 .name = "mp3",
|
yading@11
|
321 .long_name = NULL_IF_CONFIG_SMALL("MP2/3 (MPEG audio layer 2/3)"),
|
yading@11
|
322 .read_probe = mp3_read_probe,
|
yading@11
|
323 .read_header = mp3_read_header,
|
yading@11
|
324 .read_packet = mp3_read_packet,
|
yading@11
|
325 .read_seek = mp3_seek,
|
yading@11
|
326 .priv_data_size = sizeof(MP3DecContext),
|
yading@11
|
327 .flags = AVFMT_GENERIC_INDEX,
|
yading@11
|
328 .extensions = "mp2,mp3,m2a", /* XXX: use probe */
|
yading@11
|
329 };
|