# HG changeset patch # User cehoyos # Date 1284222563 0 # Node ID 1a62da965733dc68d77cde1b4280d7262478792e # Parent ae4ea19af7620acff0f092df1079130ba7ec95dc Read all id3v2 tags at the beginning of mp3 files. Patch by David Byron, dbyron dbyron com diff -r ae4ea19af762 -r 1a62da965733 avformat.h --- a/avformat.h Fri Sep 10 23:29:07 2010 +0000 +++ b/avformat.h Sat Sep 11 16:29:23 2010 +0000 @@ -23,7 +23,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 52 #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, \ LIBAVFORMAT_VERSION_MINOR, \ diff -r ae4ea19af762 -r 1a62da965733 id3v2.c --- a/id3v2.c Fri Sep 10 23:29:07 2010 +0000 +++ b/id3v2.c Sat Sep 11 16:29:23 2010 +0000 @@ -53,11 +53,17 @@ { int len, ret; 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); if (ret != ID3v2_HEADER_SIZE) return; - if (ff_id3v2_match(buf, magic)) { + found_header = ff_id3v2_match(buf, magic); + if (found_header) { /* parse ID3v2 header */ len = ((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | @@ -65,8 +71,9 @@ (buf[9] & 0x7f); ff_id3v2_parse(s, len, buf[3], buf[5]); } 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)