/******************************************************************************* * Funtion name : get_ssuinfo_from_pmt() * Description: * 1. search effect otainfo in pmt. * 2. *pssu_pid: if find, this value to send its value. * 3. return value: if find effect otainfo, return SUCCESS. * Time: 20080421 *******************************************************************************/ INT32 get_ssuinfo_from_pmt(struct program_map *map, UINT16 *pssu_pid, UINT16 pmtpid) { INT32 ret = !SI_SUCCESS; UINT32 i = 0; // for(i=0; i< psi_info->pmt_counter; i++) { // if (pmtpid != 0) { // if(psi_info->maps[i].pm_info.pmt_pid != pmtpid) // continue; } PROG_INFO *pmt_section_info = &map->pm_info; AUTO_OTA_INFO *pts_ota_info = &map->pm_info.p_esloopinfo.pmt_ssu_info.m_otainfo; if(0 != pmt_section_info->p_esloopinfo.pmt_ssu_info.ssu_pid) { if(si_get_otaconfig_oui() == pmt_section_info->p_esloopinfo.pmt_ssu_info.m_otainfo.oui) { if(si_get_ota_ssupid() != pmt_section_info->p_esloopinfo.pmt_ssu_info.ssu_pid) si_set_ota_ssupid(pmt_section_info->p_esloopinfo.pmt_ssu_info.ssu_pid); INT32 otaret; struct section_param sec_param; sec_param.section_type = 0x00; otaret = si_private_sec_parsing_start(0, pmt_section_info->p_esloopinfo.pmt_ssu_info.ssu_pid, parse_dsmcc_sec, (void*)(&sec_param)); if(otaret == OTA_SUCCESS) { *pssu_pid = pmt_section_info->p_esloopinfo.pmt_ssu_info.ssu_pid; ret = SI_SUCCESS; } } } } return ret; }
INT32 data_broadcastid_desc_handle(UINT8 tag, UINT8 len, UINT8 *pdata, void *ppriv) { INT32 ret; UINT8 oui_data_len, selector_len; UINT16 data_broadcast_id; UINT32 oui; // PMT_ESLOOP_INFO *p_info = (PMT_ESLOOP_INFO *)ppriv; struct pmt_es_info *p_info = (struct pmt_es_info *)ppriv; if(DATA_BROADCASTID_DES_TAG != tag) { // libc_printf("%s[%s] : databroadcastid tag wrong!\n", __FUNCTION__, __FILE__); ASSERT(0); } // dump_data(pdata-2, len+2, "databroadcastid_desc"); data_broadcast_id = (pdata[0]<<8 | pdata[1]); oui_data_len = pdata[2]; oui = (pdata[3]<<16 | pdata[4]<<8 | pdata[5]); if(DATABROADCASTID_ALIOTA == data_broadcast_id && (oui==si_get_otaconfig_oui() // ||oui == OUI_SAGEM )) { selector_len = pdata[8]; AUTO_OTA_INFO *pota_info = &p_info->pmt_ssu_info.m_otainfo; if(selector_len >=8) { pota_info->hw_model = pdata[9]<<8 | pdata[10]; pota_info->hw_ver = pdata[11]<<8 | pdata[12]; pota_info->sw_model = pdata[13]<<8 | pdata[14]; pota_info->ota_sw_version = pdata[15]<<8 | pdata[16]; } pota_info->oui = oui; } ret = SI_SUCCESS; return ret; }
/******************************************************************************* * Funtion name : get_otaservice_linkage_from_nit() * Description: * 1. search linkage descriptor(linkage type==0x09) in nit. * 2. psec_list: section list for a complete NIT. * 3. *plink_exist : if linkage descriptor(linkage_type == 0x09) exist. * 4. return val: if find matched OUI&service_id, return SUCCESS; else return !SUCCESS * Time: 20080420 *******************************************************************************/ INT32 get_otaservice_linkage_from_nit(struct nit_section_info *nit_info, INT8 *plink_exist, UINT16 cur_tsid) { INT32 ret = !SI_SUCCESS; INT8 linkagetype09_exist = 0; struct NITSSU_INFO *pssuinfo = &nit_info->p_firstloopinfo.ssu_location_info; if(0 == linkagetype09_exist) linkagetype09_exist = get_linkagetype09_exist(); if(0x09 == pssuinfo->linkage_type) { if(pssuinfo->des_tsid == cur_tsid) { if(pssuinfo->OUI == si_get_otaconfig_oui()) { si_set_ota_serviceid(pssuinfo->des_serviceid); ret = SUCCESS; } } } *plink_exist = linkagetype09_exist; return ret; }
/* * Name : psi_parse_loop2 * Description : parse pmt second loop. * Parameter : * INT8 *buff :seciton buffer * INT16 buff_len :buffer length * Return : */ static INT32 pmt_parse_loop2(UINT8 *pmt, UINT16 pmt_len, PROG_INFO *p_info, INT32 max_es_nr) { INT32 ret, es_cnt; UINT32 i, loop_len; struct pmt_stream_info *info; struct pmt_es_info es; UINT32 loop1_len = ((pmt[10]<<8)|pmt[11])&0x0FFF; UINT16 invalid_flag = 1; UINT32 j=0, k = 0; PP_PRINTF("\n %s(): es stream :\n",__FUNCTION__); for(es_cnt=0, i = sizeof(struct pmt_section)-4+loop1_len; i < (UINT32)pmt_len-4; i += sizeof(struct pmt_stream_info)+loop_len) { info = (struct pmt_stream_info *)(pmt+i); MEMSET(&es, 0, sizeof(struct pmt_es_info)); es.stream_type = info->stream_type; es.pid = SI_MERGE_HL8(info->elementary_pid); loop_len = SI_MERGE_HL8(info->es_info_length); ret = desc_loop_parser(info->descriptor, loop_len, pmt_loop2, ARRAY_SIZE(pmt_loop2), &es.stat, (void *)&es); if (ret != SI_SUCCESS) PP_PRINTF("%s: desc_loop_parser error, error= %d\n", ret); if (es.stat&ES_CA_EXIST) { //check if current es ca system is same with those recorded ones for(j=0; j<es.cas_count; j++) { //fix BUG17636, to get all ecm pids /* for(k=0; k<p_info->CA_count; k++) { if(p_info->CA_info[k].CA_system_id==es.cas_sysid[j]) { PP_PRINTF("es pid=%d, ca count=%d, cas_sysid[%d]=0x%x has same ca sysid with p_info->CA_info[%d]!\n" , es.pid, es.cas_count, j,es.cas_sysid[j], k); break; } } if( k==p_info->CA_count)*/ { if (p_info->CA_count < P_MAX_CA_NUM) { p_info->CA_info[p_info->CA_count].CA_system_id = es.cas_sysid[j]; p_info->CA_info[p_info->CA_count].CA_pid = es.cas_pid[j]; p_info->CA_count++; } else { PP_PRINTF("pmt_parse_loop2: ca system id count %d full!\n",p_info->CA_count); break; //for (j) } } } } #ifdef VIDEO_SEAMLESS_SWITCHING if (es.stat&ES_V_CTRL_EXIST_BIT) { p_info->video_control = es.video_control; } #endif PP_PRINTF("es stream type=%d\n",es.stream_type); switch(es.stream_type) { case MPEG1_AUDIO_STREAM: case MPEG2_AUDIO_STREAM: if (TRUE == append_audio_pid(&es, p_info, 0)) invalid_flag = 0; break; case PRIVATE_DATA_STREAM: case AC3_AUDIO_STREAM: if(es.stat&ES_TTX_EXIST) p_info->teletext_pid = es.pid; else if(es.stat&ES_SUB_EXIST) p_info->subtitle_pid = es.pid; #ifdef AC3DEC else if(((es.stat&ES_AC3_EXIST)||(es.stream_type == AC3_AUDIO_STREAM))&&(TRUE == append_audio_pid(&es, p_info,AC3_DES_EXIST))) { //if(es.stream_type == AC3_AUDIO_STREAM) //p_info->prog_number +=1; invalid_flag = 0; } else if((es.stat&ES_EAC3_EXIST)&&(TRUE == append_audio_pid(&es, p_info,EAC3_DES_EXIST))) { invalid_flag = 0; } #endif break; case MPEG_AAC_STREAM: if(TRUE == append_audio_pid(&es, p_info,AAC_DES_EXIST)) { invalid_flag = 0; } break; case MPEG_ADTS_AAC_STREAM: if(TRUE==append_audio_pid(&es, p_info,ADTS_AAC_DES_EXIST)) { invalid_flag = 0; } break; case MPEG1_VIDEO_STREAM: case MPEG2_VIDEO_STREAM: case MPEG4_VIDEO_STREAM: if (p_info->video_pid == PSI_STUFF_PID) { p_info->av_flag = 1; p_info->video_pid = es.pid; invalid_flag = 0; } break; case H264_VIDEO_STREAM: if (p_info->video_pid == PSI_STUFF_PID) { p_info->av_flag = 1; p_info->video_pid = es.pid|H264_VIDEO_PID_FLAG; invalid_flag = 0; } break; #if (SYS_PROJECT_FE == PROJECT_FE_DVBC) //case ISO13818_6_TYPE_A: case 0x05: case ISO13818_6_TYPE_B: //case ISO13818_6_TYPE_C: //case ISO13818_6_TYPE_D: invalid_flag = 0; break; #endif #if defined (AUTO_OTA) case ISO13818_6_TYPE_B: if (((es.stat&(1<<ES_DTS_EXIST_BIT)) != 0) && (es.pmt_ssu_info.m_otainfo.oui == si_get_otaconfig_oui())) { //if stream type is ISO_13818_6_TYPE_B, data broadcast id desc is exist and oui is match p_info->p_esloopinfo.pmt_ssu_info.stream_type = es.stream_type; p_info->p_esloopinfo.pmt_ssu_info.ssu_pid = es.pid; p_info->p_esloopinfo.pmt_ssu_info.m_otainfo.oui = es.pmt_ssu_info.m_otainfo.oui; invalid_flag = 0; } break; #endif default: PP_PRINTF("es_type = 0x%x unknown!\n",__FUNCTION__, es.stream_type); break; } if (++es_cnt>=max_es_nr) { PP_PRINTF("es_cnt = %d exceed max_es_nr!\n",__FUNCTION__, es_cnt); break; } } PP_PRINTF("%s: es_cnt = %d!\n\n",__FUNCTION__, es_cnt); return invalid_flag? ERR_NO_PROG_INFO : SI_SUCCESS;; }