# HG changeset patch # User michael # Date 1169029150 0 # Node ID 5e7460a2f209d76c9355aac04ce8a43c089ba5ab # Parent a7508607760ce30d0957573a242f8349639fc31e 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 diff -r a7508607760c -r 5e7460a2f209 mpeg.c --- 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);