From e56cfad04b73be35ea8dcb5fd5e8451f6924aff1 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 17 Jan 2007 10:19:10 +0000 Subject: [PATCH] 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 Originally committed as revision 7560 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/mpeg.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) 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);