changeset 1664:5e7460a2f209 libavformat

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
author michael
date Wed, 17 Jan 2007 10:19:10 +0000
parents a7508607760c
children 074b64b1fb61
files mpeg.c
diffstat 1 files changed, 14 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mpeg.c	Tue Jan 16 22:31:10 2007 +0000
+++ b/mpeg.c	Wed Jan 17 10:19:10 2007 +0000
@@ -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);