[Ffmpeg-cvslog] r7560 - trunk/libavformat/mpeg.c

michael subversion
Wed Jan 17 11:19:10 CET 2007


Author: michael
Date: Wed Jan 17 11:19:10 2007
New Revision: 7560

Modified:
   trunk/libavformat/mpeg.c

Log:
seperate redo (we dont handle this possibly valid packet) from
error_redo (somethings is definitly wrong) in which case we try to resync from the last startcode


Modified: trunk/libavformat/mpeg.c
==============================================================================
--- trunk/libavformat/mpeg.c	(original)
+++ trunk/libavformat/mpeg.c	Wed Jan 17 11:19:10 2007
@@ -1445,14 +1445,17 @@
 {
     MpegDemuxContext *m = s->priv_data;
     int len, size, startcode, c, flags, header_len;
-    int64_t pts, dts, last_pos;
+    int64_t pts, dts;
+    int64_t last_sync= url_ftell(&s->pb);
 
-    last_pos = -1;
+ error_redo:
+        url_fseek(&s->pb, last_sync, SEEK_SET);
  redo:
         /* next start code (should be immediately after) */
         m->header_state = 0xff;
         size = MAX_SYNC_SIZE;
         startcode = find_next_start_code(&s->pb, &size, &m->header_state);
+        last_sync = url_ftell(&s->pb);
     //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(&s->pb));
     if (startcode < 0)
         return AVERROR_IO;
@@ -1486,7 +1489,7 @@
     /* stuffing */
     for(;;) {
         if (len < 1)
-            goto redo;
+            goto error_redo;
         c = get_byte(&s->pb);
         len--;
         /* XXX: for mpeg1, should test only bit 7 */
@@ -1496,19 +1499,19 @@
     if ((c & 0xc0) == 0x40) {
         /* buffer scale & size */
         if (len < 2)
-            goto redo;
+            goto error_redo;
         get_byte(&s->pb);
         c = get_byte(&s->pb);
         len -= 2;
     }
     if ((c & 0xf0) == 0x20) {
         if (len < 4)
-            goto redo;
+            goto error_redo;
         dts = pts = get_pts(&s->pb, c);
         len -= 4;
     } else if ((c & 0xf0) == 0x30) {
         if (len < 9)
-            goto redo;
+            goto error_redo;
         pts = get_pts(&s->pb, c);
         dts = get_pts(&s->pb, -1);
         len -= 9;
@@ -1524,18 +1527,18 @@
         header_len = get_byte(&s->pb);
         len -= 2;
         if (header_len > len)
-            goto redo;
+            goto error_redo;
         if ((flags & 0xc0) == 0x80) {
             dts = pts = get_pts(&s->pb, -1);
             if (header_len < 5)
-                goto redo;
+                goto error_redo;
             header_len -= 5;
             len -= 5;
         } if ((flags & 0xc0) == 0xc0) {
             pts = get_pts(&s->pb, -1);
             dts = get_pts(&s->pb, -1);
             if (header_len < 10)
-                goto redo;
+                goto error_redo;
             header_len -= 10;
             len -= 10;
         }
@@ -1550,13 +1553,13 @@
 
     if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
         if (len < 1)
-            goto redo;
+            goto error_redo;
         startcode = get_byte(&s->pb);
         len--;
         if (startcode >= 0x80 && startcode <= 0xbf) {
             /* audio: skip header */
             if (len < 3)
-                goto redo;
+                goto error_redo;
             get_byte(&s->pb);
             get_byte(&s->pb);
             get_byte(&s->pb);




More information about the ffmpeg-cvslog mailing list