# HG changeset patch # User bcoudurier # Date 1243929224 0 # Node ID e57ded024980904238d61b1f9e9f9e19e300fd18 # Parent 476d3417effaa7d25e71e2683e17c83ce29dec8d do not parse full header for private streams diff -r 476d3417effa -r e57ded024980 mpegts.c --- a/mpegts.c Tue Jun 02 07:30:19 2009 +0000 +++ b/mpegts.c Tue Jun 02 07:53:44 2009 +0000 @@ -128,13 +128,15 @@ 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 @@ 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 @@ 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)