parse header chunk in a loop (don't depend on a fixed chunk ordering)
authorAurelien Jacobs <aurel@gnuage.org>
Thu, 18 Oct 2007 22:26:23 +0000 (22:26 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Thu, 18 Oct 2007 22:26:23 +0000 (22:26 +0000)
Originally committed as revision 10792 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/electronicarts.c

index dd129f158e523dd093b01e08b4e5752475da8c87..74ef7c8d12c492c9cf4697b75dcacec6d426a72e 100644 (file)
@@ -162,17 +162,16 @@ static int process_ea_header(AVFormatContext *s) {
     uint32_t blockid, size = 0;
     EaDemuxContext *ea = s->priv_data;
     ByteIOContext *pb = &s->pb;
+    int i;
+
+    for (i=0; i<5 && (!ea->audio_codec || !ea->video_codec); i++) {
+        unsigned int startpos = url_ftell(pb);
 
     blockid = get_le32(pb);
-    if (blockid == MVhd_TAG) {
         size = get_le32(pb);
-        process_video_header_vp6(s);
-        url_fskip(pb, size-32);
-        blockid = get_le32(pb);
-    }
-    if (blockid != SCHl_TAG)
-        return 0;
-    size += get_le32(pb);
+
+        switch (blockid) {
+            case SCHl_TAG :
     blockid = get_le32(pb);
     if (blockid == GSTR_TAG) {
         url_fskip(pb, 4);
@@ -182,9 +181,17 @@ static int process_ea_header(AVFormatContext *s) {
     }
 
     process_audio_header_elements(s);
+                break;
+
+            case MVhd_TAG :
+                process_video_header_vp6(s);
+                break;
+        }
+
+        url_fseek(pb, startpos + size, SEEK_SET);
+    }
 
-    /* skip to the start of the data */
-    url_fseek(pb, size, SEEK_SET);
+    url_fseek(pb, 0, SEEK_SET);
 
     return 1;
 }