int32_t stapi_set_filter(int32_t demux_id, uint16_t pid, uchar *filter, uchar *mask, int32_t num, char *pmtfile) { int32_t i; uint16_t pids[1] = { pid }; struct s_dvbapi_priority *p; if (!pmtfile) return 0; cs_debug_mask(D_DVBAPI, "pmt file %s demux_id %d", pmtfile, demux_id); 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) { cs_debug_mask(D_DVBAPI, "set stapi filter on %s for pid %04X", dev_list[i].name, pids[0]); stapi_do_set_filter(demux_id, &dev_list[i].demux_fd[demux_id][num], pids, 1, filter, mask, i); } } } cs_debug_mask(D_DVBAPI, "filter #%d set (pid %04X)", num, pid); return 1; }
int32_t stapi_set_filter(int32_t demux_id, uint16_t pid, uchar *filter, uchar *mask, int32_t num, char *pmtfile) { int32_t i; int32_t ret = -1; char dest[1024]; uint16_t pids[1] = { pid }; struct s_dvbapi_priority *p; if(!pmtfile) { cs_log_dbg(D_DVBAPI, "No valid pmtfile!"); return -1; } cs_log_dbg(D_DVBAPI, "pmt file %s demux_id %d", pmtfile, demux_id); for(p = dvbapi_priority; p != NULL; p = p->next) { if(p->type != 's') { continue; // stapi rule? } if(strcmp(pmtfile, p->pmtfile) != 0) { continue; // same file? } for(i = 0; i < PTINUM; i++) { if(strcmp(dev_list[i].name, p->devname) == 0 && p->disablefilter == 0) // check device name and if filtering is enabled! { cs_log_dbg(D_DVBAPI, "set stapi filter on %s for pid %04X", dev_list[i].name, pids[0]); ret = stapi_do_set_filter(demux_id, &dev_list[i].demux_fd[demux_id][num], pids, 1, filter, mask, i); if(ret > 0) // success { demux[demux_id].dev_index = i; cs_log_dbg(D_DVBAPI, "%s filter %d set (pid %04X)", dev_list[i].name, num, pid); return ret; // return filternumber } else // failure { cs_log_dbg(D_DVBAPI, "Error setting new filter for pid %04X on %s!", pid, dev_list[i].name); return -1; // set return to error } } } } if(p == NULL) { cs_log_dbg(D_DVBAPI, "No matching S: line in oscam.dvbapi for pmtfile %s -> stop descrambling!", pmtfile); snprintf(dest, sizeof(dest), "%s%s", TMPDIR, demux[demux_id].pmt_file); unlink(dest); // remove obsolete pmt file dvbapi_stop_descrambling(demux_id); } return ret; }