From 1303d62d8416fa315a0cc7bbbe35cfdab787ea92 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Sun, 18 Oct 2009 20:08:13 +0000 Subject: [PATCH] Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t Print error when max resync size is reached and return EAGAIN instead of INVALIDDATA, so user can retry if wanted. Originally committed as revision 20286 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/mpegts.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index f5b7fffb0a..300eb71a73 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -36,7 +36,7 @@ /* maximum size in which we look for synchronisation if synchronisation is lost */ -#define MAX_RESYNC_SIZE 4096 +#define MAX_RESYNC_SIZE 65536 #define MAX_PES_PAYLOAD 200*1024 @@ -1209,8 +1209,9 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet) /* XXX: try to find a better synchro over several packets (use get_packet_size() ?) */ -static int mpegts_resync(ByteIOContext *pb) +static int mpegts_resync(AVFormatContext *s) { + ByteIOContext *pb = s->pb; int c, i; for(i = 0;i < MAX_RESYNC_SIZE; i++) { @@ -1222,13 +1223,15 @@ static int mpegts_resync(ByteIOContext *pb) return 0; } } + av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n"); /* no sync found */ return -1; } /* return -1 if error or EOF. Return 0 if OK. */ -static int read_packet(ByteIOContext *pb, uint8_t *buf, int raw_packet_size) +static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size) { + ByteIOContext *pb = s->pb; int skip, len; for(;;) { @@ -1239,8 +1242,8 @@ static int read_packet(ByteIOContext *pb, uint8_t *buf, int raw_packet_size) if (buf[0] != 0x47) { /* find a new packet start */ url_fseek(pb, -TS_PACKET_SIZE, SEEK_CUR); - if (mpegts_resync(pb) < 0) - return AVERROR_INVALIDDATA; + if (mpegts_resync(s) < 0) + return AVERROR(EAGAIN); else continue; } else { @@ -1256,7 +1259,6 @@ static int read_packet(ByteIOContext *pb, uint8_t *buf, int raw_packet_size) static int handle_packets(MpegTSContext *ts, int nb_packets) { AVFormatContext *s = ts->stream; - ByteIOContext *pb = s->pb; uint8_t packet[TS_PACKET_SIZE]; int packet_num, ret; @@ -1268,7 +1270,7 @@ static int handle_packets(MpegTSContext *ts, int nb_packets) packet_num++; if (nb_packets != 0 && packet_num >= nb_packets) break; - ret = read_packet(pb, packet, ts->raw_packet_size); + ret = read_packet(s, packet, ts->raw_packet_size); if (ret != 0) return ret; ret = handle_packet(ts, packet); @@ -1404,7 +1406,7 @@ static int mpegts_read_header(AVFormatContext *s, nb_pcrs = 0; nb_packets = 0; for(;;) { - ret = read_packet(s->pb, packet, ts->raw_packet_size); + ret = read_packet(s, packet, ts->raw_packet_size); if (ret < 0) return -1; pid = AV_RB16(packet + 1) & 0x1fff; @@ -1453,7 +1455,7 @@ static int mpegts_raw_read_packet(AVFormatContext *s, if (av_new_packet(pkt, TS_PACKET_SIZE) < 0) return AVERROR(ENOMEM); pkt->pos= url_ftell(s->pb); - ret = read_packet(s->pb, pkt->data, ts->raw_packet_size); + ret = read_packet(s, pkt->data, ts->raw_packet_size); if (ret < 0) { av_free_packet(pkt); return ret;