mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
Started work on better ghostpad management, and started to build the low- level EOS mechanism.
Original commit message from CVS: Started work on better ghostpad management, and started to build the low- level EOS mechanism. Also removed a couple of printouts that aren't needed any more.
This commit is contained in:
parent
424d4f5e4e
commit
9a0438ba93
11 changed files with 115 additions and 7 deletions
|
@ -197,10 +197,22 @@ gst_element_add_ghost_pad (GstElement *element, GstPad *pad)
|
||||||
element->pads = g_list_append (element->pads, pad);
|
element->pads = g_list_append (element->pads, pad);
|
||||||
element->numpads++;
|
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);
|
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:
|
* gst_element_get_pad:
|
||||||
* @element: element to find pad of
|
* @element: element to find pad of
|
||||||
|
|
|
@ -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_pad_list (GstElement *element);
|
||||||
GList* gst_element_get_padtemplate_list (GstElement *element);
|
GList* gst_element_get_padtemplate_list (GstElement *element);
|
||||||
void gst_element_add_ghost_pad (GstElement *element, GstPad *pad);
|
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,
|
void gst_element_connect (GstElement *src, gchar *srcpadname,
|
||||||
GstElement *dest, gchar *destpadname);
|
GstElement *dest, gchar *destpadname);
|
||||||
|
|
|
@ -182,7 +182,7 @@ gst_default_error_handler (gchar *file, gchar *function,
|
||||||
|
|
||||||
// if there's an element, print out the pertinent information
|
// if there's an element, print out the pertinent information
|
||||||
if (element) {
|
if (element) {
|
||||||
if (GST_IS_ELEMENT(element)) {
|
if (GST_IS_OBJECT(element)) {
|
||||||
path = gst_object_get_path_string(element);
|
path = gst_object_get_path_string(element);
|
||||||
fprintf(stderr,"Element: %s",path);
|
fprintf(stderr,"Element: %s",path);
|
||||||
chars = 9 + strlen(path);
|
chars = 9 + strlen(path);
|
||||||
|
|
|
@ -193,7 +193,6 @@ extern guint32 _gst_info_categories;
|
||||||
}G_STMT_END
|
}G_STMT_END
|
||||||
|
|
||||||
|
|
||||||
//#define GST_INFO_PLUGIN_LOAD 0
|
|
||||||
enum {
|
enum {
|
||||||
GST_INFO_GST_INIT = 0, // Library initialization
|
GST_INFO_GST_INIT = 0, // Library initialization
|
||||||
GST_INFO_COTHREADS, // Cothread creation, etc.
|
GST_INFO_COTHREADS, // Cothread creation, etc.
|
||||||
|
|
74
gst/gstpad.c
74
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_real_destroy (GtkObject *object);
|
||||||
|
|
||||||
static void gst_pad_push_func (GstPad *pad, GstBuffer *buf);
|
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 GstObject *pad_parent_class = NULL;
|
||||||
static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
|
static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
@ -114,6 +115,7 @@ gst_pad_init (GstPad *pad)
|
||||||
pad->getfunc = NULL;
|
pad->getfunc = NULL;
|
||||||
pad->getregionfunc = NULL;
|
pad->getregionfunc = NULL;
|
||||||
pad->qosfunc = NULL;
|
pad->qosfunc = NULL;
|
||||||
|
pad->eosfunc = gst_pad_eos_func;
|
||||||
|
|
||||||
pad->pushfunc = GST_DEBUG_FUNCPTR(gst_pad_push_func);
|
pad->pushfunc = GST_DEBUG_FUNCPTR(gst_pad_push_func);
|
||||||
pad->pullfunc = NULL;
|
pad->pullfunc = NULL;
|
||||||
|
@ -342,6 +344,25 @@ gst_pad_set_qos_function (GstPad *pad,
|
||||||
pad->qosfunc = qos;
|
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
|
static void
|
||||||
gst_pad_push_func(GstPad *pad, GstBuffer *buf)
|
gst_pad_push_func(GstPad *pad, GstBuffer *buf)
|
||||||
{
|
{
|
||||||
|
@ -1017,3 +1038,56 @@ gst_padtemplate_load_thyself (xmlNodePtr parent)
|
||||||
return factory;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -65,6 +65,8 @@ typedef void (*GstPadPushFunction) (GstPad *pad, GstBuffer *buf);
|
||||||
typedef GstBuffer *(*GstPadPullFunction) (GstPad *pad);
|
typedef GstBuffer *(*GstPadPullFunction) (GstPad *pad);
|
||||||
typedef GstBuffer *(*GstPadPullRegionFunction) (GstPad *pad, gulong offset, gulong size);
|
typedef GstBuffer *(*GstPadPullRegionFunction) (GstPad *pad, gulong offset, gulong size);
|
||||||
|
|
||||||
|
typedef gboolean (*GstPadEOSFunction) (GstPad *pad);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GST_PAD_UNKNOWN,
|
GST_PAD_UNKNOWN,
|
||||||
GST_PAD_SRC,
|
GST_PAD_SRC,
|
||||||
|
@ -101,6 +103,8 @@ struct _GstPad {
|
||||||
GstPadPullFunction pullfunc;
|
GstPadPullFunction pullfunc;
|
||||||
GstPadPullRegionFunction pullregionfunc;
|
GstPadPullRegionFunction pullregionfunc;
|
||||||
|
|
||||||
|
GstPadEOSFunction eosfunc;
|
||||||
|
|
||||||
GstObject *parent;
|
GstObject *parent;
|
||||||
GList *ghostparents;
|
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_get_function (GstPad *pad, GstPadGetFunction get);
|
||||||
void gst_pad_set_getregion_function (GstPad *pad, GstPadGetRegionFunction getregion);
|
void gst_pad_set_getregion_function (GstPad *pad, GstPadGetRegionFunction getregion);
|
||||||
void gst_pad_set_qos_function (GstPad *pad, GstPadQoSFunction qos);
|
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);
|
void gst_pad_set_caps_list (GstPad *pad, GList *caps);
|
||||||
GList* gst_pad_get_caps_list (GstPad *pad);
|
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)
|
(((pad)->peer->pullregionfunc) ? ((pad)->peer->pullregionfunc)((pad)->peer,(offset),(size)) : NULL)
|
||||||
#endif
|
#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);
|
void gst_pad_handle_qos (GstPad *pad, glong qos_message);
|
||||||
|
|
||||||
xmlNodePtr gst_pad_save_thyself (GstPad *pad, xmlNodePtr parent);
|
xmlNodePtr gst_pad_save_thyself (GstPad *pad, xmlNodePtr parent);
|
||||||
|
|
|
@ -39,6 +39,8 @@ gint _gst_modules_seqno;
|
||||||
/* global list of plugins and its sequence number */
|
/* global list of plugins and its sequence number */
|
||||||
GList *_gst_plugins;
|
GList *_gst_plugins;
|
||||||
gint _gst_plugins_seqno;
|
gint _gst_plugins_seqno;
|
||||||
|
gint _gst_plugin_elementfactories = 0;
|
||||||
|
gint _gst_plugin_types = 0;
|
||||||
/* list of paths to check for plugins */
|
/* list of paths to check for plugins */
|
||||||
GList *_gst_plugin_paths;
|
GList *_gst_plugin_paths;
|
||||||
|
|
||||||
|
@ -141,6 +143,8 @@ gst_plugin_load_all(void)
|
||||||
gst_plugin_load_recurse(path->data,NULL);
|
gst_plugin_load_recurse(path->data,NULL);
|
||||||
path = g_list_next(path);
|
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 (module != NULL) {
|
||||||
if (g_module_symbol(module,"plugin_init",(gpointer *)&initfunc)) {
|
if (g_module_symbol(module,"plugin_init",(gpointer *)&initfunc)) {
|
||||||
if ((plugin = (initfunc)(module))) {
|
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->filename = g_strdup(name);
|
||||||
plugin->loaded = TRUE;
|
plugin->loaded = TRUE;
|
||||||
_gst_modules = g_list_prepend(_gst_modules,module);
|
_gst_modules = g_list_prepend(_gst_modules,module);
|
||||||
_gst_modules_seqno++;
|
_gst_modules_seqno++;
|
||||||
_gst_plugins = g_list_prepend(_gst_plugins,plugin);
|
_gst_plugins = g_list_prepend(_gst_plugins,plugin);
|
||||||
_gst_plugins_seqno++;
|
_gst_plugins_seqno++;
|
||||||
|
_gst_plugin_elementfactories += plugin->numelements;
|
||||||
|
_gst_plugin_types += plugin->numtypes;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -299,8 +306,10 @@ gst_plugin_new (gchar *name)
|
||||||
|
|
||||||
plugin->name = g_strdup(name);
|
plugin->name = g_strdup(name);
|
||||||
plugin->longname = NULL;
|
plugin->longname = NULL;
|
||||||
plugin->types = NULL;
|
|
||||||
plugin->elements = NULL;
|
plugin->elements = NULL;
|
||||||
|
plugin->numelements = 0;
|
||||||
|
plugin->types = NULL;
|
||||||
|
plugin->numtypes = 0;
|
||||||
plugin->loaded = TRUE;
|
plugin->loaded = TRUE;
|
||||||
|
|
||||||
return plugin;
|
return plugin;
|
||||||
|
@ -495,6 +504,7 @@ gst_plugin_add_factory (GstPlugin *plugin, GstElementFactory *factory)
|
||||||
|
|
||||||
// g_print("adding factory to plugin\n");
|
// g_print("adding factory to plugin\n");
|
||||||
plugin->elements = g_list_prepend (plugin->elements, factory);
|
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");
|
// g_print("adding factory to plugin\n");
|
||||||
plugin->types = g_list_prepend (plugin->types, factory);
|
plugin->types = g_list_prepend (plugin->types, factory);
|
||||||
|
plugin->numtypes++;
|
||||||
gst_type_register (factory);
|
gst_type_register (factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,9 @@ struct _GstPlugin {
|
||||||
gchar *filename; /* filename it came from */
|
gchar *filename; /* filename it came from */
|
||||||
|
|
||||||
GList *types; /* list of types provided */
|
GList *types; /* list of types provided */
|
||||||
|
gint numtypes;
|
||||||
GList *elements; /* list of elements provided */
|
GList *elements; /* list of elements provided */
|
||||||
|
gint numelements;
|
||||||
|
|
||||||
gboolean loaded; /* if the plugin is in memory */
|
gboolean loaded; /* if the plugin is in memory */
|
||||||
};
|
};
|
||||||
|
|
|
@ -396,6 +396,7 @@ void gst_bin_schedule_func(GstBin *bin) {
|
||||||
pads = g_list_next (pads);
|
pads = g_list_next (pads);
|
||||||
DEBUG("have pad %s:%s\n",GST_DEBUG_PAD_NAME(pad));
|
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 != NULL);
|
||||||
g_assert(pad->peer->parent != NULL);
|
g_assert(pad->peer->parent != NULL);
|
||||||
//g_assert(GST_ELEMENT(pad->peer->parent)->manager != NULL);
|
//g_assert(GST_ELEMENT(pad->peer->parent)->manager != NULL);
|
||||||
|
|
|
@ -68,7 +68,7 @@ gst_type_register (GstTypeFactory *factory)
|
||||||
|
|
||||||
g_return_val_if_fail (factory != NULL, 0);
|
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);
|
id = gst_type_find_by_mime (factory->mime);
|
||||||
|
|
||||||
if (!id) {
|
if (!id) {
|
||||||
|
|
|
@ -44,7 +44,7 @@ plugin_init (GModule *module)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_info ("gsttypes: loaded %d standard types\n",i);
|
// gst_info ("gsttypes: loaded %d standard types\n",i);
|
||||||
|
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue