示例#1
0
static void find_filters(MSList **filters, MSFilter *f ) {
    int i,found;
    MSQueue *link;
    if (f==NULL) ms_fatal("Bad graph.");
    /*ms_message("seeing %s, seen=%i",f->desc->name,f->seen);*/
    if (f->seen) {
        return;
    }
    f->seen=TRUE;
    *filters=ms_list_append(*filters,f);
    /* go upstream */
    for(i=0; i<f->desc->ninputs; i++) {
        link=f->inputs[i];
        if (link!=NULL) find_filters(filters,link->prev.filter);
    }
    /* go downstream */
    for(i=0,found=0; i<f->desc->noutputs; i++) {
        link=f->outputs[i];
        if (link!=NULL) {
            found++;
            find_filters(filters,link->next.filter);
        }
    }
    if (f->desc->noutputs>=1 && found==0) {
        ms_fatal("Bad graph: filter %s has %i outputs, none is connected.",f->desc->name,f->desc->noutputs);
    }
}
示例#2
0
int ms_ticker_detach(MSTicker *ticker,MSFilter *f){
	MSList *sources=NULL;
	MSList *filters=NULL;
	MSList *it;

	if (f->ticker==NULL) {
		ms_message("Filter %s is not scheduled; nothing to do.",f->desc->name);
		return 0;
	}

	ms_mutex_lock(&ticker->lock);

	find_filters(&filters,f);
	sources=get_sources(filters);
	if (sources==NULL){
		ms_fatal("No sources found around filter %s",f->desc->name);
		ms_list_free(filters);
		ms_mutex_unlock(&ticker->lock);
		return -1;
	}

	for(it=sources;it!=NULL;it=ms_list_next(it)){
		ticker->execution_list=ms_list_remove(ticker->execution_list,it->data);
	}
	ms_mutex_unlock(&ticker->lock);
	ms_list_for_each(filters,(void (*)(void*))ms_filter_postprocess);
	ms_list_free(filters);
	ms_list_free(sources);
	return 0;
}
示例#3
0
int ms_ticker_attach(MSTicker *ticker,MSFilter *f)
{
	MSList *sources=NULL;
	MSList *filters=NULL;
	MSList *it;
	
	if (f->ticker!=NULL) {
		ms_message("Filter %s is already being scheduled; nothing to do.",f->desc->name);
		return 0;
	}

	find_filters(&filters,f);
	sources=get_sources(filters);
	if (sources==NULL){
		ms_fatal("No sources found around filter %s",f->desc->name);
		ms_list_free(filters);
		return -1;
	}
	/*run preprocess on each filter: */
	for(it=filters;it!=NULL;it=it->next)
		ms_filter_preprocess((MSFilter*)it->data,ticker);
	ms_mutex_lock(&ticker->lock);
	ticker->execution_list=ms_list_concat(ticker->execution_list,sources);
	ms_mutex_unlock(&ticker->lock);
	ms_list_free(filters);
	return 0;
}
示例#4
0
MSList * ms_filter_find_neighbours(MSFilter *me) {
    MSList *l=NULL;
    MSList *it;
    find_filters(&l,me);
    /*reset seen boolean for further lookups to succeed !*/
    for(it=l; it!=NULL; it=it->next) {
        MSFilter *f=(MSFilter*)it->data;
        f->seen=FALSE;
    }
    return l;
}
示例#5
0
static void find_filters(MSList **filters, MSFilter *f ){
	int i;
	MSQueue *link;
	if (f==NULL) ms_fatal("Bad graph.");
	/*ms_message("seeing %s, seen=%i",f->desc->name,f->seen);*/
	if (f->seen){
		return;
	}
	f->seen=TRUE;
	*filters=ms_list_append(*filters,f);
	/* go upstream */
	for(i=0;i<f->desc->ninputs;i++){
		link=f->inputs[i];
		if (link!=NULL) find_filters(filters,link->prev.filter);
	}
	/* go downstream */
	for(i=0;i<f->desc->noutputs;i++){
		link=f->outputs[i];
		if (link!=NULL) find_filters(filters,link->next.filter);
	}
}