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)