EIT段分析
来源:百度文库 编辑:神马文学网 时间:2024/07/08 09:41:09
/* 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 */
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 */