From: Erik W. <ome...@us...> - 2003-01-20 22:23:00
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: omegahacker Date: Mon Jan 20 2003 14:22:59 PST Log message: - added 'remove' argument to _chain_recursive_add to remove elements from old chain before adding to new one - reworked _pad_unlink to be simpler and more correct Modified files: gst/schedulers : gstbasicscheduler.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/schedulers/gstbasicscheduler.c.diff?r1=1.66&r2=1.67 ====Begin Diffs==== Index: gstbasicscheduler.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/schedulers/gstbasicscheduler.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- gstbasicscheduler.c 20 Jan 2003 22:02:46 -0000 1.66 +++ gstbasicscheduler.c 20 Jan 2003 22:22:46 -0000 1.67 @@ -936,7 +936,7 @@ } static void -gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement * element) +gst_basic_scheduler_chain_recursive_add (GstSchedulerChain * chain, GstElement * element, gboolean remove) { GList *pads; GstPad *pad; @@ -945,9 +945,13 @@ /* check to see if it's in a chain already */ prevchain = gst_basic_scheduler_find_chain (chain->sched, element); - /* if it's already in another chain, we're done */ - if (prevchain != NULL) - return; + /* if it's already in another chain, either remove or punt */ + if (prevchain != NULL) { + if (remove == TRUE) + gst_basic_scheduler_chain_remove_element (prevchain, element); + else + return; + } /* add it to this one */ gst_basic_scheduler_chain_add_element (chain, element); @@ -968,7 +972,7 @@ if (GST_ELEMENT_SCHED (GST_PAD_PARENT (pad)) == GST_ELEMENT_SCHED (peerelement)) { GST_DEBUG (GST_CAT_SCHEDULING, "peer \"%s\" is valid for same chain", GST_ELEMENT_NAME (peerelement)); - gst_basic_scheduler_chain_recursive_add (chain, peerelement); + gst_basic_scheduler_chain_recursive_add (chain, peerelement, remove); } } } @@ -1213,6 +1217,7 @@ chain1 = gst_basic_scheduler_find_chain (bsched, element1); chain2 = gst_basic_scheduler_find_chain (bsched, element2); +#if 0 if (chain1 != chain2) { /* elements not in the same chain don't need to be separated */ GST_INFO (GST_CAT_SCHEDULING, "elements not in the same chain"); @@ -1225,14 +1230,22 @@ /* now create a new chain to hold element1 and build it from scratch */ chain1 = gst_basic_scheduler_chain_new (bsched); - gst_basic_scheduler_chain_recursive_add (chain1, element1); + gst_basic_scheduler_chain_recursive_add (chain1, element1, FALSE); } /* check the other element to see if it landed in the newly created chain */ if (gst_basic_scheduler_find_chain (bsched, element2) == NULL) { /* if not in chain, create chain and build from scratch */ chain2 = gst_basic_scheduler_chain_new (bsched); - gst_basic_scheduler_chain_recursive_add (chain2, element2); + gst_basic_scheduler_chain_recursive_add (chain2, element2, FALSE); + } +#endif + + /* if they're both in the same chain, move second set of elements to a new chain */ + if (chain1 && (chain1 == chain2)) { + GST_INFO (GST_CAT_SCHEDULING, "creating new chain for second element and peers"); + chain2 = gst_basic_scheduler_chain_new (bsched); + gst_basic_scheduler_chain_recursive_add (chain2, element2, TRUE); } } |