annotate ffmpeg/libavformat/mp3dec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
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 };