More incsched updates. Now need to get the headers redone...

Original commit message from CVS:
More incsched updates.  Now need to get the headers redone...
This commit is contained in:
Erik Walthinsen 2001-02-14 23:23:03 +00:00
parent 08427ffb2a
commit 3ff90ac8fb
5 changed files with 172 additions and 17 deletions

View file

@ -79,6 +79,8 @@ gst_pad_init (GstPad *pad)
enum {
REAL_SET_ACTIVE,
REAL_CAPS_CHANGED,
REAL_CONNECTED,
REAL_DISCONNECTED,
/* FILL ME */
REAL_LAST_SIGNAL
};
@ -145,6 +147,16 @@ gst_real_pad_class_init (GstRealPadClass *klass)
GTK_SIGNAL_OFFSET (GstRealPadClass, caps_changed),
gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
GTK_TYPE_POINTER);
gst_real_pad_signals[REAL_CONNECTED] =
gtk_signal_new ("connected", GTK_RUN_LAST, gtkobject_class->type,
GTK_SIGNAL_OFFSET (GstRealPadClass, connected),
gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
GTK_TYPE_POINTER);
gst_real_pad_signals[REAL_DISCONNECTED] =
gtk_signal_new ("disconnected", GTK_RUN_LAST, gtkobject_class->type,
GTK_SIGNAL_OFFSET (GstRealPadClass, disconnected),
gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
GTK_TYPE_POINTER);
gtk_object_class_add_signals (gtkobject_class, gst_real_pad_signals, REAL_LAST_SIGNAL);
gtk_object_add_arg_type ("GstRealPad::active", GTK_TYPE_BOOL,
@ -493,6 +505,10 @@ gst_pad_disconnect (GstPad *srcpad,
GST_RPAD_PEER(realsrc) = NULL;
GST_RPAD_PEER(realsink) = NULL;
/* fire off a signal to each of the pads telling them that they've been disconnected */
gtk_signal_emit(GTK_OBJECT(realsrc), gst_real_pad_signals[REAL_DISCONNECTED], realsink);
gtk_signal_emit(GTK_OBJECT(realsink), gst_real_pad_signals[REAL_DISCONNECTED], realsrc);
GST_INFO (GST_CAT_ELEMENT_PADS, "disconnected %s:%s and %s:%s",
GST_DEBUG_PAD_NAME(srcpad), GST_DEBUG_PAD_NAME(sinkpad));
}
@ -550,6 +566,10 @@ gst_pad_connect (GstPad *srcpad,
/* set the connected flag */
/* FIXME: set connected flag */
/* fire off a signal to each of the pads telling them that they've been connected */
gtk_signal_emit(GTK_OBJECT(realsrc), gst_real_pad_signals[REAL_CONNECTED], realsink);
gtk_signal_emit(GTK_OBJECT(realsink), gst_real_pad_signals[REAL_CONNECTED], realsrc);
GST_INFO (GST_CAT_ELEMENT_PADS, "connected %s:%s and %s:%s",
GST_DEBUG_PAD_NAME(srcpad), GST_DEBUG_PAD_NAME(sinkpad));
}

View file

@ -145,6 +145,9 @@ struct _GstRealPadClass {
/* signal callbacks */
void (*set_active) (GstPad *pad, gboolean active);
void (*caps_changed) (GstPad *pad, GstCaps *newcaps);
void (*connected) (GstPad *pad, GstPad *peer);
void (*disconnected) (GstPad *pad, GstPad *peer);
void (*eos) (GstPad *pad);
};

View file

@ -781,16 +781,40 @@ gst_schedule_chain_new (GstSchedule *sched)
{
GstScheduleChain *chain = g_new (GstScheduleChain, 1);
chain->parent = sched;
chain->sched = sched;
chain->elements = NULL;
chain->num_elements = 0;
chain->entry = NULL;
chain->need_cothreads = TRUE;
chain->schedule = FALSE;
sched->chains = g_list_prepend (sched->chains, chain);
sched->num_chains++;
GST_INFO (GST_CAT_SCHEDULING, "created new chain, now are %d chains",sched->num_chains);
return chain;
}
void
gst_schedule_chain_destroy (GstScheduleChain *chain)
{
chain->sched->chains = g_list_remove (chain->sched->chains, chain);
sched->num_chains--;
g_list_free (chain->elements);
g_free (chain);
}
void
gst_schedule_chain_add_element (GstScheduleChain *chain, GstElement *element)
{
GST_INFO (GST_CAT_SCHEDULING, "adding element \"%s\" to chain", GST_ELEMENT_NAME (element));
chain->elements = g_list_prepend (chain->elements, element);
chain->num_elements++;
// FIXME need to update chain schedule here, or not
}
void
gst_schedule_chain_elements (GstSchedule *schedule, GstElement *element1, GstElement *element2)
{
@ -811,26 +835,27 @@ gst_schedule_chain_elements (GstSchedule *schedule, GstElement *element1, GstEle
chain2 = chain;
}
// first check to see if they're in the same chain, we're done if that's the case
if ((chain1 != NULL) && (chain1 == chain2)) {
GST_INFO (GST_CAT_SCHEDULING, "elements are already in the same chain");
return;
}
// now, if neither element has a chain, create one
if ((chain1 == NULL) && (chain2 == NULL)) {
GST_INFO (GST_CAT_SCHEDULING, "creating new chain to hold two new elements");
chain = gst_schedule_chain_new (sched);
chain->elements = g_list_prepend (chain->elements, element1);
gst_schedule_chain_add_element (chain, element1);
gst_schedule_chain_add_element (chain, element2);
// FIXME chain changed here
chain->elements = g_list_prepend (chain->elements, element2);
// FIXME chain changed here
chain->num_elements = 2;
sched->chains = g_list_prepend (sched->chains, chain);
sched->num_chains++;
// otherwise if both have chains already, join them
} else if ((chain1 != NULL) && (chain2 != NULL)) {
GST_INFO (GST_CAT_SCHEDULING, "joining two existing chains together");
// take the contents of chain2 and merge them into chain1
chain1->elements = g_list_concat (chain1->elements, chain2->elements);
// FIXME chain changed here
chain1->num_elements += chain2->num_elements;
// FIXME chain changed here
g_free(chain2);
@ -841,9 +866,107 @@ gst_schedule_chain_elements (GstSchedule *schedule, GstElement *element1, GstEle
else chain = chain2, element = element1;
GST_INFO (GST_CAT_SCHEDULING, "adding element to existing chain");
chain->elements = g_list_prepend (chain->elements, element);
gst_schedule_chain_add_element (chain, element);
// FIXME chain changed here
chain->num_elements++;
}
}
void
gst_schedule_pad_connect_callback (GstPad *pad, GstPad *peer, GstSchedule *sched)
{
GstElement *peerelement;
GST_INFO (GST_CAT_SCHEDULING, "have pad connected callback on %s:%s",GST_DEBUG_PAD_NAME(pad));
if ((peerelement = gst_schedule_check_pad(sched,pad))) {
GST_INFO (GST_CAT_SCHEDULING, "peer is in same schedule, chaining together");
gst_schedule_chain_elements (sched, GST_ELEMENT(GST_PAD_PARENT(pad)), peerelement);
}
}
// find the chain within the schedule that holds the element, if any
GstScheduleChain *
gst_schedule_find_chain (GstSchedule *sched, GstElement *element)
{
GList *chains;
GstScheduleChain *chain;
GST_INFO (GST_CAT_SCHEDULING, "searching for element \"%s\" in chains",GST_ELEMENT_NAME(element));
chains = sched->chains;
while (chains) {
chain = (GstScheduleChain *)(chains->data);
chains = g_list_next (chains);
if (g_list_find (chain->elements, element))
return chain;
}
return NULL;
}
void
gst_schedule_chain_recursive_add (GstScheduleChain *chain, GstElement *element)
{
GList *pads;
GstPad *pad;
GstElement *peerelement;
// add the element to the chain
gst_schedule_chain_add_element (chain, element);
// now go through all the pads and see which peers can be added
pads = element->pads;
while (pads) {
pad = GST_PAD(pads->data);
pads = g_list_next (pads);
// if it's a potential peer
if ((peerelement = gst_schedule_check_pad (sched, pad))) {
// if it's not already in a chain, add it to this one
if (gst_schedule_find_chain (sched, peerelement) == NULL) {
gst_schedule_chain_recursive_add (chain, peerelement);
}
}
}
}
void
gst_schedule_pad_disconnect_callback (GstPad *pad, GstPad *peer, GstSchedule *sched)
{
GstScheduleChain *chain;
GstElement *element1, *element2;
GstScheduleChain *chain1, *chain2;
GST_INFO (GST_CAT_SCHEDULING, "have pad disconnected callback on %s:%s",GST_DEBUG_PAD_NAME(pad));
// we need to have the parent elements of each pad
element1 = GST_PAD_PARENT(pad);
element2 = GST_PAD_PARENT(peer);
GST_INFO (GST_CAT_SCHEDULING, "disconnecting elements \"%s\" and \"%s\"",
GST_ELEMENT_NAME(element1), GST_ELEMENT_NAME(element2));
// first task is to remove the old chain they belonged to.
// this can be accomplished by taking either of the elements,
// since they are guaranteed to be in the same chain
// FIXME is it potentially better to make an attempt at splitting cleaner??
chain = gst_schedule_find_chain (sched, element1);
if (chain) {
GST_INFO (GST_CAT_SCHEDULING, "destroying chain");
gst_schedule_chain_destroy (chain);
}
// now create a new chain to hold element1 and build it from scratch
chain1 = gst_schedule_chain_new (sched);
gst_schedule_chain_recursive_add (chain1, element1);
return;
// check the other element to see if it landed in the newly created chain
if (gst_schedule_find_chain (sched, element2) == NULL) {
// if not in chain, create chain and build from scratch
chain2 = gst_schedule_chain_new (sched);
gst_schedule_chain_recursive_add (chain2, element2);
}
}
@ -876,6 +999,11 @@ gst_schedule_add_element (GstSchedule *schedule, GstElement *element)
// make sure that the two elements are in the same chain
gst_schedule_chain_elements (sched,element,peerelement);
}
// now we have to attach a signal to each pad
// FIXME this is stupid
gtk_signal_connect(pad,"connected",GTK_SIGNAL_FUNC(gst_schedule_pad_connect_callback),sched);
gtk_signal_connect(pad,"disconnected",GTK_SIGNAL_FUNC(gst_schedule_pad_disconnect_callback),sched);
}
}

