Move a step closer to autoplugging. The element selection in the pipeline works.

Original commit message from CVS:
Move a step closer to autoplugging. The element selection in the
pipeline works.
Slight modification to the typefind function handling.
removed the stupid mime types in the mpeg decoders.
Adjust videosink for the new caps handling.
Modified the queue example to show an error in plan creation; Erik can you
solve this? This is the type of pipelines autoplugging uses.
This commit is contained in:
Wim Taymans 2000-12-15 16:43:26 +00:00
parent a63780a377
commit 64a740ad9b
9 changed files with 42 additions and 36 deletions

View file

@ -47,6 +47,8 @@ int main(int argc,char *argv[])
audiosink = gst_elementfactory_make("audiosink", "play_audio");
g_assert(audiosink != NULL);
gst_bin_use_cothreads (GST_BIN (bin), TRUE);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin), disksrc);
gst_bin_add(GST_BIN(bin), parse);

View file

@ -53,9 +53,6 @@ int main(int argc,char *argv[])
gst_pad_connect(gst_element_get_pad(queue,"src"),
gst_element_get_pad(audiosink,"sink"));
gst_pad_set_type_id(gst_element_get_pad(queue, "sink"),
gst_pad_get_type_id(gst_element_get_pad(audiosink, "sink")));
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("cannot autoplug pipeline\n");
exit(-1);

View file

@ -17,7 +17,7 @@
* Boston, MA 02111-1307, USA.
*/
//#define GST_DEBUG_ENABLED
#define GST_DEBUG_ENABLED
#include "gstbin.h"
#include "gstdebug.h"
@ -772,6 +772,7 @@ GST_DEBUG_PAD_NAME(pad->peer),GST_DEBUG_PAD_NAME(pad),&pad->pullfunc);
if (!pad->pullregionfunc)
pad->pullregionfunc = gst_bin_pullregionfunc_proxy;
}
//pad->threadstate = element->threadstate;
}
pads = g_list_next (pads);
}

View file

@ -118,7 +118,10 @@ gst_caps_check_compatibility (GstCaps *fromcaps, GstCaps *tocaps)
if (fromcaps->id != tocaps->id)
return FALSE;
return gst_props_check_compatibility (fromcaps->properties, tocaps->properties);
if (fromcaps->properties && tocaps->properties) {
return gst_props_check_compatibility (fromcaps->properties, tocaps->properties);
}
else return TRUE;
}

View file

@ -166,8 +166,11 @@ gst_pipeline_typefind (GstPipeline *pipeline, GstElement *element)
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
if (found) {
GstType *type;
type_id = gst_util_get_int_arg (GTK_OBJECT (typefind), "type");
//gst_pad_add_type_id (gst_element_get_pad (element, "src"), type_id);
type = gst_type_find_by_id (type_id);
gst_pad_set_caps (gst_element_get_pad (element, "src"), gst_caps_new (type->mime));
}
gst_pad_disconnect (gst_element_get_pad (element, "src"),
@ -224,7 +227,8 @@ gst_pipeline_pads_autoplug (GstElement *src, GstElement *sink)
while (srcpads && !connected) {
GstPad *srcpad = (GstPad *)srcpads->data;
connected = gst_pipeline_pads_autoplug_func (src, srcpad, sink);
if (srcpad->direction == GST_PAD_SRC)
connected = gst_pipeline_pads_autoplug_func (src, srcpad, sink);
srcpads = g_list_next(srcpads);
}
@ -369,18 +373,14 @@ gst_pipeline_autoplug (GstPipeline *pipeline)
pad = (GstPad *)pads->data;
if (pad->direction == GST_PAD_SINK) {
/*
GList *types = gst_pad_get_type_ids(pad);
if (types) {
sink_type = GPOINTER_TO_INT (types->data);
GstCaps *caps = gst_pad_get_caps (pad);
if (caps) {
sink_type = caps->id;
break;
}
else
*/
sink_type = 0;
}
g_print ("type %d\n", sink_type);
pads = g_list_next(pads);
}
@ -471,20 +471,16 @@ differ:
while (sinkpads) {
sinkpad = (GstPad *)sinkpads->data;
/*
// FIXME connect matching pads, not just the first one...
if (sinkpad->direction == GST_PAD_SINK &&
!GST_PAD_CONNECTED(sinkpad)) {
guint16 sinktype = 0;
GList *types = gst_pad_get_type_ids(sinkpad);
if (types)
sinktype = GPOINTER_TO_INT (types->data);
GstCaps *caps = gst_pad_get_caps (sinkpad);
// the queue has the type of the elements it connects
gst_pad_set_type_id (srcpad, sinktype);
gst_pad_set_type_id (gst_element_get_pad(queue, "sink"), sinktype);
gst_pad_set_caps (srcpad, caps);
gst_pad_set_caps (gst_element_get_pad(queue, "sink"), caps);
break;
}
*/
sinkpads = g_list_next(sinkpads);
}
gst_pipeline_pads_autoplug(thesrcelement, queue);

