Exemple #1
0
/*******************************************************************************
*   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;
}
Exemple #2
0
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;
}
Exemple #3
0
/*******************************************************************************
*   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;
}
Exemple #4
0
/*
  * 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;;
}