EIT段分析

/* 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 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章