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