diff --git a/gst/gstelement.c b/gst/gstelement.c index e0a58241a5..d973c2e690 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -197,10 +197,22 @@ gst_element_add_ghost_pad (GstElement *element, GstPad *pad) element->pads = g_list_append (element->pads, pad); element->numpads++; - /* emit the NEW_PAD signal */ + /* emit the NEW_GHOST_PAD signal */ gtk_signal_emit (GTK_OBJECT (element), gst_element_signals[NEW_GHOST_PAD], pad); } +void +gst_element_remove_ghost_pad (GstElement *element, GstPad *pad) +{ + g_return_if_fail (element != NULL); + g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + + // FIXME +} + + /** * gst_element_get_pad: * @element: element to find pad of diff --git a/gst/gstelement.h b/gst/gstelement.h index d492926d76..b7bf039ffd 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -193,6 +193,7 @@ GstPad* gst_element_get_pad (GstElement *element, gchar *name); GList* gst_element_get_pad_list (GstElement *element); GList* gst_element_get_padtemplate_list (GstElement *element); void gst_element_add_ghost_pad (GstElement *element, GstPad *pad); +void gst_element_remove_ghost_pad (GstElement *element, GstPad *pad); void gst_element_connect (GstElement *src, gchar *srcpadname, GstElement *dest, gchar *destpadname); diff --git a/gst/gstinfo.c b/gst/gstinfo.c index 685091dd79..9c9d2c0caa 100644 --- a/gst/gstinfo.c +++ b/gst/gstinfo.c @@ -182,7 +182,7 @@ gst_default_error_handler (gchar *file, gchar *function, // if there's an element, print out the pertinent information if (element) { - if (GST_IS_ELEMENT(element)) { + if (GST_IS_OBJECT(element)) { path = gst_object_get_path_string(element); fprintf(stderr,"Element: %s",path); chars = 9 + strlen(path); diff --git a/gst/gstinfo.h b/gst/gstinfo.h index 9a04c8156f..ba643292fe 100644 --- a/gst/gstinfo.h +++ b/gst/gstinfo.h @@ -193,7 +193,6 @@ extern guint32 _gst_info_categories; }G_STMT_END -//#define GST_INFO_PLUGIN_LOAD 0 enum { GST_INFO_GST_INIT = 0, // Library initialization GST_INFO_COTHREADS, // Cothread creation, etc. diff --git a/gst/gstpad.c b/gst/gstpad.c index e009cbf5ba..b897a419b0 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -52,6 +52,7 @@ static void gst_pad_get_arg (GtkObject *object,GtkArg *arg,guint id); static void gst_pad_real_destroy (GtkObject *object); static void gst_pad_push_func (GstPad *pad, GstBuffer *buf); +static gboolean gst_pad_eos_func (GstPad *pad); static GstObject *pad_parent_class = NULL; static guint gst_pad_signals[LAST_SIGNAL] = { 0 }; @@ -114,6 +115,7 @@ gst_pad_init (GstPad *pad) pad->getfunc = NULL; pad->getregionfunc = NULL; pad->qosfunc = NULL; + pad->eosfunc = gst_pad_eos_func; pad->pushfunc = GST_DEBUG_FUNCPTR(gst_pad_push_func); pad->pullfunc = NULL; @@ -342,6 +344,25 @@ gst_pad_set_qos_function (GstPad *pad, pad->qosfunc = qos; } +/** + * gst_pad_set_eos_function: + * @pad: the pad to set the eos function for + * @qos: the eos function + * + * Set the given EOS function for the pad + */ +void +gst_pad_set_eos_function (GstPad *pad, + GstPadEOSFunction eos) +{ + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + + pad->eosfunc = eos; +} + + + static void gst_pad_push_func(GstPad *pad, GstBuffer *buf) { @@ -1017,3 +1038,56 @@ gst_padtemplate_load_thyself (xmlNodePtr parent) return factory; } + +static gboolean +gst_pad_eos_func(GstPad *pad) +{ + GstElement *element; + GList *pads; + GstPad *srcpad; + gboolean result, success = TRUE; + + g_return_val_if_fail (pad != NULL, FALSE); + g_return_val_if_fail (GST_IS_PAD(pad), FALSE); + + INFO(GST_INFO_PADS,"attempting to set EOS on sink pad %s:%s",GST_DEBUG_PAD_NAME(pad)); + + element = GST_ELEMENT(gst_pad_get_parent (pad)); +// g_return_val_if_fail (element != NULL, FALSE); +// g_return_val_if_fail (GST_IS_ELEMENT(element), FALSE); + + pads = gst_element_get_pad_list(element); + while (pads) { + srcpad = GST_PAD(pads->data); + pads = g_list_next(pads); + + if (gst_pad_get_direction(srcpad) == GST_PAD_SRC) { + result = gst_pad_eos(srcpad); + if (result == FALSE) success = FALSE; + } + } + + if (result == FALSE) return FALSE; + + INFO(GST_INFO_PADS,"set EOS on sink pad %s:%s",GST_DEBUG_PAD_NAME(pad)); + GST_FLAG_SET (pad, GST_PAD_EOS); + + return TRUE; +} + +gboolean +gst_pad_set_eos(GstPad *pad) +{ + g_return_val_if_fail (pad != NULL, FALSE); + g_return_val_if_fail (GST_IS_PAD(pad), FALSE); + g_return_val_if_fail (GST_PAD_CONNECTED(pad), FALSE); + + INFO(GST_INFO_PADS,"attempting to set EOS on src pad %s:%s",GST_DEBUG_PAD_NAME(pad)); + + if (!gst_pad_eos(pad)) return FALSE; + + INFO(GST_INFO_PADS,"set EOS on src pad %s:%s",GST_DEBUG_PAD_NAME(pad)); + GST_FLAG_SET (pad, GST_PAD_EOS); + + return TRUE; +} diff --git a/gst/gstpad.h b/gst/gstpad.h index 6220115f8f..eeba2c0989 100644 --- a/gst/gstpad.h +++ b/gst/gstpad.h @@ -65,6 +65,8 @@ typedef void (*GstPadPushFunction) (GstPad *pad, GstBuffer *buf); typedef GstBuffer *(*GstPadPullFunction) (GstPad *pad); typedef GstBuffer *(*GstPadPullRegionFunction) (GstPad *pad, gulong offset, gulong size); +typedef gboolean (*GstPadEOSFunction) (GstPad *pad); + typedef enum { GST_PAD_UNKNOWN, GST_PAD_SRC, @@ -101,6 +103,8 @@ struct _GstPad { GstPadPullFunction pullfunc; GstPadPullRegionFunction pullregionfunc; + GstPadEOSFunction eosfunc; + GstObject *parent; GList *ghostparents; @@ -169,6 +173,7 @@ void gst_pad_set_chain_function (GstPad *pad, GstPadChainFunction chain); void gst_pad_set_get_function (GstPad *pad, GstPadGetFunction get); void gst_pad_set_getregion_function (GstPad *pad, GstPadGetRegionFunction getregion); void gst_pad_set_qos_function (GstPad *pad, GstPadQoSFunction qos); +void gst_pad_set_eos_function (GstPad *pad, GstPadEOSFunction eos); void gst_pad_set_caps_list (GstPad *pad, GList *caps); GList* gst_pad_get_caps_list (GstPad *pad); @@ -206,6 +211,9 @@ GstBuffer* gst_pad_pull_region (GstPad *pad, gulong offset, gulong size); (((pad)->peer->pullregionfunc) ? ((pad)->peer->pullregionfunc)((pad)->peer,(offset),(size)) : NULL) #endif +#define gst_pad_eos(pad) ((pad)->peer->eosfunc((pad)->peer)) +gboolean gst_pad_set_eos (GstPad *pad); + void gst_pad_handle_qos (GstPad *pad, glong qos_message); xmlNodePtr gst_pad_save_thyself (GstPad *pad, xmlNodePtr parent); diff --git a/gst/gstplugin.c b/gst/gstplugin.c index 4bb90a71cd..03d0fb2599 100644 --- a/gst/gstplugin.c +++ b/gst/gstplugin.c @@ -39,6 +39,8 @@ gint _gst_modules_seqno; /* global list of plugins and its sequence number */ GList *_gst_plugins; gint _gst_plugins_seqno; +gint _gst_plugin_elementfactories = 0; +gint _gst_plugin_types = 0; /* list of paths to check for plugins */ GList *_gst_plugin_paths; @@ -141,6 +143,8 @@ gst_plugin_load_all(void) gst_plugin_load_recurse(path->data,NULL); path = g_list_next(path); } + INFO(GST_INFO_PLUGIN_LOADING,"loaded %d plugins with %d elements and %d types", + _gst_plugins_seqno,_gst_plugin_elementfactories,_gst_plugin_types); } /** @@ -260,13 +264,16 @@ gst_plugin_load_absolute (gchar *name) if (module != NULL) { if (g_module_symbol(module,"plugin_init",(gpointer *)&initfunc)) { if ((plugin = (initfunc)(module))) { - INFO(GST_INFO_PLUGIN_LOADING,"plugin %s loaded", plugin->name); + INFO(GST_INFO_PLUGIN_LOADING,"plugin \"%s\" loaded: %d elements, %d types", + plugin->name,plugin->numelements,plugin->numtypes); plugin->filename = g_strdup(name); plugin->loaded = TRUE; _gst_modules = g_list_prepend(_gst_modules,module); _gst_modules_seqno++; _gst_plugins = g_list_prepend(_gst_plugins,plugin); _gst_plugins_seqno++; + _gst_plugin_elementfactories += plugin->numelements; + _gst_plugin_types += plugin->numtypes; return TRUE; } } @@ -299,8 +306,10 @@ gst_plugin_new (gchar *name) plugin->name = g_strdup(name); plugin->longname = NULL; - plugin->types = NULL; plugin->elements = NULL; + plugin->numelements = 0; + plugin->types = NULL; + plugin->numtypes = 0; plugin->loaded = TRUE; return plugin; @@ -495,6 +504,7 @@ gst_plugin_add_factory (GstPlugin *plugin, GstElementFactory *factory) // g_print("adding factory to plugin\n"); plugin->elements = g_list_prepend (plugin->elements, factory); + plugin->numelements++; } /** @@ -512,6 +522,7 @@ gst_plugin_add_type (GstPlugin *plugin, GstTypeFactory *factory) // g_print("adding factory to plugin\n"); plugin->types = g_list_prepend (plugin->types, factory); + plugin->numtypes++; gst_type_register (factory); } diff --git a/gst/gstplugin.h b/gst/gstplugin.h index 7f9e535ccf..3f8c2b463a 100644 --- a/gst/gstplugin.h +++ b/gst/gstplugin.h @@ -40,7 +40,9 @@ struct _GstPlugin { gchar *filename; /* filename it came from */ GList *types; /* list of types provided */ + gint numtypes; GList *elements; /* list of elements provided */ + gint numelements; gboolean loaded; /* if the plugin is in memory */ }; diff --git a/gst/gstscheduler.c b/gst/gstscheduler.c index 3b9b326caf..2d28b965a1 100644 --- a/gst/gstscheduler.c +++ b/gst/gstscheduler.c @@ -396,6 +396,7 @@ void gst_bin_schedule_func(GstBin *bin) { pads = g_list_next (pads); DEBUG("have pad %s:%s\n",GST_DEBUG_PAD_NAME(pad)); +if (pad->peer == NULL) ERROR(pad,"peer is null!"); g_assert(pad->peer != NULL); g_assert(pad->peer->parent != NULL); //g_assert(GST_ELEMENT(pad->peer->parent)->manager != NULL); diff --git a/gst/gsttype.c b/gst/gsttype.c index ac31518331..4b20848693 100644 --- a/gst/gsttype.c +++ b/gst/gsttype.c @@ -68,7 +68,7 @@ gst_type_register (GstTypeFactory *factory) g_return_val_if_fail (factory != NULL, 0); - DEBUG("type register %s\n", factory->mime); +// INFO(GST_INFO_TYPES,"type register %s", factory->mime); id = gst_type_find_by_mime (factory->mime); if (!id) { diff --git a/gst/types/gsttypes.c b/gst/types/gsttypes.c index 88ad63cfbf..6165455d6d 100644 --- a/gst/types/gsttypes.c +++ b/gst/types/gsttypes.c @@ -44,7 +44,7 @@ plugin_init (GModule *module) i++; } - gst_info ("gsttypes: loaded %d standard types\n",i); +// gst_info ("gsttypes: loaded %d standard types\n",i); return plugin; }