changeset 1722:cb0dc6abf4d1 libavformat

make the asf demuxer resistant against insertion/deletion errors
author michael
date Tue, 23 Jan 2007 21:25:06 +0000
parents 650d81b4b199
children 3c592c941858
files asf.c
diffstat 1 files changed, 17 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/asf.c	Tue Jan 23 18:37:23 2007 +0000
+++ b/asf.c	Tue Jan 23 21:25:06 2007 +0000
@@ -476,19 +476,30 @@
     ByteIOContext *pb = &s->pb;
     uint32_t packet_length, padsize;
     int rsize = 9;
-    int c;
+    int c, d, e, off;
+
+    off= (url_ftell(&s->pb) - s->data_offset) % asf->packet_size + 3;
 
-    c = get_byte(pb);
+    c=d=e=-1;
+    while(off-- > 0){
+        c=d; d=e;
+        e= get_byte(pb);
+        if(c == 0x82 && !d && !e)
+            break;
+    }
+
     if (c != 0x82) {
         if (!url_feof(pb))
             av_log(s, AV_LOG_ERROR, "ff asf bad header %x  at:%"PRId64"\n", c, url_ftell(pb));
     }
     if ((c & 0x0f) == 2) { // always true for now
-        if (get_le16(pb) != 0) {
+        if (d || e) {
             if (!url_feof(pb))
                 av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
             return -1;
         }
+        d= get_byte(pb);
+        e= get_byte(pb);
         rsize+=2;
 /*    }else{
         if (!url_feof(pb))
@@ -496,8 +507,8 @@
         return AVERROR_IO;*/
     }
 
-    asf->packet_flags = get_byte(pb);
-    asf->packet_property = get_byte(pb);
+    asf->packet_flags = d;
+    asf->packet_property = e;
 
     DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size);
     DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored
@@ -613,12 +624,6 @@
             /* fail safe */
             url_fskip(pb, ret);
 
-            ret= (url_ftell(&s->pb) - s->data_offset) % asf->packet_size;
-            if(asf->hdr.max_pktsize == asf->hdr.min_pktsize && ret){
-                av_log(s, AV_LOG_ERROR, "packet end missaligned skiping %d\n", ret);
-                url_fskip(pb, asf->packet_size - ret);
-            }
-
             asf->packet_pos= url_ftell(&s->pb);
             if (asf->data_object_size != (uint64_t)-1 &&
                 (asf->packet_pos - asf->data_object_offset >= asf->data_object_size))
@@ -833,7 +838,7 @@
 
             asf_st= s->streams[i]->priv_data;
 
-            assert((asf_st->packet_pos - s->data_offset) % asf->packet_size == 0);
+//            assert((asf_st->packet_pos - s->data_offset) % asf->packet_size == 0);
             pos= asf_st->packet_pos;
 
             av_add_index_entry(s->streams[i], pos, pts, pkt->size, pos - start_pos[i] + 1, AVINDEX_KEYFRAME);