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;
}