Пример #1
0
void sie_get_ecm_emm_cnt(UINT8 *ecm_count_ptr, UINT8 *emm_count_ptr)
{
	*ecm_count_ptr = 0;
	*emm_count_ptr = 0;
	
	if(monitor_id!=SIM_INVALID_MON_ID)
		sim_get_ecm_pid(monitor_id, NULL, ecm_count_ptr);
	
	if(cat_monitor_id!=SIM_INVALID_MON_ID)
		sim_get_emm_pid(cat_monitor_id, NULL, emm_count_ptr);
}
Пример #2
0
UINT32 sie_get_emm_pid(UINT16 *pid_buffer_ptr)
{
	UINT8 max_count = 32;

	if(cat_monitor_id==SIM_INVALID_MON_ID || pid_buffer_ptr == NULL)
		return 0;

	sim_get_emm_pid(cat_monitor_id, pid_buffer_ptr, &max_count);
		
	return max_count;
}
Пример #3
0
/*
*	name:	api_sim_callback
*	in	:	param( Struct sim_cb_param )
*	out	:	SUCCESS or ERR_FAILUE
*	function:	to be registered in sim,  send info "CTRL_MSG_SUBTYPE_CMD_PIDCHANGE" at runtime when the PID monitored changed
*/
INT32 api_sim_callback(UINT32 param)
{
	struct sim_cb_param *sim_param = (struct sim_cb_param *)param;

    INT32 ret = ERR_FAILUE;
	UINT16 sim_pcr_pid;
	UINT16 sim_video_pid;
	UINT16 sim_audio_pid[P_MAX_AUDIO_NUM];
	UINT16 sim_audio_count = P_MAX_AUDIO_NUM;
	static BOOL on_process = FALSE;
    /*
    while(on_process)
    {
        osal_task_sleep(10);
    }
    */
    on_process = TRUE;

	//static var to minitor the ecm and emm pids
	static UINT16 ecm_pids[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};	
	static UINT16 emm_pids[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    static UINT16 ecm_pids_len = 0;
	UINT16 sie_ecm_pids[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	UINT16 sie_emm_pids[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};	
	UINT8 max_ecm_cnt = 16;
	UINT8 max_emm_cnt = 16;

	static P_NODE p_node; // Come from get_prog_by_id
	INT8 sim_idx = -1, i;

    sim_information* info = api_get_sim_info_slot_by_sim(sim_param->dmx_idx, sim_param->sim_id);
    do{
        if( NULL == info)
        {
            break;
        }
    	if (sim_param->table == MONITE_TB_PMT)
    	{
    		
    		sim_video_pid = sim_pcr_pid = 8191;
    		MEMSET(sim_audio_pid, 8191, P_MAX_AUDIO_NUM);
    		
    		if (ERR_FAILUE == sim_get_video_pid(sim_param->sim_id, &sim_video_pid))
    			break;
    		//sim_get_pmt(sim_param->sim_id, &sim_p_info);
    		if (ERR_FAILUE == sim_get_audio_info(sim_param->sim_id, sim_audio_pid, NULL, &sim_audio_count))	
    			break;
    		if (ERR_FAILUE== sim_get_pcr_pid(sim_param->sim_id, &sim_pcr_pid))
    			break;
            
    		if (ERR_FAILUE == sim_get_ecm_pid(sim_param->sim_id,sie_ecm_pids,&max_ecm_cnt))
    			break;
            
            if ((max_ecm_cnt != 0)
    			&& (MEMCMP(ecm_pids,sie_ecm_pids, sizeof(UINT16)*max_ecm_cnt)!=0))
    		{
                ecm_pids_len = max_ecm_cnt;
                libc_printf("ecms changed max_ecm_cnt:%d\n",max_ecm_cnt);
                MEMCPY(ecm_pids,sie_ecm_pids, sizeof(UINT16)*max_ecm_cnt);
            }else if(ecm_pids_len !=0 && max_ecm_cnt != ecm_pids_len )
            {
                MEMCPY(ecm_pids,sie_ecm_pids, sizeof(UINT16)*(ecm_pids_len>max_ecm_cnt?ecm_pids_len:max_ecm_cnt));
                ecm_pids_len = max_ecm_cnt;
                libc_printf("ecms changed 2 max_ecm_cnt = %d\n",max_ecm_cnt);
            }
            
    		get_prog_by_id(info->prog_id, &p_node);
            
            if(p_node.pmt_pid != sim_param->sec_pid)
    		{
    			//used for debug!!
    			libc_printf("fatal error!");
               break;
    		}
    		
    		//normal mode to update video pid, audio pid, ... except ecm pid & emm pid
            
            //libc_printf("dxm%d sim %d :channel %d pid [v %d, a %d, pcr %d] -> [v %d, a %d, pcr %d]\n", \
            //                    sim_param->dmx_idx,sim_param->sim_id,info->prog_id, p_node.video_pid, p_node.audio_pid[0], p_node.pcr_pid, sim_video_pid, sim_audio_pid[0], sim_pcr_pid);
    		if((sim_video_pid != p_node.video_pid) 
    			|| (sim_pcr_pid != p_node.pcr_pid) 
    			||(sim_audio_count != p_node.audio_count) 
    			||(MEMCMP(p_node.audio_pid,sim_audio_pid, sizeof(UINT16)*sim_audio_count)!=0))
    		{
    			if ((PROG_TV_MODE ==p_node.av_flag)
    				&&((0 == sim_video_pid) ||(8191 == sim_video_pid)
    				     ||(0 == sim_pcr_pid) ||(8191 == sim_pcr_pid)
    				     ||(0 == sim_audio_pid[0]) ||(8191 == sim_audio_pid[0])))
    				break;
    			if ((PROG_RADIO_MODE ==p_node.av_flag)
    				&&((0 != sim_video_pid) ||(8191 != sim_video_pid)
    				     ||(0 == sim_pcr_pid) ||(8191 == sim_pcr_pid)
    				     ||(0 == sim_audio_pid[0]) ||(8191 == sim_audio_pid[0])))
    				break;	
    			//libc_printf("dxm%d sim %d :channel %d pid changed![v %d, a %d, pcr %d] -> [v %d, a %d, pcr %d]\n", \
    			//	sim_param->dmx_idx,sim_param->sim_id,info->prog_id, p_node.video_pid, p_node.audio_pid[0], p_node.pcr_pid, sim_video_pid, sim_audio_pid[0], sim_pcr_pid);
    			if(PROG_TV_MODE ==p_node.av_flag)
    				 p_node.video_pid = sim_video_pid;			
    			p_node.pcr_pid = sim_pcr_pid;
			
				p_node.audio_count = sim_audio_count;
				MEMCPY(p_node.audio_pid, sim_audio_pid, sizeof(UINT16)*sim_audio_count);
    			
    			modify_prog(p_node.prog_id, &p_node);
                update_data();
                api_set_active_sim_info(info);
    			ap_send_msg(CTRL_MSG_SUBTYPE_CMD_PIDCHANGE, p_node.prog_id, FALSE);//move down for sending MSG after modifed p_node
    		}
    	}

    		//CA mode to update emm pid  pid
    	if ( sim_param->table == MONITE_TB_CAT )
    	{
    		if (ERR_FAILUE == sim_get_emm_pid(sim_param->sim_id,sie_emm_pids,&max_emm_cnt))
    			break;
    		if ((p_node.ca_mode) 
    			&&(max_emm_cnt != 0)
    			&& (MEMCMP(emm_pids,sie_ecm_pids, sizeof(UINT16)*max_emm_cnt)!=0))
    		{
    			for (i=0;i<max_emm_cnt;i++)
    			{
    				libc_printf("emm pid changed![ %d] -> [ %d]\n",emm_pids[i],sie_emm_pids[i]);
    			}
    			libc_printf("Dynamic PID cause EMM changed!\n Need to update code to support it\n");
    			MEMCPY(emm_pids,sie_emm_pids, sizeof(UINT16)*max_emm_cnt);
    			// TO DO:  add ca interface to change the ecm_pids and emm_pids
    			// TO DO:  add pvr  interface to change the ecm_pids and emm_pids
    		}
    	}
        ret = SUCCESS;       
    }while(0);
    on_process = FALSE;
    
	return ret;
}