changeset 2632:c5118e086450 libavformat

parse header chunk in a loop (don't depend on a fixed chunk ordering)
author aurel
date Thu, 18 Oct 2007 22:26:23 +0000
parents f37d16f2c940
children 0605d25fba46
files electronicarts.c
diffstat 1 files changed, 17 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/electronicarts.c	Thu Oct 18 22:23:30 2007 +0000
+++ b/electronicarts.c	Thu Oct 18 22:26:23 2007 +0000
@@ -162,17 +162,16 @@
     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 @@
     }
 
     process_audio_header_elements(s);
+                break;
 
-    /* skip to the start of the data */
-    url_fseek(pb, size, SEEK_SET);
+            case MVhd_TAG :
+                process_video_header_vp6(s);
+                break;
+        }
+
+        url_fseek(pb, startpos + size, SEEK_SET);
+    }
+
+    url_fseek(pb, 0, SEEK_SET);
 
     return 1;
 }