View file

@ -47,7 +47,7 @@ struct _GstSchedule {
};
struct _GstScheduleChain {
GstSchedule *parent;
GstSchedule *sched;
GList *elements;
gint num_elements;

View file

@ -18,7 +18,6 @@ int main(int argc,char *argv[]) {
g_print("\n\nConnecting:\n");
gst_element_connect(src,"src",identity,"sink");
gst_element_connect(identity,"src",sink,"sink");
g_print("\n\nAssembling things:\n");
g_print("\nAdding src to bin:\n");
@ -33,12 +32,17 @@ int main(int argc,char *argv[]) {
gst_bin_add(bin,sink);
g_print("there are %d managed elements in bin\n",bin->num_managed_elements);
g_print("\n\nDisconnecting sink:\n");
g_print("\nConnecting identity to sink:\n");
gst_element_connect(identity,"src",sink,"sink");
g_print("\nDisconnecting sink:\n");
gst_element_disconnect(identity,"src",sink,"sink");
g_print("\nRemoving sink from bin:\n");
gst_bin_remove(bin,sink);
g_print("there are %d managed elements in bin\n",bin->num_managed_elements);
// g_print("schedule has %d chains now\n",bin->sched->num_chains);
// g_print("\nRemoving sink from bin:\n");
// gst_bin_remove(bin,sink);
// g_print("there are %d managed elements in bin\n",bin->num_managed_elements);
// g_print("\nAdding bin to thread:\n");
// gst_bin_add(thread,bin);