View file

@ -496,6 +496,7 @@ gst_plugin_add_type (GstPlugin *plugin, GstTypeFactory *factory)
// g_print("adding factory to plugin\n");
plugin->types = g_list_prepend (plugin->types, factory);
gst_type_register (factory);
}
/**

View file

@ -98,7 +98,6 @@ gst_type_register (GstTypeFactory *factory)
type->id = _gst_maxtype++;
type->mime = factory->mime;
type->exts = factory->exts;
//type->typefindfunc = factory->typefindfunc;
type->srcs = NULL;
type->sinks = NULL;
type->converters = g_hash_table_new (NULL, NULL);
@ -113,11 +112,9 @@ gst_type_register (GstTypeFactory *factory)
/* FIXME: do extension merging here, not that easy */
/* if there is no existing typefind function, try to use new one */
/*
if ((type->typefindfunc == gst_type_typefind_dummy ||
type->typefindfunc == NULL) && factory->typefindfunc)
type->typefindfunc = factory->typefindfunc;
*/
}
if (factory->typefindfunc) {
type->typefindfuncs = g_slist_prepend (type->typefindfuncs, factory->typefindfunc);
}
return id;
@ -558,6 +555,7 @@ gst_type_get_sink_to_src (guint16 sinkid, guint16 srcid)
GList *queue = NULL;
gint iNode, iDist, iPrev, i, iCost;
g_print ("gsttype: find %d to %d\n", srcid, sinkid);
if (sinkid == srcid) {
//FIXME return an identity element
return NULL;
@ -648,6 +646,7 @@ gst_type_load_thyself (xmlNodePtr parent)
GstTypeFactory *factory = g_new0 (GstTypeFactory, 1);
factory->mime = g_strdup (xmlNodeGetContent (field));
factory->typefindfunc = gst_type_typefind_dummy;
typeid = gst_type_register (factory);
}
return typeid;
@ -686,6 +685,8 @@ gst_type_typefind_dummy (GstBuffer *buffer, gpointer priv)
{
GstType *type = (GstType *)priv;
guint16 typeid;
GSList *funcs;
g_print ("gsttype: need to load typefind function\n");
type->typefindfuncs = NULL;
@ -693,11 +694,17 @@ gst_type_typefind_dummy (GstBuffer *buffer, gpointer priv)
typeid = gst_type_find_by_mime (type->mime);
type = gst_type_find_by_id (typeid);
/*
if (type->typefindfunc) {
return type->typefindfunc (buffer, type);
funcs = type->typefindfuncs;
while (funcs) {
GstTypeFindFunc func = (GstTypeFindFunc) funcs->data;
if (func) {
if (func (buffer, type)) return TRUE;
}
funcs = g_slist_next (funcs);
}
*/
return FALSE;
}
@ -726,7 +733,7 @@ gst_typefactory_load_thyself (xmlNodePtr parent)
factory->exts = g_strdup (xmlNodeGetContent (field));
}
else if (!strcmp (field->name, "typefind")) {
//factory->typefindfunc = gst_type_typefind_dummy;
factory->typefindfunc = gst_type_typefind_dummy;
}
field = field->next;
}

View file

@ -47,6 +47,8 @@ int main(int argc,char *argv[])
audiosink = gst_elementfactory_make("audiosink", "play_audio");
g_assert(audiosink != NULL);
gst_bin_use_cothreads (GST_BIN (bin), TRUE);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin), disksrc);
gst_bin_add(GST_BIN(bin), parse);

View file

@ -53,9 +53,6 @@ int main(int argc,char *argv[])
gst_pad_connect(gst_element_get_pad(queue,"src"),
gst_element_get_pad(audiosink,"sink"));
gst_pad_set_type_id(gst_element_get_pad(queue, "sink"),
gst_pad_get_type_id(gst_element_get_pad(audiosink, "sink")));
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("cannot autoplug pipeline\n");
exit(-1);