From: <wt...@fr...> - 2004-12-09 23:27:52
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Thu Dec 09 2004 15:28:43 PST Branch: BRANCH-THREADED Log message: * docs/design/part-MT-refcounting.txt: * gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock), (gst_bin_add_func), (gst_bin_add), (gst_bin_remove_func), (gst_bin_remove), (gst_bin_iterate_elements), (bin_element_is_sink), (gst_bin_get_state), (gst_bin_change_state), (gst_bin_get_by_name), (gst_bin_get_by_name_recurse_up), (gst_bin_get_by_interface), (gst_bin_get_all_by_interface): * gst/gstbin.h: * gst/gstbuffer.h: * gst/gstbus.h: * gst/gstcaps.h: * gst/gstclock.h: * gst/gstdata.h: * gst/gstelement.h: * gst/gstevent.h: * gst/gstmessage.h: * gst/gststructure.h: More MT fixes. Header cleanups, design doc update. Modified files: . : ChangeLog docs/design : part-MT-refcounting.txt gst : gstbin.c gstbin.h gstbuffer.h gstbus.h gstcaps.h gstclock.h gstdata.h gstelement.h gstevent.h gstmessage.h gststructure.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.858.2.4&r2=1.858.2.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-MT-refcounting.txt.diff?r1=1.1.2.1&r2=1.1.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.206.2.2&r2=1.206.2.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.65.2.2&r2=1.65.2.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.h.diff?r1=1.78.2.1&r2=1.78.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbus.h.diff?r1=1.1.2.1&r2=1.1.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.h.diff?r1=1.82.2.1&r2=1.82.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.h.diff?r1=1.33.2.1&r2=1.33.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstdata.h.diff?r1=1.19&r2=1.19.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.177.2.2&r2=1.177.2.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.51.2.1&r2=1.51.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstmessage.h.diff?r1=1.1.2.1&r2=1.1.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gststructure.h.diff?r1=1.17&r2=1.17.2.1 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.858.2.4 retrieving revision 1.858.2.5 diff -u -d -r1.858.2.4 -r1.858.2.5 --- ChangeLog 9 Dec 2004 22:03:28 -0000 1.858.2.4 +++ ChangeLog 9 Dec 2004 23:28:30 -0000 1.858.2.5 @@ -1,3 +1,24 @@ +2004-12-10 Wim Taymans <wi...@fl...> + + * docs/design/part-MT-refcounting.txt: + * gst/gstbin.c: (gst_bin_set_index), (gst_bin_set_clock), + (gst_bin_add_func), (gst_bin_add), (gst_bin_remove_func), + (gst_bin_remove), (gst_bin_iterate_elements), + (bin_element_is_sink), (gst_bin_get_state), (gst_bin_change_state), + (gst_bin_get_by_name), (gst_bin_get_by_name_recurse_up), + (gst_bin_get_by_interface), (gst_bin_get_all_by_interface): + * gst/gstbin.h: + * gst/gstbuffer.h: + * gst/gstbus.h: + * gst/gstcaps.h: + * gst/gstclock.h: + * gst/gstdata.h: + * gst/gstelement.h: + * gst/gstevent.h: + * gst/gstmessage.h: + * gst/gststructure.h: + More MT fixes. Header cleanups, design doc update. 2004-12-09 Wim Taymans <wi...@fl...> * gst/gstpad.c: (gst_pad_custom_new), (gst_pad_get_direction), Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.206.2.2 retrieving revision 1.206.2.3 diff -u -d -r1.206.2.2 -r1.206.2.3 --- gstbin.c 9 Dec 2004 21:08:13 -0000 1.206.2.2 +++ gstbin.c 9 Dec 2004 23:28:31 -0000 1.206.2.3 @@ -62,8 +62,8 @@ static void gst_bin_set_clock (GstElement * element, GstClock * clock); static GstClock *gst_bin_get_clock (GstElement * element); -static void gst_bin_add_func (GstBin * bin, GstElement * element); -static void gst_bin_remove_func (GstBin * bin, GstElement * element); +static gboolean gst_bin_add_func (GstBin * bin, GstElement * element); +static gboolean gst_bin_remove_func (GstBin * bin, GstElement * element); #ifndef GST_DISABLE_LOADSAVE static xmlNodePtr gst_bin_save_thyself (GstObject * object, xmlNodePtr parent); @@ -252,46 +252,71 @@ return result; } -static void +static gboolean gst_bin_add_func (GstBin * bin, GstElement * element) { GstPipeline *manager; + gchar *elem_name; + GST_LOCK (element); /* the element must not already have a parent */ - g_return_if_fail (GST_ELEMENT_PARENT (element) == NULL); + if (G_UNLIKELY (GST_ELEMENT_PARENT (element) != NULL)) + goto had_parent; + elem_name = g_strdup (GST_ELEMENT_NAME (element)); + GST_UNLOCK (element); GST_LOCK (bin); + /* we obviously can't add ourself to ourself */ + if (G_UNLIKELY (GST_ELEMENT_CAST (element) == GST_ELEMENT_CAST (bin))) + goto adding_itself; /* then check to see if the element's name is already taken in the bin, - * we can sefely take the lock here. */ - if (gst_object_check_uniqueness (bin->children, - GST_ELEMENT_NAME (element)) == FALSE) { - g_warning ("Name %s is not unique in bin %s, not adding\n", - GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin)); - GST_UNLOCK (bin); - return; - } + * we can safely take the lock here. We can leave the element locked + * as it will not be in the bin. This check is probably bogus because + * you can safely change the element name after adding it to the bin. */ + if (G_UNLIKELY (gst_object_check_uniqueness (bin->children, + elem_name) == FALSE)) + goto duplicate_name; manager = GST_ELEMENT (bin)->manager; gst_element_set_manager (element, manager); - if (GST_STATE (element) > GST_STATE (bin)) { - GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, - "setting state to receive element \"%s\"", GST_OBJECT_NAME (element)); - gst_element_set_state ((GstElement *) bin, GST_STATE (element)); - /* set the element's parent and add the element to the bin's list of children */ gst_object_set_parent (GST_OBJECT (element), GST_OBJECT (bin)); bin->children = g_list_prepend (bin->children, element); bin->numchildren++; bin->children_cookie++; + GST_UNLOCK (bin); GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin, "added element \"%s\"", - GST_OBJECT_NAME (element)); + elem_name); + g_free (elem_name); + g_signal_emit (G_OBJECT (bin), gst_bin_signals[ELEMENT_ADDED], 0, element); + return TRUE; + /* ERROR handling here */ +had_parent: + g_warning ("Element %s already has parent %p", GST_ELEMENT_NAME (element), + bin); + return FALSE; +adding_itself: + g_warning ("Cannot add bin %s to itself", GST_ELEMENT_NAME (bin)); GST_UNLOCK (bin); - g_signal_emit (G_OBJECT (bin), gst_bin_signals[ELEMENT_ADDED], 0, element); +duplicate_name: + g_warning ("Name %s is not unique in bin %s, not adding", + elem_name, GST_ELEMENT_NAME (bin)); /** @@ -301,64 +326,88 @@ * * Adds the given element to the bin. Sets the element's parent, and thus * takes ownership of the element. An element can only be added to one bin. + * + * Returns: TRUE if the element could be added, FALSE on wrong parameters or + * the bin does not want to accept the element. + * MT safe. */ -void +gboolean gst_bin_add (GstBin * bin, GstElement * element) GstBinClass *bclass; + gboolean result; - g_return_if_fail (GST_IS_BIN (bin)); - g_return_if_fail (GST_IS_ELEMENT (element)); - GST_CAT_INFO_OBJECT (GST_CAT_PARENTAGE, bin, "adding element \"%s\"", + g_return_val_if_fail (GST_IS_BIN (bin), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); bclass = GST_BIN_GET_CLASS (bin); - if (bclass->add_element) { - bclass->add_element (bin, element); - } else { - g_warning ("cannot add element %s to bin %s", + if (G_UNLIKELY (bclass->add_element == NULL)) + goto no_function; + GST_CAT_DEBUG (GST_CAT_PARENTAGE, "adding element %s to bin %s", + GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin)); + result = bclass->add_element (bin, element); + return result; +no_function: + g_warning ("adding elements to bin %s is not supported", + GST_ELEMENT_NAME (bin)); gst_bin_remove_func (GstBin * bin, GstElement * element) /* the element must have its parent set to the current bin */ - g_return_if_fail (GST_ELEMENT_PARENT (element) == (GstObject *) bin); + /* the element must not already have a parent */ + if (G_UNLIKELY (GST_ELEMENT_PARENT (element) != GST_ELEMENT_CAST (bin))) + goto wrong_parent; - GST_LOCK (bin); - /* the element must be in the bin's list of children */ - if (g_list_find (bin->children, element) == NULL) { - g_warning ("no element \"%s\" in bin \"%s\"\n", GST_ELEMENT_NAME (element), - GST_ELEMENT_NAME (bin)); + GST_LOCK (bin); + /* the element must be in the bin's list of children, is this + * check redundant with PARENT checking? */ + if (G_UNLIKELY (g_list_find (bin->children, element) == NULL)) + goto not_in_bin; /* now remove the element from the list of elements */ bin->children = g_list_remove (bin->children, element); bin->numchildren--; GST_CAT_INFO_OBJECT (GST_CAT_PARENTAGE, bin, "removed child \"%s\"", - GST_UNLOCK (bin); gst_element_set_manager (element, NULL); - /* ref as we're going to emit a signal */ - gst_object_ref (GST_OBJECT (element)); + /* we should ref here to avoid bad app behaviour.. */ gst_object_unparent (GST_OBJECT (element)); g_signal_emit (G_OBJECT (bin), gst_bin_signals[ELEMENT_REMOVED], 0, element); - /* element is really out of our control now */ - gst_object_unref (GST_OBJECT (element)); +wrong_parent: + g_warning ("Element %s is not in bin %p", GST_ELEMENT_NAME (element), bin); +not_in_bin: + g_warning ("Element %s is not in bin %s", elem_name, GST_ELEMENT_NAME (bin)); @@ -372,27 +421,42 @@ * will be freed in the process of removing it from the bin. If you * want the element to still exist after removing, you need to call * #gst_object_ref before removing it from the bin. + * Returns: TRUE if the element could be removed, FALSE on wrong parameters or + * the bin does not want to remove the element. gst_bin_remove (GstBin * bin, GstElement * element) - GST_CAT_DEBUG (GST_CAT_PARENTAGE, "[%s]: trying to remove child %s", - GST_ELEMENT_NAME (bin), GST_ELEMENT_NAME (element)); - if (bclass->remove_element) { - bclass->remove_element (bin, element); - g_warning ("cannot remove elements from bin %s\n", GST_ELEMENT_NAME (bin)); + if (G_UNLIKELY (bclass->remove_element == NULL)) + GST_CAT_DEBUG (GST_CAT_PARENTAGE, "removing element %s from bin %s", + result = bclass->remove_element (bin, element); + g_warning ("removing elements from bin %s is not supported", +/* + * bin iterator + */ typedef struct _GstBinIterator GstIterator iterator; @@ -436,14 +500,18 @@ * after usage. * Returns: a #GstIterator of #GstElements. gst_iterator_free after - * use. + * use. returns NULL when passing bad parameters. GstIterator * gst_bin_iterate_elements (GstBin * bin) GstBinIterator *result; + g_return_val_if_fail (GST_IS_BIN (bin), NULL); + /* ne need to lock, nothing can change here */ result = (GstBinIterator *) gst_iterator_new (sizeof (GstBinIterator), GST_GET_LOCK (bin), &bin->children_cookie, @@ -451,6 +519,7 @@ (GstIteratorResyncFunction) gst_bin_iterator_resync, (GstIteratorFreeFunction) gst_bin_iterator_free); result->bin = GST_BIN (gst_object_ref (GST_OBJECT (bin))); result->list = bin->children; @@ -478,6 +547,7 @@ GList *pads; gboolean connected_src = FALSE; + /* FIXME not MT safe */ for (pads = child->srcpads; pads; pads = g_list_next (pads)) { GstPad *pad = GST_PAD (pads->data); @@ -514,6 +584,8 @@ * Returns: a #GstIterator of #GstElements. gst_iterator_free after use. gst_bin_iterate_sinks (GstBin * bin) @@ -556,6 +628,8 @@ /* we cannot take the state lock yet as we might block when querying * the children, holding the lock too long for no reason */ + /* FIXME, we can loop the list ourselves instead of creating the + * iterator */ children = gst_bin_iterate_sinks (bin); child = gst_iterator_find_custom (children, timeout, (GCompareFunc) bin_find_pending_child); @@ -597,8 +671,6 @@ GQueue *elem_queue; /* list of elements waiting for a state change */ - g_return_val_if_fail (GST_IS_BIN (element), GST_STATE_FAILURE); bin = GST_BIN (element); old_state = GST_STATE (element); @@ -616,6 +688,7 @@ /* first step, find all sink elements, these are the elements * without (linked) source pads. */ + /* FIXME, we can iterate the list ourselves */ sinks = gst_bin_iterate_sinks (bin); while (!done) { gpointer child; @@ -767,27 +840,30 @@ * Get the element with the given name from this bin. This * function recurses into subbins. - * Returns: the element with the given name + * Returns: the element with the given name. Returns NULL if the + * element is not found or when bad parameters were given. GstElement * gst_bin_get_by_name (GstBin * bin, const gchar * name) - const GList *children; + GList *children; GstElement *result = NULL; - g_return_val_if_fail (bin != NULL, result); - g_return_val_if_fail (GST_IS_BIN (bin), result); - g_return_val_if_fail (name != NULL, result); + g_return_val_if_fail (name != NULL, NULL); GST_CAT_INFO (GST_CAT_PARENTAGE, "[%s]: looking up child element %s", GST_ELEMENT_NAME (bin), name); - children = bin->children; - while (children) { - GstElement *child = GST_ELEMENT (children->data); + for (children = bin->children; children; children = g_list_next (children)) { + GstElement *child = GST_ELEMENT_CAST (children->data); - if (!strcmp (GST_OBJECT_NAME (child), name)) { + GST_LOCK (child); + if (!strcmp (GST_ELEMENT_NAME (child), name)) { + GST_UNLOCK (child); result = child; break; } @@ -797,7 +873,6 @@ break; } - children = g_list_next (children); } @@ -812,25 +887,28 @@ * Get the element with the given name from this bin. If the * element is not found, a recursion is performed on the parent bin. + * Returns: the element with the given name or NULL when the element + * was not found or bad parameters were given. gst_bin_get_by_name_recurse_up (GstBin * bin, const gchar * name) - GstElement *result = NULL; - GstObject *parent; + GstElement *result; - g_return_val_if_fail (bin != NULL, NULL); g_return_val_if_fail (GST_IS_BIN (bin), NULL); g_return_val_if_fail (name != NULL, NULL); result = gst_bin_get_by_name (bin, name); if (!result) { - parent = gst_object_get_parent (GST_OBJECT (bin)); + GstObject *parent; + parent = gst_object_get_parent (GST_OBJECT_CAST (bin)); if (parent && GST_IS_BIN (parent)) { - result = gst_bin_get_by_name_recurse_up (GST_BIN (parent), name); + result = gst_bin_get_by_name_recurse_up (GST_BIN_CAST (parent), name); gst_object_unref (parent); @@ -850,21 +928,22 @@ * gst_bin_get_all_by_interface(). The function recurses bins inside bins. * Returns: An element inside the bin implementing the interface. gst_bin_get_by_interface (GstBin * bin, GType interface) - const GList *walk; + GList *walk; g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface), NULL); - walk = bin->children; - while (walk) { + for (walk = bin->children; walk; walk = g_list_next (walk)) { if (G_TYPE_CHECK_INSTANCE_TYPE (walk->data, interface)) { - result = GST_ELEMENT (walk->data); + result = GST_ELEMENT_CAST (walk->data); if (GST_IS_BIN (walk->data)) { @@ -872,7 +951,6 @@ if (result) - walk = g_list_next (walk); @@ -890,29 +968,27 @@ * g_list_free() after use. * Returns: The elements inside the bin implementing the interface. GList * gst_bin_get_all_by_interface (GstBin * bin, GType interface) GList *ret = NULL; - GST_DEBUG_OBJECT (bin, "element %s implements requested interface", - GST_ELEMENT_NAME (GST_ELEMENT (walk->data))); ret = g_list_prepend (ret, walk->data); ret = g_list_concat (ret, gst_bin_get_all_by_interface (GST_BIN (walk->data), interface)); Index: gstbin.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.65.2.2 retrieving revision 1.65.2.3 diff -u -d -r1.65.2.2 -r1.65.2.3 --- gstbin.h 9 Dec 2004 21:08:13 -0000 1.65.2.2 +++ gstbin.h 9 Dec 2004 23:28:31 -0000 1.65.2.3 @@ -37,6 +37,7 @@ #define GST_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BIN, GstBinClass)) #define GST_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BIN, GstBin)) #define GST_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BIN, GstBinClass)) +#define GST_BIN_CAST(obj) ((GstBin*)(obj)) typedef enum { GST_BIN_FLAG_FIXED_CLOCK, @@ -56,25 +57,30 @@ GstElement element; /*< public >*/ /* with LOCK */ - /* our children */ + /* our children, subclass are supposed to update these + * fields to reflect their state with _iterate_*() */ gint numchildren; GList *children; guint32 children_cookie; + /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; struct _GstBinClass { GstElementClass parent_class; - /* vtable */ - void (*add_element) (GstBin *bin, GstElement *element); - void (*remove_element) (GstBin *bin, GstElement *element); + /*< public >*/ /* signals */ void (*element_added) (GstBin *bin, GstElement *child); void (*element_removed) (GstBin *bin, GstElement *child); + /*< protected >*/ + /* vtable */ + gboolean (*add_element) (GstBin *bin, GstElement *element); + gboolean (*remove_element) (GstBin *bin, GstElement *element); @@ -82,8 +88,8 @@ GstElement* gst_bin_new (const gchar *name); /* add and remove elements from the bin */ -void gst_bin_add (GstBin *bin, GstElement *element); -void gst_bin_remove (GstBin *bin, GstElement *element); +gboolean gst_bin_add (GstBin *bin, GstElement *element); +gboolean gst_bin_remove (GstBin *bin, GstElement *element); /* retrieve a single child */ GstElement* gst_bin_get_by_name (GstBin *bin, const gchar *name); Index: gstbuffer.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbuffer.h,v retrieving revision 1.78.2.1 retrieving revision 1.78.2.2 diff -u -d -r1.78.2.1 -r1.78.2.2 --- gstbuffer.h 8 Dec 2004 17:40:36 -0000 1.78.2.1 +++ gstbuffer.h 9 Dec 2004 23:28:31 -0000 1.78.2.2 @@ -108,6 +108,7 @@ struct _GstBuffer { GstData data_type; + /*< public >*/ /* with COW */ /* pointer to data and its size */ guint8 *data; /* pointer to buffer data */ guint size; /* size of buffer data */ @@ -130,9 +131,11 @@ guint64 offset; guint64 offset_end; GstBufferFreeDataFunc free_data; gpointer buffer_private; @@ -167,7 +170,7 @@ gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2); GstBuffer* gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len); -/* --- private --- */ +/* --- protected --- */ void _gst_buffer_initialize (void); void gst_buffer_default_free (GstBuffer *buffer); Index: gstbus.h RCS file: /cvs/gstreamer/gstreamer/gst/Attic/gstbus.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- gstbus.h 8 Dec 2004 18:05:14 -0000 1.1.2.1 +++ gstbus.h 9 Dec 2004 23:28:31 -0000 1.1.2.2 @@ -34,6 +34,7 @@ #define GST_BUS_CLASS(bclass) (G_TYPE_CHECK_CLASS_CAST ((bclass), GST_TYPE_BUS, GstBusClass)) #define GST_IS_BUS_CLASS(bclass) (G_TYPE_CHECK_CLASS_TYPE ((bclass), GST_TYPE_BUS)) #define GST_BUS_GET_CLASS(bus) (G_TYPE_INSTANCE_GET_CLASS ((bus), GST_TYPE_BUS, GstBusClass)) +#define GST_BUS_CAST(bus) ((GstBus*)(bus)) typedef enum @@ -51,6 +52,7 @@ struct _GstBus { GstObject object; GAsyncQueue *queue; GstBusSyncHandler sync_handler; @@ -59,12 +61,14 @@ gint control_socket[2]; GIOChannel *io_channel; struct _GstBusClass { GstObjectClass parent_class; Index: gstcaps.h RCS file: /cvs/gstreamer/gstreamer/gst/gstcaps.h,v retrieving revision 1.82.2.1 retrieving revision 1.82.2.2 diff -u -d -r1.82.2.1 -r1.82.2.2 --- gstcaps.h 8 Dec 2004 17:40:36 -0000 1.82.2.1 +++ gstcaps.h 9 Dec 2004 23:28:31 -0000 1.82.2.2 @@ -59,18 +59,23 @@ struct _GstCaps { GType type; /* refcounting */ GstAtomicInt refcount; guint16 flags; GPtrArray *structs; struct _GstStaticCaps { GstCaps caps; const char *string; Index: gstclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.h,v retrieving revision 1.33.2.1 retrieving revision 1.33.2.2 diff -u -d -r1.33.2.1 -r1.33.2.2 --- gstclock.h 8 Dec 2004 17:40:36 -0000 1.33.2.1 +++ gstclock.h 9 Dec 2004 23:28:31 -0000 1.33.2.2 #define GST_CLOCK_CLASS(cclass) (G_TYPE_CHECK_CLASS_CAST ((cclass), GST_TYPE_CLOCK, GstClockClass)) #define GST_IS_CLOCK_CLASS(cclass) (G_TYPE_CHECK_CLASS_TYPE ((cclass), GST_TYPE_CLOCK)) #define GST_CLOCK_GET_CLASS(clock) (G_TYPE_INSTANCE_GET_CLASS ((clock), GST_TYPE_CLOCK, GstClockClass)) +#define GST_CLOCK_CAST(clock) ((GstClock*)(clock)) typedef guint64 GstClockTime; typedef gint64 GstClockTimeDiff; @@ -73,14 +74,14 @@ GstClockID id, gpointer user_data); - /* --- protected --- */ GST_CLOCK_ENTRY_OK, GST_CLOCK_ENTRY_EARLY, GST_CLOCK_ENTRY_RESTART } GstClockEntryStatus; GST_CLOCK_ENTRY_SINGLE, GST_CLOCK_ENTRY_PERIODIC } GstClockEntryType; @@ -93,7 +94,7 @@ #define GST_CLOCK_ENTRY_STATUS(entry) ((entry)->status) struct _GstClockEntry { GstClock *clock; GstClockEntryType type; GstClockTime time; @@ -128,13 +129,14 @@ struct _GstClock { GstClockFlags flags; GstClockTime start_time; GstClockTime last_time; - /* --- private --- */ guint64 resolution; GList *entries; GMutex *active_mutex; @@ -147,6 +149,7 @@ struct _GstClockClass { /* vtable */ gdouble (*change_speed) (GstClock *clock, gdouble oldspeed, gdouble newspeed); @@ -162,6 +165,8 @@ GstClockEntryStatus (*wait_async) (GstClock *clock, GstClockEntry *entry); void (*unschedule) (GstClock *clock, GstClockEntry *entry); void (*unlock) (GstClock *clock, GstClockEntry *entry); Index: gstdata.h RCS file: /cvs/gstreamer/gstreamer/gst/gstdata.h,v retrieving revision 1.19 retrieving revision 1.19.2.1 diff -u -d -r1.19 -r1.19.2.1 --- gstdata.h 15 Mar 2004 14:43:21 -0000 1.19 +++ gstdata.h 9 Dec 2004 23:28:31 -0000 1.19.2.1 @@ -69,15 +69,18 @@ struct _GstData { GType type; GstAtomicInt refcount; guint16 flags; /* utility function pointers, can override default */ GstDataFreeFunction free; /* free the data */ GstDataCopyFunction copy; /* copy the data */ Index: gstelement.h RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.177.2.2 retrieving revision 1.177.2.3 diff -u -d -r1.177.2.2 -r1.177.2.3 --- gstelement.h 9 Dec 2004 21:08:13 -0000 1.177.2.2 +++ gstelement.h 9 Dec 2004 23:28:31 -0000 1.177.2.3 @@ -115,7 +115,7 @@ } GstElementFlags; #define GST_ELEMENT_NAME(obj) (GST_OBJECT_NAME(obj)) -#define GST_ELEMENT_PARENT(obj) (GST_OBJECT_PARENT(obj)) +#define GST_ELEMENT_PARENT(obj) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(obj))) #define GST_ELEMENT_MANAGER(obj) (GST_ELEMENT_CAST(obj)->manager) #define GST_ELEMENT_CLOCK(obj) (GST_ELEMENT_CAST(obj)->clock) #define GST_ELEMENT_PADS(obj) (GST_ELEMENT_CAST(obj)->pads) @@ -182,6 +182,7 @@ struct _GstElementClass { GstObjectClass parent_class; /* the element details */ GstElementDetails details; @@ -199,6 +200,7 @@ void (*pad_removed) (GstElement *element, GstPad *pad); void (*no_more_pads) (GstElement *element); /* request/release pads */ @@ -232,6 +234,7 @@ gboolean (*query) (GstElement *element, GstQueryType type, GstFormat *format, gint64 *value); gpointer _gst_reserved[GST_PADDING - 1]; Index: gstevent.h RCS file: /cvs/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.51.2.1 retrieving revision 1.51.2.2 diff -u -d -r1.51.2.1 -r1.51.2.2 --- gstevent.h 8 Dec 2004 17:40:36 -0000 1.51.2.1 +++ gstevent.h 9 Dec 2004 23:28:31 -0000 1.51.2.2 @@ -154,6 +154,7 @@ struct _GstEvent { GstData data; GstEventType type; guint64 timestamp; GstObject *src; @@ -182,6 +183,7 @@ } structure; } event_data; Index: gstmessage.h RCS file: /cvs/gstreamer/gstreamer/gst/Attic/gstmessage.h,v --- gstmessage.h 8 Dec 2004 18:05:14 -0000 1.1.2.1 +++ gstmessage.h 9 Dec 2004 23:28:31 -0000 1.1.2.2 @@ -62,13 +62,15 @@ struct _GstMessage { + /*< public >*/ /* with MESSAGE_LOCK */ + GMutex *lock; /* lock and cond for async delivery */ + GCond *cond; GstMessageType type; guint64 timestamp; GstObject *src; - GMutex *lock; /* lock and cond for async delivery */ - GCond *cond; union { struct { GError *error; @@ -82,6 +84,7 @@ } tag; } message_data; Index: gststructure.h RCS file: /cvs/gstreamer/gstreamer/gst/gststructure.h,v retrieving revision 1.17 retrieving revision 1.17.2.1 diff -u -d -r1.17 -r1.17.2.1 --- gststructure.h 23 Jul 2004 00:12:57 -0000 1.17 +++ gststructure.h 9 Dec 2004 23:28:31 -0000 1.17.2.1 @@ -39,6 +39,7 @@ struct _GstStructure { GQuark name; GArray *fields; Index: part-MT-refcounting.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/Attic/part-MT-refcounting.txt,v --- part-MT-refcounting.txt 9 Dec 2004 17:25:00 -0000 1.1.2.1 +++ part-MT-refcounting.txt 9 Dec 2004 23:28:31 -0000 1.1.2.2 @@ -225,15 +225,18 @@ * Accessing lists If the object property is a list concurrent list iteration is needed to get the - contents of the list. GStreamer uses the cookie design pattern mechanism to - mark the last update of a list. The list and the cookie are protected by the - same lock. Each update to a list requires the following actions: + contents of the list. GStreamer uses the cookie mechanism to mark the last update + of a list. The list and the cookie are protected by the same lock. Each update to + a list requires the following actions: - acquire lock - update list - update cookie - release lock + Updating the cookie is usually done by incrementing its value by one. Since cookies + use guint32 its wraparound is for all practical reasons is not a problem. Iterating a list can safely be done by surrounding the list iteration with a lock/unlock of the lock. @@ -266,9 +269,10 @@ GST_LOCK (lock); if (cookie != object->list_cookie) { - /* concurrent modification of the list here */ + /* handle rollback caused by concurrent modification + * of the list here */ - ...undo changes to items... + ...rollback changes to items... /* grab new cookie and list */ cookie = object->list_cookie; |
From: <wt...@fr...> - 2005-03-08 14:38:20
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Mar 08 2005 06:38:18 PST Log message: * docs/design/part-MT-refcounting.txt: * docs/design/part-conventions.txt: * docs/design/part-gstobject.txt: * docs/design/part-relations.txt: * docs/design/part-standards.txt: * gst/gstbin.c: (gst_bin_add_func), (gst_bin_add), (gst_bin_remove_func), (gst_bin_remove), (gst_bin_iterate_recurse), (gst_bin_get_by_name), (gst_bin_get_by_interface), (gst_bin_iterate_all_by_interface): * gst/gstbuffer.h: * gst/gstclock.h: * gst/gstelement.c: (gst_element_class_init), (gst_element_change_state), (gst_element_set_loop_function): * gst/gstelement.h: * gst/gstiterator.c: * gst/gstobject.c: (gst_object_class_init), (gst_object_ref), (gst_object_unref), (gst_object_sink), (gst_object_dispose), (gst_object_dispatch_properties_changed), (gst_object_set_name), (gst_object_set_parent), (gst_object_unparent), (gst_object_check_uniqueness): * gst/gstobject.h: Docs updates, clean up some headers. Free iterators in GstBin. GstObject is now looking good. Modified files: . : ChangeLog docs/design : part-MT-refcounting.txt part-conventions.txt part-gstobject.txt part-relations.txt part-standards.txt gst : gstbin.c gstbuffer.h gstclock.h gstelement.c gstelement.h gstiterator.c gstobject.c gstobject.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.980&r2=1.981 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-MT-refcounting.txt.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-conventions.txt.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstobject.txt.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-relations.txt.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-standards.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.211&r2=1.212 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.h.diff?r1=1.80&r2=1.81 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.h.diff?r1=1.34&r2=1.35 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.311&r2=1.312 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.179&r2=1.180 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstiterator.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstobject.c.diff?r1=1.82&r2=1.83 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstobject.h.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.980 retrieving revision 1.981 diff -u -d -r1.980 -r1.981 --- ChangeLog 7 Mar 2005 18:33:36 -0000 1.980 +++ ChangeLog 8 Mar 2005 14:38:05 -0000 1.981 @@ -1,3 +1,28 @@ +2005-03-08 Wim Taymans <wi...@fl...> + + * docs/design/part-MT-refcounting.txt: + * docs/design/part-conventions.txt: + * docs/design/part-gstobject.txt: + * docs/design/part-relations.txt: + * docs/design/part-standards.txt: + * gst/gstbin.c: (gst_bin_add_func), (gst_bin_add), + (gst_bin_remove_func), (gst_bin_remove), (gst_bin_iterate_recurse), + (gst_bin_get_by_name), (gst_bin_get_by_interface), + (gst_bin_iterate_all_by_interface): + * gst/gstbuffer.h: + * gst/gstclock.h: + * gst/gstelement.c: (gst_element_class_init), + (gst_element_change_state), (gst_element_set_loop_function): + * gst/gstelement.h: + * gst/gstiterator.c: + * gst/gstobject.c: (gst_object_class_init), (gst_object_ref), + (gst_object_unref), (gst_object_sink), (gst_object_dispose), + (gst_object_dispatch_properties_changed), (gst_object_set_name), + (gst_object_set_parent), (gst_object_unparent), + (gst_object_check_uniqueness): + * gst/gstobject.h: + Docs updates, clean up some headers. 2005-03-07 Wim Taymans <wi...@fl...> * check/.cvsignore: Index: part-MT-refcounting.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-MT-refcounting.txt,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- part-MT-refcounting.txt 7 Mar 2005 18:27:38 -0000 1.2 +++ part-MT-refcounting.txt 8 Mar 2005 14:38:06 -0000 1.3 @@ -260,6 +260,16 @@ anymore of the pad. If you need to be sure it is, you need to extend the critical section to include the operations on the peer. + The following code is equivalent to the above but with using the functions + to access object properties. + peer = gst_pad_get_parent (pad); + if (peer) { + ... use peer ... + gst_object_unref (GST_OBJECT (peer)); + } Example: Accessing the name of an object makes a copy of the name. The caller of the @@ -271,6 +281,14 @@ ... use name ... g_free (name); + or: + name = gst_object_get_name (object); + ... use name ... + g_free (name); * Accessor methods Index: part-conventions.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-conventions.txt,v --- part-conventions.txt 7 Mar 2005 18:27:38 -0000 1.2 +++ part-conventions.txt 8 Mar 2005 14:38:06 -0000 1.3 @@ -30,8 +30,6 @@ element flags should be cross-checked with the header, as there are currently two conventions in use: with and without _FLAGS_ in the middle. -FIXME: check flags for consistency. - Drawing conventions =================== Index: part-gstobject.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-gstobject.txt,v --- part-gstobject.txt 7 Mar 2005 18:27:38 -0000 1.2 +++ part-gstobject.txt 8 Mar 2005 14:38:06 -0000 1.3 @@ -18,13 +18,15 @@ GstElement (inside a bin) GstPad (inside an element) Refcounting ----------- -- GObject refcount is not threadsafe. - GStreamer sets it to a constant value on each _ref/_unref() +- GObject refcount is not threadsafe. This will be changed in the future. + GStreamer for now sets it to a constant value on each _ref/_unref() and uses an atomic int "refcount" instead for threadsafe refcounting This implies you should always use gst_object_ref() and gst_object_unref() ! Naming ------ - names of objects cannot be changed when they are parented @@ -40,6 +42,7 @@ a more identifiable name. Typically a parent will call _set_name_prefix on children, taking a lock on them to do so. Locking ------- @@ -50,23 +53,38 @@ All members of the GstObject structure marked as /*< public >*/ /* with LOCK */ are protected by this lock. These members can only be accessed for reading -or writing while the lock is held. +or writing while the lock is held. All members should be copied or reffed +if they are used after releasing the LOCK. Note that this does *not* mean that no other thread can modify the object at the same time that the lock is held. It only means that any two sections of code that obey the lock are guaranteed to not be running simultaneously. "The lock is voluntary and cooperative". -This lock will ideally be used for parentage and refcounting, which is +This lock will ideally be used for parentage, flags and naming, which is reasonable, since they are the only possible things to protect in the GstObject. Path Generation --------------- -FIXME: rethink this ? Due to the base nature of the GstObject, it becomes the only reasonable place to put this particular function (_get_path_string). It will generate a string -describing the parent hierarchy of a given GstObject. Currently it is forced -to use several child-class-specific functions, because we do not properly use -the base capabilities (parentage, etc.) of GstObject properly. +describing the parent hierarchy of a given GstObject. +Flags +----- +Each object in the GStreamer object hierarchy can have flags associated with it, +which are used to describe a state or a feature of the object. +GstObject has flags to mark its lifecycle: FLOATING, DISPOSING and DESTROYED. +Class signals +------------- +It is possible to know when a new object is loaded by connecting to the +GstObjectClass signal. This feature is not very much used and might be removed +at some point. Index: part-relations.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-relations.txt,v --- part-relations.txt 7 Mar 2005 18:27:38 -0000 1.2 +++ part-relations.txt 8 Mar 2005 14:38:06 -0000 1.3 @@ -1,6 +1,10 @@ Object relation types --------------------- +This document describes the relations between objects that exist in GStreamer. +It will also describe the way of handling the relation wrt locking and +refcounting. 1) parent-child relation +---------+ +-------+ Index: part-standards.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-standards.txt,v retrieving revision 1.1 diff -u -d -r1.1 -r1.2 --- part-standards.txt 20 Jan 2001 20:08:59 -0000 1.1 +++ part-standards.txt 8 Mar 2005 14:38:06 -0000 1.2 @@ -6,11 +6,7 @@ Strings: Arguments passed into a function are owned by the caller, and the function will make a copy of the string for its own -internal use. The string should be const gchar *. Strings returned from a function remain the property of the -function called, and the caller must make a copy if it is to use the string for an extended duration. +internal use. The string should be const gchar *. Strings returned from a function are always a copy of the +original and should be freed after usage by the caller. Objects: -The ownership of an object during a function call depends on the type of function. If the function is simply returning -something from the object, such as _get_name(), the caller retains ownership. If the object passed is to be -manipulated in some way, it is generally the case that the function will take over the ownership. This should be -expressed as a reference increment on that object, but isn't in the general case (yet). Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.211 retrieving revision 1.212 diff -u -d -r1.211 -r1.212 --- gstbin.c 7 Mar 2005 18:27:39 -0000 1.211 +++ gstbin.c 8 Mar 2005 14:38:06 -0000 1.212 @@ -484,23 +484,27 @@ /* ERROR handling here */ adding_itself: - GST_LOCK (bin); - g_warning ("Cannot add bin %s to itself", GST_ELEMENT_NAME (bin)); - GST_UNLOCK (bin); - return FALSE; + { + GST_LOCK (bin); + g_warning ("Cannot add bin %s to itself", GST_ELEMENT_NAME (bin)); + GST_UNLOCK (bin); + return FALSE; + } duplicate_name: - g_warning ("Name %s is not unique in bin %s, not adding", - elem_name, GST_ELEMENT_NAME (bin)); - g_free (elem_name); + g_warning ("Name %s is not unique in bin %s, not adding", + elem_name, GST_ELEMENT_NAME (bin)); + g_free (elem_name); had_parent: - g_warning ("Element %s already has parent", elem_name); + g_warning ("Element %s already has parent", elem_name); } /** @@ -537,10 +541,13 @@ return result; + /* ERROR handling */ no_function: - g_warning ("adding elements to bin %s is not supported", - GST_ELEMENT_NAME (bin)); + g_warning ("adding elements to bin %s is not supported", + GST_ELEMENT_NAME (bin)); /* remove an element from the bin @@ -585,11 +592,15 @@ return TRUE; not_in_bin: - g_warning ("Element %s is not in bin %s", elem_name, GST_ELEMENT_NAME (bin)); + g_warning ("Element %s is not in bin %s", elem_name, @@ -630,10 +641,13 @@ - g_warning ("removing elements from bin %s is not supported", + g_warning ("removing elements from bin %s is not supported", static GstIteratorItem @@ -725,10 +739,8 @@ GST_UNLOCK (bin); - return NULL; * gst_bin_child_state_change: * @bin: #GstBin with the child @@ -1070,6 +1082,7 @@ children = gst_bin_iterate_recurse (bin); result = gst_iterator_find_custom (children, (GCompareFunc) compare_name, (gpointer) name); + gst_iterator_free (children); return GST_ELEMENT_CAST (result); @@ -1154,6 +1167,7 @@ result = gst_iterator_find_custom (children, (GCompareFunc) compare_interface, GINT_TO_POINTER (interface)); @@ -1182,6 +1196,7 @@ result = gst_iterator_filter (children, (GCompareFunc) compare_interface, Index: gstbuffer.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbuffer.h,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstbuffer.h 7 Mar 2005 18:27:39 -0000 1.80 +++ gstbuffer.h 8 Mar 2005 14:38:06 -0000 1.81 @@ -81,11 +81,9 @@ * @GST_BUFFER_ORIGINAL: buffer is not a copy of another buffer. * @GST_BUFFER_DONTFREE: do not try to free the data when this buffer is * unreferenced. - * @GST_BUFFER_KEY_UNIT: the buffer holds a key unit, a unit that can be - * decoded independently of other buffers. - * This flag has been deprecated, see #GST_BUFFER_DELTA_UNIT. - * @GST_BUFFER_DONTKEEP: the buffer should not be ref()ed, but copied instead - * before doing anything with it (for specially allocated hw buffers and such) + * @GST_BUFFER_PREROLL: the buffer is part of a preroll and should not be + * displayed. + * @GST_BUFFER_DISCONT: the buffer marks a discontinuity in the stream. * @GST_BUFFER_IN_CAPS: the buffer has been added as a field in a #GstCaps. * @GST_BUFFER_GAP: the buffer has been created to fill a gap in the stream. * @GST_BUFFER_DELTA_UNIT: this unit cannot be decoded independently. Index: gstclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.h,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstclock.h 7 Mar 2005 18:27:39 -0000 1.34 +++ gstclock.h 8 Mar 2005 14:38:06 -0000 1.35 @@ -60,7 +60,7 @@ #define GST_TIME_TO_TIMESPEC(t,ts) \ G_STMT_START { \ (ts).tv_sec = (t) / GST_SECOND; \ - (ts).tv_usec = ((t) - (ts).tv_sec * GST_SECOND) / GST_NSECOND; \ + (ts).tv_nsec = ((t) - (ts).tv_sec * GST_SECOND) / GST_NSECOND; \ } G_STMT_END /* timestamp debugging macros */ Index: gstelement.c RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.311 retrieving revision 1.312 diff -u -d -r1.311 -r1.312 --- gstelement.c 7 Mar 2005 18:27:39 -0000 1.311 +++ gstelement.c 8 Mar 2005 14:38:06 -0000 1.312 @@ -126,82 +126,82 @@ parent_class = g_type_class_ref (GST_TYPE_OBJECT); /** - * GstElement::state-change: + * GstElement::state-change: * @gstelement: the object which received the signal * @int: - * - * the #GstElementState of the element has been changed - */ + * + * the #GstElementState of the element has been changed + */ gst_element_signals[STATE_CHANGE] = g_signal_new ("state-change", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, state_change), NULL, NULL, gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - * GstElement::new-pad: + * GstElement::new-pad: * @object: - * a new #GstPad has been added to the element + * a new #GstPad has been added to the element gst_element_signals[NEW_PAD] = g_signal_new ("new-pad", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, new_pad), NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); - * GstElement::pad-removed: + * GstElement::pad-removed: - * a #GstPad has been removed from the element + * a #GstPad has been removed from the element gst_element_signals[PAD_REMOVED] = g_signal_new ("pad-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, pad_removed), NULL, NULL, - * GstElement::error: + * GstElement::error: * @element: * @error: * @message: - * a #GstError has occured during data processing + * a #GstError has occured during data processing gst_element_signals[ERROR] = g_signal_new ("error", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, error), NULL, NULL, gst_marshal_VOID__OBJECT_BOXED_STRING, G_TYPE_NONE, 3, GST_TYPE_ELEMENT, GST_TYPE_G_ERROR, G_TYPE_STRING); - * GstElement::eos: + * GstElement::eos: - * the end of the stream has been reached + * the end of the stream has been reached gst_element_signals[EOS] = g_signal_new ("eos", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, eos), NULL, NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0); - * GstElement::found-tag: + * GstElement::found-tag: * @tags: - * tags for the incomming stream have been received + * tags for the incomming stream have been received gst_element_signals[FOUND_TAG] = g_signal_new ("found-tag", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, found_tag), NULL, NULL, gst_marshal_VOID__OBJECT_BOXED, G_TYPE_NONE, 2, GST_TYPE_ELEMENT, GST_TYPE_TAG_LIST); - * GstElement::no-more-pads: + * GstElement::no-more-pads: - * ? + * ? gst_element_signals[NO_MORE_PADS] = g_signal_new ("no-more-pads", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, no_more_pads), NULL, @@ -1716,48 +1716,6 @@ return NULL; -/** - * gst_element_get_pad_template_list: - * @element: a #GstElement to get pad templates of. - * - * Retrieves a list of the pad templates associated with the element. - * (FIXME: Should be deprecated in favor of - * gst_element_class_get_pad_template_list). - * Returns: the #GList of padtemplates. - */ -GList * -gst_element_get_pad_template_list (GstElement * element) -{ - g_return_val_if_fail (element != NULL, NULL); - g_return_val_if_fail (GST_IS_ELEMENT (element), NULL); - return GST_ELEMENT_GET_CLASS (element)->padtemplates; -} - * gst_element_get_pad_template: - * @element: a #GstElement to get the pad template of. - * @name: the name of the #GstPadTemplate to get. - * Retrieves a padtemplate from this element with the - * given name. - * (FIXME: Should be deprecated in favor of gst_element_class_get_pad_template). - * Returns: the #GstPadTemplate with the given name, or NULL if none was found. - * No unreferencing is necessary. -GstPadTemplate * -gst_element_get_pad_template (GstElement * element, const gchar * name) - g_return_val_if_fail (name != NULL, NULL); - return gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (element), - name); static void gst_element_error_func (GstElement * element, GstElement * source, GError * error, gchar * debug) Index: gstelement.h RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.179 retrieving revision 1.180 diff -u -d -r1.179 -r1.180 --- gstelement.h 7 Mar 2005 18:27:39 -0000 1.179 +++ gstelement.h 8 Mar 2005 14:38:06 -0000 1.180 @@ -281,9 +281,14 @@ gpointer _gst_reserved[GST_PADDING - 1]; }; +GType gst_element_get_type (void); +/* element class pad templates */ void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ); -void gst_element_class_install_std_props (GstElementClass *klass, - const gchar *first_name, ...); +GstPadTemplate* gst_element_class_get_pad_template (GstElementClass *element_class, const gchar *name); +GList* gst_element_class_get_pad_template_list (GstElementClass *element_class); +/* element class details */ void gst_element_class_set_details (GstElementClass *klass, const GstElementDetails *details); @@ -291,7 +296,6 @@ void gst_element_default_error (GObject *object, GstObject *orig, GError *error, gchar *debug); -GType gst_element_get_type (void); void gst_element_set_loop_function (GstElement *element, GstElementLoopFunction loop); @@ -353,34 +357,7 @@ GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name); void gst_element_release_request_pad (GstElement *element, GstPad *pad); -GstIterator *gst_element_iterate_pads (GstElement * element); -GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad); -GstPad* gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad, - const GstCaps *filtercaps); -GstPadTemplate* gst_element_class_get_pad_template (GstElementClass *element_class, const gchar *name); -GList* gst_element_class_get_pad_template_list (GstElementClass *element_class); -GstPadTemplate* gst_element_get_pad_template (GstElement *element, const gchar *name); -GList* gst_element_get_pad_template_list (GstElement *element); -GstPadTemplate* gst_element_get_compatible_pad_template (GstElement *element, GstPadTemplate *compattempl); -gboolean gst_element_link (GstElement *src, GstElement *dest); -gboolean gst_element_link_many (GstElement *element_1, - GstElement *element_2, ...); -gboolean gst_element_link_filtered (GstElement *src, GstElement *dest, -void gst_element_unlink (GstElement *src, GstElement *dest); -void gst_element_unlink_many (GstElement *element_1, -gboolean gst_element_link_pads (GstElement *src, const gchar *srcpadname, - GstElement *dest, const gchar *destpadname); -gboolean gst_element_link_pads_filtered (GstElement *src, const gchar *srcpadname, - GstElement *dest, const gchar *destpadname, -void gst_element_unlink_pads (GstElement *src, const gchar *srcpadname, +GstIterator * gst_element_iterate_pads (GstElement * element); G_CONST_RETURN GstEventMask* gst_element_get_event_masks (GstElement *element); @@ -417,8 +394,6 @@ void gst_element_wait_state_change (GstElement *element); -G_CONST_RETURN gchar* gst_element_state_get_name (GstElementState state); GstElementFactory* gst_element_get_factory (GstElement *element); GstBin* gst_element_get_managing_bin (GstElement *element); Index: gstiterator.c RCS file: /cvs/gstreamer/gstreamer/gst/gstiterator.c,v --- gstiterator.c 7 Mar 2005 18:29:36 -0000 1.2 +++ gstiterator.c 8 Mar 2005 14:38:06 -0000 1.3 @@ -52,6 +52,9 @@ * * Create a new iterator. This function is mainly used for objects * implementing the next/resync/free function to iterate a data structure. + * + * For each item retrieved, the @item function is called with the lock + * held. The @free function is called when the iterator is freed. * * Returns: the new #GstIterator. @@ -124,9 +127,8 @@ * @master_cookie: pointer to a guint32 to protect the list. * @list: pointer to the list * @owner: object owning the list - * @ref: function to ref each item - * @unref: function to unref each item - * @free: function to free the owner of the list + * @item: function to call for each item + * @free: function to call when the iterator is freed * Create a new iterator designed for iterating @list. Index: gstobject.c RCS file: /cvs/gstreamer/gstreamer/gst/gstobject.c,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- gstobject.c 7 Mar 2005 18:27:39 -0000 1.82 +++ gstobject.c 8 Mar 2005 14:38:06 -0000 1.83 @@ -344,9 +344,7 @@ * creating a new object to symbolically 'take ownership' of the object. * Use #gst_object_set_parent to have this done for you. - * This function takes the object lock. - * MT safe. + * MT safe. This function grabs and releases the object lock. */ void gst_object_sink (GstObject * object) @@ -375,6 +373,9 @@ * function, it does not take any locks. You might want to lock * the object owning the oldobj pointer before calling this * function. + * Make sure not to LOCK the oldobj because it might be unreffed + * which could cause a deadlock when it is disposed. gst_object_replace (GstObject ** oldobj, GstObject * newobj) @@ -530,13 +531,13 @@ * @excluded_props: a set of user-specified properties to exclude or * NULL to show all changes. - * Adds a default deep_notify signal callback to an - * element. The user data should contain a pointer to an array of - * strings that should be excluded from the notify. - * The default handler will print the new value of the property + * A default deep_notify signal callback for an element. The user data + * should contain a pointer to an array of strings that should be excluded + * from the notify. The default handler will print the new value of the property * using g_print. + * MT safe. This function grabs and releases the object's LOCK or getting the + * path string of the object. gst_object_default_deep_notify (GObject * object, GstObject * orig, @@ -673,7 +674,7 @@ * Returns: the name of the object. g_free() after usage. + * MT safe. This function grabs and releases the object's LOCK. gchar * gst_object_get_name (GstObject * object) @@ -722,7 +723,7 @@ * Returns: the name prefix of the object. g_free() after usage. gst_object_get_name_prefix (GstObject * object) @@ -746,15 +747,13 @@ * Sets the parent of @object. The object's reference count will be incremented, * and any floating reference will be removed (see gst_object_sink()). * Causes the parent-set signal to be emitted. * Returns: TRUE if the parent could be set or FALSE when the object * already had a parent, the object and parent are the same or wrong * parameters were provided. + * MT safe. Grabs and releases the object's LOCK. gboolean gst_object_set_parent (GstObject * object, GstObject * parent) @@ -782,9 +781,10 @@ } g_signal_emit (G_OBJECT (object), gst_object_signals[PARENT_SET], 0, parent); - /* ERROR */ { GST_UNLOCK (object); @@ -802,7 +802,7 @@ * Returns: parent of the object, this can be NULL if the object has no * parent. unref after usage. GstObject * gst_object_get_parent (GstObject * object) @@ -828,7 +828,7 @@ * This function decreases the refcount of the object so the object * might not point to valid memory anymore after calling this function. + * MT safe. Grabs and releases the object's lock. gst_object_unparent (GstObject * object) @@ -867,7 +867,7 @@ * Returns: TRUE if the name does not appear in the list, FALSE if it does. + * MT safe. Grabs and releases the LOCK of each object in the list. gst_object_check_uniqueness (GList * list, const gchar * name) @@ -1001,7 +1001,8 @@ * Returns: a string describing the path of the object. You must * g_free() the string after usage. + * MT safe. Grabs and releases the object's LOCK for all objects + * in the hierarchy. gst_object_get_path_string (GstObject * object) Index: gstobject.h RCS file: /cvs/gstreamer/gstreamer/gst/gstobject.h,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstobject.h 7 Mar 2005 18:27:39 -0000 1.48 +++ gstobject.h 8 Mar 2005 14:38:06 -0000 1.49 @@ -21,7 +21,6 @@ * Boston, MA 02111-1307, USA. #ifndef __GST_OBJECT_H__ #define __GST_OBJECT_H__ @@ -79,6 +78,7 @@ #define GST_FLAG_SET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) |= (1<<(flag))); }G_STMT_END #define GST_FLAG_UNSET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) &= ~(1<<(flag))); }G_STMT_END +#define GST_OBJECT_IS_DISPOSING(obj) (GST_FLAG_IS_SET (obj, GST_OBJECT_DISPOSING)) #define GST_OBJECT_IS_DESTROYED(obj) (GST_FLAG_IS_SET (obj, GST_OBJECT_DESTROYED)) #define GST_OBJECT_IS_FLOATING(obj) (GST_FLAG_IS_SET (obj, GST_OBJECT_FLOATING)) @@ -91,9 +91,9 @@ /*< public >*/ /* with LOCK */ GMutex *lock; /* object LOCK */ gchar *name; /* object name */ + gchar *name_prefix; /* used for debugging */ GstObject *parent; /* this object's parent, weak ref */ guint32 flags; - gchar *name_prefix; /* used for debugging */ /*< private >*/ gpointer _gst_reserved[GST_PADDING]; |
From: <wt...@fr...> - 2005-03-22 11:33:14
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Mar 22 2005 03:33:12 PST Log message: * docs/design/part-TODO.txt: * docs/design/part-events.txt: * docs/design/part-gstbin.txt: * docs/design/part-gstbus.txt: * docs/design/part-gstpipeline.txt: * docs/design/part-messages.txt: * gst/gstbus.c: * gst/gstmessage.c: Docs updates Modified files: . : ChangeLog docs/design : part-TODO.txt part-events.txt gst : gstbus.c gstmessage.c Added files: docs/design : part-gstbin.txt part-gstbus.txt part-gstpipeline.txt part-messages.txt Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.989&r2=1.990 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-events.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstbin.txt?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstbus.txt?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstpipeline.txt?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-messages.txt?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbus.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstmessage.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.989 retrieving revision 1.990 diff -u -d -r1.989 -r1.990 --- ChangeLog 21 Mar 2005 18:17:57 -0000 1.989 +++ ChangeLog 22 Mar 2005 11:32:59 -0000 1.990 @@ -1,3 +1,15 @@ +2005-03-22 Wim Taymans <wi...@fl...> + + * docs/design/part-TODO.txt: + * docs/design/part-events.txt: + * docs/design/part-gstbin.txt: + * docs/design/part-gstbus.txt: + * docs/design/part-gstpipeline.txt: + * docs/design/part-messages.txt: + * gst/gstbus.c: + * gst/gstmessage.c: + Docs updates 2005-03-21 Wim Taymans <wi...@fl...> * gst/gstbus.c: (gst_bus_post): Index: part-TODO.txt RCS file: part-TODO.txt diff -N part-TODO.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ part-TODO.txt 22 Mar 2005 11:32:59 -0000 1.2 @@ -0,0 +1,35 @@ +- changing an object's name after construction is not allowed. Checks are performed + when adding objects to parents that no duplicate names are used, changing the name + to a duplicate name after adding it is therefore allowed and voids internal + consistency. +- check for race in _task_pause()/_stop() since the TASK_LOCK is not held by the + calling thread and the STREAM_LOCK not by the task code. +- only emit EOS in PLAYING. Make sure elements reemit the EOS message when going to + PLAYING again. +- implement return values from events in addition to the gboolean. +- implement query ala events as opposed to the current return value of only a + guint64. I don't have a use case where this a problem yet, though. +- implement state change order on get<->loop-get<->loop elements. This probably + requires a backtracking algorithm. +- implement iterators for traversing elements upstream or dowstream. +- unlinking pads in the PAUSED state needs to make sure the stream thread is not + executing code. Can this be done with a flush to unlock all downstream chain + functions? +- implement seek in GstPipeline. +- make events use GstStructure like GstMessage instead of the current union. +- make the seek event return the time where the seek will happen so that GstPipeline + can update the stream time. +- implement clock selection as explained in part-gstpipeline.txt Index: part-events.txt RCS file: part-events.txt diff -N part-events.txt +++ part-events.txt 22 Mar 2005 11:32:59 -0000 1.2 @@ -0,0 +1,175 @@ +Events +------ +Events are objects passed around in parallel to the buffer dataflow to +notify elements of various events. +Events are received on pads using the event function. Some events should +be interleaved with the data stream so they require taking the STREAM_LOCK, +others don't. +Different types of events exist to implement various functionalities. + GST_EVENT_EOS: no more data is to be expected on a pad. + GST_EVENT_FLUSH: data is to be discarded or allowed again + GST_EVENT_DISCONTINUOUS: A new group of buffers with common start time + GST_EVENT_QOS: A notification of the quality of service of the stream + GST_EVENT_SEEK: A seek should be performed to a new position in the stream + GST_EVENT_SIZE: Notification of suggested buffer size. + GST_EVENT_RATE: Notification to change the processing speed of a stream + GST_EVENT_NAVIGATION: A navigation event. + GST_EVENT_TAG: Stream metadata. +EOS +--- +The EOS event can only be sent on a sinkpad. It is typically emited by the +source element when it has finished sending data. This event is mainly sent +in the streaming thread but can also be sent from the application thread. +The downstream element should forward the EOS event to its downstream peer +elements. This way the event will eventually reach the renderers which should +then post an EOS message on the bus. +For elements with multiple sink pads it might be possible to wait for EOS on +all the pads before forwarding the event. +The EOS event should always be interleaved with the data flow, therefore the +STREAM_LOCK should be taken. +Sometimes the EOS event is generated by another element than the source, for +example a demuxer filter can generate an EOS event before the source element. +This is not a problem, the demuxer does not send an EOS event to the upstream +element but returns GST_FLOW_UNEXPECTED, causing the source element to stop +sending data. +An element that sends EOS on a pad should stop sending data on that pad. Source +elements typically pause() their task for that purpose. +By default, the pipeline collects all EOS events from all the sinks before +passing the EOS message to the application. +The EOS is only posted on the bus by the sink elements in the PLAYING state. If +the EOS event is received in the PAUSED state, it is queued until the element +goes to PLAYING. +FLUSH +----- +A flush event is sent both downstream and upstream to clear any pending data +from the pipeline. This might be needed to make the graph more responsive +when the normal dataflow gets interrupted by for example a seek event. +Flushing happens in two stages. + 1) a source filter sends the flush event to the downstream peer element. The + downstream element starts rejecting buffers from the upstream elements. It + sends the flush event further downstream and discards any buffers it is + holding as well as return from the chain function as soon as possible. + This makes sure that all upstream elements get unblocked. + This event is not synchronized with the STREAM_LOCK and can be done in the + application thread. + 2) a source filter sends the flush event with the done flag set to indicate + that the downstream element can accept buffers again. The downstream + element sends the flush event to its peer elements. After this step dataflow + continues. The endflush call is synchronized with the STREAM_LOCK so any + data used by the chain function can safely freed here if needed. Any + pending EOS events should be discarded too. +After the flush completes the second stage, data is flowing again in the pipeline +and all buffers are more recent than those before the flush. +For elements that use the pullregion function, they send both flush events to +the upstream pads in the same way top make sure that the pullregion function +unlocks and any pending buffers are cleared in the upstream elements. +DISCONTINUOUS +------------- +A discont event is sent downstream by an element to indicate that the following +group of buffers start and end at the specified time. +After a seek event for example, a discont event is sent. +SEEK +---- +A seek event is issued by the application to start playback of a new +position in the stream. It is called form the application thread and +travels upstream. +The seek event contains the new start end end position of playback +after the seek is performed. Optionally the end position can be left +at -1 to continue playback to the end of the stream. +A stream usually flushes the graph to minimize latency after the seek. +The seek event is passed along from element to element until it reaches +an element that can perform the seek. No intermediate element is allowed +to assume that a seek to this location will happen. It is allowed to +modify the start and stop times if it needs to do so. +The actual seek is performed in the application thread so that success +or failure can be reported as a return value of the seek event. It is +therefore important that before executing the seek, the element acquires +the STREAM_LOCK so that the streaming thread and the seek gets serialized. +The general flow of executing the seek is as follows: + 1) unblock the streaming threads, they could be blocked in a chain + function. This is done by sending a flush on all srcpads. + The flush will make sure that all downstream elements unlock and + that control will return to this element chain/loop function. + We cannot lock the STREAM_LOCK before doing this since it might + cause a deadlock. + 2) lock the STREAM_LOCK. This will work since the chain/loop function + was unlocked in step 1). + 3) perform the seek. + 4) send a flush event with the done flag set to allow streaming again. + 5) start stopped tasks and unlock the STREAM_LOCK, dataflow will continue + now from the new position. +SIZE +Some demuxers know an optimal size for any downstream buffers. They can +use this event to signal this fact. Similary an element can signal an +upstream element of a prefered buffer size. +RATE +When the application wants to change the playback rate of the stream, it +issues a rate event. A rate of 1.0 is the normal playback rate, 2.0 plays +at twice the speed and negative values play backwards. +Note that the clock speed does not change. +NAVIGATION +---------- +A navigation event is generated by a sink element to signal the elements +of a navigation event such as a mouse movement or button click. +Navigation events travel downstream. +TAG +--- + +The tag event is sent downstream when an element has discovered metadata +tags in a media file. Encoders can use this event to adjust their tagging +system. --- NEW FILE: part-gstbin.txt --- GstBin ------ GstBin is a container element for other GstElements. This makes it possible to group elements together so that they can be treated as one single GstElement. Add/removing elements --------------------- The basic functionality of a bin is to add and remove GstElements to/from it. gst_bin_add() and gst_bin_remove() perform these operations respectively. The bin maintains a parent-child relationship with its elements (see part- relations.txt). Retrieving elements ------------------- GstBin provides a number of functions to retrieve one or more children from itself. A few examples of the provided functions: gst_bin_get_by_name() retrieves an element by name. gst_bin_iterate_elements() returns an iterator to all the children. element management ------------------ The most important function of the GstBin is to distribute all GstElement operations on itself to all of its children. This includes: - state changes - index get/set - clock gst/set - bus set/get - scheduler set/get The state change distribution is the most complex and is explained in part-states.txt. Subclassing ----------- Subclasses of GstBin are free to implement their own add/remove implementations. It is a good idea to update the GList of children so that the _iterate() functions can still be used. --- NEW FILE: part-gstbus.txt --- GstBus The GstBus is an object responsible for delivering GstMessages in a first-in first-out way from the streaming threads to the application. Since the application typically only wants to deal with delivery of these messages from one thread, the GstBus will marshall the messages between different threads. The GstBus provides support for GSource based notifications. This makes it possible to handle the delivery in the glib mainloop. A message is posted on the bus with the gst_bus_post() method. With the gst_bus_peek() and _pop() methods one can look at or retrieve a previously posted message. The bus can be polled with the gst_bus_poll() method. This methods blocks up to the specified timeout value until one of the specified messages types is posted on the bus. The application can then _pop() the messages from the bus to handle them. It is also possible to get messages from the bus without any thread marshalling with the gst_bus_set_sync_handler() method. This makes it possible to react to a message in the same thread that posted the message on the bus. This should only be used if the application is able to deal with messages from different threads. --- NEW FILE: part-gstpipeline.txt --- GstPipeline A GstPipeline is usually a toplevel bin an provides all of its children with a clock and a bus. The GstPipeline will also collect EOS messages from its children and will forward the EOS message to the application when all of the sinks are in EOS. The pipeline also calculates the stream time based on the selected clock (see part-clocks.txt). The pipeline manages the seek operation for the application. The pipeline creates a GstBus and attaches a sync handler to receive the EOS events. Since the pipeline subclasses GstBin, all of its children will receive the same bus when added to the Gstbin. The application can retrieve the GstBus and integrate it in the mainloop or it can just _pop() messages off in its own thread. Clock selection --------------- Since all of the children of a GstPipeline must use the same clock, the pipeline must select a clock. The default clock selection algorithm works as follows: - If the application selected a clock, use that clock. (see below) - use clock of source elements (*) - use clock of other element, starting from the sinks going upstream. (+) - use GstSystemClock. (*) currently not implemented. (+) traversing the graph upstream to find the best clock is not implemented, currently the first element found that provides a clock is used. The application can influence this clock selection with two methods: gst_pipeline_use_clock() and gst_pipeline_auto_clock(). The _use_clock() method forces the use of a specific clock on the pipeline regardless of what clock providers are children of the pipeline. Setting NULL disables the clock completely and makes the pipeline run as fast as possible. The _auto_clock() method removes the fixed clock and reactivates the auto- matic clock selection algorithm described above. EOS --- The sink elements will post an EOS event on the bus when they reach EOS. The EOS message is only posted to the bus when the element is in PLAYING. The pipeline collects all EOS messages and forwards it to the application as soon as all the sinks have posted an EOS. The list of queued EOS messages is cleared when the pipeline goes to PAUSED again. This means that all elements should repost the EOS message when going to PLAYING again. Seeking ------- When performing a seek on the pipeline element using gst_element_send_event(), the pipeline performs the following actions: - record the current state of the pipeline. - set the pipeline to paused - send the seek event to all sinks - update the stream time with the time of the seek - restore old state of the pipeline. --- NEW FILE: part-messages.txt --- Messages -------- Messages are refcounted lightweight objects to signal the application of pipeline events. Index: gstbus.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbus.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstbus.c 21 Mar 2005 18:17:57 -0000 1.3 +++ gstbus.c 22 Mar 2005 11:32:59 -0000 1.4 @@ -482,8 +482,11 @@ /** * gst_bus_add_watch_full: - * @bus: a #GstBus to create the watch for + * @bus: a #GstBus to create the watch for. + * @priority: The priority of the watch. * @handler: A function to call when a message is received. + * @user_data: user data passed to @handler. + * @notify: the function to call when the source is removed. * * Adds the bus to the mainloop with the given priority. If the handler returns * TRUE, the message will then be popped off the queue. When the handler is @@ -528,6 +531,8 @@ * gst_bus_add_watch: * @bus: a #GstBus to create the watch for + * @handler: A function to call when a message is received. * Adds the bus to the mainloop with the default priority. Index: gstmessage.c RCS file: /cvs/gstreamer/gstreamer/gst/gstmessage.c,v retrieving revision 1.2 diff -u -d -r1.2 -r1.3 --- gstmessage.c 21 Mar 2005 17:34:00 -0000 1.2 +++ gstmessage.c 22 Mar 2005 11:32:59 -0000 1.3 @@ -356,7 +356,7 @@ * gst_message_parse_error: * @message: A valid #GstMessage of type GST_MESSAGE_ERROR. - * Extracts the GError and debug strung from the GstMessage. The values returned + * Extracts the GError and debug string from the GstMessage. The values returned * in the output arguments are copies; the caller must free them when done. * MT safe. @@ -381,7 +381,7 @@ * gst_message_parse_warning: * @message: A valid #GstMessage of type GST_MESSAGE_WARNING. |
From: <wt...@fr...> - 2005-05-30 15:49:00
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Mon May 30 2005 08:48:57 PDT Log message: * docs/design/part-overview.txt: * gst/gstsystemclock.h: Small typo fixes, doc updates. Modified files: . : ChangeLog docs/design : part-overview.txt gst : gstsystemclock.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1111&r2=1.1112 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-overview.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1111 retrieving revision 1.1112 diff -u -d -r1.1111 -r1.1112 --- ChangeLog 30 May 2005 15:46:15 -0000 1.1111 +++ ChangeLog 30 May 2005 15:48:44 -0000 1.1112 @@ -1,5 +1,11 @@ 2005-05-30 Wim Taymans <wi...@fl...> + * docs/design/part-overview.txt: + * gst/gstsystemclock.h: + Small typo fixes, doc updates. + +2005-05-30 Wim Taymans <wi...@fl...> * gst/gst.c: (gst_init_get_popt_table), (init_post), (init_popt_callback): Remove cpu-opt flag. Index: gstsystemclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstsystemclock.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstsystemclock.h 7 Mar 2005 18:27:39 -0000 1.12 +++ gstsystemclock.h 30 May 2005 15:48:44 -0000 1.13 @@ -2,7 +2,7 @@ * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wt...@ch...> * - * gstclock.h: Header for clock subsystem + * gstsystemclock.h: A clock implementation based on system time * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public Index: part-overview.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-overview.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- part-overview.txt 24 May 2005 16:47:06 -0000 1.1 +++ part-overview.txt 30 May 2005 15:48:45 -0000 1.2 @@ -374,7 +374,8 @@ elements to inform them of the EOS. The element is not supposed to accept any more data after receiving an EOS event on a sinkpad. - The source element stops sending data after sending the EOS message. + The element providing the streaming thread stops sending data after sending the + EOS message. The EOS even will eventually arrive in the sink element. The sink will then post an EOS message on the bus to inform the pipeline that a particular stream has @@ -398,7 +399,8 @@ filesrc to PAUSED: nothing Going to the intermediate PAUSED state will block all elements in the _push() - functions. + functions. This happens because the sink element blocks on the first buffer + it receives. Some elements might be performing blocking operations in the PLAYING state that must be unblocked when they go into the PAUSED state. This makes sure that the @@ -412,7 +414,7 @@ deactivated and becomes unusable for sending more data. mp3dec to READY: the pads are deactivated and the state change completes when mp3dec leaves its _chain() function. - filesrc to PAUSED: the pads are deactivated and the thread is paused. + filesrc to READY: the pads are deactivated and the thread is paused. The upstream elements finish their chain() function because the downstream element returned an error code from the _push() functions. These error codes are eventually |
From: <wt...@fr...> - 2005-06-30 12:18:39
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Thu Jun 30 2005 05:18:32 PDT Log message: * CHANGES-0.9: * docs/design/draft-ghostpads.txt: * docs/design/draft-push-pull.txt: * docs/design/draft-query.txt: * docs/design/part-TODO.txt: * docs/design/part-query.txt: Added CHANGES-0.9 doc, updated status of other docs. * gst/gstquery.h: Remove "hmm" macro Modified files: . : ChangeLog docs/design : draft-ghostpads.txt draft-push-pull.txt part-TODO.txt part-query.txt gst : gstquery.h Added files: . : CHANGES-0.9 Removed files: docs/design : draft-query.txt Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/CHANGES-0.9?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1209&r2=1.1210 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/draft-ghostpads.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/draft-push-pull.txt.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/draft-query.txt http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-query.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstquery.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== --- NEW FILE: CHANGES-0.9 --- Changes in the 0.9 version -------------------------- - Refcounting and API revised for thread safety, see rules in docs/design/part-MT-refcounting.txt - Scheduling is now done by the elements, they start/stop processing threads themselves. This removes the need for a separate scheduler. - State changes now happen from sink to source. This makes sure that downstream elements are ready to process data when upstream starts producing. - EOS/ERROR/... does not change the state of elements anymore. This means that when the application sets the state on an element, it remains in this state. - GMainLoop integration. Information on the state of the pipeline is now received in the mainloop. - Events move separate from the datastream, this allows for both in and out of sync delivery of events. - Generic _pull() replaced by _pull_region() so that random access can be made faster. - data passing happens from PAUSED, called the preroll phase. In this state no data is rendered but it is queued in the sinks. - negotiation simplified. Caps are now attached to buffers and travel along with the datastream. - GstBuffer is now subclassable. - Ghostpads now look and feel like real pads. - New Seeking/flushing policy. - Addition of base classes and helper functions in the core to abstract away the harder parts of plugin development. Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1209 retrieving revision 1.1210 diff -u -d -r1.1209 -r1.1210 --- ChangeLog 30 Jun 2005 12:14:47 -0000 1.1209 +++ ChangeLog 30 Jun 2005 12:18:19 -0000 1.1210 @@ -1,5 +1,18 @@ 2005-06-30 Wim Taymans <wi...@fl...> + * CHANGES-0.9: + * docs/design/draft-ghostpads.txt: + * docs/design/draft-push-pull.txt: + * docs/design/draft-query.txt: + * docs/design/part-TODO.txt: + * docs/design/part-query.txt: + Added CHANGES-0.9 doc, updated status of other docs. + + * gst/gstquery.h: + Remove "hmm" macro + +2005-06-30 Wim Taymans <wi...@fl...> * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_empty), (gst_base_sink_preroll_queue_flush), (gst_base_sink_handle_object), (gst_base_sink_change_state): Index: gstquery.h RCS file: /cvs/gstreamer/gstreamer/gst/gstquery.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstquery.h 16 May 2005 20:21:54 -0000 1.12 +++ gstquery.h 30 Jun 2005 12:18:19 -0000 1.13 @@ -156,10 +156,6 @@ GstStructure * gst_query_get_structure (GstQuery *query); -/* hmm */ -#define GST_QUERY_POSITION_GET_FORMAT(q) \ - (gst_structure_get_int ((q)->structure, "format")) - G_END_DECLS #endif /* __GST_QUERY_H__ */ Index: draft-ghostpads.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/draft-ghostpads.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- draft-ghostpads.txt 24 May 2005 16:47:06 -0000 1.1 +++ draft-ghostpads.txt 30 Jun 2005 12:18:19 -0000 1.2 @@ -3,7 +3,7 @@ Status: - DRAFT. + DRAFT. DEPRECATED by better current implementation. Purpose: Index: draft-push-pull.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/draft-push-pull.txt,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- draft-push-pull.txt 24 May 2005 16:47:06 -0000 1.4 +++ draft-push-pull.txt 30 Jun 2005 12:18:19 -0000 1.5 Status - DRAFT + DRAFT. DEPRECATED by better current implementation. Observations: --- draft-query.txt DELETED --- Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v --- part-TODO.txt 2 Jun 2005 08:26:58 -0000 1.4 +++ part-TODO.txt 30 Jun 2005 12:18:19 -0000 1.5 @@ -4,9 +4,6 @@ to a duplicate name after adding it is therefore allowed and voids internal consistency. -- check for race in _task_pause()/_stop() since the TASK_LOCK is not held by the - calling thread and the STREAM_LOCK not by the task code. - only emit EOS in PLAYING. Make sure elements reemit the EOS message when going to PLAYING again. @@ -14,17 +11,11 @@ done by making the event contain a GstStructure with input/output values, similar to GstMessage. -- implement state change order on get<->loop-get<->loop elements. This probably - requires a backtracking algorithm. - implement iterators for traversing elements upstream or dowstream. - unlinking pads in the PAUSED state needs to make sure the stream thread is not executing code. Can this be done with a flush to unlock all downstream chain functions? -- make the seek event return the time where the seek will happen so that GstPipeline - can update the stream time. This is linked with making the events return values. - implement clock selection as explained in part-gstpipeline.txt Index: part-query.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-query.txt,v --- part-query.txt 21 Apr 2005 09:37:34 -0000 1.1 +++ part-query.txt 30 Jun 2005 12:18:19 -0000 1.2 @@ -1,69 +1,93 @@ -Query ------ +DRAFT Query +----------- -Queries are used to get information about the state of the stream. -Various queries exist such as get the total length and the position +Status -A query can be performed on a pad or on an element. Both the element -and the pad query have default behaviour unless a custom query handler -is installed. + Implemented, move me to design... -The default pad query handler will forward the query to an internally -linked pad. This internally linked pad is either obtained by calling -the internal_links function of the pad or by using the default -function (which selects the pads with oposite directions from the parent -element). +Purpose -The default element query function will select a random source pad to -send the event to. + Queries are used to get information about the stream. + A query is started on a specific pad and travels up or downstream. -The pad query function has the following prototype: +Types of queries - gboolean (*GstPadQueryFunction) (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); + - get length of stream + - get position in stream + - get seeking capabilities + - get latency + - convert one value to another + - query supported formats + - query internal links. -The query function can return a single value in one of the defined -formats. +Current implementation -The function returns TRUE if the query could be performed. The returned -values are undefined when this function returns FALSE. + The current implementation of query requires pads to implement the + following functions: + gboolean (*GstPadConvertFunction) (GstPad *pad, + GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value); + gboolean (*GstPadQueryFunction) (GstPad *pad, GstQueryType type, + GstFormat *format, gint64 *value); + GList* (*GstPadIntLinkFunction) (GstPad *pad); + const GstFormat* (*GstPadFormatsFunction) (GstPad *pad); + const GstEventMask* (*GstPadEventMaskFunction) (GstPad *pad); + const GstQueryType* (*GstPadQueryTypeFunction) (GstPad *pad); -Query types ------------ + Most of these functions are not very extensible in particular, + the queryfunction can only return one value. - GST_QUERY_TOTAL: - get the total length of the stream in the given format. +Requirements - GST_QUERY_POSITION: + - multiple return values, grouped together when they make sense. + - one pad function to perform the query + - extensible queries. - get the current position in the stream in the given format. +Proposition - GST_QUERY_LATENCY: + - define GstQuery extending GstData and containing a GstStructure (see GstMessage) + - define standard query types (see proposed types) + - define methods to create a parse the results in the GstQuery. + - define pad method: - get the latency introduced in the stream in the given format. - This query can be used to retrieve how much data is queued in a - queue or in a hardware device such as an audio sink. + gboolean (*GstPadQueryFunction) (GstPad *pad, GstQuery *query); - GST_QUERY_JITTER: + pad returns result in query structure and TRUE as result or FALSE when + query is not supported. - Get the jitter, this is the difference between the expected and real - time a buffer is captured or played. +Proposed types - GST_QUERY_START: + - GST_QUERY_SEEKING: + + - get info on how seeking can be done + - getrange, with/without offset/size + - ranges where seeking is efficient (for caching network sources) + - flags describing seeking behaviour (forward, backward, segments, + play backwards, ...) - Query the position in the stream where the last start position was - configured. When a seek was performed to play a stream from A to B, - this query will return A. + - GST_QUERY_POSITION: + + - get info on current position of the stream + - start position + - current position + - end position + - length + + - GST_QUERY_LATENCY: - GST_QUERY_SEGMENT_END: + - get amount of buffering - Query the position in the stream where the last end position was - this query will return B. + - GST_QUERY_CONVERT: - GST_QUERY_RATE: + - convert format/value to another format/value pair. - Query the current playback rate of the stream. + - GST_QUERY_FORMATS: + - return list of supported formats. +Also???? + - GST_QUERY_CAPS: |
From: <wt...@fr...> - 2005-07-29 19:19:43
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Fri Jul 29 2005 12:19:41 PDT Log message: * docs/design/part-gstghostpad.txt: Small update. * gst/gstbin.c: (unlink_pads), (gst_bin_add_func), (gst_bin_remove_func): Unlinking pads while holding the bin LOCK is not a good idea. * gst/gstpad.c: (gst_pad_class_init), (gst_pad_link_check_hierarchy), (gst_pad_get_caps_unlocked), (gst_pad_accept_caps), (gst_pad_set_caps), (gst_pad_send_event): No prob setting template after creating the pad. Modified files: . : ChangeLog docs/design : part-gstghostpad.txt gst : gstbin.c gstpad.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1315&r2=1.1316 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstghostpad.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.245&r2=1.246 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.421&r2=1.422 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1315 retrieving revision 1.1316 diff -u -d -r1.1315 -r1.1316 --- ChangeLog 29 Jul 2005 15:34:50 -0000 1.1315 +++ ChangeLog 29 Jul 2005 19:19:29 -0000 1.1316 @@ -1,3 +1,18 @@ +2005-07-29 Wim Taymans <wi...@fl...> + + * docs/design/part-gstghostpad.txt: + Small update. + * gst/gstbin.c: (unlink_pads), (gst_bin_add_func), + (gst_bin_remove_func): + Unlinking pads while holding the bin LOCK is not a good + idea. + * gst/gstpad.c: (gst_pad_class_init), + (gst_pad_link_check_hierarchy), (gst_pad_get_caps_unlocked), + (gst_pad_accept_caps), (gst_pad_set_caps), (gst_pad_send_event): + No prob setting template after creating the pad. 2005-07-29 Jan Schmidt <th...@ma...> * gst/gstbus.c: (gst_bus_set_flushing), (gst_bus_pop), Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.245 retrieving revision 1.246 diff -u -d -r1.245 -r1.246 --- gstbin.c 28 Jul 2005 15:38:46 -0000 1.245 +++ gstbin.c 29 Jul 2005 19:19:29 -0000 1.246 @@ -388,11 +388,6 @@ if (GST_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK)) GST_FLAG_SET (bin, GST_ELEMENT_IS_SINK); - /* unlink all linked pads */ - it = gst_element_iterate_pads (element); - gst_iterator_foreach (it, (GFunc) unlink_pads, element); - gst_iterator_free (it); - bin->children = g_list_prepend (bin->children, element); bin->numchildren++; bin->children_cookie++; @@ -406,6 +401,11 @@ GST_UNLOCK (bin); + /* unlink all linked pads */ + it = gst_element_iterate_pads (element); + gst_iterator_foreach (it, (GFunc) unlink_pads, element); + gst_iterator_free (it); GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin, "added element \"%s\"", elem_name); g_free (elem_name); @@ -506,11 +506,6 @@ if (G_UNLIKELY (g_list_find (bin->children, element) == NULL)) goto not_in_bin; /* now remove the element from the list of elements */ bin->children = g_list_remove (bin->children, element); bin->numchildren--; @@ -528,13 +523,17 @@ GST_FLAG_UNSET (bin, GST_ELEMENT_IS_SINK); } } GST_CAT_INFO_OBJECT (GST_CAT_PARENTAGE, bin, "removed child \"%s\"", gst_element_set_bus (element, NULL); /* unlock any waiters for the state change. It is possible that Index: gstpad.c RCS file: /cvs/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.421 retrieving revision 1.422 diff -u -d -r1.421 -r1.422 --- gstpad.c 28 Jul 2005 11:24:33 -0000 1.421 +++ gstpad.c 29 Jul 2005 19:19:29 -0000 1.422 @@ -183,7 +183,7 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), PAD_PROP_TEMPLATE, g_param_spec_object ("template", "Template", "The GstPadTemplate of this pad", GST_TYPE_PAD_TEMPLATE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + G_PARAM_READWRITE)); #ifndef GST_DISABLE_LOADSAVE gstobject_class->save_thyself = GST_DEBUG_FUNCPTR (gst_pad_save_thyself); Index: part-gstghostpad.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-gstghostpad.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- part-gstghostpad.txt 29 Jul 2005 11:29:52 -0000 1.1 +++ part-gstghostpad.txt 29 Jul 2005 19:19:29 -0000 1.2 @@ -153,7 +153,7 @@ a) new GstProxyPad Y is created b) Y direction is same as peer c) Y target is set to peer - d) X internal pad is set to Y + d) X internal pad is set to Y (X is parent of Y) e) Y is activated in the same mode as X f) core makes link from src to X @@ -196,7 +196,7 @@ e) link is made from Y to X target (sink) f) Y is activated in the same mode as X g) core makes link from src to X |
From: <wt...@fr...> - 2005-09-24 14:14:19
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Sat Sep 24 2005 07:14:15 PDT Log message: * docs/design/part-events.txt: * docs/design/part-gstbus.txt: * docs/design/part-gstpipeline.txt: * docs/design/part-messages.txt: * docs/design/part-overview.txt: * docs/design/part-segments.txt: * gst/gstbin.c: * gst/gstbuffer.c: * gst/gstclock.c: * gst/gstelement.c: * gst/gstevent.c: * gst/gstfilter.c: * gst/gstiterator.c: Various documentation updates. Modified files: . : ChangeLog docs/design : part-events.txt part-gstbus.txt part-gstpipeline.txt part-messages.txt part-overview.txt gst : gstbin.c gstbuffer.c gstclock.c gstelement.c gstevent.c gstfilter.c gstiterator.c Added files: docs/design : part-segments.txt Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1559&r2=1.1560 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-events.txt.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstbus.txt.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-gstpipeline.txt.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-messages.txt.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-overview.txt.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-segments.txt?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.262&r2=1.263 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.c.diff?r1=1.106&r2=1.107 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.c.diff?r1=1.58&r2=1.59 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.365&r2=1.366 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.c.diff?r1=1.65&r2=1.66 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstfilter.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstiterator.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1559 retrieving revision 1.1560 diff -u -d -r1.1559 -r1.1560 --- ChangeLog 24 Sep 2005 11:41:01 -0000 1.1559 +++ ChangeLog 24 Sep 2005 14:14:03 -0000 1.1560 @@ -1,3 +1,20 @@ +2005-09-24 Wim Taymans <wi...@fl...> + + * docs/design/part-events.txt: + * docs/design/part-gstbus.txt: + * docs/design/part-gstpipeline.txt: + * docs/design/part-messages.txt: + * docs/design/part-overview.txt: + * docs/design/part-segments.txt: + * gst/gstbin.c: + * gst/gstbuffer.c: + * gst/gstclock.c: + * gst/gstelement.c: + * gst/gstevent.c: + * gst/gstfilter.c: + * gst/gstiterator.c: + Various documentation updates. 2005-09-24 Thomas Vander Stichele <thomas at apestaart dot org> * gst/gstclock.h: Index: part-events.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-events.txt,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- part-events.txt 16 Aug 2005 09:42:47 -0000 1.10 +++ part-events.txt 24 Sep 2005 14:14:03 -0000 1.11 @@ -66,6 +66,10 @@ elements. This way the event will eventually reach the renderers which should then post an EOS message on the bus. +An element might want to flush its internally queued data before forwarding +the EOS event downstream. This flushing can be done in the same thread as +the one handling the EOS event. For elements with multiple sink pads it might be possible to wait for EOS on all the pads before forwarding the event. Index: part-gstbus.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-gstbus.txt,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- part-gstbus.txt 23 Sep 2005 18:02:18 -0000 1.3 +++ part-gstbus.txt 24 Sep 2005 14:14:03 -0000 1.4 @@ -10,7 +10,8 @@ is done in another thread than the application. The GstBus provides support for GSource based notifications. This makes it -possible to handle the delivery in the glib mainloop. +possible to handle the delivery in the glib mainloop. Different GSources +can be added to the same bin provided they listen to different message types. A message is posted on the bus with the gst_bus_post() method. With the gst_bus_peek() and _pop() methods one can look at or retrieve a previously @@ -27,9 +28,11 @@ message on the bus. This should only be used if the application is able to deal with messages from different threads. +If no messages are popped from the bus with either a GSource or gst_bus_pop(), +they remain on the bus. When a pipeline or bin goes from READY into NULL state, it will set its bus to flushing, ie. the bus will drop all existing and new messages on the bus, This is necessary because bus messages hold references to the bin/pipeline or its elements, so there are circular references that need to be broken if one ever wants to be able to destroy a bin or pipeline properly. - Index: part-gstpipeline.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-gstpipeline.txt,v retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- part-gstpipeline.txt 15 Jul 2005 13:44:19 -0000 1.4 +++ part-gstpipeline.txt 24 Sep 2005 14:14:03 -0000 1.5 @@ -4,6 +4,8 @@ A GstPipeline is usually a toplevel bin an provides all of its children with a clock. +A GstPipeline also provides a toplevel GstBus (see part-gstbus.txt) The pipeline also calculates the stream time based on the selected clock (see part-clocks.txt). Index: part-messages.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-messages.txt,v --- part-messages.txt 27 Aug 2005 10:57:00 -0000 1.3 +++ part-messages.txt 24 Sep 2005 14:14:03 -0000 1.4 @@ -73,3 +73,14 @@ An element posted an application specific message. + GST_MESSAGE_SEGMENT_START: + An element started playback of a new segment. This message is not forwarded + the the application but is used internally to scheduler SEGMENT_DONE messages. + GST_MESSAGE_SEGMENT_DONE: + An element or bin completed playback of a segment. This message is only posted + on the bus if a SEGMENT seek is performed on a pipeline. Index: part-overview.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-overview.txt,v --- part-overview.txt 28 Jul 2005 11:24:33 -0000 1.3 +++ part-overview.txt 24 Sep 2005 14:14:03 -0000 1.4 @@ -465,7 +465,7 @@ always stop because of step 1). 3) perform the seek operation 4) send a FLUSH done event to all downstream and upstream peer elements. - 5) send DISCONT event to inform all elements of the new position and to complete + 5) send NEWSEGMENT event to inform all elements of the new position and to complete the seek. In step 1) all dowstream elements have to return from any blocking operations @@ -509,7 +509,7 @@ | 2) stop streaming | 3) perform seek --------------------------> 4) FLUSH done event - --------------------------> 5) DISCONT event + --------------------------> 5) NEWSEGMENT event | e) update stream time | f) PLAY pipeline --- NEW FILE: part-segments.txt --- Segments -------- A segment in GStreamer denotes a set of media samples that must be processed. A segment has a start time, a stop time and a processing rate. A media stream has a start and a stop time. The start time is always 0 and the stop time is the duration (or -1 if unknown, for example a live stream). We call this the complete media stream. The segment of the complete media stream can be played by issuing a seek on the stream. The seek has a start time, a stop time and a processing rate. complete stream +------------------------------------------------+ 0 duration segment |--------------------------| start stop The playback of a segment starts with a source or demuxer element pushing a newsegment event containing the start time, stop time and rate of the segment. The purpose of this newsegment is to inform downstream elements of the requested segment positions. Some elements might produce buffers that fall outside of the segment and that might therefore be discarded or clipped. ex. filesrc ! avidemux ! videodecoder ! videosink When avidemux starts playback of the segment from second 1 to 5, it pushes out a newsegment with 1 and 5 as start and stop times. The video decoder stores these values internally and forwards them to the next downstream element (videosink, which also stores the values) Since second 1 does not contain a keyframe, the avi demuxer starts sending data from the previous keyframe which is at timestamp 0. The video decoder decodes the keyframe but knows it should not push the video frame yet as it falls outside of the configured segment. When the video decoder receives the frame with timestamp 1, it is able to decode this frame as it received and decoded the data up to the previous keyframe. It then continues to decode and push frames with timestamps >= 1. When it reaches timestamp 5, it does not decode and push frames anymore. The stop time is important when the video format contains B frames. The video decoder receives a P frame first, which is can decode but not push yet. When it receives a B frame, it can decode the B frame and push the B frame followed by the previously decoded P frame. If the P frame is outside of the segment, the decoder knows it should not send the P frame. Avidemux stops sending data after pushing frame with timestamp 5 and pushes an EOS event downstream to finish playback. Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.262 retrieving revision 1.263 diff -u -d -r1.262 -r1.263 --- gstbin.c 23 Sep 2005 17:17:42 -0000 1.262 +++ gstbin.c 24 Sep 2005 14:14:03 -0000 1.263 @@ -32,8 +32,8 @@ * allowing for deep nesting of predefined sub-pipelines. * * A new GstBin is created with gst_bin_new(). Use a #GstPipeline instead if you - * want to create a toplevel bin because a normal bin doesn't have a scheduler - * of its own. + * want to create a toplevel bin because a normal bin doesn't have a bus or + * handle clock distribution of its own. * * After the bin has been created you will typically add elements to it with * gst_bin_add(). You can remove elements with gst_bin_remove(). @@ -43,24 +43,15 @@ * purposes and will query the parent bins when the element is not found in the * current bin. - * The list of elements in a bin can be retrieved with gst_bin_get_list(). - * - * After the bin has been set to the PLAYING state (with gst_element_set_state()), - * gst_bin_iterate() is used to process the elements in the bin. + * An iterator of elements in a bin can be retrieved with + * gst_bin_iterate_elements(). Various other iterators exist to retrieve the + * elements in a bin. * The "element_added" signal is fired whenever a new element is added to the * bin. Likewise the "element_removed" signal is fired whenever an element is * removed from the bin. - * gst_bin_destroy() is used to destroy the bin. - * - * To control the selection of the clock in a bin, you can use the following - * methods: - * gst_bin_auto_clock() to let the bin select a clock automatically, - * gst_bin_get_clock() to get the current clock of the bin and - * gst_bin_use_clock() to specify a clock explicitly. - * Note that the default behaviour is to automatically select a clock from one - * of the clock providers in the bin. + * gst_bin_unref() is used to destroy the bin. */ #include "gst_private.h" Index: gstbuffer.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbuffer.c,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- gstbuffer.c 22 Sep 2005 09:30:40 -0000 1.106 +++ gstbuffer.c 24 Sep 2005 14:14:03 -0000 1.107 @@ -58,6 +58,11 @@ * If an element knows what pad you will push the buffer out on, it should use * gst_pad_alloc_buffer() instead to create a buffer. This allows downstream * elements to provide special buffers to write in, like hardware buffers. + * + * A buffer has a pointer to a #GstCaps describing the media type of the data + * in the buffer. Attach caps to the buffer with gst_buffer_set_caps(); this + * is typically done before pushing out a buffer using gst_pad_push() so that + * the downstream element knows the type of the buffer. * gst_buffer_ref() is used to increase the refcount of a buffer. This must be * done when you want to keep a handle to the buffer after pushing it to the @@ -80,12 +85,10 @@ * An element should either unref the buffer or push it out on a src pad * using gst_pad_push() (see #GstPad). - * Buffers usually are freed by unreffing them with gst_buffer_unref(). - * Do not use gst_buffer_free() : this function effectively frees the buffer - * regardless of the refcount, which is dangerous. - * Last reviewed on August 12th, 2004 (0.8.5) + * Buffers usually are freed by unreffing them with gst_buffer_unref(). When + * the refcount drops to 0, the buffer memory will be freed again. + * Last reviewed on September 24th, 2005 (0.9.0) Index: gstclock.c RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- gstclock.c 20 Sep 2005 09:28:56 -0000 1.58 +++ gstclock.c 24 Sep 2005 14:14:03 -0000 1.59 @@ -31,8 +31,10 @@ * The clock time is always measured in nanoseconds and always increases. The * pipeline uses the clock to calculate the stream time. - * Usually all renderers sync to the global clock so that the clock is always - * a good measure of the current playback time in the pipeline. + * Usually all renderers sync to the global clock using the buffer timestamps + * and the segment events. + * The time of the clock in itself is not very usefull for an application. #include <time.h> Index: gstelement.c RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.365 retrieving revision 1.366 diff -u -d -r1.365 -r1.366 --- gstelement.c 23 Sep 2005 17:17:42 -0000 1.365 +++ gstelement.c 24 Sep 2005 14:14:03 -0000 1.366 @@ -39,10 +39,9 @@ * and output (or source) pads. * Core and plug-in writers can add and remove pads with gst_element_add_pad() * and gst_element_remove_pad(). - * Application writers can manipulate ghost pads (copies of real pads inside a bin) - * with gst_element_add_ghost_pad() and gst_element_remove_ghost_pad(). * A pad of an element can be retrieved by name with gst_element_get_pad(). - * A GList of all pads can be retrieved with gst_element_get_pad_list(). + * An iterator of all pads can be retrieved with gst_element_iterate_pads(). * Elements can be linked through their pads. * If the link is straightforward, use the gst_element_link() @@ -61,9 +60,7 @@ * gst_element_state_get_name(). * You can get and set a #GstClock on an element using gst_element_get_clock() - * and gst_element_set_clock(). You can wait for the clock to reach a given - * #GstClockTime using gst_element_clock_wait(). + * and gst_element_set_clock(). #include <glib.h> Index: gstevent.c RCS file: /cvs/gstreamer/gstreamer/gst/gstevent.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- gstevent.c 8 Sep 2005 17:23:57 -0000 1.65 +++ gstevent.c 24 Sep 2005 14:14:03 -0000 1.66 @@ -26,9 +26,10 @@ * The event classes are used to construct and query events. - * Events are usually created with gst_event_new() which takes the event type as - * an argument. Properties specific to the event can be set afterwards with the - * provided macros. The event should be unreferenced with gst_event_unref(). + * Events are usually created with gst_event_new_*() which takes the extra event + * paramters as arguments. + * Events can be parsed with their respective gst_event_parse_*() functions. + * The event should be unreferenced with gst_event_unref(). * gst_event_new_seek() is a usually used to create a seek event and it takes * the needed parameters for a seek event. Index: gstfilter.c RCS file: /cvs/gstreamer/gstreamer/gst/gstfilter.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstfilter.c 31 Aug 2005 14:08:45 -0000 1.12 +++ gstfilter.c 24 Sep 2005 14:14:03 -0000 1.13 @@ -18,13 +18,8 @@ /** * SECTION:gstfilter - * @short_description: Take data in and spit data out + * @short_description: A utility function to filter GLists. - * Filters take data in and spit data out. They are the main elements in a - * filter graph. - * Filters have zero or more inputs and zero or more outputs. Filters are - * linked together to form filter graphs. A #GstFilter is the base class and is - * not very useful on its own. #include <gst/gstfilter.h> Index: gstiterator.c RCS file: /cvs/gstreamer/gstreamer/gst/gstiterator.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstiterator.c 25 Aug 2005 23:17:18 -0000 1.7 +++ gstiterator.c 24 Sep 2005 14:14:03 -0000 1.8 @@ -18,6 +18,18 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. +/** + * SECTION:gstiterator + * @short_description: Object to retrieve multiple elements in a threadsafe + * way. + * @see_also: #GstElement, #GstBin + * A GstIterator is used to retrieve multiple objects from another object in + * a threadsafe way. + * Various GStreamer objects provide access to their internal structures using + * an iterator. + */ #include <gst/gstiterator.h> |
From: <wt...@fr...> - 2005-09-27 17:00:28
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Sep 27 2005 10:00:25 PDT Log message: * docs/design/part-TODO.txt: Update TODO. * gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree), (update_outdegree), (find_element), (gst_bin_sort_iterator_next), (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free), (gst_bin_iterate_sorted), (gst_bin_element_set_state), (gst_bin_change_state): * gst/gstelement.h: Remove element variable, we keep element info in the iterator now. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstbin.c gstelement.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1580&r2=1.1581 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.266&r2=1.267 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.209&r2=1.210 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1580 retrieving revision 1.1581 diff -u -d -r1.1580 -r1.1581 --- ChangeLog 27 Sep 2005 16:30:26 -0000 1.1580 +++ ChangeLog 27 Sep 2005 17:00:13 -0000 1.1581 @@ -1,3 +1,16 @@ +2005-09-27 Wim Taymans <wi...@fl...> + + * docs/design/part-TODO.txt: + Update TODO. + * gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree), + (update_outdegree), (find_element), (gst_bin_sort_iterator_next), + (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free), + (gst_bin_iterate_sorted), (gst_bin_element_set_state), + (gst_bin_change_state): + * gst/gstelement.h: + Remove element variable, we keep element info in the iterator now. 2005-09-27 Andy Wingo <wi...@po...> * libs/gst/dataprotocol/dataprotocol.c: Fix error-checking return Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- part-TODO.txt 27 Jul 2005 18:33:02 -0000 1.7 +++ part-TODO.txt 27 Sep 2005 17:00:13 -0000 1.8 @@ -8,9 +8,6 @@ done by making the event contain a GstStructure with input/output values, similar to GstMessage. -- implement iterators for traversing elements upstream or dowstream. Use more simple - algorithm using indegree topological sort. - - unlinking pads in the PAUSED state needs to make sure the stream thread is not executing code. Can this be done with a flush to unlock all downstream chain functions? Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.266 retrieving revision 1.267 diff -u -d -r1.266 -r1.267 --- gstbin.c 27 Sep 2005 16:16:39 -0000 1.266 +++ gstbin.c 27 Sep 2005 17:00:13 -0000 1.267 @@ -1057,22 +1057,30 @@ typedef struct _GstBinSortIterator { GstIterator it; - GQueue *queue; - GstBin *bin; - gint mode; - GstElement *best; + GQueue *queue; /* elements queued for state change */ + GstBin *bin; /* bin we iterate */ + gint mode; /* adding or removing dependency */ + GstElement *best; /* next element with least dependencies */ + gint best_deg; /* best degree */ + GHashTable *hash; /* has table with element dependencies */ } GstBinSortIterator; +/* we add and subtract 1 to make sure we don't confuse NULL and 0 */ +#define HASH_SET_DEGREE(bit, elem, deg) \ + g_hash_table_replace (bit->hash, elem, GINT_TO_POINTER(deg+1)) +#define HASH_GET_DEGREE(bit, elem) \ + (GPOINTER_TO_INT(g_hash_table_lookup (bit->hash, elem))-1) /* add element to queue of next elements in the iterator. * We push at the tail to give higher priority elements a * chance first */ static void -add_to_queue (GQueue * queue, GstElement * element) +add_to_queue (GstBinSortIterator * bit, GstElement * element) GST_DEBUG ("%s add to queue", GST_ELEMENT_NAME (element)); gst_object_ref (element); - g_queue_push_tail (queue, element); - element->outdegree = -1; + g_queue_push_tail (bit->queue, element); + HASH_SET_DEGREE (bit, element, -1); } /* clear the queue, unref all objects as we took a ref when @@ -1093,10 +1101,10 @@ /* sinks are added right away */ if (GST_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK)) { - add_to_queue (bit->queue, element); + add_to_queue (bit, element); } else { /* others are marked with 0 and handled when sinks are done */ - element->outdegree = 0; + HASH_SET_DEGREE (bit, element, 0); } @@ -1129,17 +1137,21 @@ GST_LOCK (peer_element); if (GST_OBJECT_CAST (peer_element)->parent == GST_OBJECT_CAST (bit->bin)) { + gint old_deg, new_deg; + old_deg = HASH_GET_DEGREE (bit, peer_element); + new_deg = old_deg + bit->mode; GST_DEBUG ("change element %s, degree %d->%d, linked to %s", GST_ELEMENT_NAME (peer_element), - peer_element->outdegree, peer_element->outdegree + bit->mode, - GST_ELEMENT_NAME (element)); + old_deg, new_deg, GST_ELEMENT_NAME (element)); /* update outdegree */ - peer_element->outdegree += bit->mode; - if (peer_element->outdegree == 0) { + if (new_deg == 0) { /* outdegree hit 0, add to queue */ - add_to_queue (bit->queue, peer_element); + add_to_queue (bit, peer_element); + } else { + HASH_SET_DEGREE (bit, peer_element, new_deg); } linked = TRUE; } @@ -1164,12 +1176,13 @@ gint outdegree; /* element is already handled */ - if ((outdegree = element->outdegree) < 0) + if ((outdegree = HASH_GET_DEGREE (bit, element)) < 0) return; /* first element or element with smaller outdegree */ - if (bit->best == NULL || bit->best->outdegree > outdegree) { + if (bit->best == NULL || bit->best_deg > outdegree) { bit->best = element; + bit->best_deg = outdegree; @@ -1181,16 +1194,17 @@ /* empty queue, we have to find a next best element */ if (g_queue_is_empty (bit->queue)) { bit->best = NULL; + bit->best_deg = G_MAXINT; g_list_foreach (bit->bin->children, (GFunc) find_element, bit); if (bit->best) { - if (bit->best->outdegree != 0) { + if (bit->best_deg != 0) { /* we don't fail on this one yet */ g_warning ("loop detected in the graph !!"); } - /* best unhandled elements, add to queue */ + /* best unhandled elements, scheduler as next element */ GST_DEBUG ("queue empty, next best: %s", GST_ELEMENT_NAME (bit->best)); gst_object_ref (bit->best); - bit->best->outdegree = -1; + HASH_SET_DEGREE (bit, bit->best, -1); *result = bit->best; } else { GST_DEBUG ("queue empty, elements exhausted"); @@ -1229,6 +1243,7 @@ clear_queue (bit->queue); g_queue_free (bit->queue); + g_hash_table_destroy (bit->hash); gst_object_unref (bit->bin); g_free (bit); @@ -1249,9 +1264,6 @@ * * MT safe. - * FIXME: No two iterators can run at the same time since the iterators - * use a shared element field. - * * Returns: a #GstIterator of #GstElements. gst_iterator_free after use. */ GstIterator * @@ -1274,6 +1286,7 @@ (GstIteratorResyncFunction) gst_bin_sort_iterator_resync, (GstIteratorFreeFunction) gst_bin_sort_iterator_free); result->queue = g_queue_new (); + result->hash = g_hash_table_new (NULL, NULL); result->bin = bin; gst_bin_sort_iterator_resync (result); GST_UNLOCK (bin); Index: gstelement.h RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.209 retrieving revision 1.210 diff -u -d -r1.209 -r1.210 --- gstelement.h 27 Sep 2005 16:16:39 -0000 1.209 +++ gstelement.h 27 Sep 2005 17:00:13 -0000 1.210 @@ -304,10 +304,6 @@ GList *sinkpads; guint32 pads_cookie; - /* used in bin state change to calculate number of connections - * on the srcpad */ - gint outdegree; /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; |
From: <wt...@fr...> - 2005-10-11 11:08:53
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Oct 11 2005 04:09:04 PDT Log message: * docs/design/part-states.txt: Some more docs. * gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state), (gst_bin_change_state_func), (bin_bus_handler): Doc updates. Don't distribute the same clock over and over again. * gst/gstclock.c: * gst/gstclock.h: Doc updates. * gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark), (gst_pad_get_type), (gst_pad_push), (gst_pad_push_event), (gst_pad_send_event): * gst/gstpad.h: Make probe emission threadsafe again. Register quarks and move _get_name() from utils. Doc updates. * gst/gstpipeline.c: (gst_pipeline_class_init), (gst_pipeline_change_state), (gst_pipeline_provide_clock_func): Only redistribute the clock of it changed. * gst/gstsystemclock.h: Doc updates. * gst/gstutils.c: * gst/gstutils.h: Moved the _flow_get_name() to GstPad. Modified files: . : ChangeLog docs/design : part-states.txt gst : gstbin.c gstbin.h gstclock.c gstclock.h gstpad.c gstpad.h gstpipeline.c gstsystemclock.h gstutils.c gstutils.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1690&r2=1.1691 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-states.txt.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.282&r2=1.283 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.80&r2=1.81 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.c.diff?r1=1.60&r2=1.61 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.h.diff?r1=1.43&r2=1.44 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.450&r2=1.451 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.h.diff?r1=1.190&r2=1.191 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpipeline.c.diff?r1=1.116&r2=1.117 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.h.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstutils.c.diff?r1=1.100&r2=1.101 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstutils.h.diff?r1=1.56&r2=1.57 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1690 retrieving revision 1.1691 diff -u -d -r1.1690 -r1.1691 --- ChangeLog 10 Oct 2005 23:55:39 -0000 1.1690 +++ ChangeLog 11 Oct 2005 11:08:51 -0000 1.1691 @@ -1,3 +1,35 @@ +2005-10-11 Wim Taymans <wi...@fl...> + + * docs/design/part-states.txt: + Some more docs. + * gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state), + (gst_bin_change_state_func), (bin_bus_handler): + Doc updates. Don't distribute the same clock over and over again. + * gst/gstclock.c: + * gst/gstclock.h: + Doc updates. + * gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark), + (gst_pad_get_type), (gst_pad_push), (gst_pad_push_event), + (gst_pad_send_event): + * gst/gstpad.h: + Make probe emission threadsafe again. + Register quarks and move _get_name() from utils. + * gst/gstpipeline.c: (gst_pipeline_class_init), + (gst_pipeline_change_state), (gst_pipeline_provide_clock_func): + Only redistribute the clock of it changed. + * gst/gstsystemclock.h: + Doc updates. + * gst/gstutils.c: + * gst/gstutils.h: + Moved the _flow_get_name() to GstPad. 2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org> * check/gst-libs/gdp.c: (GST_START_TEST): Index: part-states.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-states.txt,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- part-states.txt 8 Oct 2005 16:49:15 -0000 1.5 +++ part-states.txt 11 Oct 2005 11:08:52 -0000 1.6 @@ -286,6 +286,55 @@ Locking overview (element) -------------------------- +* Element commiting SUCCESS + - STATE_LOCK is taken in set_state + - change state is called if SUCCESS, commit state is called + - commit state calls change_state to next state change. + - if final state is reached, stack unwinds and result is returned to + set_state and caller. + set_state(element) change_state (element) commit_state + | | | + STATE_LOCK | | + |------------------------>| | + | | | + | | (do state change) | + | | if SUCCESS | + | |---------------------->| + | | | post message + | |<----------------------| if (!final) change_state (next) + | | | else SIGNAL + |<------------------------| | + | SUCCESS + | + STATE_UNLOCK + | + SUCCESS + +* Element commiting ASYNC + - change state is called and returns ASYNC + - ASYNC returned to the caller. + - element takes STATE_LOCK in streaming thread. + - element calls commit_state in streaming thread. set_state(element) change_state (element) stream_thread commit_state (element) | | | | @@ -298,19 +347,21 @@ | | (start_task) | | | | STREAM_LOCK | - | | | | + | | |... | |<------------------------| | | - | ASYNC | | + | ASYNC STREAM_UNLOCK | STATE_UNLOCK | | | .....sync........ STATE_LOCK | ASYNC |----------------->| | | - | |---> post_message(ASYNC) + | |---> post_message() | |---> if (!final) change_state (next) | | else SIGNAL |<-----------------| STATE_UNLOCK | + STREAM_LOCK + | ... STREAM_UNLOCK Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.282 retrieving revision 1.283 diff -u -d -r1.282 -r1.283 --- gstbin.c 10 Oct 2005 16:38:24 -0000 1.282 +++ gstbin.c 11 Oct 2005 11:08:52 -0000 1.283 @@ -51,7 +51,7 @@ * bin. Likewise the "element_removed" signal is fired whenever an element is * removed from the bin. * - * gst_bin_unref() is used to destroy the bin. + * gst_object_unref() is used to destroy the bin. */ #include "gst_private.h" @@ -70,11 +70,6 @@ GST_DEBUG_CATEGORY_STATIC (bin_debug); #define GST_CAT_DEFAULT bin_debug -#define GST_LOG_BIN_CONTENTS(bin, text) GST_LOG_OBJECT ((bin), \ - text ": %d elements: %u PLAYING, %u PAUSED, %u READY, %u NULL, own state: %s", \ - (bin)->numchildren, (guint) (bin)->child_states[3], \ - (guint) (bin)->child_states[2], (bin)->child_states[1], \ - (bin)->child_states[0], gst_element_state_get_name (GST_STATE (bin))) static GstElementDetails gst_bin_details = GST_ELEMENT_DETAILS ("Generic bin", "Generic/Bin", @@ -351,10 +346,12 @@ bin = GST_BIN (element); GST_LOCK (bin); - for (children = bin->children; children; children = g_list_next (children)) { - GstElement *child = GST_ELEMENT (children->data); + if (element->clock != clock) { + for (children = bin->children; children; children = g_list_next (children)) { + GstElement *child = GST_ELEMENT (children->data); - gst_element_set_clock (child, clock); + gst_element_set_clock (child, clock); + } } GST_UNLOCK (bin); } Index: gstbin.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstbin.h 10 Oct 2005 16:38:24 -0000 1.80 +++ gstbin.h 11 Oct 2005 11:08:52 -0000 1.81 @@ -94,6 +94,7 @@ gboolean polling; gboolean state_dirty; /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; Index: gstclock.c RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstclock.c 8 Oct 2005 08:00:37 -0000 1.60 +++ gstclock.c 11 Oct 2005 11:08:52 -0000 1.61 @@ -31,8 +31,8 @@ * The clock time is always measured in nanoseconds and always increases. The * pipeline uses the clock to calculate the stream time. - * Usually all renderers sync to the global clock using the buffer timestamps - * and the segment events. + * Usually all renderers sync to the global clock using the buffer timestamps, + * the newsegment events and the element's base time. * The time of the clock in itself is not very usefull for an application. Index: gstclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.h,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gstclock.h 24 Sep 2005 11:41:01 -0000 1.43 +++ gstclock.h 11 Oct 2005 11:08:52 -0000 1.44 @@ -1,6 +1,7 @@ /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <om...@cs...> * 2000 Wim Taymans <wt...@ch...> + * 2005 Wim Taymans <wi...@fl...> * gstclock.h: Header for clock subsystem Index: gstpad.c RCS file: /cvs/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.450 retrieving revision 1.451 diff -u -d -r1.450 -r1.451 --- gstpad.c 9 Oct 2005 20:49:46 -0000 1.450 +++ gstpad.c 11 Oct 2005 11:08:52 -0000 1.451 @@ -73,17 +73,6 @@ #include "gstvalue.h" GST_DEBUG_CATEGORY_STATIC (debug_dataflow); -#define DEBUG_DATA(obj,data,notice) G_STMT_START{\ - if (!data) { \ - GST_CAT_DEBUG_OBJECT (debug_dataflow, obj, "NULL data value"); \ - } else if (GST_IS_EVENT (data)) { \ - GST_CAT_DEBUG_OBJECT (debug_dataflow, obj, "%s event %p (type %d, refcount %d)", notice, data, \ - GST_EVENT_TYPE (data), GST_DATA_REFCOUNT_VALUE (data)); \ - } else { \ - GST_CAT_LOG_OBJECT (debug_dataflow, obj, "%s buffer %p (size %u, refcount %d)", notice, data, \ - GST_BUFFER_SIZE (data), GST_BUFFER_REFCOUNT_VALUE (data)); \ - } \ -}G_STMT_END #define GST_CAT_DEFAULT GST_CAT_PADS /* Pad signals and args */ @@ -129,9 +118,71 @@ static GstObjectClass *parent_class = NULL; static guint gst_pad_signals[LAST_SIGNAL] = { 0 }; +/* quarks for probe signals */ static GQuark buffer_quark; static GQuark event_quark; +typedef struct +{ + gint ret; + gchar *name; + GQuark quark; +} GstFlowQuarks; +static GstFlowQuarks flow_quarks[] = { + {GST_FLOW_RESEND, "resend", 0}, + {GST_FLOW_OK, "ok", 0}, + {GST_FLOW_NOT_LINKED, "not-linked", 0}, + {GST_FLOW_WRONG_STATE, "wrong-state", 0}, + {GST_FLOW_UNEXPECTED, "unexpected", 0}, + {GST_FLOW_NOT_NEGOTIATED, "not-negotiated", 0}, + {GST_FLOW_ERROR, "error", 0}, + {GST_FLOW_NOT_SUPPORTED, "not-supported", 0}, + {0, NULL, 0} +}; +/** + * gst_flow_get_name: + * @ret: a #GstFlowReturn to get the name of. + * + * Gets a string representing the given flow return. + * Returns: a string with the name of the flow return. + */ +G_CONST_RETURN gchar * +gst_flow_get_name (GstFlowReturn ret) + gint i; + for (i = 0; flow_quarks[i].name; i++) { + if (ret == flow_quarks[i].ret) + return flow_quarks[i].name; + } + return "unknown"; +} + * gst_flow_to_quark: + * @ret: a #GstFlowReturn to get the quark of. + * Get the unique quark for the given GstFlowReturn. + * Returns: the quark associated with the flow return or 0 if an + * invalid return was specified. +GQuark +gst_flow_to_quark (GstFlowReturn ret) + return flow_quarks[i].quark; + return 0; GType gst_pad_get_type (void) { @@ -143,6 +194,7 @@ 0, (GInstanceInitFunc) gst_pad_init, NULL }; + gint i; _gst_pad_type = g_type_register_static (GST_TYPE_OBJECT, "GstPad", &pad_info, 0); @@ -150,6 +202,10 @@ buffer_quark = g_quark_from_static_string ("buffer"); event_quark = g_quark_from_static_string ("event"); + for (i = 0; flow_quarks[i].name; i++) { + flow_quarks[i].quark = g_quark_from_static_string (flow_quarks[i].name); GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW", GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads"); @@ -3089,8 +3145,6 @@ GstPad *peer; GstFlowReturn ret; - gboolean emit_signal; - gboolean signal_ret = TRUE; g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR); g_return_val_if_fail (GST_PAD_DIRECTION (pad) == GST_PAD_SRC, GST_FLOW_ERROR); @@ -3106,23 +3160,18 @@ /* we emit signals on the pad arg, the peer will have a chance to * emit in the _chain() function */ - emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0; - GST_UNLOCK (pad); + if (G_UNLIKELY (GST_PAD_DO_BUFFER_SIGNALS (pad) > 0)) { + /* unlock before emitting */ + GST_UNLOCK (pad); - if (G_UNLIKELY (emit_signal)) { - signal_ret = gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer)); - } + /* if the signal handler returned FALSE, it means we should just drop the + * buffer */ + if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer))) + goto dropped; - /* if the signal handler returned FALSE, it means we should just drop the - * buffer */ - if (signal_ret == FALSE) { - gst_buffer_unref (buffer); - GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return"); - return GST_FLOW_OK; + GST_LOCK (pad); - GST_LOCK (pad); - if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL)) goto not_linked; gst_object_ref (peer); @@ -3135,6 +3184,12 @@ return ret; /* ERROR recovery here */ +dropped: + { + gst_buffer_unref (buffer); + GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return"); + return GST_FLOW_OK; not_linked: { gst_buffer_unref (buffer); @@ -3382,25 +3437,20 @@ GstPad *peerpad; gboolean result; g_return_val_if_fail (GST_IS_PAD (pad), FALSE); g_return_val_if_fail (event != NULL, FALSE); + g_return_val_if_fail (GST_IS_EVENT (event), FALSE); - emit_signal = GST_PAD_DO_EVENT_SIGNALS (pad) > 0; + GST_LOCK (pad); + if (G_UNLIKELY (GST_PAD_DO_EVENT_SIGNALS (pad) > 0)) { - signal_ret = gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (event)); + if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (event))) + goto dropping; - GST_DEBUG_OBJECT (pad, "Dropping event after FALSE probe return"); - gst_event_unref (event); - return FALSE; peerpad = GST_PAD_PEER (pad); if (peerpad == NULL) @@ -3415,6 +3465,12 @@ return result; /* ERROR handling */ +dropping: + GST_DEBUG_OBJECT (pad, "Dropping event after FALSE probe return"); + gst_event_unref (event); + return FALSE; gst_event_unref (event); @@ -3444,7 +3500,6 @@ GST_LOCK (pad); if (GST_PAD_IS_SINK (pad) && !GST_EVENT_IS_DOWNSTREAM (event)) goto wrong_direction; if (GST_PAD_IS_SRC (pad) && !GST_EVENT_IS_UPSTREAM (event)) @@ -3482,8 +3537,6 @@ goto no_function; emit_signal = GST_PAD_DO_EVENT_SIGNALS (pad) > 0; - gst_object_ref (pad); GST_UNLOCK (pad); if (G_UNLIKELY (emit_signal)) { @@ -3493,8 +3546,6 @@ result = eventfunc (GST_PAD_CAST (pad), event); - gst_object_unref (pad); @@ -3524,7 +3575,6 @@ dropping: GST_DEBUG ("Dropping event after FALSE probe return"); - gst_object_unref (pad); return FALSE; Index: gstpad.h RCS file: /cvs/gstreamer/gstreamer/gst/gstpad.h,v retrieving revision 1.190 retrieving revision 1.191 diff -u -d -r1.190 -r1.191 --- gstpad.h 9 Oct 2005 20:49:46 -0000 1.190 +++ gstpad.h 11 Oct 2005 11:08:52 -0000 1.191 @@ -76,7 +76,7 @@ * @ret: the #GstPadLinkReturn value * Macro to test if the given #GstPadLinkReturn value indicates a failed - * negotiation step (REFUSED/DELAYED). + * link step. #define GST_PAD_LINK_FAILED(ret) ((ret) < GST_PAD_LINK_OK) @@ -85,25 +85,47 @@ * Macro to test if the given #GstPadLinkReturn value indicates a successfull - * negotiation step (OK/DONE). #define GST_PAD_LINK_SUCCESSFUL(ret) ((ret) >= GST_PAD_LINK_OK) + * GstFlowReturn: + * GST_FLOW_RESEND: Resend buffer, possibly with new caps. + * GST_FLOW_OK: Data passing was ok. + * GST_FLOW_NOT_LINKED: Pad is not linked. + * GST_FLOW_WRONG_STATE: Pad is in wrong state. + * GST_FLOW_UNEXPECTED: Did not expect anything, like after EOS. + * GST_FLOW_NOT_NEGOTIATED: Pad is not negotiated. + * GST_FLOW_ERROR: Some (fatal) error occured. + * The result of passing data to a linked pad. typedef enum { - GST_FLOW_RESEND = 1, /* resend buffer, possibly with new caps */ - GST_FLOW_OK = 0, /* data passing was ok */ + GST_FLOW_RESEND = 1, + GST_FLOW_OK = 0, /* expected failures */ - GST_FLOW_NOT_LINKED = -1, /* pad is not linked */ - GST_FLOW_WRONG_STATE = -2, /* pad is in wrong state */ + GST_FLOW_NOT_LINKED = -1, + GST_FLOW_WRONG_STATE = -2, /* error cases */ - GST_FLOW_UNEXPECTED = -3, /* did not expect anything, like after EOS */ - GST_FLOW_NOT_NEGOTIATED = -4, /* pad is not negotiated */ - GST_FLOW_ERROR = -5, /* some (fatal) error occured */ - GST_FLOW_NOT_SUPPORTED = -6 /* function not supported */ + GST_FLOW_UNEXPECTED = -3, + GST_FLOW_NOT_NEGOTIATED = -4, + GST_FLOW_ERROR = -5, + GST_FLOW_NOT_SUPPORTED = -6 } GstFlowReturn; + * GST_FLOW_IS_FATAL: + * @ret: a #GstFlowReturn value + * Macro to test if the given #GstFlowReturn value indicates a fatal + * error. #define GST_FLOW_IS_FATAL(ret) ((ret) <= GST_FLOW_UNEXPECTED) +G_CONST_RETURN gchar* gst_flow_get_name (GstFlowReturn ret); +GQuark gst_flow_to_quark (GstFlowReturn ret); GST_ACTIVATE_NONE, GST_ACTIVATE_PUSH, Index: gstpipeline.c RCS file: /cvs/gstreamer/gstreamer/gst/gstpipeline.c,v retrieving revision 1.116 retrieving revision 1.117 diff -u -d -r1.116 -r1.117 --- gstpipeline.c 10 Oct 2005 16:38:24 -0000 1.116 +++ gstpipeline.c 11 Oct 2005 11:08:52 -0000 1.117 @@ -324,10 +324,10 @@ GST_TIME_ARGS (start_time), GST_TIME_ARGS (element->base_time)); GST_UNLOCK (element); - /* now distribute the clock */ - gst_element_set_clock (element, clock); if (new_clock) { + /* now distribute the clock */ + gst_element_set_clock (element, clock); /* if we selected a new clock, let the app know about it */ gst_element_post_message (element, gst_message_new_new_clock (GST_OBJECT_CAST (element), clock)); Index: gstsystemclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstsystemclock.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstsystemclock.h 30 May 2005 15:48:44 -0000 1.13 +++ gstsystemclock.h 11 Oct 2005 11:08:52 -0000 1.14 * gstsystemclock.h: A clock implementation based on system time Index: gstutils.c RCS file: /cvs/gstreamer/gstreamer/gst/gstutils.c,v retrieving revision 1.100 retrieving revision 1.101 diff -u -d -r1.100 -r1.101 --- gstutils.c 10 Oct 2005 18:16:36 -0000 1.100 +++ gstutils.c 11 Oct 2005 11:08:52 -0000 1.101 @@ -1784,41 +1784,6 @@ /** - * gst_flow_get_name: - * @ret: a #GstFlowReturn to get the name of. - * - * Gets a string representing the given flow return. - * Returns: a string with the name of the flow return. - */ -G_CONST_RETURN gchar * -gst_flow_get_name (GstFlowReturn ret) -{ - switch (ret) { - case GST_FLOW_RESEND: - return "RESEND_BUFFER"; - case GST_FLOW_OK: - return "OK"; - /* expected failures */ - case GST_FLOW_NOT_LINKED: - return "NOT_LINKED"; - case GST_FLOW_WRONG_STATE: - return "WRONG_STATE"; - /* error cases */ - case GST_FLOW_UNEXPECTED: - return "UNEXPECTED"; - case GST_FLOW_NOT_NEGOTIATED: - return "NOT_NEGOTIATED"; - case GST_FLOW_ERROR: - return "ERROR"; - case GST_FLOW_NOT_SUPPORTED: - return "NOT_SUPPORTED"; - default: - return "UNKNOWN error"; -} -/** * gst_object_default_error: * @source: the #GstObject that initiated the error. * @error: the GError. Index: gstutils.h RCS file: /cvs/gstreamer/gstreamer/gst/gstutils.h,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- gstutils.h 10 Oct 2005 18:16:36 -0000 1.56 +++ gstutils.h 11 Oct 2005 11:08:52 -0000 1.57 @@ -529,10 +529,6 @@ GstElement* gst_pad_get_parent_element (GstPad *pad); -/* flow */ -G_CONST_RETURN gchar* gst_flow_get_name (GstFlowReturn ret); /* util query functions */ gboolean gst_pad_query_position (GstPad *pad, GstFormat *format, gint64 *cur, gint64 *end); |
From: <wt...@fr...> - 2005-10-25 15:39:50
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Oct 25 2005 08:39:48 PDT Log message: * docs/design/part-TODO.txt: Update TODO. * gst/gstbin.c: (message_check), (bin_replace_message), (bin_remove_messages), (is_eos), (gst_bin_add_func), (update_degree), (gst_bin_sort_iterator_next), (bin_bus_handler), (bin_query_duration_init), (bin_query_duration_fold), (bin_query_duration_done), (bin_query_generic_fold), (gst_bin_query): Handle SEGMENT_START/DONE messages correctly. More evolved query algorithm that handles duration queries correctly. * gst/gstelement.c: (gst_element_send_event), (gst_element_query), (gst_element_get_state_func), (gst_element_abort_state), (gst_element_commit_state), (gst_element_lost_state): Some more debugging. * gst/gstmessage.h: Added doc. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstbin.c gstelement.c gstmessage.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1790&r2=1.1791 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.298&r2=1.299 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.399&r2=1.400 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstmessage.h.diff?r1=1.31&r2=1.32 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1790 retrieving revision 1.1791 diff -u -d -r1.1790 -r1.1791 --- ChangeLog 25 Oct 2005 10:15:45 -0000 1.1790 +++ ChangeLog 25 Oct 2005 15:39:36 -0000 1.1791 @@ -1,5 +1,28 @@ 2005-10-25 Wim Taymans <wi...@fl...> + * docs/design/part-TODO.txt: + Update TODO. + + * gst/gstbin.c: (message_check), (bin_replace_message), + (bin_remove_messages), (is_eos), (gst_bin_add_func), + (update_degree), (gst_bin_sort_iterator_next), (bin_bus_handler), + (bin_query_duration_init), (bin_query_duration_fold), + (bin_query_duration_done), (bin_query_generic_fold), + (gst_bin_query): + Handle SEGMENT_START/DONE messages correctly. + More evolved query algorithm that handles duration queries + correctly. + * gst/gstelement.c: (gst_element_send_event), (gst_element_query), + (gst_element_get_state_func), (gst_element_abort_state), + (gst_element_commit_state), (gst_element_lost_state): + Some more debugging. + * gst/gstmessage.h: + Added doc. +2005-10-25 Wim Taymans <wi...@fl...> * gst/base/gstbasesink.c: (gst_base_sink_get_position): Don't use invalid stream_time. Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- part-TODO.txt 20 Oct 2005 17:18:12 -0000 1.10 +++ part-TODO.txt 25 Oct 2005 15:39:36 -0000 1.11 @@ -31,3 +31,4 @@ - make bin_bus_handler a vmethod so subclasses can use their own implementation or chain to the parent. +- make it possible to seek on other formats than bytes in basesrc. Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.298 retrieving revision 1.299 diff -u -d -r1.298 -r1.299 --- gstbin.c 20 Oct 2005 17:22:40 -0000 1.298 +++ gstbin.c 25 Oct 2005 15:39:36 -0000 1.299 @@ -442,13 +442,20 @@ } /* with LOCK, returns TRUE if message had a valid SRC, takes ref on - * the message. */ + * the message. + * + * A message that is cached and has the same SRC and type is replaced + * by the given message. + */ static gboolean bin_replace_message (GstBin * bin, GstMessage * message, GstMessageType types) { GList *previous; GstObject *src; gboolean res = TRUE; + const gchar *name; + name = gst_message_type_get_name (GST_MESSAGE_TYPE (message)); if ((src = GST_MESSAGE_SRC (message))) { MessageFind find; @@ -465,19 +472,16 @@ previous->data = message; GST_DEBUG_OBJECT (bin, "replace old message %s from %s", - gst_message_type_get_name (GST_MESSAGE_TYPE (message)), - GST_ELEMENT_NAME (src)); + name, GST_ELEMENT_NAME (src)); } else { /* keep new message */ bin->messages = g_list_prepend (bin->messages, message); GST_DEBUG_OBJECT (bin, "got new message %s from %s", } } else { - GST_DEBUG_OBJECT (bin, "got message %s from (NULL), not processing", - gst_message_type_get_name (GST_MESSAGE_TYPE (message))); + GST_DEBUG_OBJECT (bin, "got message %s from (NULL), not processing", name); res = FALSE; gst_message_unref (message); } @@ -1756,6 +1760,8 @@ GST_UNLOCK (bin); break; + /* non toplevel bins just forward the message and don't start + * a recalc themselves */ not_toplevel: { GST_UNLOCK (bin); @@ -1769,15 +1775,54 @@ case GST_MESSAGE_SEGMENT_START: GST_LOCK (bin); + /* replace any previous segment_start message from this source + * with the new segment start message */ bin_replace_message (bin, message, GST_MESSAGE_SEGMENT_START); case GST_MESSAGE_SEGMENT_DONE: + { + MessageFind find; + gboolean post = FALSE; + GstFormat format; + gint64 position; + gst_message_parse_segment_done (message, &format, &position); + /* if there are no more segment_start messages, everybody posted + * a segment_done and we can post one on the bus. */ + /* we don't care who still has a pending segment start */ + find.src = NULL; + find.types = GST_MESSAGE_SEGMENT_START; + if (!g_list_find_custom (bin->messages, &find, + (GCompareFunc) message_check)) { + /* nothing found */ + post = TRUE; + /* remove all old segment_done messages */ + bin_remove_messages (bin, NULL, GST_MESSAGE_SEGMENT_DONE); + } + if (post) { + /* post segment done with latest format and position. */ + gst_element_post_message (GST_ELEMENT_CAST (bin), + gst_message_new_segment_done (GST_OBJECT_CAST (bin), + format, position)); + } case GST_MESSAGE_DURATION: + /* remove all cached duration messages, next time somebody asks + * for duration, we will recalculate. */ + GST_LOCK (bin); + bin_remove_messages (bin, NULL, GST_MESSAGE_DURATION); + GST_UNLOCK (bin); + /* fallthrough */ default: /* Send all other messages upward */ GST_DEBUG_OBJECT (bin, "posting message upward"); @@ -1788,40 +1833,130 @@ return GST_BUS_DROP; +/* generic struct passed to all query fold methods */ +typedef struct +{ + GstQuery *query; + gint64 max; +} QueryFold; +typedef void (*QueryInitFunction) (GstBin * bin, QueryFold * fold); +typedef void (*QueryDoneFunction) (GstBin * bin, QueryFold * fold); +/* for duration we collect all durations and take the MAX of + * all valid results */ +static void +bin_query_duration_init (GstBin * bin, QueryFold * fold) + fold->max = -1; +} +static gboolean +bin_query_duration_fold (GstElement * item, GValue * ret, QueryFold * fold) + if (gst_element_query (item, fold->query)) { + gint64 duration; + g_value_set_boolean (ret, TRUE); + gst_query_parse_duration (fold->query, NULL, &duration); + GST_DEBUG_OBJECT (item, "got duration %" G_GINT64_FORMAT, duration); + if (duration > fold->max) + fold->max = duration; + } + return TRUE; +bin_query_duration_done (GstBin * bin, QueryFold * fold) + GstFormat format; + gst_query_parse_duration (fold->query, &format, NULL); + /* store max in query result */ + gst_query_set_duration (fold->query, format, fold->max); + GST_DEBUG_OBJECT (bin, "max duration %" G_GINT64_FORMAT, fold->max); +/* generic fold, return first valid result */ +bin_query_generic_fold (GstElement * item, GValue * ret, QueryFold * fold) + gboolean res; + if ((res = gst_element_query (item, fold->query))) { + GST_DEBUG_OBJECT (item, "answered query"); + /* and stop as soon as we have a valid result */ + return !res; gst_bin_query (GstElement * element, GstQuery * query) GstBin *bin = GST_BIN (element); GstIterator *iter; - gboolean res = FALSE, done = FALSE; + gboolean res = FALSE; + GstIteratorFoldFunction fold_func; + QueryInitFunction fold_init = NULL; + QueryDoneFunction fold_done = NULL; + QueryFold fold_data; + GValue ret = { 0 }; + fold_data.query = query; + g_value_init (&ret, G_TYPE_BOOLEAN); + g_value_set_boolean (&ret, FALSE); + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION: + fold_func = (GstIteratorFoldFunction) bin_query_duration_fold; + fold_init = bin_query_duration_init; + fold_done = bin_query_duration_done; + break; + default: + fold_func = (GstIteratorFoldFunction) bin_query_generic_fold; iter = gst_bin_iterate_sinks (bin); GST_DEBUG_OBJECT (bin, "Sending query to sink children"); - while (!(res || done)) { - gpointer data; + if (fold_init) + fold_init (bin, &fold_data); - switch (gst_iterator_next (iter, &data)) { - case GST_ITERATOR_OK: - { - GstElement *sink; + while (TRUE) { + GstIteratorResult ires; - sink = GST_ELEMENT_CAST (data); - res = gst_element_query (sink, query); - gst_object_unref (sink); - break; - } + ires = gst_iterator_fold (iter, fold_func, &ret, &fold_data); + switch (ires) { case GST_ITERATOR_RESYNC: gst_iterator_resync (iter); + if (fold_init) + fold_init (bin, &fold_data); + g_value_set_boolean (&ret, FALSE); break; - default: + case GST_ITERATOR_OK: case GST_ITERATOR_DONE: - done = TRUE; + if (fold_done) + fold_done (bin, &fold_data); + res = g_value_get_boolean (&ret); + goto done; + default: + res = FALSE; +done: gst_iterator_free (iter); + GST_DEBUG_OBJECT (bin, "query result %d", res); return res; Index: gstelement.c RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.399 retrieving revision 1.400 diff -u -d -r1.399 -r1.400 --- gstelement.c 20 Oct 2005 20:25:55 -0000 1.399 +++ gstelement.c 25 Oct 2005 15:39:36 -0000 1.400 @@ -1185,6 +1185,8 @@ oclass = GST_ELEMENT_GET_CLASS (element); if (oclass->send_event) { + GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send event on element %s", + GST_ELEMENT_NAME (element)); result = oclass->send_event (element, event); GstPad *pad = gst_element_get_random_pad (element, GST_PAD_SINK); @@ -1306,6 +1308,8 @@ if (oclass->query) { + GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s", result = oclass->query (element, query); GstPad *pad = gst_element_get_random_pad (element, GST_PAD_SRC); Index: gstmessage.h RCS file: /cvs/gstreamer/gstreamer/gst/gstmessage.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstmessage.h 21 Oct 2005 11:36:32 -0000 1.31 +++ gstmessage.h 25 Oct 2005 15:39:36 -0000 1.32 @@ -37,6 +37,7 @@ * @GST_MESSAGE_TAG: a tag was found. * @GST_MESSAGE_BUFFERING: the pipeline is buffering * @GST_MESSAGE_STATE_CHANGED: a state change happened + * @GST_MESSAGE_STATE_DIRTY: an element changed state in a streaming thread * @GST_MESSAGE_STEP_DONE: a framestep finished. * @GST_MESSAGE_CLOCK_PROVIDE: an element notifies its capability of providing * a clock. |
From: <wt...@fr...> - 2005-10-28 16:21:44
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Fri Oct 28 2005 09:21:41 PDT Log message: * docs/design/part-TODO.txt: Add an item to TODO. * gst/gstiterator.c: (gst_iterator_fold), (gst_iterator_find_custom): * gst/gstiterator.h: Add iterator docs. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstiterator.c gstiterator.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1799&r2=1.1800 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstiterator.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstiterator.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: part-TODO.txt =================================================================== RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- part-TODO.txt 25 Oct 2005 15:39:36 -0000 1.11 +++ part-TODO.txt 28 Oct 2005 16:21:28 -0000 1.12 @@ -20,6 +20,8 @@ in the sinks. This sample should be discarded, possibly with a flush event started from the source. +- convert framerate to GstFraction in GstCaps. + - implement latency calculation for live sources. - implement master/slave clocks. Index: ChangeLog RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1799 retrieving revision 1.1800 diff -u -d -r1.1799 -r1.1800 --- ChangeLog 28 Oct 2005 10:45:32 -0000 1.1799 +++ ChangeLog 28 Oct 2005 16:21:28 -0000 1.1800 @@ -1,5 +1,15 @@ 2005-10-28 Wim Taymans <wi...@fl...> + * docs/design/part-TODO.txt: + Add an item to TODO. + * gst/gstiterator.c: (gst_iterator_fold), + (gst_iterator_find_custom): + * gst/gstiterator.h: + Add iterator docs. +2005-10-28 Wim Taymans <wi...@fl...> * gst/base/gstbasetransform.c: (gst_base_transform_class_init), (gst_base_transform_init): Don't leak class. Index: gstiterator.c RCS file: /cvs/gstreamer/gstreamer/gst/gstiterator.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstiterator.c 15 Oct 2005 16:01:57 -0000 1.13 +++ gstiterator.c 28 Oct 2005 16:21:29 -0000 1.14 @@ -30,6 +30,32 @@ * * Various GStreamer objects provide access to their internal structures using * an iterator. + * + * The basic use pattern of an iterator is as follows: + * <example> + * <title>Using an iterator</title> + * <programlisting> + * it = _get_iterator(object); + * done = FALSE; + * while (!done) { + * switch (gst_iterator_next (it, &item)) { + * case GST_ITERATOR_OK: + * ... use/change item here... + * gst_object_unref (item); + * break; + * case GST_ITERATOR_RESYNC: + * ...rollback changes to items... + * gst_iterator_resync (it); + * case GST_ITERATOR_DONE: + * done = TRUE; + * } + * } + * gst_iterator_free (it); + * </programlisting> + * </example> */ #include "gst_private.h" @@ -464,7 +490,7 @@ result = gst_iterator_next (iter, &item); switch (result) { case GST_ITERATOR_OK: - /* fixme: is there a way to ref/unref items? */ + /* FIXME: is there a way to ref/unref items? */ if (!func (item, ret, user_data)) goto fold_done; else @@ -548,6 +574,9 @@ * The iterator will not be freed. + * This function will return NULL if an error or resync happened to + * the iterator. * Returns: The element in the iterator that matches the compare * function or NULL when no element matched. @@ -565,6 +594,8 @@ data.func = func; data.user_data = user_data; + /* FIXME, we totally ignore RESYNC and return NULL so that the + * app does not know if the element was not found or a resync happened */ res = gst_iterator_fold (iter, (GstIteratorFoldFunction) find_custom_fold_func, &ret, &data); Index: gstiterator.h RCS file: /cvs/gstreamer/gstreamer/gst/gstiterator.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstiterator.h 7 Oct 2005 00:14:45 -0000 1.8 +++ gstiterator.h 28 Oct 2005 16:21:29 -0000 1.9 @@ -27,36 +27,170 @@ G_BEGIN_DECLS +/** + * GstIteratorResult: + * @GST_ITERATOR_DONE: No more items in the iterator + * @GST_ITERATOR_OK: An item was retrieved + * @GST_ITERATOR_RESYNC: Datastructure changed while iterating + * @GST_ITERATOR_ERROR: An error happened + * The result of gst_iterator_next(). + */ typedef enum { - GST_ITERATOR_DONE = 0, /* no more items in the iterator */ - GST_ITERATOR_OK = 1, /* item retrieved */ - GST_ITERATOR_RESYNC = 2, /* datastructures changed while iterating */ - GST_ITERATOR_ERROR = 3, /* some error happened */ + GST_ITERATOR_DONE = 0, + GST_ITERATOR_OK = 1, + GST_ITERATOR_RESYNC = 2, + GST_ITERATOR_ERROR = 3, } GstIteratorResult; typedef struct _GstIterator GstIterator; + * GstIteratorItem: + * @GST_ITERATOR_ITEM_SKIP: Skip this item + * @GST_ITERATOR_ITEM_PASS: Return item + * @GST_ITERATOR_ITEM_END: Stop after this item. + * The result of a GstIteratorItemFunction. - GST_ITERATOR_ITEM_SKIP = 0, /* skip item */ - GST_ITERATOR_ITEM_PASS = 1, /* return item */ - GST_ITERATOR_ITEM_END = 2, /* stop after this item */ + GST_ITERATOR_ITEM_SKIP = 0, + GST_ITERATOR_ITEM_PASS = 1, + GST_ITERATOR_ITEM_END = 2, } GstIteratorItem; + * GstIteratorDisposeFunction: + * @owner: the owner of the iterator + * The function that will be called when a GList iterator is freed. The + * owner of the GList iterator can then clean up its resources. typedef void (*GstIteratorDisposeFunction) (gpointer owner); + * GstIteratorNextFunction: + * @it: the iterator + * @result: a pointer to hold the next item + * The function that will be called when the next element of the iterator + * should be retrieved. + * Implementors of a #GstIterator should implement this + * function and pass it to the constructor of the custom iterator. + * The function will be called with the iterator lock held. + * Returns: the result of the operation. typedef GstIteratorResult (*GstIteratorNextFunction) (GstIterator *it, gpointer *result); + * GstIteratorItemFunction: + * @item: the item being retrieved. + * The function that will be called after the next item of the iterator + * has been retrieved. This function will typically increase the refcount + * of the item or make a copy. typedef GstIteratorItem (*GstIteratorItemFunction) (GstIterator *it, gpointer item); + * GstIteratorResyncFunction: + * This function will be called whenever a concurrent update happened + * to the iterated datastructure. The implementor of the iterator should + * restart the iterator from the beginning and clean up any state it might + * have. typedef void (*GstIteratorResyncFunction) (GstIterator *it); + * GstIteratorFreeFunction: + * This function will be called when the iterator is freed. typedef void (*GstIteratorFreeFunction) (GstIterator *it); + * GstIteratorFoldFunction: + * @item: the item to fold + * @ret: a GValue collecting the result + * @user_data: data passed to #gst_iterator_fold + * A function to be passed to #gst_iterator_fold. + * Returns: TRUE if the fold should continue, FALSE if it should stop. typedef gboolean (*GstIteratorFoldFunction) (gpointer item, GValue *ret, gpointer user_data); + * GST_ITERATOR: + * @it: the #GstIterator value + * Macro to cast to a #GstIterator #define GST_ITERATOR(it) ((GstIterator*)(it)) + * GST_ITERATOR_LOCK: + * @it: the #GstIterator to get the lock of + * Macro to get the lock protecting the datastructure being iterated. #define GST_ITERATOR_LOCK(it) (GST_ITERATOR(it)->lock) + * GST_ITERATOR_COOKIE: + * @it: the #GstIterator to get the cookie of + * Macro to get the cookie of a #GstIterator. The cookie of the + * iterator is the value of the master cookie when the iterator + * was created. + * Whenever the iterator is iterated, the value is compared to the + * value of the master cookie. If they are different, a concurrent + * modification happened to the iterator and a resync is needed. #define GST_ITERATOR_COOKIE(it) (GST_ITERATOR(it)->cookie) + * GST_ITERATOR_ORIG_COOKIE: + * @it: the #GstIterator to get the master cookie of + * Macro to get a pointer to where the master cookie is stored. The + * master cookie protects the structure being iterated and gets updated + * whenever the datastructure changes. #define GST_ITERATOR_ORIG_COOKIE(it) (GST_ITERATOR(it)->master_cookie) + * GstIterator: + * @next: The function to get the next item in the iterator + * @item: The function to be called for each item retrieved + * @resync: The function to call when a resync is needed. + * @free: The function to call when the iterator is freed + * @pushed: The iterator that is currently pushed with gst_iterator_push() + * @type: The type of the object that this iterator will return + * @lock: The lock protecting the data structure and the cookie. + * @cookie: The cookie; the value of the master_cookie when this iterator was + * created. + * @master_cookie: A pointer to the master cookie. + * GstIterator base structure. The values of this structure are + * protected for subclasses, use the methods to use the #GstIterator. struct _GstIterator { + /*< protected >*/ GstIteratorNextFunction next; GstIteratorItemFunction item; GstIteratorResyncFunction resync; |
From: <wt...@fr...> - 2005-10-28 18:14:45
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Fri Oct 28 2005 11:14:36 PDT Log message: * docs/design/part-TODO.txt: * gst/gstiterator.c: * gst/gstsystemclock.c: * gst/gstsystemclock.h: Doc updates. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstiterator.c gstsystemclock.c gstsystemclock.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1804&r2=1.1805 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstiterator.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.h.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1804 retrieving revision 1.1805 diff -u -d -r1.1804 -r1.1805 --- ChangeLog 28 Oct 2005 18:10:41 -0000 1.1804 +++ ChangeLog 28 Oct 2005 18:14:24 -0000 1.1805 @@ -1,3 +1,11 @@ +2005-10-28 Wim Taymans <wi...@fl...> + + * docs/design/part-TODO.txt: + * gst/gstiterator.c: + * gst/gstsystemclock.c: + * gst/gstsystemclock.h: + Doc updates. 2005-10-28 Edward Hervey <ed...@fl...> * docs/gst/gstreamer-docs.sgml: Index: gstiterator.c RCS file: /cvs/gstreamer/gstreamer/gst/gstiterator.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstiterator.c 28 Oct 2005 16:21:29 -0000 1.14 +++ gstiterator.c 28 Oct 2005 18:14:24 -0000 1.15 @@ -56,6 +56,8 @@ * gst_iterator_free (it); * </programlisting> * </example> + * + * Last reviewed on 2005-10-28 (0.9.4) */ #include "gst_private.h" Index: gstsystemclock.c RCS file: /cvs/gstreamer/gstreamer/gst/gstsystemclock.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstsystemclock.c 15 Oct 2005 16:01:57 -0000 1.33 +++ gstsystemclock.c 28 Oct 2005 18:14:24 -0000 1.34 @@ -25,7 +25,17 @@ * @short_description: Default clock that uses the current system time * @see_also: #GstClock * - * The System clock is an implementation of GstClock using the system time. + * The GStreamer core provides a GstSystemClock based on the system time. + * Asynchronous callbacks are scheduled from an internal thread. + * Clock implementors are encouraged to subclass this systemclock as it + * implements the async notification. + * Subclasses can however override all of the important methods for sync and + * async notifications to implement their own callback methods or blocking + * wait operations. Index: gstsystemclock.h RCS file: /cvs/gstreamer/gstreamer/gst/gstsystemclock.h,v --- gstsystemclock.h 11 Oct 2005 11:08:52 -0000 1.14 +++ gstsystemclock.h 28 Oct 2005 18:14:24 -0000 1.15 @@ -40,6 +40,12 @@ typedef struct _GstSystemClock GstSystemClock; typedef struct _GstSystemClockClass GstSystemClockClass; +/** + * GstSystemClock: + * @clock: The parent clock + * The default implementation of a #GstClock that uses the system time. + */ struct _GstSystemClock { GstClock clock; Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- part-TODO.txt 28 Oct 2005 16:21:28 -0000 1.12 +++ part-TODO.txt 28 Oct 2005 18:14:24 -0000 1.13 @@ -34,3 +34,9 @@ or chain to the parent. - make it possible to seek on other formats than bytes in basesrc. +- GstFormat quarks, get_name. +- GstQuery quark, get_name. +- GstEvent, GstMessage register like GstFormat or GstQuery. |
From: <wt...@fr...> - 2005-11-09 12:02:06
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Wed Nov 09 2005 04:01:58 PST Log message: * docs/design/part-TODO.txt: Some more items for the TODO * gst/gstcaps.c: * gst/gstcaps.h: Document GstCaps. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstcaps.c gstcaps.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1845&r2=1.1846 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.c.diff?r1=1.150&r2=1.151 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.h.diff?r1=1.95&r2=1.96 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1845 retrieving revision 1.1846 diff -u -d -r1.1845 -r1.1846 --- ChangeLog 9 Nov 2005 10:06:30 -0000 1.1845 +++ ChangeLog 9 Nov 2005 12:01:45 -0000 1.1846 @@ -1,3 +1,12 @@ +2005-11-09 Wim Taymans <wi...@fl...> + + * docs/design/part-TODO.txt: + Some more items for the TODO + * gst/gstcaps.c: + * gst/gstcaps.h: + Document GstCaps. 2005-11-09 Andy Wingo <wi...@po...> * gst/base/gstbasesink.c: Add the beginning of docs here -- have Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- part-TODO.txt 3 Nov 2005 20:14:24 -0000 1.14 +++ part-TODO.txt 9 Nov 2005 12:01:46 -0000 1.15 @@ -42,3 +42,8 @@ - GstEvent, GstMessage register like GstFormat or GstQuery. - unblocking while seeking. gst_element_flush_pads (GstElement, gboolean); +- make GstCapsFlags instead of the #define for GST_CAPS_FLAGS_ANY. +- query POSITION/DURATION return accuracy. Just a flag or accuracy percentage. Index: gstcaps.c RCS file: /cvs/gstreamer/gstreamer/gst/gstcaps.c,v retrieving revision 1.150 retrieving revision 1.151 diff -u -d -r1.150 -r1.151 --- gstcaps.c 17 Oct 2005 14:37:06 -0000 1.150 +++ gstcaps.c 9 Nov 2005 12:01:46 -0000 1.151 @@ -22,6 +22,45 @@ * @short_description: Structure describing sets of media formats * @see_also: #GstStructure * + * Caps are lighweight refcounted objects describing media types. + * They are composed of an array of #GstStructure. + * + * Caps are exposed on #GstPadTemplate to describe all possible types a + * given pad can handle. They are also stored in the registry along with + * a description of the element. + * Caps are exposed on the element pads using the gst_pad_get_caps() pad + * function. This function describes the possible types that the pad can + * handle or produce at runtime. + * Caps are also attached to buffers to describe to content of the data + * pointed to by the buffer with gst_buffer_set_caps(). Caps attached to + * a #GstBuffer allow for format negotiation upstream and downstream. + * A #GstCaps can be constructed with the following code fragment: + * <example> + * <title>Creating caps</title> + * <programlisting> + * GstCaps *caps; + * caps = gst_caps_new_simple ("video/x-raw-yuv", + * "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + * "framerate", G_TYPE_DOUBLE, 25.0, + * "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, + * "width", G_TYPE_INT, 320, + * "height", G_TYPE_INT, 240, + * NULL); + * </programlisting> + * </example> + * A #GstCaps is fixed when it has no properties with ranges or lists. Use + * gst_caps_is_fixed() to test for fixed caps. Only fixed caps can be + * set on a #GstPad or #GstBuffer. + * Various methods exist to work with the media types such as substracting + * or intersecting. + * Last reviewed on 2005-11-09 (0.9.4) */ #ifdef HAVE_CONFIG_H @@ -129,7 +168,7 @@ * Creates a new #GstCaps that contains one #GstStructure. The * structure is defined by the arguments, which have the same format - * as @gst_structure_new(). + * as gst_structure_new(). * Caller is responsible for unreffing the returned caps. * Returns: the new #GstCaps @@ -532,7 +571,7 @@ * WARNING: This function takes a const GstCaps *, but returns a * non-const GstStructure *. This is for programming convenience -- * the caller should be aware that structures inside a constant - * @GstCaps should not be modified. + * #GstCaps should not be modified. * Returns: a pointer to the #GstStructure corresponding to @index @@ -548,13 +587,13 @@ /** * gst_caps_copy_nth: - * @caps: the @GstCaps to copy + * @caps: the #GstCaps to copy * @nth: the nth structure to copy - * Creates a new @GstCaps and appends a copy of the nth structure + * Creates a new #GstCaps and appends a copy of the nth structure * contained in @caps. - * Returns: the new @GstCaps + * Returns: the new #GstCaps GstCaps * gst_caps_copy_nth (const GstCaps * caps, guint nth) @@ -577,7 +616,7 @@ * gst_caps_truncate: - * @caps: the @GstCaps to truncate + * @caps: the #GstCaps to truncate * Destructively discard all but the first structure from @caps. Useful when * fixating. @caps must be writable. @@ -598,13 +637,13 @@ * gst_caps_set_simple: - * @caps: the @GstCaps to set + * @caps: the #GstCaps to set * @field: first field to set * @...: additional parameters * Sets fields in a simple #GstCaps. A simple #GstCaps is one that * only has one structure. The arguments must be passed in the same - * manner as @gst_structure_set(), and be NULL-terminated. + * manner as gst_structure_set(), and be NULL-terminated. void gst_caps_set_simple (GstCaps * caps, char *field, ...) @@ -625,13 +664,13 @@ * gst_caps_set_simple_valist: * @varargs: additional parameters gst_caps_set_simple_valist (GstCaps * caps, char *field, va_list varargs) @@ -651,7 +690,7 @@ * gst_caps_is_any: - * @caps: the @GstCaps to test + * @caps: the #GstCaps to test * Determines if @caps represents any media format. @@ -667,7 +706,7 @@ * gst_caps_is_empty: * Determines if @caps represents no media formats. @@ -693,9 +732,9 @@ * gst_caps_is_fixed: - * Fixed @GstCaps describe exactly one format, that is, they have exactly + * Fixed #GstCaps describe exactly one format, that is, they have exactly * one structure, and each field in the structure describes a fixed type. * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST. Index: gstcaps.h RCS file: /cvs/gstreamer/gstreamer/gst/gstcaps.h,v retrieving revision 1.95 retrieving revision 1.96 diff -u -d -r1.95 -r1.96 --- gstcaps.h 4 Nov 2005 20:12:00 -0000 1.95 +++ gstcaps.h 9 Nov 2005 12:01:46 -0000 1.96 @@ -121,6 +121,15 @@ #define GST_CAPS_REFCOUNT_VALUE(caps) (g_atomic_int_get (&(GST_CAPS(caps))->refcount)) +/** + * GstCaps: + * @type: GType of the caps + * @refcount: the atomic refcount value + * @flags: extra flags for the caps + * @structs: array of #GstStructure for this caps + * Object describing media types. + */ struct _GstCaps { GType type; @@ -135,6 +144,15 @@ gpointer _gst_reserved[GST_PADDING]; }; + * GstStaticCaps: + * @caps: the cached #GstCaps + * @string: a string describing a caps + * Datastructure to initialize #GstCaps from a string description usually + * used in conjunction with GST_STATIC_CAPS() and gst_static_caps_get() to + * instantiate a #GstCaps. struct _GstStaticCaps { /*< public >*/ GstCaps caps; @@ -184,12 +202,12 @@ gboolean gst_caps_is_empty (const GstCaps *caps); gboolean gst_caps_is_fixed (const GstCaps *caps); gboolean gst_caps_is_always_compatible (const GstCaps *caps1, - const GstCaps *caps2); + const GstCaps *caps2); gboolean gst_caps_is_subset (const GstCaps *subset, const GstCaps *superset); gboolean gst_caps_is_equal (const GstCaps *caps1, const GstCaps *caps2); -gboolean gst_caps_is_equal_fixed (const GstCaps * caps1, +gboolean gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2); |
From: <wt...@fr...> - 2005-11-19 18:28:54
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Sat Nov 19 2005 10:28:52 PST Log message: * docs/design/part-TODO.txt: * gst/gstbin.c: (gst_bin_class_init), (gst_bin_provide_clock_func), (gst_bin_add_func), (gst_bin_remove_func), (bin_bus_handler), (gst_bin_handle_message_func): * gst/gstbin.h: Make message handling overridable. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstbin.c gstbin.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1938&r2=1.1939 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.310&r2=1.311 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.90&r2=1.91 ====Begin Diffs==== Index: part-TODO.txt =================================================================== RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- part-TODO.txt 15 Nov 2005 15:44:46 -0000 1.17 +++ part-TODO.txt 19 Nov 2005 18:28:40 -0000 1.18 @@ -9,17 +9,6 @@ - convert framerate to GstFraction in GstCaps. -- implement latency calculation for live sources. - -- implement master/slave clocks. -- implement QOS. -- implement BUFFERSIZE. -- make bin_bus_handler a vmethod so subclasses can use their own implementation - or chain to the parent. - make it possible to seek on other formats than bytes in basesrc. - GstFormat, GstQuery quarks, get_name. @@ -47,7 +36,13 @@ IMPLEMENTATION -------------- -- implement clock selection as explained in part-gstpipeline.txt. +- implement latency calculation for live sources. + +- implement master/slave clocks. +- implement QOS. +- implement BUFFERSIZE. DESIGN Index: ChangeLog RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1938 retrieving revision 1.1939 diff -u -d -r1.1938 -r1.1939 --- ChangeLog 19 Nov 2005 18:26:35 -0000 1.1938 +++ ChangeLog 19 Nov 2005 18:28:38 -0000 1.1939 @@ -1,3 +1,12 @@ +2005-11-19 Wim Taymans <wi...@fl...> + * docs/design/part-TODO.txt: + * gst/gstbin.c: (gst_bin_class_init), (gst_bin_provide_clock_func), + (gst_bin_add_func), (gst_bin_remove_func), (bin_bus_handler), + (gst_bin_handle_message_func): + * gst/gstbin.h: + Make message handling overridable. 2005-11-19 Andy Wingo <wi...@po...> * gst/gstpad.h (GST_PAD_IS_USABLE): Removed. Fixes #321235. Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.310 retrieving revision 1.311 diff -u -d -r1.310 -r1.311 --- gstbin.c 19 Nov 2005 17:50:52 -0000 1.310 +++ gstbin.c 19 Nov 2005 18:28:39 -0000 1.311 @@ -147,6 +147,7 @@ static GstClock *gst_bin_provide_clock_func (GstElement * element); static void gst_bin_set_clock_func (GstElement * element, GstClock * clock); +static void gst_bin_handle_message_func (GstBin * bin, GstMessage * message); static gboolean gst_bin_send_event (GstElement * element, GstEvent * event); static GstBusSyncReply bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin); @@ -336,6 +337,7 @@ klass->add_element = GST_DEBUG_FUNCPTR (gst_bin_add_func); klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func); + klass->handle_message = GST_DEBUG_FUNCPTR (gst_bin_handle_message_func); GST_DEBUG ("creating bin thread pool"); err = NULL; @@ -497,7 +499,7 @@ } gst_object_replace ((GstObject **) & bin->provided_clock, (GstObject *) result); - gst_object_replace ((GstObject **) & bin->ABI.clock_provider, + gst_object_replace ((GstObject **) & bin->clock_provider, (GstObject *) provider); bin->clock_dirty = FALSE; GST_DEBUG_OBJECT (bin, "provided new clock %p", result); @@ -871,7 +873,7 @@ /* if the clock provider for this element is removed, we lost * the clock as well, we need to inform the parent of this * so that it can select a new clock */ - if (bin->ABI.clock_provider == element) { + if (bin->clock_provider == element) { GST_DEBUG_OBJECT (bin, "element \"%s\" provided the clock", elem_name); bin->clock_dirty = TRUE; clock_message = @@ -1840,6 +1842,21 @@ static GstBusSyncReply bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin) { + GstBinClass *bclass; + bclass = GST_BIN_GET_CLASS (bin); + if (bclass->handle_message) + bclass->handle_message (bin, message); + else + gst_message_unref (message); + return GST_BUS_DROP; +} +static void +gst_bin_handle_message_func (GstBin * bin, GstMessage * message) +{ GST_DEBUG_OBJECT (bin, "[msg %p] handling child message of type %s", message, gst_message_type_get_name (GST_MESSAGE_TYPE (message))); @@ -1994,14 +2011,14 @@ goto forward; - return GST_BUS_DROP; + return; forward: { /* Send all other messages upward */ GST_DEBUG_OBJECT (bin, "posting message upward"); gst_element_post_message (GST_ELEMENT_CAST (bin), message); - return GST_BUS_DROP; + return; } Index: gstbin.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- gstbin.h 18 Nov 2005 11:03:10 -0000 1.90 +++ gstbin.h 19 Nov 2005 18:28:39 -0000 1.91 @@ -88,6 +88,7 @@ * @state_dirty: the bin needs to recalculate its state * @clock_dirty: the bin needs to select a new clock * @provided_clock: the last clock selected + * @clock_provider: the element that provided @provided_clock * * The GstBin base class. Subclasses can access these fields provided * the LOCK is taken. @@ -110,14 +111,10 @@ gboolean clock_dirty; GstClock *provided_clock; + GstElement *clock_provider; /*< private >*/ - union { - struct { - GstElement *clock_provider; - } ABI; - gpointer _gst_reserved[GST_PADDING+1-1]; - }; + gpointer _gst_reserved[GST_PADDING]; }; /** @@ -125,9 +122,13 @@ * @parent_class: bin parent class * @add_element: method to add an element to a bin * @remove_element: method to remove an element from a bin + * @handle_message: method to handle a message from the children * Subclasses can override the @add_element and @remove_element to * update the list of children in the bin. + * + * The @handle_message method can be overriden to implement custom + * message handling. */ struct _GstBinClass { GstElementClass parent_class; @@ -144,6 +145,8 @@ gboolean (*add_element) (GstBin *bin, GstElement *element); gboolean (*remove_element) (GstBin *bin, GstElement *element); + void (*handle_message) (GstBin *bin, GstMessage *message); gpointer _gst_reserved[GST_PADDING]; |
From: <wt...@fr...> - 2005-11-19 18:57:14
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Sat Nov 19 2005 10:57:12 PST Log message: * docs/design/part-TODO.txt: * gst/gstformat.c: (_gst_format_initialize), (gst_format_get_name), (gst_format_to_quark), (gst_format_register): * gst/gstformat.h: * gst/gstquery.c: (_gst_query_initialize), (gst_query_type_get_name), (gst_query_type_to_quark), (gst_query_type_register): * gst/gstquery.h: Add type to quark and type to string conversions. Modified files: . : ChangeLog docs/design : part-TODO.txt gst : gstformat.c gstformat.h gstquery.c gstquery.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1940&r2=1.1941 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-TODO.txt.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstformat.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstformat.h.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstquery.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstquery.h.diff?r1=1.25&r2=1.26 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1940 retrieving revision 1.1941 diff -u -d -r1.1940 -r1.1941 --- ChangeLog 19 Nov 2005 18:32:01 -0000 1.1940 +++ ChangeLog 19 Nov 2005 18:56:59 -0000 1.1941 @@ -1,3 +1,15 @@ +2005-11-19 Wim Taymans <wi...@fl...> + + * docs/design/part-TODO.txt: + * gst/gstformat.c: (_gst_format_initialize), (gst_format_get_name), + (gst_format_to_quark), (gst_format_register): + * gst/gstformat.h: + * gst/gstquery.c: (_gst_query_initialize), + (gst_query_type_get_name), (gst_query_type_to_quark), + (gst_query_type_register): + * gst/gstquery.h: + Add type to quark and type to string conversions. 2005-11-19 Andy Wingo <wi...@po...> * gst/gstbuffer.h (GST_BUFFER_FLAG_ORIGINAL): Removed. Fixes Index: part-TODO.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-TODO.txt,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- part-TODO.txt 19 Nov 2005 18:28:40 -0000 1.18 +++ part-TODO.txt 19 Nov 2005 18:57:00 -0000 1.19 @@ -11,8 +11,6 @@ - make it possible to seek on other formats than bytes in basesrc. -- GstFormat, GstQuery quarks, get_name. - - GstEvent, GstMessage register like GstFormat or GstQuery. - unblocking while seeking. gst_element_flush_pads (GstElement, gboolean); Index: gstformat.c RCS file: /cvs/gstreamer/gstreamer/gst/gstformat.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstformat.c 15 Oct 2005 16:01:57 -0000 1.16 +++ gstformat.c 19 Nov 2005 18:57:00 -0000 1.17 @@ -43,12 +43,12 @@ static guint32 _n_values = 1; /* we start from 1 because 0 reserved for UNDEFINED */ static GstFormatDefinition standard_definitions[] = { - {GST_FORMAT_DEFAULT, "default", "Default format for the media type"}, - {GST_FORMAT_BYTES, "bytes", "Bytes"}, - {GST_FORMAT_TIME, "time", "Time"}, - {GST_FORMAT_BUFFERS, "buffers", "Buffers"}, - {GST_FORMAT_PERCENT, "percent", "Percent"}, - {0, NULL, NULL} + {GST_FORMAT_DEFAULT, "default", "Default format for the media type", 0}, + {GST_FORMAT_BYTES, "bytes", "Bytes", 0}, + {GST_FORMAT_TIME, "time", "Time", 0}, + {GST_FORMAT_BUFFERS, "buffers", "Buffers", 0}, + {GST_FORMAT_PERCENT, "percent", "Percent", 0}, + {0, NULL, NULL, 0} }; void @@ -63,6 +63,7 @@ } while (standards->nick) { + standards->quark = g_quark_from_static_string (standards->nick); g_hash_table_insert (_nick_to_format, standards->nick, standards); g_hash_table_insert (_format_to_nick, GINT_TO_POINTER (standards->value), standards); @@ -74,6 +75,26 @@ g_static_mutex_unlock (&mutex); } +const gchar * +gst_format_get_name (GstFormat format) +{ + const GstFormatDefinition *def; + def = gst_format_get_details (format); + return def->nick; +} +GQuark +gst_format_to_quark (GstFormat format) + return def->quark; /** * gst_format_register: * @nick: The nick of the new format @@ -104,6 +125,7 @@ format->value = _n_values; format->nick = g_strdup (nick); format->description = g_strdup (description); + format->quark = g_quark_from_static_string (format->nick); g_static_mutex_lock (&mutex); g_hash_table_insert (_nick_to_format, format->nick, format); Index: gstformat.h RCS file: /cvs/gstreamer/gstreamer/gst/gstformat.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstformat.h 15 Oct 2005 15:30:22 -0000 1.29 +++ gstformat.h 19 Nov 2005 18:57:00 -0000 1.30 @@ -34,7 +34,8 @@ * GstFormat: * @GST_FORMAT_UNDEFINED: undefined format - * @GST_FORMAT_DEFAULT: the default format of the pad/element + * @GST_FORMAT_DEFAULT: the default format of the pad/element. This can be + * samples for raw audio, frames/fields for raw video. * @GST_FORMAT_BYTES: bytes * @GST_FORMAT_TIME: time in nanoseconds * @GST_FORMAT_BUFFERS: buffers @@ -42,9 +43,11 @@ * * Standard predefined formats */ +/* NOTE: don't forget to update the table in gstformat.c when changing + * this enum */ typedef enum { GST_FORMAT_UNDEFINED = 0, /* must be first in list */ - GST_FORMAT_DEFAULT = 1, /* samples for raw audio, frames/fields for raw video */ + GST_FORMAT_DEFAULT = 1, GST_FORMAT_BYTES = 2, GST_FORMAT_TIME = 3, GST_FORMAT_BUFFERS = 4, @@ -81,10 +84,14 @@ GstFormat value; gchar *nick; gchar *description; + GQuark quark; void _gst_format_initialize (void); +const gchar* gst_format_get_name (GstFormat format); +GQuark gst_format_to_quark (GstFormat format); /* register a new format */ GstFormat gst_format_register (const gchar *nick, const gchar *description); Index: gstquery.c RCS file: /cvs/gstreamer/gstreamer/gst/gstquery.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstquery.c 10 Nov 2005 10:17:01 -0000 1.24 +++ gstquery.c 19 Nov 2005 18:57:00 -0000 1.25 @@ -58,16 +58,16 @@ static guint32 _n_values = 1; /* we start from 1 because 0 reserved for NONE */ static GstQueryTypeDefinition standard_definitions[] = { - {GST_QUERY_POSITION, "position", "Current position"}, - {GST_QUERY_DURATION, "duration", "Total duration"}, - {GST_QUERY_LATENCY, "latency", "Latency"}, - {GST_QUERY_JITTER, "jitter", "Jitter"}, - {GST_QUERY_RATE, "rate", "Configured rate 1000000 = 1"}, - {GST_QUERY_SEEKING, "seeking", "Seeking capabilities and parameters"}, - {GST_QUERY_SEGMENT, "segment", "currently configured segment"}, - {GST_QUERY_CONVERT, "convert", "Converting between formats"}, - {GST_QUERY_FORMATS, "formats", "Supported formats for conversion"}, + {GST_QUERY_POSITION, "position", "Current position", 0}, + {GST_QUERY_DURATION, "duration", "Total duration", 0}, + {GST_QUERY_LATENCY, "latency", "Latency", 0}, + {GST_QUERY_JITTER, "jitter", "Jitter", 0}, + {GST_QUERY_RATE, "rate", "Configured rate 1000000 = 1", 0}, + {GST_QUERY_SEEKING, "seeking", "Seeking capabilities and parameters", 0}, + {GST_QUERY_SEGMENT, "segment", "currently configured segment", 0}, + {GST_QUERY_CONVERT, "convert", "Converting between formats", 0}, + {GST_QUERY_FORMATS, "formats", "Supported formats for conversion", 0}, @@ -86,6 +86,7 @@ g_hash_table_insert (_nick_to_query, standards->nick, standards); g_hash_table_insert (_query_type_to_nick, GINT_TO_POINTER (standards->value), standards); @@ -99,6 +100,26 @@ gst_query_get_type (); +gst_query_type_get_name (GstQueryType query) + const GstQueryTypeDefinition *def; + def = gst_query_type_get_details (query); +gst_query_type_to_quark (GstQueryType query) GType gst_query_get_type (void) { @@ -201,6 +222,7 @@ query->value = _n_values; query->nick = g_strdup (nick); query->description = g_strdup (description); + query->quark = g_quark_from_static_string (query->nick); g_hash_table_insert (_nick_to_query, query->nick, query); Index: gstquery.h RCS file: /cvs/gstreamer/gstreamer/gst/gstquery.h,v retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstquery.h 10 Nov 2005 10:17:01 -0000 1.25 +++ gstquery.h 19 Nov 2005 18:57:00 -0000 1.26 @@ -49,6 +49,8 @@ * Standard predefined Query types +/* NOTE: don't forget to update the table in gstquery.c when changing GST_QUERY_NONE = 0, GST_QUERY_POSITION, @@ -86,6 +88,7 @@ GstQueryType value; gchar *nick; gchar *description; + GQuark quark; #define GST_TYPE_QUERY (gst_query_get_type()) @@ -118,6 +121,10 @@ void _gst_query_initialize (void); +const gchar* gst_query_type_get_name (GstQueryType query); +GQuark gst_query_type_to_quark (GstQueryType query); GType gst_query_get_type (void); /* register a new query */ |
From: <wt...@ke...> - 2006-03-29 13:45:31
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Wed Mar 29 2006 13:45:27 UTC Log message: * docs/design/part-qos.txt: * gst/gstclock.c: Small documentation updates and additions. Modified files: . : ChangeLog docs/design : part-qos.txt gst : gstclock.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.2403&r2=1.2404 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/design/part-qos.txt.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.c.diff?r1=1.90&r2=1.91 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.2403 retrieving revision 1.2404 diff -u -d -r1.2403 -r1.2404 --- ChangeLog 29 Mar 2006 13:39:05 -0000 1.2403 +++ ChangeLog 29 Mar 2006 13:45:15 -0000 1.2404 @@ -1,5 +1,11 @@ 2006-03-29 Wim Taymans <wi...@fl...> + * docs/design/part-qos.txt: + * gst/gstclock.c: + Small documentation updates and additions. + +2006-03-29 Wim Taymans <wi...@fl...> * libs/gst/base/gstbasesrc.c: (gst_base_src_finalize), (gst_base_src_send_event), (gst_base_src_loop), (gst_base_src_change_state): Index: part-qos.txt RCS file: /cvs/gstreamer/gstreamer/docs/design/part-qos.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- part-qos.txt 27 Mar 2006 18:38:49 -0000 1.1 +++ part-qos.txt 29 Mar 2006 13:45:15 -0000 1.2 @@ -17,6 +17,13 @@ - long term rate corrections based on trends observed in the sinks. +Sources of quality problems +--------------------------- + - High CPU load + - QoS event --------- @@ -38,13 +45,19 @@ A buffer with timestamp B1 arrives in the sink at time T1. The buffer timestamp is then synchronized against the clock which yields a jitter J1 -return value from the clock. +return value from the clock. The jitter J1 is simply calculated as -If the jitter is positive, the entry arrived in time and can be rendered. + J1 = B1 - CT +Where CT is the clock time when the entry arrives in the sink. This value +is calculated inside the clock when we perform gst_clock_entry_wait(). +If the jitter is positive, the entry arrived in time and can be rendered +after waiting for the clock to reach time B1 (which is also CT + J1). If the jitter is negative however, the entry arrived too late in the sink and should therefore be dropped. A dropped buffer should generate a QoS -event upstream. +event upstream. J1 is the amount of time the entry was late. Using the jitter we can calculate the time when the buffer arrived in the sink: @@ -53,7 +66,7 @@ The time the buffer leaves the sink after synchronisation is measured as: - T2 = B1 - (J1 < 0 : J1 : 0) (2) + T2 = B1 - (J1 < 0 ? J1 : 0) (2) For buffers that arrive in time (J1 >= 0) the buffer leaves after synchronisation which is exactly B1. Late buffers (J1 < 0) leave the sink when they arrive, @@ -62,7 +75,7 @@ Using a previous T0 and a new T1, we can calculate the time it took for upstream to generate a buffer with timestamp B1. - PT1 = T0 - T1 (3) + PT1 = T1 - T0 (3) We call PT1 the processing time needed to generate buffer with timestamp B1. @@ -149,7 +162,7 @@ Receivers of the QoS message should permanently reduce their datarate as given by the proportion member. Failure to do so will certainly lead to -dropped frames and worse a QoS. +more dropped frames and a generally worse QoS. QoS strategies @@ -160,6 +173,7 @@ - switch to a lower decoding/encoding quality - switch to a lower quality source QoS implementations ------------------- Index: gstclock.c RCS file: /cvs/gstreamer/gstreamer/gst/gstclock.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- gstclock.c 21 Mar 2006 14:14:49 -0000 1.90 +++ gstclock.c 29 Mar 2006 13:45:15 -0000 1.91 @@ -339,9 +339,10 @@ * If the @jitter argument is not NULL and this function returns #GST_CLOCK_OK * or #GST_CLOCK_EARLY, it will contain the difference * against the clock and the time of @id when this method was - * called. Negative values means @id was scheduled too late (and this - * function will return #GST_CLOCK_EARLY). Positive values indicate how - * early @id was scheduled. + * called. Negative values indicate how late @id was relative to the clock + * (in which case this function will return #GST_CLOCK_EARLY). + * Positive values indicate how much time was spent waiting on the clock + * before this function returned. * * Returns: the result of the blocking wait. #GST_CLOCK_EARLY will be returned * if the current clock time is past the time of @id, #GST_CLOCK_OK if |