From: Baptiste Coudurier Date: Tue, 2 Jun 2009 07:53:44 +0000 (+0000) Subject: do not parse full header for private streams X-Git-Tag: v0.6~4179 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b2984add8077ecc9d3cdf0d9294fb323f2001511;p=platform%2Fupstream%2Flibav.git do not parse full header for private streams Originally committed as revision 19075 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index df28157..031c460 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -128,13 +128,15 @@ struct MpegTSContext { enum MpegTSState { MPEGTS_HEADER = 0, + MPEGTS_PESHEADER, MPEGTS_PESHEADER_FILL, MPEGTS_PAYLOAD, MPEGTS_SKIP, }; /* enough for PES header + length */ -#define PES_START_SIZE 9 +#define PES_START_SIZE 6 +#define PES_HEADER_SIZE 9 #define MAX_PES_HEADER_SIZE (9 + 255) struct PESContext { @@ -951,8 +953,7 @@ static int mpegts_push_data(MpegTSFilter *filter, code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */ code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */ code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */ - pes->state = MPEGTS_PESHEADER_FILL; - pes->pes_header_size = pes->header[8] + 9; + pes->state = MPEGTS_PESHEADER; } else { pes->state = MPEGTS_PAYLOAD; pes->data_index = 0; @@ -968,6 +969,21 @@ static int mpegts_push_data(MpegTSFilter *filter, break; /**********************************************/ /* PES packing parsing */ + case MPEGTS_PESHEADER: + len = PES_HEADER_SIZE - pes->data_index; + if (len < 0) + return -1; + if (len > buf_size) + len = buf_size; + memcpy(pes->header + pes->data_index, p, len); + pes->data_index += len; + p += len; + buf_size -= len; + if (pes->data_index == PES_HEADER_SIZE) { + pes->pes_header_size = pes->header[8] + 9; + pes->state = MPEGTS_PESHEADER_FILL; + } + break; case MPEGTS_PESHEADER_FILL: len = pes->pes_header_size - pes->data_index; if (len < 0)