resync ffm if error in stream
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>
Fri, 20 Mar 2009 01:44:45 +0000 (01:44 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Fri, 20 Mar 2009 01:44:45 +0000 (01:44 +0000)
Originally committed as revision 18065 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/ffmdec.c

index cc27693..cf04264 100644 (file)
@@ -87,13 +87,26 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
         return AVERROR(EAGAIN);
 }
 
         return AVERROR(EAGAIN);
 }
 
+static int ffm_resync(AVFormatContext *s, int state)
+{
+    av_log(s, AV_LOG_ERROR, "resyncing\n");
+    while (state != PACKET_ID) {
+        if (url_feof(s->pb)) {
+            av_log(s, AV_LOG_ERROR, "cannot find FFM syncword\n");
+            return -1;
+        }
+        state = (state << 8) | get_byte(s->pb);
+    }
+    return 0;
+}
+
 /* first is true if we read the frame header */
 static int ffm_read_data(AVFormatContext *s,
                          uint8_t *buf, int size, int header)
 {
     FFMContext *ffm = s->priv_data;
     ByteIOContext *pb = s->pb;
 /* first is true if we read the frame header */
 static int ffm_read_data(AVFormatContext *s,
                          uint8_t *buf, int size, int header)
 {
     FFMContext *ffm = s->priv_data;
     ByteIOContext *pb = s->pb;
-    int len, fill_size, size1, frame_offset;
+    int len, fill_size, size1, frame_offset, id;
 
     size1 = size;
     while (size > 0) {
 
     size1 = size;
     while (size > 0) {
@@ -107,7 +120,10 @@ static int ffm_read_data(AVFormatContext *s,
             if (url_ftell(pb) == ffm->file_size)
                 url_fseek(pb, ffm->packet_size, SEEK_SET);
     retry_read:
             if (url_ftell(pb) == ffm->file_size)
                 url_fseek(pb, ffm->packet_size, SEEK_SET);
     retry_read:
-            get_be16(pb); /* PACKET_ID */
+            id = get_be16(pb); /* PACKET_ID */
+            if (id != PACKET_ID)
+                if (ffm_resync(s, id) < 0)
+                    return -1;
             fill_size = get_be16(pb);
             ffm->dts = get_be64(pb);
             frame_offset = get_be16(pb);
             fill_size = get_be16(pb);
             ffm->dts = get_be64(pb);
             frame_offset = get_be16(pb);