int32_t stapi_remove_filter(int32_t demux_id, int32_t num, char *pmtfile) { int32_t i, ret = 0; struct s_dvbapi_priority *p; if(!pmtfile) { return 0; } for(p = dvbapi_priority; p != NULL; p = p->next) { if(p->type != 's') { continue; } if(strcmp(pmtfile, p->pmtfile) != 0) { continue; } for(i = 0; i < PTINUM; i++) { if(strcmp(dev_list[i].name, p->devname) == 0 && p->disablefilter == 0) { ret = stapi_do_remove_filter(demux_id, &dev_list[i].demux_fd[demux_id][num], i); } } } if(ret == 1) { cs_log_dbg(D_DVBAPI, "filter %d removed", num); } else { cs_log_dbg(D_DVBAPI, "Error: filter %d was not removed!", num); } return ret; }
int32_t stapi_do_set_filter(int32_t demux_id, FILTERTYPE *filter, uint16_t *pids, int32_t pidcount, uchar *filt, uchar *mask, int32_t dev_id) { uint32_t FilterAssociateError=0; int32_t k, ret=0; filter->fd = 0; filter->BufferHandle[0] = 0; filter->SlotHandle[0] = 0; if (dev_list[dev_id].SessionHandle==0) return 0; uint32_t FilterAllocateError = oscam_stapi_FilterAllocate(dev_list[dev_id].SessionHandle, &filter->fd); if (FilterAllocateError != 0) { cs_log("FilterAllocate problem"); filter->fd=0; return 0; } for (k=0;k<pidcount;k++) { uint16_t pid = pids[k]; uint32_t QuerySlot = oscam_stapi_PidQuery(dev_list[dev_id].name, pid); int32_t SlotInit=1; if (QuerySlot != 0) { uint32_t checkslot = check_slot(dev_id, QuerySlot, NULL); if (checkslot>0) { filter->SlotHandle[k] = QuerySlot; filter->BufferHandle[k] = checkslot; SlotInit=0; } else { cs_log("overtake: clear pid: %d", oscam_stapi_SlotClearPid(QuerySlot)); SlotInit=1; } } if (SlotInit==1) { ret = oscam_stapi_SlotInit(dev_list[dev_id].SessionHandle, dev_list[dev_id].SignalHandle, &filter->BufferHandle[k], &filter->SlotHandle[k], pid); } FilterAssociateError = oscam_stapi_FilterAssociate(filter->fd, filter->SlotHandle[k]); filter->NumSlots++; } uint32_t FilterSetError = oscam_stapi_FilterSet(filter->fd, filt, mask); if (ret || FilterAllocateError || FilterAssociateError || FilterSetError) { cs_log("set_filter: dev: %d FAl: %d FAs: %d FS: %d", dev_id, FilterAllocateError, FilterAssociateError, FilterSetError); stapi_do_remove_filter(demux_id, filter, dev_id); return 0; } else { return 1; } }
int32_t stapi_remove_filter(int32_t demux_id, int32_t num, char *pmtfile) { int32_t i; struct s_dvbapi_priority *p; if (!pmtfile) return 0; for (p=dvbapi_priority; p != NULL; p=p->next) { if (p->type!='s') continue; if (strcmp(pmtfile, p->pmtfile)!=0) continue; for (i=0;i<PTINUM;i++) { if(strcmp(dev_list[i].name, p->devname)==0 && p->disablefilter==0) { stapi_do_remove_filter(demux_id, &dev_list[i].demux_fd[demux_id][num], i); } } } cs_debug_mask(D_DVBAPI, "filter #%d removed", num); return 1; }