Mercurial > libavformat.hg
changeset 5000:e57ded024980 libavformat
do not parse full header for private streams
author | bcoudurier |
---|---|
date | Tue, 02 Jun 2009 07:53:44 +0000 |
parents | 476d3417effa |
children | 4da68099d180 |
files | mpegts.c |
diffstat | 1 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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)