diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index df281571b1..031c460dd6 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)