Read all id3v2 tags at the beginning of mp3 files.
authorDavid Byron <dbyron@dbyron.com>
Sat, 11 Sep 2010 16:29:23 +0000 (16:29 +0000)
committerCarl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at>
Sat, 11 Sep 2010 16:29:23 +0000 (16:29 +0000)
Patch by David Byron, dbyron dbyron com

Originally committed as revision 25105 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avformat.h
libavformat/id3v2.c

index 441f807..ed9dfb3 100644 (file)
@@ -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, \
index f2515d5..b51f049 100644 (file)
@@ -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)