Read all id3v2 tags at the beginning of mp3 files.

Patch by David Byron, dbyron dbyron com

Originally committed as revision 25105 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
David Byron 2010-09-11 16:29:23 +00:00 committed by Carl Eugen Hoyos
parent 0132ab80a8
commit 0c41d554e2
2 changed files with 10 additions and 3 deletions

View File

@ -23,7 +23,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 52 #define LIBAVFORMAT_VERSION_MAJOR 52
#define LIBAVFORMAT_VERSION_MINOR 78 #define LIBAVFORMAT_VERSION_MINOR 78
#define LIBAVFORMAT_VERSION_MICRO 4 #define LIBAVFORMAT_VERSION_MICRO 5
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \

View File

@ -53,11 +53,17 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic)
{ {
int len, ret; int len, ret;
uint8_t buf[ID3v2_HEADER_SIZE]; uint8_t buf[ID3v2_HEADER_SIZE];
int found_header;
int64_t off;
do {
/* save the current offset in case there's nothing to read/skip */
off = url_ftell(s->pb);
ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE); ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE);
if (ret != ID3v2_HEADER_SIZE) if (ret != ID3v2_HEADER_SIZE)
return; return;
if (ff_id3v2_match(buf, magic)) { found_header = ff_id3v2_match(buf, magic);
if (found_header) {
/* parse ID3v2 header */ /* parse ID3v2 header */
len = ((buf[6] & 0x7f) << 21) | len = ((buf[6] & 0x7f) << 21) |
((buf[7] & 0x7f) << 14) | ((buf[7] & 0x7f) << 14) |
@ -65,8 +71,9 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic)
(buf[9] & 0x7f); (buf[9] & 0x7f);
ff_id3v2_parse(s, len, buf[3], buf[5]); ff_id3v2_parse(s, len, buf[3], buf[5]);
} else { } else {
url_fseek(s->pb, 0, SEEK_SET); url_fseek(s->pb, off, SEEK_SET);
} }
} while (found_header);
} }
static unsigned int get_size(ByteIOContext *s, int len) static unsigned int get_size(ByteIOContext *s, int len)