12 memset( header, 0x00, TS_HEADER_SZIE);
20 int Header::getBytes( uint8_t *buf, uint32_t size)
22 if( size < TS_HEADER_SZIE) {
26 memcpy( buf, header, TS_HEADER_SZIE);
28 return TS_HEADER_SZIE;
31 int Header::parse( const uint8_t *buf, uint32_t len)
33 if( len < TS_HEADER_SZIE) {
37 memcpy( header, buf, TS_HEADER_SZIE);
40 sync_byte = (buf[ 0] >> 0) & 0xff;
41 transport_error_indicator = (buf[ 1] >> 7) & 0x01;
42 payload_unit_start_indicator = (buf[ 1] >> 6) & 0x01;
43 transport_priority = (buf[ 1] >> 5) & 0x01;
44 pid = ((buf[ 1] & 0x1f) << 8) + buf[ 2];
45 transport_scrambling_control = (buf[ 3] >> 6) & 0x03;
46 adaptation_field_control = (buf[ 3] >> 4) & 0x03;
47 continuity_counter = (buf[ 3] >> 0) & 0x0f;
50 return TS_HEADER_SZIE;
53 AdaptationField::AdaptationField()
55 adaptation_field = NULL;
58 field_data_length = 0;
61 adaptation_field_length = 0x00;
62 discontinuity_indicator = 0x00;
63 random_access_indicator = 0x00;
64 elementary_stream_priority_indicator = 0x00;
67 splicing_point_flag = 0x00;
68 transport_private_data_flag = 0x00;
69 adaptation_field_extension_flag = 0x00;
73 AdaptationField::AdaptationField( AdaptationField &src)
78 AdaptationField::~AdaptationField()
83 AdaptationField& AdaptationField::operator=( AdaptationField &src)
89 int AdaptationField::getBytes( uint8_t *buf, uint32_t size)
92 const uint8_t af_len = getAdaptationFieldLength();
94 if( size < af_len + 1) {
98 memcpy( buf, adaptation_field, af_len + 1);
103 int AdaptationField::parse( uint8_t *buf, uint32_t len)
114 if( len < af_len + index) {
119 adaptation_field = new uint8_t[ af_len + index];
120 memcpy( adaptation_field, buf, af_len + index);
123 adaptation_field_length = af_len;
128 discontinuity_indicator = (buf[ index] >> 7) & 0x01;
129 random_access_indicator = (buf[ index] >> 6) & 0x01;
130 elementary_stream_priority_indicator = (buf[ index] >> 5) & 0x01;
131 PCR_flag = (buf[ index] >> 4) & 0x01;
132 OPCR_flag = (buf[ index] >> 3) & 0x01;
133 splicing_point_flag = (buf[ index] >> 2) & 0x01;
134 transport_private_data_flag = (buf[ index] >> 1) & 0x01;
135 adaptation_field_extension_flag = (buf[ index] >> 0) & 0x01;
139 field_data_length = af_len - 1;
140 if( field_data_length > 0) {
141 field_data = &adaptation_field[ index];
143 index += field_data_length;
150 void AdaptationField::copy( AdaptationField &dst)
152 const uint8_t af_len = getAdaptationFieldLength();
155 if( adaptation_field) {
156 dst.adaptation_field = new uint8_t[ af_len + 1];
157 memcpy( dst.adaptation_field, adaptation_field, af_len + 1);
159 if( field_data_length > 0) {
160 dst.field_data_length = field_data_length;
161 dst.field_data = &dst.adaptation_field[ 2];
166 dst.adaptation_field_length = adaptation_field_length;
167 dst.discontinuity_indicator = discontinuity_indicator;
168 dst.random_access_indicator = random_access_indicator;
169 dst.elementary_stream_priority_indicator = elementary_stream_priority_indicator;
170 dst.PCR_flag = PCR_flag;
171 dst.OPCR_flag = OPCR_flag;
172 dst.splicing_point_flag = splicing_point_flag;
173 dst.transport_private_data_flag = transport_private_data_flag;
174 dst.adaptation_field_extension_flag = adaptation_field_extension_flag;
178 void AdaptationField::clear()
180 if( adaptation_field) {
181 delete[] adaptation_field;
183 adaptation_field = NULL;
185 field_data_length = 0;
188 TSPacket::TSPacket( Header *h, AdaptationField *af, uint8_t *p, uint32_t p_len)
191 adaptation_field = af;
194 payload = new uint8_t[ p_len];
195 memcpy( payload, p, p_len);
196 payload_length = p_len;
204 TSPacket::~TSPacket()
210 if( adaptation_field) {
211 delete adaptation_field;
212 adaptation_field = NULL;
221 uint16_t TSPacket::getPID()
223 return header->getPid();
226 Header* TSPacket::getHeader()
231 AdaptationField* TSPacket::getAdaptationField()
233 return adaptation_field;
235 uint32_t TSPacket::getPayloadLength()
237 return payload_length;
240 uint32_t TSPacket::getPayload( uint8_t **p)
243 return payload_length;
246 int TSPacket::getBytes( uint8_t *buf, uint32_t size)
251 if( size < TS_PACKET_SIZE) {
255 w = header->getBytes( &buf[ index], size - index);
256 if( w != Header::TS_HEADER_SZIE) {
261 if( adaptation_field) {
262 w = adaptation_field->getBytes( &buf[ index], size - index);
269 if( index + payload_length > TS_PACKET_SIZE) {
272 memcpy( &buf[ index], payload, payload_length);
273 index += payload_length;
275 if( index < TS_PACKET_SIZE) {
276 memset( &buf[ index], 0xff, TS_PACKET_SIZE - index);
277 index += (TS_PACKET_SIZE - index);
284 TSPacket* TSPacket::parse( uint8_t *buf, uint32_t len, uint32_t *read_len)
288 AdaptationField *af = NULL;
296 if( (index = TSPacket::sync( buf, len)) == -1) {
299 if( sync_index != 0) {
300 fprintf( stderr, "sync index = %d\n", sync_index);
303 if( len - index < TS_PACKET_SIZE) {
312 if( (read = h->parse( &buf[ index], len - index)) == -1) {
317 if( h->getTransportErrorIndicator()) {
318 //fprintf( stderr, "transport_error_indicator = 1, PID = 0x%04X\n", h->getPid());
322 if( h->getAdaptationFieldControl() == 0x02 || h->getAdaptationFieldControl() == 0x03) {
323 af = new AdaptationField();
327 if( (read = af->parse( &buf[ index], len - index)) == -1) {
332 payload_len = TS_PACKET_SIZE - (index - sync_index);
333 if( payload_len < 0) {
337 p = new TSPacket( h, af, &buf[ index], payload_len);
341 index += payload_len;
361 TSPacket* TSPacket::create( Header *h, AdaptationField *af, uint8_t *p, uint32_t p_len)
363 TSPacket *ts = new TSPacket( h, af, p, p_len);
368 int TSPacket::sync( uint8_t *buf, uint32_t len)
372 for( i = 0; i < len; i++) {
373 if( buf[ i] == Header::SYNC) {