5 #include "b25/aribstr.h"
\r
6 #include "mpeg2/ts/Header.h"
\r
7 #include "mpeg2/ts/Table.h"
\r
27 int Table::GetCrc32(
\r
28 unsigned char* data, // [in] CRC data
\r
29 int len) // [in] CRC data length
\r
35 for (i = 0; i < len; i++)
\r
40 for (j = 0; j < 8; j++)
\r
45 bit = (x >> (7 - j)) & 0x1;
\r
48 if (crc & 0x80000000)
\r
67 bool Table::decode(uint8_t *packet)
\r
69 bool result = false;
\r
71 Header header(packet);
\r
73 if (header._transport_error)
\r
75 printf("transport error.\n");
\r
79 if (header._payload_unit_start)
\r
83 memset(_section, 0x00, sizeof(_section));
\r
87 if ((_pid == header._pid) && (_continuity_counter == header._continuity_counter))
\r
89 // adaptation_field_control
\r
90 if (header._adaptation_field_control != 0x02)
\r
93 length = header._payload_unit_start ? ((((packet[0x06] << 8) + packet[0x07]) & 0x0FFF) + 3) : ((((_section[0x01] << 8) + _section[0x02]) & 0x0FFF) + 3);
\r
94 uint8_t offset = 0x04;
\r
95 if (header._adaptation_field_control == 0x03)
\r
97 offset = offset + 1 + packet[0x04];
\r
104 uint16_t cpylen = ((length - _length) < (PACKET_SIZE - offset)) ? (length - _length) : (PACKET_SIZE - offset);
\r
106 memcpy(&_section[_length], &packet[offset], cpylen);
\r
108 _continuty_counter++;
\r
110 if (_length == length)
\r
112 if (GetCrc32(_section, _length) == 0)
\r
115 result = decode_section();
\r
125 bool Table::decode(Header *header, uint8_t *packet)
\r
127 bool result = false;
\r
129 if (header->_adaptation_field_control != 0x02)
\r
132 length = header->_payload_unit_start ? ((((packet[0x06] << 8) + packet[0x07]) & 0x0FFF) + 3) : ((((_section[0x01] << 8) + _section[0x02]) & 0x0FFF) + 3);
\r
133 uint8_t offset = 0x04;
\r
134 if (header->_adaptation_field_control == 0x03)
\r
136 offset = offset + packet[0x04];
\r
139 if (header->_payload_unit_start)
\r
143 if (packet[offset] != 0)
\r
145 memcpy(&_section[_length], &packet[offset + 1], packet[offset]);
\r
147 result = decode_section();
\r
151 offset += (1 + packet[offset]);
\r
154 memcpy(&_section[_length], &packet[offset], PACKET_SIZE - offset);
\r
155 _length += (PACKET_SIZE - offset);
\r
161 bool Table::decode_section()
\r
166 void Table::reset()
\r
168 printf("Table::reset\n");
\r
171 memset(_section, 0x00, sizeof(_section));
\r
174 static int getBit(unsigned char *byte, int *pbit, int gbit)
\r
176 int pbyte = *pbit / 8;
\r
177 unsigned char *fbyte = byte + pbyte;
\r
179 int cutbit = *pbit - (pbyte * 8);
\r
180 int lcutbit = 32 - (cutbit + gbit);
\r
182 unsigned char tbuf[4]; //
\r
185 memcpy(tbuf, fbyte, sizeof(unsigned char) * 4);
\r
188 tbuf[0] = tbuf[0] << cutbit;
\r
189 tbuf[0] = tbuf[0] >> cutbit;
\r
192 tnum = tbuf[0] << 24 | tbuf[1] << 16 | tbuf[2] << 8 | tbuf[3];
\r
195 tnum = tnum >> lcutbit;
\r
202 #define MAXSECLEN 4096
\r
204 static void getStr(char *tostr, unsigned char *byte, int *pbit, int len)
\r
206 char str[MAXSECLEN];
\r
207 int pbyte = *pbit / 8;
\r
208 unsigned char *fbyte = byte + pbyte;
\r
210 memset(str, 0, sizeof(char) * MAXSECLEN);
\r
211 memcpy(str, fbyte, len);
\r
213 *pbit += (len * 8);
\r
215 AribToString(tostr, str, len);
\r
218 static void getStr(char *tostr, unsigned char *byte, int len)
\r
220 char str[MAXSECLEN];
\r
222 memset(str, 0, sizeof(char) * MAXSECLEN);
\r
223 memcpy(str, byte, len);
\r
225 AribToString(tostr, str, len);
\r
228 static uint16_t parseContentDescriptor(uint8_t *buf, ContentDescriptor *content)
\r
230 // printf("%s\n", __FUNCTION__);
\r
231 for (int i = 0; i < (content->descriptor_length / 2); ++i)
\r
233 content->contents[i].content_nibble_level_1 = (buf[i * 2 + 0x02] & 0xF0) >> 4;
\r
234 content->contents[i].content_nibble_level_2 = buf[i * 2 + 0x02] & 0x0F;
\r
235 content->contents[i].user_nibble_1 = (buf[i * 2 + 0x03] & 0xF0) >> 4;
\r
236 content->contents[i].user_nibble_2 = buf[i * 2 + 0x03] & 0x0F;
\r
238 return content->descriptor_length + 2;
\r
241 static uint16_t parseShortEventDescriptor(uint8_t *buf, ShortEventDescriptor *short_event)
\r
243 // printf("%s\n", __FUNCTION__);
\r
244 uint16_t result = short_event->descriptor_length + 2;
\r
246 memcpy(&short_event->ISO_639_language_code[0], &buf[0x02], 3);
\r
247 short_event->event_name_length = buf[0x05];
\r
248 if ((short_event->event_name_length + 5) <= short_event->descriptor_length)
\r
250 // memcpy(&short_event->event_name[0], &buf[0x06], short_event->event_name_length);
\r
251 getStr((char *)short_event->event_name, &buf[0x06], short_event->event_name_length);
\r
252 short_event->text_length = buf[short_event->event_name_length + 6];
\r
253 if ((short_event->text_length + short_event->event_name_length + 5) == short_event->descriptor_length)
\r
255 // memcpy(&short_event->text[0], &buf[short_event->event_name_length + 6], short_event->text_length);
\r
256 getStr((char *)short_event->text, &buf[short_event->event_name_length + 6], short_event->text_length);
\r
257 // printf("%s() success.\n", __FUNCTION__);
\r
261 printf("%s() event_name_length = %d\n", __FUNCTION__, short_event->event_name_length);
\r
262 printf("%s() text_length error. %d\n", __FUNCTION__, short_event->text_length);
\r
268 printf("%s() descriptor_length = %d\n", __FUNCTION__, short_event->descriptor_length);
\r
269 printf("%s() event_name_length error. %d\n", __FUNCTION__, short_event->event_name_length);
\r
275 memset(short_event, 0, sizeof(ShortEventDescriptor));
\r
277 short_event->descriptor_tag = getBit(buf, &boff, 8);
\r
278 if ((short_event->descriptor_tag & 0xFF) == 0x4D)
\r
280 short_event->descriptor_length = getBit(buf, &boff, 8);
\r
281 memcpy(short_event->ISO_639_language_code, buf + boff / 8, 3);
\r
282 /* desc->ISO_639_language_code = getBit(data, &boff, 24); */
\r
285 short_event->event_name_length = getBit(buf, &boff, 8);
\r
286 // memset((char *)short_event->event_name, 0x00, MAX_DESC_LEN);
\r
287 // getStr((char *)short_event->event_name, buf, &boff, short_event->event_name_length);
\r
288 memcpy((char *)short_event->event_name, buf + boff / 8, short_event->event_name_length);
\r
289 boff += short_event->event_name_length * 8;
\r
291 short_event->text_length = getBit(buf, &boff, 8);
\r
292 // memset((char *)short_event->text, 0x00, MAX_DESC_LEN);
\r
293 // getStr((char *)short_event->text, buf, &boff, short_event->text_length);
\r
294 memcpy((char *)short_event->text, buf + boff / 8, short_event->text_length);
\r
304 static uint16_t parseExtendedEventDescriptor(uint8_t *buf, ExtendedEventDescriptor *extended)
\r
306 // printf("%s\n", __FUNCTION__);
\r
307 uint16_t result = extended->descriptor_length + 2;
\r
309 extended->descriptor_number = (buf[0x02] & 0xF0) >> 4;
\r
310 extended->last_descriptor_number = buf[0x02] & 0x0F;
\r
311 memcpy(&extended->ISO_639_language_code[0], &buf[0x03], 3);
\r
312 extended->length_of_items = buf[0x06];
\r
313 extended->item_count = 0;
\r
314 if ((extended->length_of_items + 6) <= extended->descriptor_length)
\r
316 extended->text_length = 0;
\r
317 extended->text_length = buf[extended->length_of_items + 7];
\r
318 if ((extended->text_length + extended->length_of_items + 6) == extended->descriptor_length)
\r
320 memcpy(&extended->text[0], &buf[extended->length_of_items + 7], extended->text_length);
\r
321 // memset((char *)extended->text, 0x00, MAX_DESC_LEN);
\r
322 // getStr((char *)extended->text, &buf[extended->length_of_items + 7], extended->text_length);
\r
324 int item_remain = extended->length_of_items;
\r
325 int item_offset = 0x07;
\r
326 while (item_remain >= 2)
\r
328 extended->items[extended->item_count].item_description_length = buf[item_offset++];
\r
329 if (extended->items[extended->item_count].item_description_length > 0)
\r
331 memcpy(&extended->items[extended->item_count].item_description[0], &buf[item_offset],
\r
332 extended->items[extended->item_count].item_description_length);
\r
333 // memset((char *)&extended->items[extended->item_count].item_description[0], 0x00, MAX_DESC_LEN);
\r
334 // getStr((char *)&extended->items[extended->item_count].item_description[0], &buf[item_offset],
\r
335 // extended->items[extended->item_count].item_description_length);
\r
336 item_offset += extended->items[extended->item_count].item_description_length;
\r
338 item_remain -= (1 + extended->items[extended->item_count].item_description_length);
\r
339 if (item_remain < 1)
\r
341 printf("%s item desc len error.\n", __FUNCTION__);
\r
346 extended->items[extended->item_count].item_length = buf[item_offset++];
\r
347 if (extended->items[extended->item_count].item_length > 0)
\r
349 memcpy(&extended->items[extended->item_count].item[0], &buf[item_offset],
\r
350 extended->items[extended->item_count].item_length);
\r
351 // memset((char *)&extended->items[extended->item_count].item[0], 0x00, MAX_DESC_LEN);
\r
352 // getStr((char *)&extended->items[extended->item_count].item[0], &buf[item_offset],
\r
353 // extended->items[extended->item_count].item_length);
\r
354 item_offset += extended->items[extended->item_count].item_length;
\r
356 item_remain -= (1 + extended->items[extended->item_count].item_length);
\r
357 if ((item_remain < 0) || (item_remain == 1))
\r
359 printf("%s item len error. %d\n", __FUNCTION__, item_remain);
\r
364 // printf("eevt success.\n");
\r
367 ++extended->item_count;
\r
372 printf("%s() length_of_items = %d\n", __FUNCTION__, extended->length_of_items);
\r
373 printf("%s() text_length error. %d\n", __FUNCTION__, extended->text_length);
\r
379 printf("%s() descriptor_length = %d\n", __FUNCTION__, extended->descriptor_length);
\r
380 printf("%s() length_of_items error. %d\n", __FUNCTION__, extended->length_of_items);
\r
388 uint16_t Table::parseDescriptor(uint8_t *buf, uint16_t length, Descriptor *descriptor)
\r
390 uint16_t result = 0;
\r
392 descriptor->other.descriptor_tag = buf[0x00];
\r
393 descriptor->other.descriptor_length = buf[0x01];
\r
396 if ((descriptor->other.descriptor_length + 2) <= length)
\r
398 switch (descriptor->other.descriptor_tag)
\r
400 case 0x4D: // Short event descriptor
\r
401 result = parseShortEventDescriptor(buf, &descriptor->short_event);
\r
404 case 0x4E: // Extended event descriptor
\r
405 result = parseExtendedEventDescriptor(buf, &descriptor->extended_event);
\r
408 case 0x54: // Content descriptor
\r
409 result = parseContentDescriptor(buf, &descriptor->content);
\r
412 case 0x50: // Component
\r
413 // result = parseComponentDescriptor(hoge);
\r
414 result = descriptor->other.descriptor_length + 2;
\r
417 case 0xC4: // Audio Component
\r
418 // result = parseAudioComponentDescriptor(hoge);
\r
419 result = descriptor->other.descriptor_length + 2;
\r
423 case 0xD5: // Series descriptor
\r
424 // result = parseSeriesDescriptor(hoge);
\r
425 result = descriptor->other.descriptor_length + 2;
\r
429 memcpy(&descriptor->other.descriptor[0], &buf[0x02], descriptor->other.descriptor_length);
\r
430 result = descriptor->other.descriptor_length + 2;
\r
436 printf("%s() length = %d\n", __FUNCTION__, length);
\r
437 printf("%s() descriptor_tag = %d\n", __FUNCTION__, descriptor->other.descriptor_tag);
\r
438 printf("%s() descriptor_length error. %d\n", __FUNCTION__, descriptor->other.descriptor_length);
\r