1/* 2 * MP3 muxer and demuxer 3 * Copyright (c) 2003 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#include <strings.h> 23#include "libavutil/avstring.h" 24#include "libavutil/intreadwrite.h" 25#include "avformat.h" 26#include "id3v2.h" 27#include "id3v1.h" 28 29#if CONFIG_MP3_DEMUXER 30 31#include "libavcodec/mpegaudio.h" 32#include "libavcodec/mpegaudiodecheader.h" 33 34/* mp3 read */ 35 36static int mp3_read_probe(AVProbeData *p) 37{ 38 int max_frames, first_frames = 0; 39 int fsize, frames, sample_rate; 40 uint32_t header; 41 uint8_t *buf, *buf0, *buf2, *end; 42 AVCodecContext avctx; 43 44 buf0 = p->buf; 45 if(ff_id3v2_match(buf0)) { 46 buf0 += ff_id3v2_tag_len(buf0); 47 } 48 end = p->buf + p->buf_size - sizeof(uint32_t); 49 while(buf0 < end && !*buf0) 50 buf0++; 51 52 max_frames = 0; 53 buf = buf0; 54 55 for(; buf < end; buf= buf2+1) { 56 buf2 = buf; 57 58 for(frames = 0; buf2 < end; frames++) { 59 header = AV_RB32(buf2); 60 fsize = ff_mpa_decode_header(&avctx, header, &sample_rate, &sample_rate, &sample_rate, &sample_rate); 61 if(fsize < 0) 62 break; 63 buf2 += fsize; 64 } 65 max_frames = FFMAX(max_frames, frames); 66 if(buf == buf0) 67 first_frames= frames; 68 } 69 // keep this in sync with ac3 probe, both need to avoid 70 // issues with MPEG-files! 71 if (first_frames>=4) return AVPROBE_SCORE_MAX/2+1; 72 else if(max_frames>500)return AVPROBE_SCORE_MAX/2; 73 else if(max_frames>=4) return AVPROBE_SCORE_MAX/4; 74 else if(buf0!=p->buf) return AVPROBE_SCORE_MAX/4-1; 75 else if(max_frames>=1) return 1; 76 else return 0; 77//mpegps_mp3_unrecognized_format.mpg has max_frames=3 78} 79 80/** 81 * Try to find Xing/Info/VBRI tags and compute duration from info therein 82 */ 83static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base) 84{ 85 uint32_t v, spf; 86 int frames = -1; /* Total number of frames in file */ 87 const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}}; 88 MPADecodeHeader c; 89 int vbrtag_size = 0; 90 91 v = get_be32(s->pb); 92 if(ff_mpa_check_header(v) < 0) 93 return -1; 94 95 if (ff_mpegaudio_decode_header(&c, v) == 0) 96 vbrtag_size = c.frame_size; 97 if(c.layer != 3) 98 return -1; 99 100 /* Check for Xing / Info tag */ 101 url_fseek(s->pb, xing_offtbl[c.lsf == 1][c.nb_channels == 1], SEEK_CUR); 102 v = get_be32(s->pb); 103 if(v == MKBETAG('X', 'i', 'n', 'g') || v == MKBETAG('I', 'n', 'f', 'o')) { 104 v = get_be32(s->pb); 105 if(v & 0x1) 106 frames = get_be32(s->pb); 107 } 108 109 /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */ 110 url_fseek(s->pb, base + 4 + 32, SEEK_SET); 111 v = get_be32(s->pb); 112 if(v == MKBETAG('V', 'B', 'R', 'I')) { 113 /* Check tag version */ 114 if(get_be16(s->pb) == 1) { 115 /* skip delay, quality and total bytes */ 116 url_fseek(s->pb, 8, SEEK_CUR); 117 frames = get_be32(s->pb); 118 } 119 } 120 121 if(frames < 0) 122 return -1; 123 124 /* Skip the vbr tag frame */ 125 url_fseek(s->pb, base + vbrtag_size, SEEK_SET); 126 127 spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */ 128 st->duration = av_rescale_q(frames, (AVRational){spf, c.sample_rate}, 129 st->time_base); 130 return 0; 131} 132 133static int mp3_read_header(AVFormatContext *s, 134 AVFormatParameters *ap) 135{ 136 AVStream *st; 137 int64_t off; 138 139 st = av_new_stream(s, 0); 140 if (!st) 141 return AVERROR(ENOMEM); 142 143 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; 144 st->codec->codec_id = CODEC_ID_MP3; 145 st->need_parsing = AVSTREAM_PARSE_FULL; 146 st->start_time = 0; 147 148 // lcm of all mp3 sample rates 149 av_set_pts_info(st, 64, 1, 14112000); 150 151 ff_id3v2_read(s); 152 off = url_ftell(s->pb); 153 154 if (!av_metadata_get(s->metadata, "", NULL, AV_METADATA_IGNORE_SUFFIX)) 155 ff_id3v1_read(s); 156 157 if (mp3_parse_vbr_tags(s, st, off) < 0) 158 url_fseek(s->pb, off, SEEK_SET); 159 160 /* the parameters will be extracted from the compressed bitstream */ 161 return 0; 162} 163 164#define MP3_PACKET_SIZE 1024 165 166static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt) 167{ 168 int ret, size; 169 // AVStream *st = s->streams[0]; 170 171 size= MP3_PACKET_SIZE; 172 173 ret= av_get_packet(s->pb, pkt, size); 174 175 pkt->stream_index = 0; 176 if (ret <= 0) { 177 return AVERROR(EIO); 178 } 179 /* note: we need to modify the packet size here to handle the last 180 packet */ 181 pkt->size = ret; 182 return ret; 183} 184 185AVInputFormat mp3_demuxer = { 186 "mp3", 187 NULL_IF_CONFIG_SMALL("MPEG audio layer 2/3"), 188 0, 189 mp3_read_probe, 190 mp3_read_header, 191 mp3_read_packet, 192 .flags= AVFMT_GENERIC_INDEX, 193 .extensions = "mp2,mp3,m2a", /* XXX: use probe */ 194 .metadata_conv = ff_id3v2_metadata_conv, 195}; 196#endif 197 198#if CONFIG_MP2_MUXER || CONFIG_MP3_MUXER 199static int id3v1_set_string(AVFormatContext *s, const char *key, 200 uint8_t *buf, int buf_size) 201{ 202 AVMetadataTag *tag; 203 if ((tag = av_metadata_get(s->metadata, key, NULL, 0))) 204 strncpy(buf, tag->value, buf_size); 205 return !!tag; 206} 207 208static int id3v1_create_tag(AVFormatContext *s, uint8_t *buf) 209{ 210 AVMetadataTag *tag; 211 int i, count = 0; 212 213 memset(buf, 0, ID3v1_TAG_SIZE); /* fail safe */ 214 buf[0] = 'T'; 215 buf[1] = 'A'; 216 buf[2] = 'G'; 217 count += id3v1_set_string(s, "title", buf + 3, 30); 218 count += id3v1_set_string(s, "author", buf + 33, 30); 219 count += id3v1_set_string(s, "album", buf + 63, 30); 220 count += id3v1_set_string(s, "date", buf + 93, 4); 221 count += id3v1_set_string(s, "comment", buf + 97, 30); 222 if ((tag = av_metadata_get(s->metadata, "track", NULL, 0))) { 223 buf[125] = 0; 224 buf[126] = atoi(tag->value); 225 count++; 226 } 227 buf[127] = 0xFF; /* default to unknown genre */ 228 if ((tag = av_metadata_get(s->metadata, "genre", NULL, 0))) { 229 for(i = 0; i <= ID3v1_GENRE_MAX; i++) { 230 if (!strcasecmp(tag->value, ff_id3v1_genre_str[i])) { 231 buf[127] = i; 232 count++; 233 break; 234 } 235 } 236 } 237 return count; 238} 239 240/* simple formats */ 241 242static void id3v2_put_size(AVFormatContext *s, int size) 243{ 244 put_byte(s->pb, size >> 21 & 0x7f); 245 put_byte(s->pb, size >> 14 & 0x7f); 246 put_byte(s->pb, size >> 7 & 0x7f); 247 put_byte(s->pb, size & 0x7f); 248} 249 250static void id3v2_put_ttag(AVFormatContext *s, const char *buf, int len, 251 uint32_t tag) 252{ 253 put_be32(s->pb, tag); 254 id3v2_put_size(s, len + 1); 255 put_be16(s->pb, 0); 256 put_byte(s->pb, 3); /* UTF-8 */ 257 put_buffer(s->pb, buf, len); 258} 259 260 261static int mp3_write_packet(struct AVFormatContext *s, AVPacket *pkt) 262{ 263 put_buffer(s->pb, pkt->data, pkt->size); 264 put_flush_packet(s->pb); 265 return 0; 266} 267 268static int mp3_write_trailer(struct AVFormatContext *s) 269{ 270 uint8_t buf[ID3v1_TAG_SIZE]; 271 272 /* write the id3v1 tag */ 273 if (id3v1_create_tag(s, buf) > 0) { 274 put_buffer(s->pb, buf, ID3v1_TAG_SIZE); 275 put_flush_packet(s->pb); 276 } 277 return 0; 278} 279#endif /* CONFIG_MP2_MUXER || CONFIG_MP3_MUXER */ 280 281#if CONFIG_MP2_MUXER 282AVOutputFormat mp2_muxer = { 283 "mp2", 284 NULL_IF_CONFIG_SMALL("MPEG audio layer 2"), 285 "audio/x-mpeg", 286 "mp2,m2a", 287 0, 288 CODEC_ID_MP2, 289 CODEC_ID_NONE, 290 NULL, 291 mp3_write_packet, 292 mp3_write_trailer, 293}; 294#endif 295 296#if CONFIG_MP3_MUXER 297/** 298 * Write an ID3v2.4 header at beginning of stream 299 */ 300 301static int mp3_write_header(struct AVFormatContext *s) 302{ 303 AVMetadataTag *t = NULL; 304 int totlen = 0; 305 int64_t size_pos, cur_pos; 306 307 put_be32(s->pb, MKBETAG('I', 'D', '3', 0x04)); /* ID3v2.4 */ 308 put_byte(s->pb, 0); 309 put_byte(s->pb, 0); /* flags */ 310 311 /* reserve space for size */ 312 size_pos = url_ftell(s->pb); 313 put_be32(s->pb, 0); 314 315 while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) { 316 uint32_t tag = 0; 317 318 if (t->key[0] == 'T' && strlen(t->key) == 4) { 319 int i; 320 for (i = 0; *ff_id3v2_tags[i]; i++) 321 if (AV_RB32(t->key) == AV_RB32(ff_id3v2_tags[i])) { 322 int len = strlen(t->value); 323 tag = AV_RB32(t->key); 324 totlen += len + ID3v2_HEADER_SIZE + 2; 325 id3v2_put_ttag(s, t->value, len + 1, tag); 326 break; 327 } 328 } 329 330 if (!tag) { /* unknown tag, write as TXXX frame */ 331 int len = strlen(t->key), len1 = strlen(t->value); 332 char *buf = av_malloc(len + len1 + 2); 333 if (!buf) 334 return AVERROR(ENOMEM); 335 tag = MKBETAG('T', 'X', 'X', 'X'); 336 strcpy(buf, t->key); 337 strcpy(buf + len + 1, t->value); 338 id3v2_put_ttag(s, buf, len + len1 + 2, tag); 339 totlen += len + len1 + ID3v2_HEADER_SIZE + 3; 340 av_free(buf); 341 } 342 } 343 344 cur_pos = url_ftell(s->pb); 345 url_fseek(s->pb, size_pos, SEEK_SET); 346 id3v2_put_size(s, totlen); 347 url_fseek(s->pb, cur_pos, SEEK_SET); 348 349 return 0; 350} 351 352AVOutputFormat mp3_muxer = { 353 "mp3", 354 NULL_IF_CONFIG_SMALL("MPEG audio layer 3"), 355 "audio/x-mpeg", 356 "mp3", 357 0, 358 CODEC_ID_MP3, 359 CODEC_ID_NONE, 360 mp3_write_header, 361 mp3_write_packet, 362 mp3_write_trailer, 363 AVFMT_NOTIMESTAMPS, 364 .metadata_conv = ff_id3v2_metadata_conv, 365}; 366#endif 367