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); }
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; }
/* * 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; }