1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MP3 demuxer 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Fabrice Bellard 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/opt.h" 23cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 24cabdff1aSopenharmony_ci#include "libavutil/dict.h" 25cabdff1aSopenharmony_ci#include "libavutil/mathematics.h" 26cabdff1aSopenharmony_ci#include "avformat.h" 27cabdff1aSopenharmony_ci#include "internal.h" 28cabdff1aSopenharmony_ci#include "avio_internal.h" 29cabdff1aSopenharmony_ci#include "demux.h" 30cabdff1aSopenharmony_ci#include "id3v2.h" 31cabdff1aSopenharmony_ci#include "id3v1.h" 32cabdff1aSopenharmony_ci#include "replaygain.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#include "libavcodec/codec_id.h" 35cabdff1aSopenharmony_ci#include "libavcodec/mpegaudiodecheader.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#define XING_FLAG_FRAMES 0x01 38cabdff1aSopenharmony_ci#define XING_FLAG_SIZE 0x02 39cabdff1aSopenharmony_ci#define XING_FLAG_TOC 0x04 40cabdff1aSopenharmony_ci#define XING_FLAC_QSCALE 0x08 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define XING_TOC_COUNT 100 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_citypedef struct { 46cabdff1aSopenharmony_ci AVClass *class; 47cabdff1aSopenharmony_ci int64_t filesize; 48cabdff1aSopenharmony_ci int xing_toc; 49cabdff1aSopenharmony_ci int start_pad; 50cabdff1aSopenharmony_ci int end_pad; 51cabdff1aSopenharmony_ci int usetoc; 52cabdff1aSopenharmony_ci unsigned frames; /* Total number of frames in file */ 53cabdff1aSopenharmony_ci unsigned header_filesize; /* Total number of bytes in the stream */ 54cabdff1aSopenharmony_ci int is_cbr; 55cabdff1aSopenharmony_ci} MP3DecContext; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_cienum CheckRet { 58cabdff1aSopenharmony_ci CHECK_WRONG_HEADER = -1, 59cabdff1aSopenharmony_ci CHECK_SEEK_FAILED = -2, 60cabdff1aSopenharmony_ci}; 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_cistatic int check(AVIOContext *pb, int64_t pos, uint32_t *header); 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci/* mp3 read */ 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_cistatic int mp3_read_probe(const AVProbeData *p) 67cabdff1aSopenharmony_ci{ 68cabdff1aSopenharmony_ci int max_frames, first_frames = 0; 69cabdff1aSopenharmony_ci int whole_used = 0; 70cabdff1aSopenharmony_ci int frames, ret; 71cabdff1aSopenharmony_ci int framesizes, max_framesizes; 72cabdff1aSopenharmony_ci uint32_t header; 73cabdff1aSopenharmony_ci const uint8_t *buf, *buf0, *buf2, *buf3, *end; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci buf0 = p->buf; 76cabdff1aSopenharmony_ci end = p->buf + p->buf_size - sizeof(uint32_t); 77cabdff1aSopenharmony_ci while (buf0 < end && !*buf0) 78cabdff1aSopenharmony_ci buf0++; 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci max_frames = 0; 81cabdff1aSopenharmony_ci max_framesizes = 0; 82cabdff1aSopenharmony_ci buf = buf0; 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci for (; buf < end; buf = buf2+1) { 85cabdff1aSopenharmony_ci buf2 = buf; 86cabdff1aSopenharmony_ci for (framesizes = frames = 0; buf2 < end; frames++) { 87cabdff1aSopenharmony_ci MPADecodeHeader h; 88cabdff1aSopenharmony_ci int header_emu = 0; 89cabdff1aSopenharmony_ci int available; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci header = AV_RB32(buf2); 92cabdff1aSopenharmony_ci ret = avpriv_mpegaudio_decode_header(&h, header); 93cabdff1aSopenharmony_ci if (ret != 0) 94cabdff1aSopenharmony_ci break; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci available = FFMIN(h.frame_size, end - buf2); 97cabdff1aSopenharmony_ci for (buf3 = buf2 + 4; buf3 < buf2 + available; buf3++) { 98cabdff1aSopenharmony_ci uint32_t next_sync = AV_RB32(buf3); 99cabdff1aSopenharmony_ci header_emu += (next_sync & MP3_MASK) == (header & MP3_MASK); 100cabdff1aSopenharmony_ci } 101cabdff1aSopenharmony_ci if (header_emu > 2) 102cabdff1aSopenharmony_ci break; 103cabdff1aSopenharmony_ci framesizes += h.frame_size; 104cabdff1aSopenharmony_ci if (available < h.frame_size) { 105cabdff1aSopenharmony_ci frames++; 106cabdff1aSopenharmony_ci break; 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci buf2 += h.frame_size; 109cabdff1aSopenharmony_ci } 110cabdff1aSopenharmony_ci max_frames = FFMAX(max_frames, frames); 111cabdff1aSopenharmony_ci max_framesizes = FFMAX(max_framesizes, framesizes); 112cabdff1aSopenharmony_ci if (buf == buf0) { 113cabdff1aSopenharmony_ci first_frames= frames; 114cabdff1aSopenharmony_ci if (buf2 == end + sizeof(uint32_t)) 115cabdff1aSopenharmony_ci whole_used = 1; 116cabdff1aSopenharmony_ci } 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci // keep this in sync with ac3 probe, both need to avoid 119cabdff1aSopenharmony_ci // issues with MPEG-files! 120cabdff1aSopenharmony_ci if (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1; 121cabdff1aSopenharmony_ci else if (max_frames>200 && p->buf_size < 2*max_framesizes)return AVPROBE_SCORE_EXTENSION; 122cabdff1aSopenharmony_ci else if (max_frames>=4 && p->buf_size < 2*max_framesizes) return AVPROBE_SCORE_EXTENSION / 2; 123cabdff1aSopenharmony_ci else if (ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size) 124cabdff1aSopenharmony_ci return p->buf_size < PROBE_BUF_MAX ? AVPROBE_SCORE_EXTENSION / 4 : AVPROBE_SCORE_EXTENSION - 2; 125cabdff1aSopenharmony_ci else if (first_frames > 1 && whole_used) return 5; 126cabdff1aSopenharmony_ci else if (max_frames>=1 && p->buf_size < 10*max_framesizes) return 1; 127cabdff1aSopenharmony_ci else return 0; 128cabdff1aSopenharmony_ci //mpegps_mp3_unrecognized_format.mpg has max_frames=3 129cabdff1aSopenharmony_ci} 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_cistatic void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration) 132cabdff1aSopenharmony_ci{ 133cabdff1aSopenharmony_ci int i; 134cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 135cabdff1aSopenharmony_ci int fast_seek = s->flags & AVFMT_FLAG_FAST_SEEK; 136cabdff1aSopenharmony_ci int fill_index = (mp3->usetoc || fast_seek) && duration > 0; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci if (!filesize && 139cabdff1aSopenharmony_ci !(filesize = avio_size(s->pb))) { 140cabdff1aSopenharmony_ci av_log(s, AV_LOG_WARNING, "Cannot determine file size, skipping TOC table.\n"); 141cabdff1aSopenharmony_ci fill_index = 0; 142cabdff1aSopenharmony_ci } 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci for (i = 0; i < XING_TOC_COUNT; i++) { 145cabdff1aSopenharmony_ci uint8_t b = avio_r8(s->pb); 146cabdff1aSopenharmony_ci if (fill_index) 147cabdff1aSopenharmony_ci av_add_index_entry(s->streams[0], 148cabdff1aSopenharmony_ci av_rescale(b, filesize, 256), 149cabdff1aSopenharmony_ci av_rescale(i, duration, XING_TOC_COUNT), 150cabdff1aSopenharmony_ci 0, 0, AVINDEX_KEYFRAME); 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci if (fill_index) 153cabdff1aSopenharmony_ci mp3->xing_toc = 1; 154cabdff1aSopenharmony_ci} 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_cistatic void mp3_parse_info_tag(AVFormatContext *s, AVStream *st, 157cabdff1aSopenharmony_ci MPADecodeHeader *c, uint32_t spf) 158cabdff1aSopenharmony_ci{ 159cabdff1aSopenharmony_ci#define LAST_BITS(k, n) ((k) & ((1 << (n)) - 1)) 160cabdff1aSopenharmony_ci#define MIDDLE_BITS(k, m, n) LAST_BITS((k) >> (m), ((n) - (m) + 1)) 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci FFStream *const sti = ffstream(st); 163cabdff1aSopenharmony_ci uint16_t crc; 164cabdff1aSopenharmony_ci uint32_t v; 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci char version[10]; 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci uint32_t peak = 0; 169cabdff1aSopenharmony_ci int32_t r_gain = INT32_MIN, a_gain = INT32_MIN; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 172cabdff1aSopenharmony_ci static const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}}; 173cabdff1aSopenharmony_ci uint64_t fsize = avio_size(s->pb); 174cabdff1aSopenharmony_ci int64_t pos = avio_tell(s->pb); 175cabdff1aSopenharmony_ci fsize = fsize >= pos ? fsize - pos : 0; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci /* Check for Xing / Info tag */ 178cabdff1aSopenharmony_ci avio_skip(s->pb, xing_offtbl[c->lsf == 1][c->nb_channels == 1]); 179cabdff1aSopenharmony_ci v = avio_rb32(s->pb); 180cabdff1aSopenharmony_ci mp3->is_cbr = v == MKBETAG('I', 'n', 'f', 'o'); 181cabdff1aSopenharmony_ci if (v != MKBETAG('X', 'i', 'n', 'g') && !mp3->is_cbr) 182cabdff1aSopenharmony_ci return; 183cabdff1aSopenharmony_ci 184cabdff1aSopenharmony_ci v = avio_rb32(s->pb); 185cabdff1aSopenharmony_ci if (v & XING_FLAG_FRAMES) 186cabdff1aSopenharmony_ci mp3->frames = avio_rb32(s->pb); 187cabdff1aSopenharmony_ci if (v & XING_FLAG_SIZE) 188cabdff1aSopenharmony_ci mp3->header_filesize = avio_rb32(s->pb); 189cabdff1aSopenharmony_ci if (fsize && mp3->header_filesize) { 190cabdff1aSopenharmony_ci uint64_t min, delta; 191cabdff1aSopenharmony_ci min = FFMIN(fsize, mp3->header_filesize); 192cabdff1aSopenharmony_ci delta = FFMAX(fsize, mp3->header_filesize) - min; 193cabdff1aSopenharmony_ci if (fsize > mp3->header_filesize && delta > min >> 4) { 194cabdff1aSopenharmony_ci mp3->frames = 0; 195cabdff1aSopenharmony_ci av_log(s, AV_LOG_WARNING, 196cabdff1aSopenharmony_ci "invalid concatenated file detected - using bitrate for duration\n"); 197cabdff1aSopenharmony_ci } else if (delta > min >> 4) { 198cabdff1aSopenharmony_ci av_log(s, AV_LOG_WARNING, 199cabdff1aSopenharmony_ci "filesize and duration do not match (growing file?)\n"); 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci if (v & XING_FLAG_TOC) 203cabdff1aSopenharmony_ci read_xing_toc(s, mp3->header_filesize, av_rescale_q(mp3->frames, 204cabdff1aSopenharmony_ci (AVRational){spf, c->sample_rate}, 205cabdff1aSopenharmony_ci st->time_base)); 206cabdff1aSopenharmony_ci /* VBR quality */ 207cabdff1aSopenharmony_ci if (v & XING_FLAC_QSCALE) 208cabdff1aSopenharmony_ci avio_rb32(s->pb); 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci /* Encoder short version string */ 211cabdff1aSopenharmony_ci memset(version, 0, sizeof(version)); 212cabdff1aSopenharmony_ci avio_read(s->pb, version, 9); 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci /* Info Tag revision + VBR method */ 215cabdff1aSopenharmony_ci avio_r8(s->pb); 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci /* Lowpass filter value */ 218cabdff1aSopenharmony_ci avio_r8(s->pb); 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci /* ReplayGain peak */ 221cabdff1aSopenharmony_ci v = avio_rb32(s->pb); 222cabdff1aSopenharmony_ci peak = av_rescale(v, 100000, 1 << 23); 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci /* Radio ReplayGain */ 225cabdff1aSopenharmony_ci v = avio_rb16(s->pb); 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci if (MIDDLE_BITS(v, 13, 15) == 1) { 228cabdff1aSopenharmony_ci r_gain = MIDDLE_BITS(v, 0, 8) * 10000; 229cabdff1aSopenharmony_ci 230cabdff1aSopenharmony_ci if (v & (1 << 9)) 231cabdff1aSopenharmony_ci r_gain *= -1; 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci /* Audiophile ReplayGain */ 235cabdff1aSopenharmony_ci v = avio_rb16(s->pb); 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci if (MIDDLE_BITS(v, 13, 15) == 2) { 238cabdff1aSopenharmony_ci a_gain = MIDDLE_BITS(v, 0, 8) * 10000; 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci if (v & (1 << 9)) 241cabdff1aSopenharmony_ci a_gain *= -1; 242cabdff1aSopenharmony_ci } 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci /* Encoding flags + ATH Type */ 245cabdff1aSopenharmony_ci avio_r8(s->pb); 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci /* if ABR {specified bitrate} else {minimal bitrate} */ 248cabdff1aSopenharmony_ci avio_r8(s->pb); 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci /* Encoder delays */ 251cabdff1aSopenharmony_ci v = avio_rb24(s->pb); 252cabdff1aSopenharmony_ci if (AV_RB32(version) == MKBETAG('L', 'A', 'M', 'E') 253cabdff1aSopenharmony_ci || AV_RB32(version) == MKBETAG('L', 'a', 'v', 'f') 254cabdff1aSopenharmony_ci || AV_RB32(version) == MKBETAG('L', 'a', 'v', 'c') 255cabdff1aSopenharmony_ci ) { 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci mp3->start_pad = v>>12; 258cabdff1aSopenharmony_ci mp3-> end_pad = v&4095; 259cabdff1aSopenharmony_ci sti->start_skip_samples = mp3->start_pad + 528 + 1; 260cabdff1aSopenharmony_ci if (mp3->frames) { 261cabdff1aSopenharmony_ci sti->first_discard_sample = -mp3->end_pad + 528 + 1 + mp3->frames * (int64_t)spf; 262cabdff1aSopenharmony_ci sti->last_discard_sample = mp3->frames * (int64_t)spf; 263cabdff1aSopenharmony_ci } 264cabdff1aSopenharmony_ci if (!st->start_time) 265cabdff1aSopenharmony_ci st->start_time = av_rescale_q(sti->start_skip_samples, 266cabdff1aSopenharmony_ci (AVRational){1, c->sample_rate}, 267cabdff1aSopenharmony_ci st->time_base); 268cabdff1aSopenharmony_ci av_log(s, AV_LOG_DEBUG, "pad %d %d\n", mp3->start_pad, mp3-> end_pad); 269cabdff1aSopenharmony_ci } 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci /* Misc */ 272cabdff1aSopenharmony_ci avio_r8(s->pb); 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci /* MP3 gain */ 275cabdff1aSopenharmony_ci avio_r8(s->pb); 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci /* Preset and surround info */ 278cabdff1aSopenharmony_ci avio_rb16(s->pb); 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci /* Music length */ 281cabdff1aSopenharmony_ci avio_rb32(s->pb); 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci /* Music CRC */ 284cabdff1aSopenharmony_ci avio_rb16(s->pb); 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci /* Info Tag CRC */ 287cabdff1aSopenharmony_ci crc = ffio_get_checksum(s->pb); 288cabdff1aSopenharmony_ci v = avio_rb16(s->pb); 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci if (v == crc) { 291cabdff1aSopenharmony_ci ff_replaygain_export_raw(st, r_gain, peak, a_gain, 0); 292cabdff1aSopenharmony_ci av_dict_set(&st->metadata, "encoder", version, 0); 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci} 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_cistatic void mp3_parse_vbri_tag(AVFormatContext *s, AVStream *st, int64_t base) 297cabdff1aSopenharmony_ci{ 298cabdff1aSopenharmony_ci uint32_t v; 299cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */ 302cabdff1aSopenharmony_ci avio_seek(s->pb, base + 4 + 32, SEEK_SET); 303cabdff1aSopenharmony_ci v = avio_rb32(s->pb); 304cabdff1aSopenharmony_ci if (v == MKBETAG('V', 'B', 'R', 'I')) { 305cabdff1aSopenharmony_ci /* Check tag version */ 306cabdff1aSopenharmony_ci if (avio_rb16(s->pb) == 1) { 307cabdff1aSopenharmony_ci /* skip delay and quality */ 308cabdff1aSopenharmony_ci avio_skip(s->pb, 4); 309cabdff1aSopenharmony_ci mp3->header_filesize = avio_rb32(s->pb); 310cabdff1aSopenharmony_ci mp3->frames = avio_rb32(s->pb); 311cabdff1aSopenharmony_ci } 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci} 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci/** 316cabdff1aSopenharmony_ci * Try to find Xing/Info/VBRI tags and compute duration from info therein 317cabdff1aSopenharmony_ci */ 318cabdff1aSopenharmony_cistatic int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base) 319cabdff1aSopenharmony_ci{ 320cabdff1aSopenharmony_ci uint32_t v, spf; 321cabdff1aSopenharmony_ci MPADecodeHeader c; 322cabdff1aSopenharmony_ci int vbrtag_size = 0; 323cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 324cabdff1aSopenharmony_ci int ret; 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci ffio_init_checksum(s->pb, ff_crcA001_update, 0); 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci v = avio_rb32(s->pb); 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci ret = avpriv_mpegaudio_decode_header(&c, v); 331cabdff1aSopenharmony_ci if (ret < 0) 332cabdff1aSopenharmony_ci return ret; 333cabdff1aSopenharmony_ci else if (ret == 0) 334cabdff1aSopenharmony_ci vbrtag_size = c.frame_size; 335cabdff1aSopenharmony_ci if (c.layer != 3) 336cabdff1aSopenharmony_ci return -1; 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */ 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci mp3->frames = 0; 341cabdff1aSopenharmony_ci mp3->header_filesize = 0; 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci mp3_parse_info_tag(s, st, &c, spf); 344cabdff1aSopenharmony_ci mp3_parse_vbri_tag(s, st, base); 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci if (!mp3->frames && !mp3->header_filesize) 347cabdff1aSopenharmony_ci return -1; 348cabdff1aSopenharmony_ci 349cabdff1aSopenharmony_ci /* Skip the vbr tag frame */ 350cabdff1aSopenharmony_ci avio_seek(s->pb, base + vbrtag_size, SEEK_SET); 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci if (mp3->frames) 353cabdff1aSopenharmony_ci st->duration = av_rescale_q(mp3->frames, (AVRational){spf, c.sample_rate}, 354cabdff1aSopenharmony_ci st->time_base); 355cabdff1aSopenharmony_ci if (mp3->header_filesize && mp3->frames && !mp3->is_cbr) 356cabdff1aSopenharmony_ci st->codecpar->bit_rate = av_rescale(mp3->header_filesize, 8 * c.sample_rate, mp3->frames * (int64_t)spf); 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci return 0; 359cabdff1aSopenharmony_ci} 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_cistatic int mp3_read_header(AVFormatContext *s) 362cabdff1aSopenharmony_ci{ 363cabdff1aSopenharmony_ci FFFormatContext *const si = ffformatcontext(s); 364cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 365cabdff1aSopenharmony_ci AVStream *st; 366cabdff1aSopenharmony_ci FFStream *sti; 367cabdff1aSopenharmony_ci int64_t off; 368cabdff1aSopenharmony_ci int ret; 369cabdff1aSopenharmony_ci int i; 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci s->metadata = si->id3v2_meta; 372cabdff1aSopenharmony_ci si->id3v2_meta = NULL; 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci st = avformat_new_stream(s, NULL); 375cabdff1aSopenharmony_ci if (!st) 376cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 377cabdff1aSopenharmony_ci sti = ffstream(st); 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; 380cabdff1aSopenharmony_ci st->codecpar->codec_id = AV_CODEC_ID_MP3; 381cabdff1aSopenharmony_ci sti->need_parsing = AVSTREAM_PARSE_FULL_RAW; 382cabdff1aSopenharmony_ci st->start_time = 0; 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci // lcm of all mp3 sample rates 385cabdff1aSopenharmony_ci avpriv_set_pts_info(st, 64, 1, 14112000); 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci ffiocontext(s->pb)->maxsize = -1; 388cabdff1aSopenharmony_ci off = avio_tell(s->pb); 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci if (!av_dict_count(s->metadata)) 391cabdff1aSopenharmony_ci ff_id3v1_read(s); 392cabdff1aSopenharmony_ci 393cabdff1aSopenharmony_ci if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) 394cabdff1aSopenharmony_ci mp3->filesize = avio_size(s->pb); 395cabdff1aSopenharmony_ci 396cabdff1aSopenharmony_ci if (mp3_parse_vbr_tags(s, st, off) < 0) 397cabdff1aSopenharmony_ci avio_seek(s->pb, off, SEEK_SET); 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci ret = ff_replaygain_export(st, s->metadata); 400cabdff1aSopenharmony_ci if (ret < 0) 401cabdff1aSopenharmony_ci return ret; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci off = avio_tell(s->pb); 404cabdff1aSopenharmony_ci for (i = 0; i < 64 * 1024; i++) { 405cabdff1aSopenharmony_ci uint32_t header, header2; 406cabdff1aSopenharmony_ci int frame_size; 407cabdff1aSopenharmony_ci if (!(i&1023)) 408cabdff1aSopenharmony_ci ffio_ensure_seekback(s->pb, i + 1024 + 4); 409cabdff1aSopenharmony_ci frame_size = check(s->pb, off + i, &header); 410cabdff1aSopenharmony_ci if (frame_size > 0) { 411cabdff1aSopenharmony_ci ret = avio_seek(s->pb, off, SEEK_SET); 412cabdff1aSopenharmony_ci if (ret < 0) 413cabdff1aSopenharmony_ci return ret; 414cabdff1aSopenharmony_ci ffio_ensure_seekback(s->pb, i + 1024 + frame_size + 4); 415cabdff1aSopenharmony_ci ret = check(s->pb, off + i + frame_size, &header2); 416cabdff1aSopenharmony_ci if (ret >= 0 && 417cabdff1aSopenharmony_ci (header & MP3_MASK) == (header2 & MP3_MASK)) 418cabdff1aSopenharmony_ci { 419cabdff1aSopenharmony_ci av_log(s, i > 0 ? AV_LOG_INFO : AV_LOG_VERBOSE, "Skipping %d bytes of junk at %"PRId64".\n", i, off); 420cabdff1aSopenharmony_ci ret = avio_seek(s->pb, off + i, SEEK_SET); 421cabdff1aSopenharmony_ci if (ret < 0) 422cabdff1aSopenharmony_ci return ret; 423cabdff1aSopenharmony_ci break; 424cabdff1aSopenharmony_ci } else if (ret == CHECK_SEEK_FAILED) { 425cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "Invalid frame size (%d): Could not seek to %"PRId64".\n", frame_size, off + i + frame_size); 426cabdff1aSopenharmony_ci return AVERROR(EINVAL); 427cabdff1aSopenharmony_ci } 428cabdff1aSopenharmony_ci } else if (frame_size == CHECK_SEEK_FAILED) { 429cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "Failed to read frame size: Could not seek to %"PRId64".\n", (int64_t) (i + 1024 + frame_size + 4)); 430cabdff1aSopenharmony_ci return AVERROR(EINVAL); 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci ret = avio_seek(s->pb, off, SEEK_SET); 433cabdff1aSopenharmony_ci if (ret < 0) 434cabdff1aSopenharmony_ci return ret; 435cabdff1aSopenharmony_ci } 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci off = avio_tell(s->pb); 438cabdff1aSopenharmony_ci // the seek index is relative to the end of the xing vbr headers 439cabdff1aSopenharmony_ci for (int i = 0; i < sti->nb_index_entries; i++) 440cabdff1aSopenharmony_ci sti->index_entries[i].pos += off; 441cabdff1aSopenharmony_ci 442cabdff1aSopenharmony_ci /* the parameters will be extracted from the compressed bitstream */ 443cabdff1aSopenharmony_ci return 0; 444cabdff1aSopenharmony_ci} 445cabdff1aSopenharmony_ci 446cabdff1aSopenharmony_ci#define MP3_PACKET_SIZE 1024 447cabdff1aSopenharmony_ci 448cabdff1aSopenharmony_cistatic int mp3_read_packet(AVFormatContext *s, AVPacket *pkt) 449cabdff1aSopenharmony_ci{ 450cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 451cabdff1aSopenharmony_ci int ret, size; 452cabdff1aSopenharmony_ci int64_t pos; 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci size = MP3_PACKET_SIZE; 455cabdff1aSopenharmony_ci pos = avio_tell(s->pb); 456cabdff1aSopenharmony_ci if (mp3->filesize > ID3v1_TAG_SIZE && pos < mp3->filesize) 457cabdff1aSopenharmony_ci size= FFMIN(size, mp3->filesize - pos); 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_ci ret = av_get_packet(s->pb, pkt, size); 460cabdff1aSopenharmony_ci if (ret <= 0) { 461cabdff1aSopenharmony_ci if(ret<0) 462cabdff1aSopenharmony_ci return ret; 463cabdff1aSopenharmony_ci return AVERROR_EOF; 464cabdff1aSopenharmony_ci } 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci pkt->flags &= ~AV_PKT_FLAG_CORRUPT; 467cabdff1aSopenharmony_ci pkt->stream_index = 0; 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci return ret; 470cabdff1aSopenharmony_ci} 471cabdff1aSopenharmony_ci 472cabdff1aSopenharmony_ci#define SEEK_WINDOW 4096 473cabdff1aSopenharmony_ci 474cabdff1aSopenharmony_cistatic int check(AVIOContext *pb, int64_t pos, uint32_t *ret_header) 475cabdff1aSopenharmony_ci{ 476cabdff1aSopenharmony_ci int64_t ret = avio_seek(pb, pos, SEEK_SET); 477cabdff1aSopenharmony_ci uint8_t header_buf[4]; 478cabdff1aSopenharmony_ci unsigned header; 479cabdff1aSopenharmony_ci MPADecodeHeader sd; 480cabdff1aSopenharmony_ci if (ret < 0) 481cabdff1aSopenharmony_ci return CHECK_SEEK_FAILED; 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci ret = avio_read(pb, &header_buf[0], 4); 484cabdff1aSopenharmony_ci /* We should always find four bytes for a valid mpa header. */ 485cabdff1aSopenharmony_ci if (ret < 4) 486cabdff1aSopenharmony_ci return CHECK_SEEK_FAILED; 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci header = AV_RB32(&header_buf[0]); 489cabdff1aSopenharmony_ci if (ff_mpa_check_header(header) < 0) 490cabdff1aSopenharmony_ci return CHECK_WRONG_HEADER; 491cabdff1aSopenharmony_ci if (avpriv_mpegaudio_decode_header(&sd, header) == 1) 492cabdff1aSopenharmony_ci return CHECK_WRONG_HEADER; 493cabdff1aSopenharmony_ci 494cabdff1aSopenharmony_ci if (ret_header) 495cabdff1aSopenharmony_ci *ret_header = header; 496cabdff1aSopenharmony_ci return sd.frame_size; 497cabdff1aSopenharmony_ci} 498cabdff1aSopenharmony_ci 499cabdff1aSopenharmony_cistatic int64_t mp3_sync(AVFormatContext *s, int64_t target_pos, int flags) 500cabdff1aSopenharmony_ci{ 501cabdff1aSopenharmony_ci int dir = (flags&AVSEEK_FLAG_BACKWARD) ? -1 : 1; 502cabdff1aSopenharmony_ci int64_t best_pos; 503cabdff1aSopenharmony_ci int best_score, i, j; 504cabdff1aSopenharmony_ci int64_t ret; 505cabdff1aSopenharmony_ci 506cabdff1aSopenharmony_ci avio_seek(s->pb, FFMAX(target_pos - SEEK_WINDOW, 0), SEEK_SET); 507cabdff1aSopenharmony_ci ret = avio_seek(s->pb, target_pos, SEEK_SET); 508cabdff1aSopenharmony_ci if (ret < 0) 509cabdff1aSopenharmony_ci return ret; 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci#define MIN_VALID 3 512cabdff1aSopenharmony_ci best_pos = target_pos; 513cabdff1aSopenharmony_ci best_score = 999; 514cabdff1aSopenharmony_ci for (i = 0; i < SEEK_WINDOW; i++) { 515cabdff1aSopenharmony_ci int64_t pos = target_pos + (dir > 0 ? i - SEEK_WINDOW/4 : -i); 516cabdff1aSopenharmony_ci int64_t candidate = -1; 517cabdff1aSopenharmony_ci int score = 999; 518cabdff1aSopenharmony_ci 519cabdff1aSopenharmony_ci if (pos < 0) 520cabdff1aSopenharmony_ci continue; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci for (j = 0; j < MIN_VALID; j++) { 523cabdff1aSopenharmony_ci ret = check(s->pb, pos, NULL); 524cabdff1aSopenharmony_ci if (ret < 0) { 525cabdff1aSopenharmony_ci if (ret == CHECK_WRONG_HEADER) { 526cabdff1aSopenharmony_ci break; 527cabdff1aSopenharmony_ci } else if (ret == CHECK_SEEK_FAILED) { 528cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "Could not seek to %"PRId64".\n", pos); 529cabdff1aSopenharmony_ci return AVERROR(EINVAL); 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci } 532cabdff1aSopenharmony_ci if ((target_pos - pos)*dir <= 0 && FFABS(MIN_VALID/2-j) < score) { 533cabdff1aSopenharmony_ci candidate = pos; 534cabdff1aSopenharmony_ci score = FFABS(MIN_VALID/2-j); 535cabdff1aSopenharmony_ci } 536cabdff1aSopenharmony_ci pos += ret; 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci if (best_score > score && j == MIN_VALID) { 539cabdff1aSopenharmony_ci best_pos = candidate; 540cabdff1aSopenharmony_ci best_score = score; 541cabdff1aSopenharmony_ci if(score == 0) 542cabdff1aSopenharmony_ci break; 543cabdff1aSopenharmony_ci } 544cabdff1aSopenharmony_ci } 545cabdff1aSopenharmony_ci 546cabdff1aSopenharmony_ci return avio_seek(s->pb, best_pos, SEEK_SET); 547cabdff1aSopenharmony_ci} 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_cistatic int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp, 550cabdff1aSopenharmony_ci int flags) 551cabdff1aSopenharmony_ci{ 552cabdff1aSopenharmony_ci FFFormatContext *const si = ffformatcontext(s); 553cabdff1aSopenharmony_ci MP3DecContext *mp3 = s->priv_data; 554cabdff1aSopenharmony_ci AVIndexEntry *ie, ie1; 555cabdff1aSopenharmony_ci AVStream *st = s->streams[0]; 556cabdff1aSopenharmony_ci FFStream *const sti = ffstream(st); 557cabdff1aSopenharmony_ci int64_t best_pos; 558cabdff1aSopenharmony_ci int fast_seek = s->flags & AVFMT_FLAG_FAST_SEEK; 559cabdff1aSopenharmony_ci int64_t filesize = mp3->header_filesize; 560cabdff1aSopenharmony_ci 561cabdff1aSopenharmony_ci if (filesize <= 0) { 562cabdff1aSopenharmony_ci int64_t size = avio_size(s->pb); 563cabdff1aSopenharmony_ci if (size > 0 && size > si->data_offset) 564cabdff1aSopenharmony_ci filesize = size - si->data_offset; 565cabdff1aSopenharmony_ci } 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci if (mp3->xing_toc && (mp3->usetoc || (fast_seek && !mp3->is_cbr))) { 568cabdff1aSopenharmony_ci int64_t ret = av_index_search_timestamp(st, timestamp, flags); 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci // NOTE: The MP3 TOC is not a precise lookup table. Accuracy is worse 571cabdff1aSopenharmony_ci // for bigger files. 572cabdff1aSopenharmony_ci av_log(s, AV_LOG_WARNING, "Using MP3 TOC to seek; may be imprecise.\n"); 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci if (ret < 0) 575cabdff1aSopenharmony_ci return ret; 576cabdff1aSopenharmony_ci 577cabdff1aSopenharmony_ci ie = &sti->index_entries[ret]; 578cabdff1aSopenharmony_ci } else if (fast_seek && st->duration > 0 && filesize > 0) { 579cabdff1aSopenharmony_ci if (!mp3->is_cbr) 580cabdff1aSopenharmony_ci av_log(s, AV_LOG_WARNING, "Using scaling to seek VBR MP3; may be imprecise.\n"); 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci ie = &ie1; 583cabdff1aSopenharmony_ci timestamp = av_clip64(timestamp, 0, st->duration); 584cabdff1aSopenharmony_ci ie->timestamp = timestamp; 585cabdff1aSopenharmony_ci ie->pos = av_rescale(timestamp, filesize, st->duration) + si->data_offset; 586cabdff1aSopenharmony_ci } else { 587cabdff1aSopenharmony_ci return -1; // generic index code 588cabdff1aSopenharmony_ci } 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci best_pos = mp3_sync(s, ie->pos, flags); 591cabdff1aSopenharmony_ci if (best_pos < 0) 592cabdff1aSopenharmony_ci return best_pos; 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ci if (mp3->is_cbr && ie == &ie1 && mp3->frames) { 595cabdff1aSopenharmony_ci int frame_duration = av_rescale(st->duration, 1, mp3->frames); 596cabdff1aSopenharmony_ci ie1.timestamp = frame_duration * av_rescale(best_pos - si->data_offset, mp3->frames, mp3->header_filesize); 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci 599cabdff1aSopenharmony_ci avpriv_update_cur_dts(s, st, ie->timestamp); 600cabdff1aSopenharmony_ci return 0; 601cabdff1aSopenharmony_ci} 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_cistatic const AVOption options[] = { 604cabdff1aSopenharmony_ci { "usetoc", "use table of contents", offsetof(MP3DecContext, usetoc), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM}, 605cabdff1aSopenharmony_ci { NULL }, 606cabdff1aSopenharmony_ci}; 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_cistatic const AVClass demuxer_class = { 609cabdff1aSopenharmony_ci .class_name = "mp3", 610cabdff1aSopenharmony_ci .item_name = av_default_item_name, 611cabdff1aSopenharmony_ci .option = options, 612cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 613cabdff1aSopenharmony_ci .category = AV_CLASS_CATEGORY_DEMUXER, 614cabdff1aSopenharmony_ci}; 615cabdff1aSopenharmony_ci 616cabdff1aSopenharmony_ciconst AVInputFormat ff_mp3_demuxer = { 617cabdff1aSopenharmony_ci .name = "mp3", 618cabdff1aSopenharmony_ci .long_name = NULL_IF_CONFIG_SMALL("MP2/3 (MPEG audio layer 2/3)"), 619cabdff1aSopenharmony_ci .read_probe = mp3_read_probe, 620cabdff1aSopenharmony_ci .read_header = mp3_read_header, 621cabdff1aSopenharmony_ci .read_packet = mp3_read_packet, 622cabdff1aSopenharmony_ci .read_seek = mp3_seek, 623cabdff1aSopenharmony_ci .priv_data_size = sizeof(MP3DecContext), 624cabdff1aSopenharmony_ci .flags = AVFMT_GENERIC_INDEX, 625cabdff1aSopenharmony_ci .extensions = "mp2,mp3,m2a,mpa", /* XXX: use probe */ 626cabdff1aSopenharmony_ci .priv_class = &demuxer_class, 627cabdff1aSopenharmony_ci}; 628