/* analyse the header of the section: total 8 bytes */
tbl_id = *pBuffer++;
sct_syntax_indicator = (*pBuffer & 0x80);
sct_length = (*pBuffer++ & 0x0F) << 8;
sct_length |= *pBuffer++;
service_id = (*pBuffer++ & 0xFF) << 8;
service_id |= *pBuffer++;
ver_number = (*pBuffer & 0x3E) >> 1;
cn_indicator = (*pBuffer++ & 0x01);
sct_number = *pBuffer++;
last_sct_number = *pBuffer++;
ts_id = (*pBuffer++ & 0xFF) << 8;
ts_id |= *pBuffer++;
original_network_id = (*pBuffer++ & 0xFF) << 8;
original_network_id |= *pBuffer++;
seg_last_sct_num = *pBuffer++;
last_tbl_id = *pBuffer++;
seg_number = sct_number/8;
lst_seg_number = last_sct_number / 8;
event_number = 0;
while (uCount )
{
event_id = (*pBuffer++ & 0xFF) << 8;
event_id |= *pBuffer++;
date = (*pBuffer++ & 0xFF) << 8;
date |= *pBuffer++;
_time = (*pBuffer++ & 0xFF) << 16;
_time |= (*pBuffer++ & 0xFF) << 8;
_time |= *pBuffer++;
duration = (*pBuffer++ & 0xFF) << 16;
duration |= (*pBuffer++ & 0xFF) << 8;
duration |= *pBuffer++;
run_status_free_ca = (*pBuffer & 0xF0) >> 4;
desc_loop_length = (*pBuffer++ & 0x0F) << 8;
desc_loop_length |= *pBuffer++;
si_parser_descr_lookup (desc_loop_length,
pBuffer,
(u_int8)(NUM_EIT_DESCS),
(pInfo->pEITEntry + event_number)->pEvent_Descs,
(&(pInfo->pEITEntry + event_number)->uNumDescs));
pBuffer = pBuffer + desc_loop_length;
uCount = uCount - 12 - desc_loop_length;
event_number++;
if(event_number >= NUM_EIT_EVENT)
{
break;
}
}
static SI_STATUS si_parser_descr_lookup (
u_int16 uLen, /* I: length of descriptor data. */
u_int8 * pData, /* I: ptr to descriptor data. */
u_int8 MaxDescrs, /* I: max number of descriptors. */
PTR_DESCRIPTOR_ENTRY pDescrEntry, /* I: ptr to descriptor entries. */
u_int8 * pNumDescrs /* O: number of descriptors. */
)
{
int16 uCount;
u_int8 * pBuffer;
u_int8 uDescriptorLen;
u_int8 uNumDescriptor;
PTR_DESCRIPTOR_ENTRY pEntry;
u_int8 * p;
if ((NULL == pData) || (0 == MaxDescrs) || (NULL == pDescrEntry) ||
(NULL == pNumDescrs))
{
return (SI_ERROR);
}
uCount = uLen;
pBuffer = pData;
uNumDescriptor = 0;
pEntry = pDescrEntry;
while (uCount > 0)
{
/* store the found descriptor information. */
pEntry->pData = pBuffer;
p = pBuffer;
pEntry->uTag = *pBuffer++;
pEntry->uLen = *pBuffer++;
uDescriptorLen = pEntry->uLen;
pEntry->uLength = uDescriptorLen + 2;
/* go to next */
// printf("###pEntry->uTag:0x%0x/n",pEntry->uTag);
if(pEntry->uTag == 0x4d){
p += 2;
lang_code[0]=p++;
lang_code[1]=p++;
lang_code[2]=p++;
p+=1;
name = p;
p += pEntry->uLen;
p++;
text = p;
//
printf("###name:%-30s text:%-30s/n",name,text);
}
uCount = uCount - uDescriptorLen - 2;
if(uCount < 0)
{
return SI_ERROR;
}
pBuffer = pBuffer + uDescriptorLen;
pEntry ++;
uNumDescriptor ++;
/* if there are too many descriptors to store, ignore the rest. */
if (uNumDescriptor >= MaxDescrs)
{
break;
}
}
/* return the number of the found descriptors. */
*pNumDescrs = uNumDescriptor;
return (SI_OK);
} /* si_parser_descr_lookup */