mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-11 02:24:13 +00:00
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:
parent
08427ffb2a
commit
3ff90ac8fb
5 changed files with 172 additions and 17 deletions
20
gst/gstpad.c
20
gst/gstpad.c
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ struct _GstSchedule {
|
|||
};
|
||||
|
||||
struct _GstScheduleChain {
|
||||
GstSchedule *parent;
|
||||
GstSchedule *sched;
|
||||
|
||||
GList *elements;
|
||||
gint num_elements;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue