diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 709ce16f18..932557e673 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -1445,14 +1445,17 @@ static int mpegps_read_pes_header(AVFormatContext *s, { 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 @@ static int mpegps_read_pes_header(AVFormatContext *s, /* 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 @@ static int mpegps_read_pes_header(AVFormatContext *s, 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 @@ static int mpegps_read_pes_header(AVFormatContext *s, 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 @@ static int mpegps_read_pes_header(AVFormatContext *s, 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);