void azbox_openxcas_ecm_callback(int32_t stream_id, uint32_t UNUSED(seq), int32_t cipher_index, uint32_t UNUSED(caid), unsigned char *ecm_data, int32_t l, uint16_t pid) { cs_debug_mask(D_DVBAPI, LOG_PREFIX "ecm callback received"); openxcas_stream_id = stream_id; //openxcas_seq = seq; //openxcas_caid = caid; openxcas_ecm_pid = pid; openxcas_busy = 1; ECM_REQUEST *er; if (!(er=get_ecmtask())) return; er->srvid = openxcas_sid; er->caid = openxcas_caid; er->pid = openxcas_ecm_pid; er->prid = openxcas_provid; er->ecmlen = l; memcpy(er->ecm, ecm_data, er->ecmlen); request_cw(dvbapi_client, er, 0, 0); //openxcas_stop_filter(openxcas_stream_id, OPENXCAS_FILTER_ECM); //openxcas_remove_filter(openxcas_stream_id, OPENXCAS_FILTER_ECM); openxcas_cipher_idx = cipher_index; struct timeb tp; cs_ftime(&tp); tp.time+=500; }
void azbox_openxcas_ex_callback(int32_t stream_id, uint32_t seq, int32_t idx, uint32_t pid, unsigned char *ecm_data, int32_t l) { cs_debug_mask(D_DVBAPI, LOG_PREFIX "ex callback received"); openxcas_stream_id = stream_id; openxcas_ecm_pid = pid; openxcas_cipher_idx = idx; // is this really cipher_idx? ECM_REQUEST *er; if(!(er = get_ecmtask())) { return; } er->srvid = openxcas_sid; er->caid = openxcas_caid; er->pid = openxcas_ecm_pid; er->prid = openxcas_provid; er->ecmlen = l; memcpy(er->ecm, ecm_data, er->ecmlen); request_cw(dvbapi_client, er, 0, 0); if(openxcas_stop_filter_ex(stream_id, seq, openxcas_filter_idx) < 0) { cs_log(LOG_PREFIX "unable to stop ex filter"); } else { cs_debug_mask(D_DVBAPI, LOG_PREFIX "ex filter stopped"); } unsigned char mask[12]; unsigned char comp[12]; memset(&mask, 0x00, sizeof(mask)); memset(&comp, 0x00, sizeof(comp)); mask[0] = 0xff; comp[0] = ecm_data[0] ^ 1; if((openxcas_filter_idx = openxcas_start_filter_ex(stream_id, seq, openxcas_ecm_pid, mask, comp, (void *)azbox_openxcas_ex_callback)) < 0) { cs_log(LOG_PREFIX "unable to start ex filter"); } else { cs_debug_mask(D_DVBAPI, LOG_PREFIX "ex filter started, pid = %x", openxcas_ecm_pid); } }