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 */