static void call_process(MSFilter *f){ bool_t process_done=FALSE; if (f->desc->ninputs==0 || f->desc->flags & MS_FILTER_IS_PUMP){ ms_filter_process(f); }else{ while (ms_filter_inputs_have_data(f)) { if (process_done){ ms_warning("Re-scheduling filter %s: all data should be consumed in one process call, so fix it.",f->desc->name); } ms_filter_process(f); process_done=TRUE; } } }
/*execute the processing chain attached to a sync source. It is called as a thread by ms_main()*/ void *ms_thread_run(void *sync_ptr) { MSSync *sync=(MSSync*) sync_ptr; GList *filter; MSFilter *f; ms_sync_lock(sync); while(sync->run) { //g_message("sync->run=%i",sync->run); if (sync->samples_per_tick==0) ms_sync_suspend(sync); if (sync->flags & MS_SYNC_NEED_UPDATE){ ms_compile(sync); ms_sync_setup(sync); } filter=sync->execution_list; ms_sync_unlock(sync); //ms_trace("Calling synchronisation"); ms_sync_synchronize(sync); while(filter!=NULL) { f=(MSFilter*)filter->data; if (MS_FILTER_GET_CLASS(f)->attributes & FILTER_IS_SOURCE) { /* execute it once */ ms_trace("Running source filter %s.",f->klass->name); ms_filter_process(f); } else { /* make the filter process its input data until it has no more */ while ( ms_filter_fifos_have_data(f) || ms_filter_queues_have_data(f) ) { ms_trace("Running filter %s.",f->klass->name); ms_filter_process(f); } } filter=g_list_next(filter); } ms_sync_lock(sync); } g_cond_signal(sync->stop_cond); /* signal that the sync thread has finished */ ms_sync_unlock(sync); g_message("Mediastreamer processing thread is exiting."); return NULL; }