11 static const int TS_HEADER_SZIE = 4;
12 static const uint8_t SYNC = 0x47;
15 uint8_t header[ TS_HEADER_SZIE];
18 uint8_t sync_byte; // 8bit
19 uint8_t transport_error_indicator; // 1bit
20 uint8_t payload_unit_start_indicator; // 1bit
21 uint8_t transport_priority; // 1bit
22 uint16_t pid; // 13bit
23 uint8_t transport_scrambling_control; // 2bit
24 uint8_t adaptation_field_control; // 2bit
25 uint8_t continuity_counter; // 4bit
32 int getBytes( uint8_t *buf, uint32_t size);
33 int parse( const uint8_t *buf, uint32_t len);
37 uint8_t getTransportErrorIndicator();
38 uint8_t getPayloadUnitStartIndicator();
39 uint8_t getTransportPriority();
41 uint8_t getTransportScramblingControl();
42 uint8_t getAdaptationFieldControl();
43 uint8_t getContinuityCounter();
45 void setTransportErrorIndicator( uint8_t val);
46 void setPayloadUnitStartIndicator( uint8_t val);
47 void setTransportPriority( uint8_t val);
48 void setPid( uint16_t val);
49 void setTransportScramblingControl( uint8_t val);
50 void setAdaptationFieldControl( uint8_t val);
51 void setContinuityCounter( uint8_t val) ;
54 class AdaptationField {
56 uint8_t *adaptation_field;
59 uint8_t adaptation_field_length; // 8bit
60 uint8_t discontinuity_indicator; // 1bit
61 uint8_t random_access_indicator; // 1bit
62 uint8_t elementary_stream_priority_indicator; // 1bit
63 uint8_t PCR_flag; // 1bit
64 uint8_t OPCR_flag; // 1bit
65 uint8_t splicing_point_flag; // 1bit
66 uint8_t transport_private_data_flag; // 1bit
67 uint8_t adaptation_field_extension_flag; // 1bit
71 uint32_t field_data_length;
75 AdaptationField( AdaptationField &src);
76 virtual ~AdaptationField();
78 int getBytes( uint8_t *buf, uint32_t size);
79 int parse( uint8_t *buf, uint32_t len);
83 uint8_t getAdaptationFieldLength(); // 8bit
84 uint8_t getDiscontinuityIndicator(); // 1bit
85 uint8_t getRandomAccessIndicator(); // 1bit
86 uint8_t getElementaryStreamPriorityIndicator(); // 1bit
87 uint8_t getPCRFlag(); // 1bit
88 uint8_t getOPCRFlag(); // 1bit
89 uint8_t getSplicingPointFlag(); // 1bit
90 uint8_t getTransportPrivateDataFlag(); // 1bit
91 uint8_t getAdaptationFieldExtensionFlag(); // 1bit
94 AdaptationField& operator=( AdaptationField &src);
97 void copy( AdaptationField &dst);
104 static const int TS_PACKET_SIZE = 188;
108 AdaptationField *adaptation_field;
110 uint32_t payload_length;
113 TSPacket( Header *h, AdaptationField *af, uint8_t *p, uint32_t p_len);
121 AdaptationField* getAdaptationField();
122 uint32_t getPayloadLength();
123 uint32_t getPayload( uint8_t **p);
125 int getBytes( uint8_t *buf, uint32_t size);
127 static TSPacket* parse( uint8_t *buf, uint32_t len, uint32_t *read_len);
128 static TSPacket* create( Header *h, AdaptationField *af, uint8_t *p, uint32_t p_len);
131 static int sync( uint8_t *buf, uint32_t len) ;
136 inline uint32_t Header::size()
138 return TS_HEADER_SZIE;
141 inline uint8_t Header::getTransportErrorIndicator()
143 return Bits::get( header[ 1], 7, 0x01);
146 inline void Header::setTransportErrorIndicator( uint8_t val)
148 Bits::set( &header[ 1], val, 7, 0x01);
151 inline uint8_t Header::getPayloadUnitStartIndicator()
153 return Bits::get( header[ 1], 6, 0x01);
156 inline void Header::setPayloadUnitStartIndicator( uint8_t val)
158 Bits::set( &header[ 1], val, 6, 0x01);
161 inline uint8_t Header::getTransportPriority()
163 return Bits::get( header[ 1], 5, 0x01);
166 inline void Header::setTransportPriority( uint8_t val)
168 Bits::set( &header[ 1], val, 5, 0x01);
171 inline uint16_t Header::getPid()
173 return (Bits::get( header[ 1], 0, 0x1f) << 8) + header[ 2];
176 inline void Header::setPid( uint16_t val)
178 Bits::set( &header[ 1], (uint8_t)(val >> 8), 0, 0x1f);
179 header[ 2] = val & 0xff;
182 inline uint8_t Header::getTransportScramblingControl()
184 return Bits::get( header[ 3], 6, 0x03);
187 inline void Header::setTransportScramblingControl( uint8_t val)
189 Bits::set( &header[ 3], val, 6, 0x03);
192 inline uint8_t Header::getAdaptationFieldControl()
194 return Bits::get( header[ 3], 4, 0x03);
197 inline void Header::setAdaptationFieldControl( uint8_t val)
199 Bits::set( &header[ 3], val, 4, 0x03);
202 inline uint8_t Header::getContinuityCounter()
204 return Bits::get( header[ 3], 0, 0x0f);
207 inline void Header::setContinuityCounter( uint8_t val)
209 Bits::set( &header[ 3], val, 0, 0x0f);
214 inline uint32_t AdaptationField::size()
216 return getAdaptationFieldLength() + 1;
219 inline uint8_t AdaptationField::getAdaptationFieldLength()
221 if( adaptation_field) {
222 return adaptation_field[ 0];
229 inline uint8_t AdaptationField::getDiscontinuityIndicator()
231 if( adaptation_field) {
232 return Bits::get( adaptation_field[ 1], 7, 0x01);
239 inline uint8_t AdaptationField::getRandomAccessIndicator()
241 if( adaptation_field) {
242 return Bits::get( adaptation_field[ 1], 6, 0x01);
249 inline uint8_t AdaptationField::getElementaryStreamPriorityIndicator()
251 if( adaptation_field) {
252 return Bits::get( adaptation_field[ 1], 5, 0x01);
259 inline uint8_t AdaptationField::getPCRFlag()
261 if( adaptation_field) {
262 return Bits::get( adaptation_field[ 1], 4, 0x01);
269 inline uint8_t AdaptationField::getOPCRFlag()
271 if( adaptation_field) {
272 return Bits::get( adaptation_field[ 1], 3, 0x01);
279 inline uint8_t AdaptationField::getSplicingPointFlag()
281 if( adaptation_field) {
282 return Bits::get( adaptation_field[ 1], 2, 0x01);
289 inline uint8_t AdaptationField::getTransportPrivateDataFlag()
291 if( adaptation_field) {
292 return Bits::get( adaptation_field[ 1], 1, 0x01);
299 inline uint8_t AdaptationField::getAdaptationFieldExtensionFlag()
301 if( adaptation_field) {
302 return Bits::get( adaptation_field[ 1], 0, 0x01);