diff options
author | Alex Converse <alex.converse@gmail.com> | 2009-01-19 21:54:06 +0000 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2009-01-19 21:54:06 +0000 |
commit | ac3ef4a41b6de8bd0309fe166bb4c544f3d719be (patch) | |
tree | 709028defcbd2cfe5c1184fae3778d5a8c3512ae | |
parent | 2f642393381659f4a198d9c5a96896eebb23de18 (diff) | |
download | ffmpeg-ac3ef4a41b6de8bd0309fe166bb4c544f3d719be.tar.gz |
Fix probing of files with ID3v2 tags. Discussed at
http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2009-January/059302.html
Originally committed as revision 16688 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/Makefile | 4 | ||||
-rw-r--r-- | libavformat/id3v2.c | 12 | ||||
-rw-r--r-- | libavformat/id3v2.h | 7 | ||||
-rw-r--r-- | libavformat/mp3.c | 12 | ||||
-rw-r--r-- | libavformat/mpc.c | 7 | ||||
-rw-r--r-- | libavformat/raw.c | 13 |
6 files changed, 43 insertions, 12 deletions
diff --git a/libavformat/Makefile b/libavformat/Makefile index 231afbba6f..6879d6a992 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -8,7 +8,7 @@ HEADERS = avformat.h avio.h rtsp.h rtspcodes.h OBJS = allformats.o cutils.o metadata.o metadata_compat.o options.o os_support.o sdp.o utils.o # muxers/demuxers -OBJS-$(CONFIG_AAC_DEMUXER) += raw.o +OBJS-$(CONFIG_AAC_DEMUXER) += raw.o id3v2.o OBJS-$(CONFIG_AC3_DEMUXER) += raw.o OBJS-$(CONFIG_AC3_MUXER) += raw.o OBJS-$(CONFIG_ADTS_MUXER) += adtsenc.o @@ -97,7 +97,7 @@ OBJS-$(CONFIG_MP2_MUXER) += mp3.o OBJS-$(CONFIG_MP3_DEMUXER) += mp3.o id3v2.o OBJS-$(CONFIG_MP3_MUXER) += mp3.o OBJS-$(CONFIG_MP4_MUXER) += movenc.o riff.o isom.o avc.o -OBJS-$(CONFIG_MPC_DEMUXER) += mpc.o +OBJS-$(CONFIG_MPC_DEMUXER) += mpc.o id3v2.o OBJS-$(CONFIG_MPC8_DEMUXER) += mpc8.o OBJS-$(CONFIG_MPEG1SYSTEM_MUXER) += mpegenc.o OBJS-$(CONFIG_MPEG1VCD_MUXER) += mpegenc.o diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index c27443b3c2..018fd51dc8 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -33,3 +33,15 @@ int ff_id3v2_match(const uint8_t *buf) (buf[8] & 0x80) == 0 && (buf[9] & 0x80) == 0; } + +int ff_id3v2_tag_len(const uint8_t * buf) +{ + int len = ((buf[6] & 0x7f) << 21) + + ((buf[7] & 0x7f) << 14) + + ((buf[8] & 0x7f) << 7) + + (buf[9] & 0x7f) + + ID3v2_HEADER_SIZE; + if (buf[5] & 0x10) + len += ID3v2_HEADER_SIZE; + return len; +} diff --git a/libavformat/id3v2.h b/libavformat/id3v2.h index f54e29054b..6d62f11f3b 100644 --- a/libavformat/id3v2.h +++ b/libavformat/id3v2.h @@ -32,4 +32,11 @@ */ int ff_id3v2_match(const uint8_t *buf); +/** + * Gets the length of an ID3v2 tag. + * @buf must be ID3v2_HEADER_SIZE bytes long and point to the start of an + * already detected ID3v2 tag + */ +int ff_id3v2_tag_len(const uint8_t *buf); + #endif /* AVFORMAT_ID3V2_H */ diff --git a/libavformat/mp3.c b/libavformat/mp3.c index 1a3c5e23cf..ec8c0bb997 100644 --- a/libavformat/mp3.c +++ b/libavformat/mp3.c @@ -354,14 +354,16 @@ static int mp3_read_probe(AVProbeData *p) int max_frames, first_frames = 0; int fsize, frames, sample_rate; uint32_t header; - uint8_t *buf, *buf2, *end; + uint8_t *buf, *buf0, *buf2, *end; AVCodecContext avctx; - if(ff_id3v2_match(p->buf)) - return AVPROBE_SCORE_MAX/2+1; // this must be less than mpeg-ps because some retards put id3v2 tags before mpeg-ps files + buf0 = p->buf; + if(ff_id3v2_match(buf0)) { + buf0 += ff_id3v2_tag_len(buf0); + } max_frames = 0; - buf = p->buf; + buf = buf0; end = buf + p->buf_size - sizeof(uint32_t); for(; buf < end; buf= buf2+1) { @@ -375,7 +377,7 @@ static int mp3_read_probe(AVProbeData *p) buf2 += fsize; } max_frames = FFMAX(max_frames, frames); - if(buf == p->buf) + if(buf == buf0) first_frames= frames; } if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1; diff --git a/libavformat/mpc.c b/libavformat/mpc.c index 1a22c113b0..9dbd239f0e 100644 --- a/libavformat/mpc.c +++ b/libavformat/mpc.c @@ -21,6 +21,7 @@ #include "libavcodec/bitstream.h" #include "avformat.h" +#include "id3v2.h" #define MPC_FRAMESIZE 1152 #define DELAY_FRAMES 32 @@ -43,10 +44,12 @@ typedef struct { static int mpc_probe(AVProbeData *p) { const uint8_t *d = p->buf; + if (ff_id3v2_match(d)) { + d += ff_id3v2_tag_len(d); + } + if (d+3 < p->buf+p->buf_size) if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7)) return AVPROBE_SCORE_MAX; - if (d[0] == 'I' && d[1] == 'D' && d[2] == '3') - return AVPROBE_SCORE_MAX / 2; return 0; } diff --git a/libavformat/raw.c b/libavformat/raw.c index 2ca011e509..fe6f6e40c3 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -26,6 +26,7 @@ #include "libavcodec/bytestream.h" #include "avformat.h" #include "raw.h" +#include "id3v2.h" /* simple formats */ #if CONFIG_FLAC_MUXER @@ -582,9 +583,15 @@ static int adts_aac_probe(AVProbeData *p) { int max_frames = 0, first_frames = 0; int fsize, frames; + uint8_t *buf0 = p->buf; uint8_t *buf2; - uint8_t *buf = p->buf; - uint8_t *end = buf + p->buf_size - 7; + uint8_t *buf; + uint8_t *end = buf0 + p->buf_size - 7; + + if (ff_id3v2_match(buf0)) { + buf0 += ff_id3v2_tag_len(buf0); + } + buf = buf0; for(; buf < end; buf= buf2+1) { buf2 = buf; @@ -599,7 +606,7 @@ static int adts_aac_probe(AVProbeData *p) buf2 += fsize; } max_frames = FFMAX(max_frames, frames); - if(buf == p->buf) + if(buf == buf0) first_frames= frames; } if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1; |