//parse LCN descriptor INT32 si_on_lcn_desc(UINT8 tag, UINT8 length, UINT8 *data, void *priv) { struct nit_section_info *n_info = (struct nit_section_info *)priv; if (n_info->s_nr==PSI_MODULE_MAX_NIT_SINFO_NUMBER) { SN_PRINTF("%s: maximum lcn collected!\n", __FUNCTION__); return SI_SUCCESS; } //must follow private data specifier descriptor #if(PRIVATE_DATA_SPEC != INVALID_PRIVATE_DATA_SPEC) if(n_info->priv_spec != PRIVATE_DATA_SPEC) return SI_SUCCESS; #endif //parse lcn loop while (length >= 4) { #ifdef SUPPORT_FRANCE_HD UINT16 i; for(i=0; i<n_info->s_nr; i++) { if(n_info->s_info[i].sid == ((data[0]<<8)|data[1])) break; } if(i == n_info->s_nr) { n_info->s_info[n_info->s_nr].onid = n_info->onid; n_info->s_info[n_info->s_nr].tsid = n_info->tsid; n_info->s_info[n_info->s_nr].sid = (data[0]<<8)|data[1]; n_info->s_info[n_info->s_nr].lcn = ((data[2]&0x03)<<8)|data[3]; #ifdef ITALY_HD_BOOK_SUPPORT n_info->s_info[n_info->s_nr].visible_service_flag = (data[2] >> 7); #endif SN_PRINTF("LCN[%d]: %d - onid: 0x%X, tsid: 0x%X, sid: 0x%X\n", n_info->s_nr, n_info->s_info[n_info->s_nr].lcn, n_info->s_info[n_info->s_nr].onid, n_info->s_info[n_info->s_nr].tsid, n_info->s_info[n_info->s_nr].sid ); n_info->s_nr ++; } else {
INT32 si_on_HDsimulLCN_desc(UINT8 tag, UINT8 length, UINT8 *data, void *priv) { struct nit_section_info *n_info = (struct nit_section_info *)priv; if (n_info->s_nr==PSI_MODULE_MAX_NIT_SINFO_NUMBER) { SN_PRINTF("%s: maximum lcn collected!\n", __FUNCTION__); return SI_SUCCESS; } //must follow private data specifier descriptor #if(PRIVATE_DATA_SPEC != INVALID_PRIVATE_DATA_SPEC) if(n_info->priv_spec != PRIVATE_DATA_SPEC) return SI_SUCCESS; #endif //parse lcn loop while (length >= 4) { n_info->hd_info[n_info->hd_nr].onid = n_info->onid; n_info->hd_info[n_info->hd_nr].tsid = n_info->tsid; n_info->hd_info[n_info->hd_nr].sid = (data[0]<<8)|data[1]; n_info->hd_info[n_info->hd_nr].hd_lcn = ((data[2]&0x03)<<8)|data[3]; SN_PRINTF("tag=%x,LCN[%d]: %d - onid: 0x%X, tsid: 0x%X, sid: 0x%X\n", tag, n_info->hd_nr, n_info->hd_info[n_info->hd_nr].hd_lcn, n_info->hd_info[n_info->hd_nr].onid, n_info->hd_info[n_info->hd_nr].tsid, n_info->hd_info[n_info->hd_nr].sid ); n_info->hd_nr ++; if (n_info->hd_nr==PSI_MODULE_MAX_NIT_SINFO_NUMBER) { SN_PRINTF("%s: maximum hd_simul_lcn collected!\n", __FUNCTION__); return SI_SUCCESS; } data += 4; length -= 4; } return SI_SUCCESS; }
INT32 si_on_service_list_desc(UINT8 tag, UINT8 length, UINT8 *data, void *priv) { struct nit_section_info *n_info = (struct nit_section_info *)priv; INT16 i; if (n_info->s_nr==PSI_MODULE_MAX_NIT_SINFO_NUMBER) { SN_PRINTF("%s: maximum lcn collected!\n", __FUNCTION__); return SI_SUCCESS; } //parse lcn loop while (length >= 3) { for(i=0; i<n_info->s_nr; i++) { if(n_info->s_info[i].sid == ((data[0]<<8)|data[1])) break; } if(i == n_info->s_nr) { n_info->s_info[n_info->s_nr].onid = n_info->onid; n_info->s_info[n_info->s_nr].tsid = n_info->tsid; n_info->s_info[n_info->s_nr].sid = (data[0]<<8)|data[1]; n_info->s_nr ++; } if (n_info->s_nr==PSI_MODULE_MAX_NIT_SINFO_NUMBER) { SN_PRINTF("%s: maximum lcn collected!\n", __FUNCTION__); return SI_SUCCESS; } data += 3; length -= 3; } return SI_SUCCESS; }
INT32 si_nit_parser(UINT8 *data, INT32 len, struct section_parameter *param) { INT32 i, ret, dloop_len; struct network_descriptor *nw_desc; struct nit_section_info *n_info = (struct nit_section_info *)param->priv; struct transport_stream_info *ts_info; if (data == NULL) { n_info->xp_nr = 0; return SI_SUCCESS; } #if(defined( _MHEG5_ENABLE_) || defined( _MHEG5_V20_ENABLE_)||defined(SUPPORT_FRANCE_HD)) //network_id n_info->net_id = (data[3]<<8) | data[4]; #endif #ifdef SUPPORT_FRANCE_HD n_info->version_num = (data[5]&0x3e)>>1; #endif nw_desc = &((struct nit_section *)data)->network; dloop_len = SI_MERGE_HL8(nw_desc->network_descriptor_length); if (n_info->lp1_nr&&(dloop_len>0)) { #ifdef AUTO_OTA ret = desc_loop_parser(nw_desc->descriptor, dloop_len, n_info->loop1, n_info->lp1_nr, &n_info->p_firstloopinfo.descriptors_parse_stat, n_info); #else ret = desc_loop_parser(nw_desc->descriptor, dloop_len, n_info->loop1, n_info->lp1_nr, NULL, n_info); #endif if (ret != SI_SUCCESS) { SN_PRINTF("%s: loop1 parse failure!\n", __FUNCTION__); return ret; } #ifdef AUTO_OTA if(0 == (&n_info->p_firstloopinfo.descriptors_parse_stat)&(1<<NIT_LINKAGE_EXIST_BIT)) set_linkagetype09_exist(0); #endif } if (n_info->lp2_nr==0) { return SI_SUCCESS; } for(i=sizeof(struct nit_section)+dloop_len-4; i<len-4; i += sizeof(struct transport_stream_info)+dloop_len) { ts_info = (struct transport_stream_info *)(data+i); n_info->tsid = SI_MERGE_UINT16(ts_info->transport_stream_id); n_info->onid = SI_MERGE_UINT16(ts_info->original_network_id); dloop_len = SI_MERGE_HL8(ts_info->transport_stream_length); if (dloop_len>0) { ret = desc_loop_parser(ts_info->descriptor, dloop_len, n_info->loop2, n_info->lp2_nr, NULL, n_info); if (ret != SI_SUCCESS) { SN_PRINTF("%s: loop2 parse failure!\n", __FUNCTION__); return ret; } } } return SI_SUCCESS; }
// get LCN from NIT INT32 si_nit_get_info(struct nit_section_info *nsi, UINT16 onid, UINT16 tsid, PROG_INFO *pg) { INT32 i; #ifdef SUPPORT_FRANCE_HD for(i=0; i<nsi->s_nr; i++) { if ((nsi->s_info[i].sid == pg->prog_number) &&(nsi->s_info[i].tsid == tsid) &&(nsi->s_info[i].onid == onid)) { pg->lcn = nsi->s_info[i].lcn; if(nsi->s_info[i].lcn== 0) //for DTG test SI05 pg->lcn_true = FALSE; else pg->lcn_true = TRUE; SN_PRINTF("found lcn: %d\n",pg->lcn); //return SI_SUCCESS; } } SN_PRINTF("not found lcn of prog 0x%X!!\n",pg->prog_number); for(i=0; i<nsi->hd_nr; i++) { if ((nsi->hd_info[i].sid == pg->prog_number) &&(nsi->hd_info[i].tsid == tsid) &&(nsi->hd_info[i].onid == onid)) { pg->hd_lcn = nsi->hd_info[i].hd_lcn; if(nsi->hd_info[i].hd_lcn== 0) //for DTG test SI05 pg->hd_lcn_true = FALSE; else { pg->hd_lcn_true = TRUE; SN_PRINTF("found hd_lcn: %d,hd_lcn=%x\n",pg->hd_lcn,pg->hd_lcn_true ); } return SI_SUCCESS; } } SN_PRINTF("not found lcn of prog 0x%X!!\n",pg->prog_number); #else for(i=0; i<nsi->s_nr; i++) { if ((nsi->s_info[i].sid == pg->prog_number) &&(nsi->s_info[i].tsid == tsid) &&(nsi->s_info[i].onid == onid)) { pg->lcn = nsi->s_info[i].lcn; if(nsi->s_info[i].lcn== 0) //for DTG test SI05 pg->lcn_true = FALSE; else pg->lcn_true = TRUE; SN_PRINTF("found lcn: %d\n",pg->lcn); return SI_SUCCESS; } } SN_PRINTF("not found lcn of prog 0x%X!!\n",pg->prog_number); #endif return ERR_FAILUE; }