Mercurial > libavformat.hg
comparison mpegts.c @ 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 | d44e963aaf1c |
comparison
equal
deleted
inserted
replaced
4999:476d3417effa | 5000:e57ded024980 |
---|---|
126 | 126 |
127 /* TS stream handling */ | 127 /* TS stream handling */ |
128 | 128 |
129 enum MpegTSState { | 129 enum MpegTSState { |
130 MPEGTS_HEADER = 0, | 130 MPEGTS_HEADER = 0, |
131 MPEGTS_PESHEADER, | |
131 MPEGTS_PESHEADER_FILL, | 132 MPEGTS_PESHEADER_FILL, |
132 MPEGTS_PAYLOAD, | 133 MPEGTS_PAYLOAD, |
133 MPEGTS_SKIP, | 134 MPEGTS_SKIP, |
134 }; | 135 }; |
135 | 136 |
136 /* enough for PES header + length */ | 137 /* enough for PES header + length */ |
137 #define PES_START_SIZE 9 | 138 #define PES_START_SIZE 6 |
139 #define PES_HEADER_SIZE 9 | |
138 #define MAX_PES_HEADER_SIZE (9 + 255) | 140 #define MAX_PES_HEADER_SIZE (9 + 255) |
139 | 141 |
140 struct PESContext { | 142 struct PESContext { |
141 int pid; | 143 int pid; |
142 int pcr_pid; /**< if -1 then all packets containing PCR are considered */ | 144 int pcr_pid; /**< if -1 then all packets containing PCR are considered */ |
949 | 951 |
950 if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */ | 952 if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */ |
951 code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */ | 953 code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */ |
952 code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */ | 954 code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */ |
953 code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */ | 955 code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */ |
954 pes->state = MPEGTS_PESHEADER_FILL; | 956 pes->state = MPEGTS_PESHEADER; |
955 pes->pes_header_size = pes->header[8] + 9; | |
956 } else { | 957 } else { |
957 pes->state = MPEGTS_PAYLOAD; | 958 pes->state = MPEGTS_PAYLOAD; |
958 pes->data_index = 0; | 959 pes->data_index = 0; |
959 } | 960 } |
960 } else { | 961 } else { |
966 } | 967 } |
967 } | 968 } |
968 break; | 969 break; |
969 /**********************************************/ | 970 /**********************************************/ |
970 /* PES packing parsing */ | 971 /* PES packing parsing */ |
972 case MPEGTS_PESHEADER: | |
973 len = PES_HEADER_SIZE - pes->data_index; | |
974 if (len < 0) | |
975 return -1; | |
976 if (len > buf_size) | |
977 len = buf_size; | |
978 memcpy(pes->header + pes->data_index, p, len); | |
979 pes->data_index += len; | |
980 p += len; | |
981 buf_size -= len; | |
982 if (pes->data_index == PES_HEADER_SIZE) { | |
983 pes->pes_header_size = pes->header[8] + 9; | |
984 pes->state = MPEGTS_PESHEADER_FILL; | |
985 } | |
986 break; | |
971 case MPEGTS_PESHEADER_FILL: | 987 case MPEGTS_PESHEADER_FILL: |
972 len = pes->pes_header_size - pes->data_index; | 988 len = pes->pes_header_size - pes->data_index; |
973 if (len < 0) | 989 if (len < 0) |
974 return -1; | 990 return -1; |
975 if (len > buf_size) | 991 if (len > buf_size) |