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

📄 eit.c

📁 Dvbstreamer 用在解析MPTS的部分内容
💻 C
📖 第 1 页 / 共 2 页
字号:
                              void * p_private_decoder,                              dvbpsi_psi_section_t * p_section){  dvbpsi_eit_decoder_t* p_eit_decoder                        = (dvbpsi_eit_decoder_t*)p_private_decoder;  int b_append = 1;  int b_reinit = 0;  unsigned int i;  DVBPSI_DEBUG_ARG("EIT decoder",                   "Table version %2d, " "i_table_id %2d, " "i_extension %5d, "                   "section %3d up to %3d, " "current %1d",                   p_section->i_version, p_section->i_table_id,                   p_section->i_extension,                   p_section->i_number, p_section->i_last_number,                   p_section->b_current_next);  if(!p_section->b_syntax_indicator)  {    /* Invalid section_syntax_indicator */    DVBPSI_ERROR("EIT decoder",                 "invalid section (section_syntax_indicator == 0)");    b_append = 0;  }  /* Now if b_append is true then we have a valid EIT section */  if(b_append)  {    /* TS discontinuity check */    if(p_psi_decoder->b_discontinuity)    {      b_reinit = 1;      p_psi_decoder->b_discontinuity = 0;    }    else    {      /* Perform a few sanity checks */      if(p_eit_decoder->p_building_eit)      {        if(p_eit_decoder->p_building_eit->i_service_id != p_section->i_extension)        {          /* service_id */          DVBPSI_ERROR("EIT decoder",                       "'service_id' differs"                       " whereas no TS discontinuity has occurred");          b_reinit = 1;        }        else if(p_eit_decoder->p_building_eit->i_version                                                != p_section->i_version)        {          /* version_number */          DVBPSI_ERROR("EIT decoder",                       "'version_number' differs"                       " whereas no discontinuity has occurred");          b_reinit = 1;        }        else if(p_eit_decoder->i_last_section_number !=                                                p_section->i_last_number)        {          /* last_section_number */          DVBPSI_ERROR("EIT decoder",                       "'last_section_number' differs"                       " whereas no discontinuity has occured");          b_reinit = 1;        }      }      else      {        if(    (p_eit_decoder->b_current_valid)            && (p_eit_decoder->current_eit.i_version == p_section->i_version))        {          /* Signal a new EIT if the previous one wasn't active */          if(    (!p_eit_decoder->current_eit.b_current_next)              && (p_section->b_current_next))          {            dvbpsi_eit_t* p_eit = (dvbpsi_eit_t*)ObjectCreateType(dvbpsi_eit_t);            p_eit_decoder->current_eit.b_current_next = 1;            *p_eit = p_eit_decoder->current_eit;            p_eit_decoder->pf_callback(p_eit_decoder->p_cb_data, p_eit);          }          /* Don't decode since this version is already decoded */          b_append = 0;        }      }    }  }  /* Reinit the decoder if wanted */  if(b_reinit)  {    /* Force redecoding */    p_eit_decoder->b_current_valid = 0;    /* Free structures */    if(p_eit_decoder->p_building_eit)    {      ObjectRefDec(p_eit_decoder->p_building_eit);      p_eit_decoder->p_building_eit = NULL;    }    /* Clear the section array */    for(i = 0; i <= 255; i++)    {      if(p_eit_decoder->ap_sections[i] != NULL)      {        dvbpsi_ReleasePSISections(p_psi_decoder, p_eit_decoder->ap_sections[i]);        p_eit_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_eit_decoder->p_building_eit)    {      dvbpsi_NewEIT(p_eit_decoder->p_building_eit,                     p_section->i_extension,                     p_section->i_version,                     p_section->b_current_next,                     ((uint16_t)(p_section->p_payload_start[0]) << 8)                     | p_section->p_payload_start[1],                     ((uint16_t)(p_section->p_payload_start[2]) << 8)                     | p_section->p_payload_start[3],                     p_section->p_payload_start[4],                     p_section->p_payload_start[5]);      p_eit_decoder->i_last_section_number = p_section->i_last_number;      p_eit_decoder->i_first_received_section_number = p_section->i_number;    }    /* Fill the section array */    if(p_eit_decoder->ap_sections[p_section->i_number] != NULL)    {      DVBPSI_DEBUG_ARG("EIT decoder", "overwrite section number %d",                       p_section->i_number);      dvbpsi_ReleasePSISections(p_psi_decoder, p_eit_decoder->ap_sections[p_section->i_number]);    }    p_eit_decoder->ap_sections[p_section->i_number] = p_section;    /* Check if we have all the sections */    b_complete = 0;    /* As there may be gaps in the section_number fields (see below), we     * have to wait until we have received a section_number twice or     * until we have a received a section_number which is     * first_received_section_number - 1;     * if the first_received_section_number is 0, it's enough to wait     * until the last_section_number has been received;     * this is the only way to be sure that a complete table has been     * sent! */    if((p_eit_decoder->i_first_received_section_number > 0 &&        (p_section->i_number ==           p_eit_decoder->i_first_received_section_number ||         p_section->i_number ==           p_eit_decoder->i_first_received_section_number - 1)) ||       (p_eit_decoder->i_first_received_section_number == 0 &&        p_section->i_number == p_eit_decoder->i_last_section_number))    {      for(i = 0; i <= p_eit_decoder->i_last_section_number; i++)      {        if(!p_eit_decoder->ap_sections[i])          break;        if(i == p_eit_decoder->i_last_section_number)        {          b_complete = 1;          break;        }        /* ETSI EN 300 468 V1.5.1 section 5.2.4 says that the EIT         * sections may be structured into a number of segments and         * that there may be a gap in the section_number between         * two segments (but not within a single segment); thus at         * the end of a segment (indicated by         * section_number == segment_last_section_number)         * we have to search for the beginning of the next segment) */        if(i == p_eit_decoder->ap_sections[i]->p_payload_start[4])        {          while(!p_eit_decoder->ap_sections[i + 1] &&                (i + 1 < p_eit_decoder->i_last_section_number))          {            i++;          }        }      }    }    if(b_complete)    {      /* Save the current information */      p_eit_decoder->current_eit = *p_eit_decoder->p_building_eit;      p_eit_decoder->b_current_valid = 1;      /* Chain the sections */      if(p_eit_decoder->i_last_section_number)      {        dvbpsi_psi_section_t * p_prev_section;        p_prev_section = p_eit_decoder->ap_sections[0];        for(i = 1; i <= p_eit_decoder->i_last_section_number; i++)        {          if(p_eit_decoder->ap_sections[i] != NULL)          {            p_prev_section->p_next = p_eit_decoder->ap_sections[i];            p_prev_section = p_eit_decoder->ap_sections[i];          }        }      }      /* Decode the sections */      dvbpsi_DecodeEITSections(p_eit_decoder->p_building_eit,                               p_eit_decoder->ap_sections[0]);      /* Delete the sections */      dvbpsi_ReleasePSISections(p_psi_decoder, p_eit_decoder->ap_sections[0]);      /* signal the new EIT */      p_eit_decoder->pf_callback(p_eit_decoder->p_cb_data,                                 p_eit_decoder->p_building_eit);      /* Reinitialize the structures */      p_eit_decoder->p_building_eit = NULL;      for(i = 0; i <= p_eit_decoder->i_last_section_number; i++)        p_eit_decoder->ap_sections[i] = NULL;    }  }  else  {    dvbpsi_ReleasePSISections(p_psi_decoder, p_section);  }}/***************************************************************************** * dvbpsi_DecodeEITSections ***************************************************************************** * EIT decoder. *****************************************************************************/void dvbpsi_DecodeEITSections(dvbpsi_eit_t* p_eit,                              dvbpsi_psi_section_t* p_section){  uint8_t* p_byte, * p_end;  while(p_section)  {    for(p_byte = p_section->p_payload_start + 6;        p_byte < p_section->p_payload_end - 12;)    {      uint16_t i_event_id = ((uint16_t)(p_byte[0]) << 8) | p_byte[1];      dvbpsi_date_time_t t_start_time;      dvbpsi_eit_event_duration_t t_duration;      uint8_t i_running_status = (uint8_t)(p_byte[10]) >> 5;      int b_free_ca = (int)(p_byte[10] & 0x10) >> 4;      uint16_t i_length = ((uint16_t)(p_byte[10] & 0xf) << 8) | p_byte[11];      dvbpsi_DecodeMJDUTC(&p_byte[2], &t_start_time);      t_duration.i_hours   = (((unsigned int)(p_byte[7] >> 4) & 0xf) * 10) + ((unsigned int)(p_byte[7] & 0xf));      t_duration.i_minutes = (((unsigned int)(p_byte[8] >> 4) & 0xf) * 10) + ((unsigned int)(p_byte[8] & 0xf));      t_duration.i_seconds = (((unsigned int)(p_byte[9] >> 4) & 0xf) * 10) + ((unsigned int)(p_byte[9] & 0xf));            dvbpsi_eit_event_t* p_event = dvbpsi_EITAddEvent(p_eit,          i_event_id, &t_start_time, &t_duration,          i_running_status, b_free_ca);      /* Event descriptors */      p_byte += 12;      p_end = p_byte + i_length;      while(p_byte + 2 <= p_end)      {        uint8_t i_tag = p_byte[0];        uint8_t i_length = p_byte[1];        if(i_length + 2 <= p_end - p_byte)          dvbpsi_EITEventAddDescriptor(p_event, i_tag, i_length, p_byte + 2);        p_byte += 2 + i_length;      }    }    p_section = p_section->p_next;  }}

⌨️ 快捷键说明

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