⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nit.c

📁 Dvbstreamer 用在解析MPTS的部分内容
💻 C
📖 第 1 页 / 共 2 页
字号:
          DVBPSI_ERROR("NIT decoder",                       "'version_number' differs"                       " whereas no discontinuity has occured");          b_reinit = 1;        }        else if(p_nit_decoder->i_last_section_number !=                                                p_section->i_last_number)        {          /* last_section_number */          DVBPSI_ERROR("NIT decoder",                       "'last_section_number' differs"                       " whereas no discontinuity has occured");          b_reinit = 1;        }      }      else      {        if(    (p_nit_decoder->b_current_valid)            && (p_nit_decoder->current_nit.i_version == p_section->i_version))        {          /* Signal a new NIT if the previous one wasn't active */          if(    (!p_nit_decoder->current_nit.b_current_next)              && (p_section->b_current_next))          {            dvbpsi_nit_t * p_nit = (dvbpsi_nit_t*)ObjectCreateType(dvbpsi_nit_t);            p_nit_decoder->current_nit.b_current_next = 1;            *p_nit = p_nit_decoder->current_nit;            p_nit_decoder->pf_callback(p_nit_decoder->p_cb_data, p_nit);          }          /* Don't decode since this version is already decoded */          b_append = 0;        }      }    }  }  /* Reinit the decoder if wanted */  if(b_reinit)  {    /* Force redecoding */    p_nit_decoder->b_current_valid = 0;    /* Free structures */    if(p_nit_decoder->p_building_nit)    {      ObjectRefDec(p_nit_decoder->p_building_nit);      p_nit_decoder->p_building_nit = NULL;    }    /* Clear the section array */    for(i = 0; i <= 255; i++)    {      if(p_nit_decoder->ap_sections[i] != NULL)      {        dvbpsi_ReleasePSISections(p_psi_decoder, p_nit_decoder->ap_sections[i]);        p_nit_decoder->ap_sections[i] = NULL;      }    }  }  /* Append the section to the list if wanted */  if(b_append)  {    int b_complete;    /* Initialize the structures if it's the first section received */    if(!p_nit_decoder->p_building_nit)    {      dvbpsi_NewNIT(p_nit_decoder->p_building_nit,                     p_section->i_extension,                     p_section->i_version,                     p_section->b_current_next);      p_nit_decoder->i_last_section_number = p_section->i_last_number;    }    /* Fill the section array */    if(p_nit_decoder->ap_sections[p_section->i_number] != NULL)    {      DVBPSI_ERROR_ARG("NIT decoder", "NIT decoder: overwrite section number %d",                       p_section->i_number);      dvbpsi_ReleasePSISections(p_psi_decoder, p_nit_decoder->ap_sections[p_section->i_number]);    }    p_nit_decoder->ap_sections[p_section->i_number] = p_section;    /* Check if we have all the sections */    b_complete = 0;    for(i = 0; i <= p_nit_decoder->i_last_section_number; i++)    {      if(!p_nit_decoder->ap_sections[i])        break;      if(i == p_nit_decoder->i_last_section_number)        b_complete = 1;    }    if(b_complete)    {      /* Save the current information */      p_nit_decoder->current_nit = *p_nit_decoder->p_building_nit;      p_nit_decoder->b_current_valid = 1;      /* Chain the sections */      if(p_nit_decoder->i_last_section_number)      {        for(i = 0; i <= p_nit_decoder->i_last_section_number - 1; i++)          p_nit_decoder->ap_sections[i]->p_next =                                        p_nit_decoder->ap_sections[i + 1];      }      /* Decode the sections */      dvbpsi_DecodeNITSections(p_nit_decoder->p_building_nit,                               p_nit_decoder->ap_sections[0]);      /* Delete the sections */      dvbpsi_ReleasePSISections(p_psi_decoder, p_nit_decoder->ap_sections[0]);      /* signal the new NIT */      p_nit_decoder->pf_callback(p_nit_decoder->p_cb_data,                                 p_nit_decoder->p_building_nit);      /* Reinitialize the structures */      p_nit_decoder->p_building_nit = NULL;      for(i = 0; i <= p_nit_decoder->i_last_section_number; i++)        p_nit_decoder->ap_sections[i] = NULL;    }  }  else  {    dvbpsi_ReleasePSISections(p_psi_decoder, p_section);  }}/***************************************************************************** * dvbpsi_DecodeNITSection ***************************************************************************** * NIT decoder. *****************************************************************************/void dvbpsi_DecodeNITSections(dvbpsi_nit_t* p_nit,                              dvbpsi_psi_section_t* p_section){  uint8_t *p_byte, *p_end;  uint8_t *p_ts_end;  uint16_t i_ts_length;  while(p_section)  {    for(p_byte = p_section->p_payload_start;        p_byte + 4 < p_section->p_payload_end;)    {      uint16_t i_length = ((uint16_t)(p_byte[0] & 0xf) <<8) | p_byte[1];      /* network descriptors */      p_byte += 2;      p_end = p_byte + i_length;      if( p_end > p_section->p_payload_end ) break;      while(p_byte + 2 <= p_end)      {        uint8_t i_tag = p_byte[0];        uint8_t i_desc_length = p_byte[1];        if(i_desc_length + 2 <= p_end - p_byte)          dvbpsi_NITAddDescriptor(p_nit, i_tag, i_desc_length, p_byte + 2);        p_byte += 2 + i_desc_length;      }      i_ts_length = ((uint16_t)(p_byte[0] & 0xf) <<8) | p_byte[1];      p_byte += 2;      p_ts_end = p_byte + i_ts_length;      if( p_ts_end > p_section->p_payload_end ) break;      while(p_byte + 2 <= p_ts_end)      {          uint16_t i_ts_id = ((uint16_t)p_byte[0]<<8) | p_byte[1];          uint16_t i_original_network_id = ((uint16_t)p_byte[2]<<8) | p_byte[3];          dvbpsi_nit_transport_t *p_transport = dvbpsi_NITAddTransport(p_nit, i_ts_id, i_original_network_id);          i_length = ((uint16_t)(p_byte[4] & 0xf) <<8) | p_byte[5];          p_byte += 6;          p_end = p_byte + i_length;          if( p_end > p_section->p_payload_end ) break;          while(p_byte + 2 <= p_end)          {            uint8_t i_tag = p_byte[0];            uint8_t i_desc_length = p_byte[1];            if(i_desc_length + 2 <= p_end - p_byte)              dvbpsi_NITTransportAddDescriptor(p_transport, i_tag, i_desc_length, p_byte + 2);            p_byte += 2 + i_desc_length;          }      }    }    p_section = p_section->p_next;  }}/***************************************************************************** * dvbpsi_NITAddDescriptor ***************************************************************************** * Add a descriptor in the NIT description. *****************************************************************************/dvbpsi_descriptor_t *dvbpsi_NITAddDescriptor(                                               dvbpsi_nit_t *p_nit,                                               uint8_t i_tag, uint8_t i_length,                                               uint8_t *p_data){  dvbpsi_descriptor_t * p_descriptor                        = dvbpsi_NewDescriptor(i_tag, i_length, p_data);  if(p_descriptor)  {    if(p_nit->p_first_descriptor == NULL)    {      p_nit->p_first_descriptor = p_descriptor;    }    else    {      dvbpsi_descriptor_t * p_last_descriptor = p_nit->p_first_descriptor;      while(p_last_descriptor->p_next != NULL)        p_last_descriptor = p_last_descriptor->p_next;      p_last_descriptor->p_next = p_descriptor;    }  }  return p_descriptor;}/***************************************************************************** * dvbpsi_NITAddTransport ***************************************************************************** * Add a transport description at the end of the NIT. *****************************************************************************/dvbpsi_nit_transport_t *dvbpsi_NITAddTransport(dvbpsi_nit_t* p_nit,                                           uint16_t i_ts_id,                                           uint16_t i_original_network_id){  dvbpsi_nit_transport_t * p_transport                = (dvbpsi_nit_transport_t*)malloc(sizeof(dvbpsi_nit_transport_t));  if(p_transport)  {    p_transport->i_ts_id = i_ts_id;    p_transport->i_original_network_id = i_original_network_id;    p_transport->p_first_descriptor = NULL;    p_transport->p_next = NULL;    if(p_nit->p_first_transport == NULL)    {      p_nit->p_first_transport = p_transport;    }    else    {      dvbpsi_nit_transport_t * p_last_transport = p_nit->p_first_transport;      while(p_last_transport->p_next != NULL)        p_last_transport = p_last_transport->p_next;      p_last_transport->p_next = p_transport;    }  }  return p_transport;}/***************************************************************************** * dvbpsi_NITTransportAddDescriptor ***************************************************************************** * Add a descriptor in the NIT transport description. *****************************************************************************/dvbpsi_descriptor_t *dvbpsi_NITTransportAddDescriptor(                                               dvbpsi_nit_transport_t *p_transport,                                               uint8_t i_tag, uint8_t i_length,                                               uint8_t *p_data){  dvbpsi_descriptor_t * p_descriptor                        = dvbpsi_NewDescriptor(i_tag, i_length, p_data);  if(p_descriptor)  {    if(p_transport->p_first_descriptor == NULL)    {      p_transport->p_first_descriptor = p_descriptor;    }    else    {      dvbpsi_descriptor_t * p_last_descriptor = p_transport->p_first_descriptor;      while(p_last_descriptor->p_next != NULL)        p_last_descriptor = p_last_descriptor->p_next;      p_last_descriptor->p_next = p_descriptor;    }  }  return p_descriptor;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -