summaryrefslogtreecommitdiff
path: root/libavformat/id3v2.c
diff options
context:
space:
mode:
authorDavid Byron <dbyron@dbyron.com>2010-09-11 16:29:23 +0000
committerCarl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at>2010-09-11 16:29:23 +0000
commit0c41d554e2373b1e17c462155fba5ef209e544c1 (patch)
treeab42f3b27b8cf8e8b2ae32d884b632d826154e23 /libavformat/id3v2.c
parent0132ab80a817cd261966b17280c6a01b91292f17 (diff)
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
Diffstat (limited to 'libavformat/id3v2.c')
-rw-r--r--libavformat/id3v2.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index f2515d5206..b51f049c53 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -53,11 +53,17 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic)
{
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 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic)
(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)