From: Wim T. <wt...@us...> - 2002-02-19 22:10:42
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Tue Feb 19 2002 14:10:39 PST Log message: Fixed some warnings Always recalculate caps intersection in perform_negotiate 'cause they might have changed. (needs better solution probably) Modified files: gst : gstpad.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.146&r2=1.147 ====Begin Diffs==== Index: gstpad.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.146 retrieving revision 1.147 diff -u -d -r1.146 -r1.147 --- gstpad.c 18 Feb 2002 00:40:56 -0000 1.146 +++ gstpad.c 19 Feb 2002 22:10:37 -0000 1.147 @@ -1042,7 +1042,6 @@ gboolean gst_pad_try_set_caps (GstPad *pad, GstCaps *caps) { - GstCaps *oldcaps; GstRealPad *peer, *realpad; realpad = GST_PAD_REALIZE (pad); @@ -1169,6 +1168,7 @@ { GstCaps *intersection; GstRealPad *realsrc, *realsink; + GstCaps *srccaps, *sinkcaps; g_return_val_if_fail (srcpad != NULL, FALSE); g_return_val_if_fail (sinkpad != NULL, FALSE); @@ -1179,8 +1179,14 @@ g_return_val_if_fail (GST_RPAD_PEER (realsrc) != NULL, FALSE); g_return_val_if_fail (GST_RPAD_PEER (realsink) == realsrc, FALSE); - /* it doesn't matter which filter we take */ - intersection = GST_RPAD_FILTER (realsrc); + /* calculate the new caps here */ + srccaps = gst_pad_get_caps (GST_PAD (realsrc)); + GST_INFO (GST_CAT_PADS, "dumping caps of pad %s:%s", GST_DEBUG_PAD_NAME (realsrc)); + gst_caps_debug (srccaps); + sinkcaps = gst_pad_get_caps (GST_PAD (realsink)); + GST_INFO (GST_CAT_PADS, "dumping caps of pad %s:%s", GST_DEBUG_PAD_NAME (realsink)); + gst_caps_debug (sinkcaps); + intersection = gst_caps_intersect (srccaps, sinkcaps); /* no negotiation is performed it the pads have filtercaps */ if (intersection) { @@ -1454,14 +1460,16 @@ { GstRealPad *peer; - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); + g_return_val_if_fail (pad != NULL, FALSE); + g_return_val_if_fail (GST_IS_PAD (pad), FALSE); GST_DEBUG (GST_CAT_PROPERTIES, "set allowed caps of %s:%s\n", GST_DEBUG_PAD_NAME (pad)); peer = GST_RPAD_PEER (pad); if (peer) - gst_pad_try_reconnect_filtered (pad, GST_PAD (peer), GST_RPAD_APPFILTER (pad)); + return gst_pad_try_reconnect_filtered (pad, GST_PAD (peer), GST_RPAD_APPFILTER (pad)); + + return TRUE; } /** |
From: Wim T. <wt...@us...> - 2002-02-22 23:12:18
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Fri Feb 22 2002 15:12:17 PST Log message: Only unset the scheduler on REAL pads. This is a nasty one that causes random memory corruption. Modified files: gst : gstscheduler.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstscheduler.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: gstscheduler.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstscheduler.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstscheduler.c 15 Feb 2002 21:17:06 -0000 1.48 +++ gstscheduler.c 22 Feb 2002 23:12:05 -0000 1.49 @@ -149,11 +149,13 @@ GstPad * gst_scheduler_pad_select (GstScheduler *sched, GList *padlist) { - g_return_if_fail (GST_IS_SCHEDULER (sched)); - g_return_if_fail (padlist != NULL); + g_return_val_if_fail (GST_IS_SCHEDULER (sched), NULL); + g_return_val_if_fail (padlist != NULL, NULL); if (CLASS (sched)->pad_select) CLASS (sched)->pad_select (sched, padlist); + + return NULL; } /** @@ -206,7 +208,7 @@ void gst_scheduler_remove_element (GstScheduler *sched, GstElement *element) { - GList *l; + GList *pads; g_return_if_fail (GST_IS_SCHEDULER (sched)); g_return_if_fail (GST_IS_ELEMENT (element)); @@ -214,8 +216,13 @@ if (CLASS (sched)->remove_element) CLASS (sched)->remove_element (sched, element); - for (l=element->pads; l; l=l->next) - gst_pad_unset_sched ((GstPad*) l->data); + for (pads = element->pads; pads; pads = pads->next) { + GstPad *pad = GST_PAD (pads->data); + + if (GST_IS_REAL_PAD (pad)) { + gst_pad_unset_sched (GST_PAD (pads->data)); + } + } } /** @@ -319,10 +326,12 @@ gboolean gst_scheduler_iterate (GstScheduler *sched) { - g_return_if_fail (GST_IS_SCHEDULER (sched)); + g_return_val_if_fail (GST_IS_SCHEDULER (sched), FALSE); if (CLASS (sched)->iterate) - CLASS (sched)->iterate (sched); + return CLASS (sched)->iterate (sched); + + return FALSE; } |
From: Wim T. <wt...@us...> - 2002-02-23 13:41:30
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sat Feb 23 2002 05:41:29 PST Log message: Added a private field to the cothread state. Modified files: gst : cothreads.c cothreads.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/cothreads.c.diff?r1=1.58&r2=1.59 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/cothreads.h.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: cothreads.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- cothreads.c 28 Dec 2001 20:20:26 -0000 1.58 +++ cothreads.c 23 Feb 2002 13:41:17 -0000 1.59 @@ -380,7 +380,13 @@ * adds data to a cothread */ void -cothread_set_data (cothread_state * thread, gchar * key, gpointer data) +cothread_set_private (cothread_state *thread, gpointer data) +{ + thread->priv = data; +} + +void +cothread_context_set_data (cothread_state *thread, gchar *key, gpointer data) { cothread_context *ctx = pthread_getspecific (_cothread_key); @@ -397,7 +403,13 @@ * Returns: the data assiciated with the key */ gpointer -cothread_get_data (cothread_state * thread, gchar * key) +cothread_get_private (cothread_state *thread) +{ + return thread->priv; +} + +gpointer +cothread_context_get_data (cothread_state * thread, gchar * key) { cothread_context *ctx = pthread_getspecific (_cothread_key); Index: cothreads.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- cothreads.h 27 Dec 2001 00:47:41 -0000 1.21 +++ cothreads.h 23 Feb 2002 13:41:17 -0000 1.22 @@ -47,6 +47,7 @@ struct _cothread_state { cothread_context *ctx; int threadnum; + gpointer priv; cothread_func func; int argc; @@ -67,25 +68,29 @@ }; -cothread_context* cothread_context_init (void); -void cothread_context_free (cothread_context *ctx); +cothread_context* cothread_context_init (void); +void cothread_context_free (cothread_context *ctx); +void cothread_context_set_data (cothread_state *thread, + gchar *key, gpointer data); +gpointer cothread_context_get_data (cothread_state *thread, gchar *key); -cothread_state* cothread_create (cothread_context *ctx); -void cothread_free (cothread_state *thread); -void cothread_setfunc (cothread_state *thread, cothread_func func, - int argc, char **argv); -void cothread_stop (cothread_state *thread); +cothread_state* cothread_create (cothread_context *ctx); +void cothread_free (cothread_state *thread); +void cothread_setfunc (cothread_state *thread, cothread_func func, + int argc, char **argv); +void cothread_stop (cothread_state *thread); -void cothread_switch (cothread_state *thread); -void cothread_set_data (cothread_state *thread, gchar *key, gpointer data); -gpointer cothread_get_data (cothread_state *thread, gchar *key); +void cothread_switch (cothread_state *thread); +void cothread_set_private (cothread_state *thread, + gpointer data); +gpointer cothread_get_private (cothread_state *thread); -void cothread_lock (cothread_state *thread); -gboolean cothread_trylock (cothread_state *thread); -void cothread_unlock (cothread_state *thread); +void cothread_lock (cothread_state *thread); +gboolean cothread_trylock (cothread_state *thread); +void cothread_unlock (cothread_state *thread); -cothread_state* cothread_main (cothread_context *ctx); -cothread_state* cothread_current_main (void); -cothread_state* cothread_current (void); +cothread_state* cothread_main (cothread_context *ctx); +cothread_state* cothread_current_main (void); +cothread_state* cothread_current (void); #endif /* __COTHREAD_H__ */ |
From: Wim T. <wt...@us...> - 2002-02-23 13:57:23
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sat Feb 23 2002 05:57:21 PST Log message: Added gst_event_copy Modified files: gst : gstevent.c gstevent.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gstevent.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstevent.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstevent.c 26 Jan 2002 18:28:26 -0000 1.10 +++ gstevent.c 23 Feb 2002 13:57:09 -0000 1.11 @@ -84,6 +84,30 @@ } /** + * gst_event_copy: + * @event: The event to copy + * + * Copy the event + * + * Returns: A copy of the event. + */ +GstEvent* +gst_event_copy (GstEvent *event) +{ + GstEvent *copy; + + g_mutex_lock (_gst_event_chunk_lock); + copy = g_mem_chunk_alloc (_gst_event_chunk); + g_mutex_unlock (_gst_event_chunk_lock); + + memcpy (copy, event, sizeof (GstEvent)); + + /* FIXME copy/ref additional fields */ + + return copy; +} + +/** * gst_event_free: * @event: The event to free * Index: gstevent.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstevent.h 31 Jan 2002 15:38:04 -0000 1.7 +++ gstevent.h 23 Feb 2002 13:57:09 -0000 1.8 @@ -99,7 +99,8 @@ void _gst_event_initialize (void); GstEvent* gst_event_new (GstEventType type); -void gst_event_free (GstEvent* event); +GstEvent* gst_event_copy (GstEvent *event); +void gst_event_free (GstEvent *event); /* seek events */ GstEvent* gst_event_new_seek (GstSeekType type, gint64 offset, gboolean flush); |
From: Wim T. <wt...@us...> - 2002-02-23 14:02:47
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sat Feb 23 2002 06:02:42 PST Log message: Iterate until we find the real pad when creating a ghostpad make a copy of the event in the default dispatcher. Modified files: gst : gstpad.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.149&r2=1.150 ====Begin Diffs==== Index: gstpad.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.149 retrieving revision 1.150 diff -u -d -r1.149 -r1.150 --- gstpad.c 21 Feb 2002 10:38:18 -0000 1.149 +++ gstpad.c 23 Feb 2002 14:02:29 -0000 1.150 @@ -2233,13 +2233,20 @@ GstPad *pad) { GstGhostPad *ghostpad; + GstRealPad *realpad; g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (GST_IS_PAD (pad), NULL); ghostpad = g_object_new (gst_ghost_pad_get_type () ,NULL); gst_pad_set_name (GST_PAD (ghostpad), name); - GST_GPAD_REALPAD (ghostpad) = GST_PAD_REALIZE (pad); + + realpad = (GstRealPad *) pad; + + while (!GST_IS_REAL_PAD (realpad)) { + realpad = GST_PAD_REALIZE (realpad); + } + GST_GPAD_REALPAD (ghostpad) = realpad; GST_PAD_PADTEMPLATE (ghostpad) = GST_PAD_PADTEMPLATE (pad); /* add ourselves to the real pad's list of ghostpads */ @@ -2264,12 +2271,12 @@ /* for all pads in the opposite direction that are connected */ if (GST_PAD_DIRECTION (eventpad) != GST_PAD_DIRECTION (pad) && GST_PAD_IS_CONNECTED (eventpad)) { if (GST_PAD_DIRECTION (eventpad) == GST_PAD_SRC) { - gst_pad_push (eventpad, GST_BUFFER (gst_event_new (GST_EVENT_TYPE (event)))); + gst_pad_push (eventpad, GST_BUFFER (gst_event_copy (event))); } else { GstPad *peerpad = GST_PAD_CAST (GST_RPAD_PEER (eventpad)); - gst_pad_send_event (peerpad, gst_event_new (GST_EVENT_TYPE (event))); + gst_pad_send_event (peerpad, gst_event_copy (event)); } } } @@ -2293,14 +2300,12 @@ case GST_EVENT_EOS: gst_element_set_eos (element); gst_pad_event_default_dispatch (pad, element, event); - gst_event_free (event); /* we have to try to schedule another element because this one is disabled */ gst_element_yield (element); break; case GST_EVENT_FLUSH: default: gst_pad_event_default_dispatch (pad, element, event); - gst_event_free (event); break; } } |
From: Wim T. <wt...@us...> - 2002-03-30 17:05:46
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sat Mar 30 2002 09:05:45 PST Log message: - Remove the propsprivate header file - Added new API for properties. - Moved the clock distribution to the scheduler. - Removed the lock from GstCaps - Added boxed types for Caps/Props - Simplified the clock, new systemclock implementation - Removed deprecated element_info/send_event functions - First step at exposing more info in the pad_connect functions - Queue cleanup - Make the scheduler aware of other schedulers inside it - Added the _SELF_SCHEDULABLE flag to gstthread - Removed _get_widget from _utils, changed to new props API - Make fakesink sync on timestamps when requested - Removed the offset notify from filesrc - Added a fast scheduler - some scheduler cleanups. Modified files: gst : Makefile.am gst.h gstbin.c gstbin.h gstcaps.c gstcaps.h gstclock.c gstclock.h gstelement.c gstelement.h gstpad.c gstpad.h gstprops.c gstprops.h gstqueue.c gstscheduler.c gstscheduler.h gstsystemclock.c gstsystemclock.h gstthread.c gstutils.c gstutils.h Removed files: gst : gstpropsprivate.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/Makefile.am.diff?r1=1.100&r2=1.101 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gst.h.diff?r1=1.31&r2=1.32 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.124&r2=1.125 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.34&r2=1.35 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.c.diff?r1=1.45&r2=1.46 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.h.diff?r1=1.33&r2=1.34 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.c.diff?r1=1.16&r2=1.17 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.h.diff?r1=1.6&r2=1.7 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.123&r2=1.124 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.84&r2=1.85 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.154&r2=1.155 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.h.diff?r1=1.80&r2=1.81 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.c.diff?r1=1.53&r2=1.54 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.h.diff?r1=1.23&r2=1.24 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpropsprivate.h http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.35&r2=1.36 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstscheduler.c.diff?r1=1.50&r2=1.51 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstscheduler.h.diff?r1=1.18&r2=1.19 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.c.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstsystemclock.h.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstthread.c.diff?r1=1.70&r2=1.71 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstutils.c.diff?r1=1.28&r2=1.29 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstutils.h.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/Makefile.am,v retrieving revision 1.100 retrieving revision 1.101 diff -u -d -r1.100 -r1.101 --- Makefile.am 19 Mar 2002 17:07:20 -0000 1.100 +++ Makefile.am 30 Mar 2002 17:05:00 -0000 1.101 @@ -145,19 +145,18 @@ noinst_HEADERS = \ gst_private.h \ gstarch.h \ - gstpropsprivate.h \ cothreads.h libgstreamer_la_CFLAGS = -D_GNU_SOURCE -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" \ $(LIBGST_CFLAGS) \ -D_GNU_SOURCE \ -DG_LOG_DOMAIN=g_log_domain_gstreamer \ - -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" + -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" # the compiler shoots cothreads.c in the head at -O6 -libcothreads_la_CFLAGS = $(libgstreamer_la_CFLAGS) -O2 +libcothreads_la_CFLAGS = $(libgstreamer_la_CFLAGS) -O2 libgstreamer_la_LIBADD = $(LIBGST_LIBS) -libgstreamer_la_LDFLAGS = @GST_LT_LDFLAGS@ -version-info @GST_LIBVERSION@ +libgstreamer_la_LDFLAGS = @GST_LT_LDFLAGS@ -version-info @GST_LIBVERSION@ EXTRA_DIST = ROADMAP Index: gst.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gst.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gst.h 24 Feb 2002 17:08:06 -0000 1.31 +++ gst.h 30 Mar 2002 17:05:00 -0000 1.32 @@ -35,7 +35,6 @@ #include <gst/gstpad.h> #include <gst/gstbuffer.h> #include <gst/gstcpu.h> -#include <gst/gstsystemclock.h> #include <gst/gstelement.h> #include <gst/gstbin.h> #include <gst/gstpipeline.h> Index: gstbin.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.124 retrieving revision 1.125 diff -u -d -r1.124 -r1.125 --- gstbin.c 24 Mar 2002 22:07:06 -0000 1.124 +++ gstbin.c 30 Mar 2002 17:05:00 -0000 1.125 @@ -152,78 +152,16 @@ return gst_elementfactory_make ("bin", name); } -static inline void -gst_bin_reset_element_sched (GstElement * element, GstScheduler * sched) -{ - GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "resetting element's scheduler"); - - gst_element_set_sched (element, sched); -} - - -static void -gst_bin_get_clock_elements (GstBin *bin, GList **needing, GList **providing) -{ - GList *children = gst_bin_get_list (bin); - - while (children) { - GstElement *child = GST_ELEMENT (children->data); - - if (GST_IS_BIN (child)) { - gst_bin_get_clock_elements (GST_BIN (child), needing, providing); - } - if (child->getclockfunc) { - *providing = g_list_prepend (*providing, child); - } - if (child->setclockfunc) { - *needing = g_list_prepend (*needing, child); - } - - children = g_list_next (children); - } -} - -static void -gst_bin_distribute_clock (GstBin *bin, GList *needing, GstClock *clock) -{ - while (needing) { - GST_DEBUG (GST_CAT_CLOCK, "setting clock on %s", GST_ELEMENT_NAME (needing->data)); - gst_element_set_clock (GST_ELEMENT (needing->data), clock); - - needing = g_list_next (needing); - } -} - -static void -gst_bin_distribute_clocks (GstBin *bin) -{ - GList *needing = NULL, *providing = NULL; - GstClock *clock; - - gst_bin_get_clock_elements (bin, &needing, &providing); - - if (GST_FLAG_IS_SET (bin, GST_BIN_FLAG_FIXED_CLOCK)) { - clock = bin->clock; - } - else if (providing) { - clock = gst_element_get_clock (GST_ELEMENT (providing->data)); - } - else { - GST_DEBUG (GST_CAT_CLOCK, "no clock provided, using default clock"); - clock = gst_system_clock_obtain (); - } - - GST_BIN_CLOCK (bin) = clock; - gst_bin_distribute_clock (bin, needing, clock); -} - GstClock* gst_bin_get_clock (GstBin *bin) { g_return_val_if_fail (bin != NULL, NULL); g_return_val_if_fail (GST_IS_BIN (bin), NULL); - return GST_BIN_CLOCK (bin); + if (GST_ELEMENT_SCHED (bin)) + return gst_scheduler_get_clock (GST_ELEMENT_SCHED (bin)); + + return NULL; } void @@ -232,8 +170,8 @@ g_return_if_fail (bin != NULL); g_return_if_fail (GST_IS_BIN (bin)); - GST_FLAG_SET (bin, GST_BIN_FLAG_FIXED_CLOCK); - GST_BIN_CLOCK (bin) = clock; + if (GST_ELEMENT_SCHED (bin)) + gst_scheduler_use_clock (GST_ELEMENT_SCHED (bin), clock); } void @@ -242,12 +180,12 @@ g_return_if_fail (bin != NULL); g_return_if_fail (GST_IS_BIN (bin)); - GST_FLAG_UNSET (bin, GST_BIN_FLAG_FIXED_CLOCK); - GST_BIN_CLOCK (bin) = NULL; + if (GST_ELEMENT_SCHED (bin)) + gst_scheduler_auto_clock (GST_ELEMENT_SCHED (bin)); } static void -gst_bin_set_element_sched (GstElement * element, GstScheduler * sched) +gst_bin_set_element_sched (GstElement *element, GstScheduler *sched) { GList *children; GstElement *child; @@ -264,6 +202,7 @@ if (GST_IS_BIN (element)) { if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) { GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not resetting"); + gst_scheduler_add_scheduler (sched, GST_ELEMENT_SCHED (element)); return; } @@ -278,7 +217,6 @@ gst_bin_set_element_sched (child, sched); } - } /* otherwise, if it's just a regular old element */ else { @@ -288,7 +226,7 @@ static void -gst_bin_unset_element_sched (GstElement * element) +gst_bin_unset_element_sched (GstElement *element, GstScheduler *sched) { GList *children; GstElement *child; @@ -302,7 +240,7 @@ return; } - GST_INFO (GST_CAT_SCHEDULING, "removing element \"%s\" from it sched %p", + GST_INFO (GST_CAT_SCHEDULING, "removing element \"%s\" from its sched %p", GST_ELEMENT_NAME (element), GST_ELEMENT_SCHED (element)); /* if it's actually a Bin */ @@ -311,20 +249,21 @@ if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) { GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not unsetting sched"); + if (sched) { + gst_scheduler_remove_scheduler (sched, GST_ELEMENT_SCHED (element)); + } return; } - - gst_scheduler_remove_element (GST_ELEMENT_SCHED (element), element); - /* for each child, remove them from their schedule */ children = GST_BIN (element)->children; while (children) { child = GST_ELEMENT (children->data); children = g_list_next (children); - gst_bin_unset_element_sched (child); + gst_bin_unset_element_sched (child, sched); } + gst_scheduler_remove_element (GST_ELEMENT_SCHED (element), element); } /* otherwise, if it's just a regular old element */ else { @@ -372,10 +311,11 @@ * add a reference. */ void -gst_bin_add (GstBin * bin, GstElement * element) +gst_bin_add (GstBin *bin, GstElement *element) { gint state_idx = 0; GstElementState state; + GstScheduler *sched; g_return_if_fail (bin != NULL); g_return_if_fail (GST_IS_BIN (bin)); @@ -409,11 +349,9 @@ /* now we have to deal with manager stuff * we can only do this if there's a scheduler: * if we're not a manager, and aren't attached to anything, we have no sched (yet) */ - if (GST_IS_BIN (element) && GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) { - GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is a manager"); - } - else if (GST_ELEMENT_SCHED (bin) != NULL) { - gst_bin_set_element_sched (element, GST_ELEMENT_SCHED (bin)); + sched = GST_ELEMENT_SCHED (bin); + if (sched) { + gst_bin_set_element_sched (element, sched); } GST_INFO_ELEMENT (GST_CAT_PARENTAGE, bin, "added child \"%s\"", GST_ELEMENT_NAME (element)); @@ -429,7 +367,7 @@ * Remove the element from its associated bin, unparenting as well. */ void -gst_bin_remove (GstBin * bin, GstElement * element) +gst_bin_remove (GstBin *bin, GstElement *element) { gint state_idx = 0; GstElementState state; @@ -456,7 +394,7 @@ } /* remove this element from the list of managed elements */ - gst_bin_unset_element_sched (element); + gst_bin_unset_element_sched (element, GST_ELEMENT_SCHED (bin)); /* now remove the element from the list of elements */ bin->children = g_list_remove (bin->children, element); @@ -504,7 +442,7 @@ GST_LOCK (bin); bin->child_states[old_idx]--; bin->child_states[new_idx]++; - + for (i = GST_NUM_STATES - 1; i >= 0; i--) { if (bin->child_states[i] != 0) { gint state = (1 << i); @@ -512,7 +450,9 @@ GST_INFO (GST_CAT_STATES, "bin %s need state change to %s", GST_ELEMENT_NAME (bin), gst_element_statename (state)); GST_STATE_PENDING (bin) = state; + GST_UNLOCK (bin); gst_bin_change_state_norecurse (bin); + return; } break; } @@ -542,7 +482,11 @@ GST_INFO_ELEMENT (GST_CAT_STATES, element, "changing childrens' state from %s to %s", gst_element_statename (old_state), gst_element_statename (pending)); + if (pending == GST_STATE_VOID_PENDING) + return GST_STATE_SUCCESS; + children = bin->children; + while (children) { child = GST_ELEMENT (children->data); children = g_list_next (children); @@ -568,28 +512,6 @@ break; } } - - if (GST_ELEMENT_SCHED (bin) != NULL && GST_ELEMENT_PARENT (bin) == NULL) { - switch (transition) { - case GST_STATE_NULL_TO_READY: - gst_bin_distribute_clocks (bin); - break; - case GST_STATE_READY_TO_PAUSED: - if (GST_BIN_CLOCK (bin)) - gst_clock_reset (GST_BIN_CLOCK (bin)); - break; - case GST_STATE_PAUSED_TO_PLAYING: - gst_bin_distribute_clocks (bin); - if (GST_BIN_CLOCK (bin)) - gst_clock_activate (GST_BIN_CLOCK (bin), TRUE); - break; - case GST_STATE_PLAYING_TO_PAUSED: - if (GST_BIN_CLOCK (bin)) - gst_clock_activate (GST_BIN_CLOCK (bin), FALSE); - break; - } - } - GST_INFO_ELEMENT (GST_CAT_STATES, element, "done changing bin's state from %s to %s, now in %s", gst_element_statename (old_state), Index: gstbin.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstbin.h 18 Mar 2002 04:41:35 -0000 1.34 +++ gstbin.h 30 Mar 2002 17:05:00 -0000 1.35 @@ -48,10 +48,6 @@ # define GST_BIN_CLASS GST_BIN_CLASS_CAST #endif -#define GST_BIN_CLOCK_PROVIDERS(bin) (GST_BIN(bin)->clock_providers) -#define GST_BIN_CLOCK_RECEIVERS(bin) (GST_BIN(bin)->clock_receivers) -#define GST_BIN_CLOCK(bin) (GST_BIN(bin)->clock) - typedef enum { /* this bin is a manager of child elements, i.e. a pipeline or thread */ GST_BIN_FLAG_MANAGER = GST_ELEMENT_FLAG_LAST, @@ -82,8 +78,6 @@ GstElementState child_states[GST_NUM_STATES]; - GstClock *clock; - gpointer sched_private; }; @@ -128,9 +122,6 @@ /* one of our childs signaled a state change */ void gst_bin_child_state_change (GstBin *bin, GstElementState oldstate, GstElementState newstate, GstElement *child); -/* one of our childs signaled an error */ -void gst_bin_child_error (GstBin *bin, GstElement *child); - #ifdef __cplusplus } Index: gstcaps.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstcaps.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- gstcaps.c 24 Mar 2002 22:07:06 -0000 1.45 +++ gstcaps.c 30 Mar 2002 17:05:00 -0000 1.46 @@ -26,11 +26,11 @@ #include "gstcaps.h" #include "gsttype.h" -#include "gstpropsprivate.h" - static GMemChunk *_gst_caps_chunk; static GMutex *_gst_caps_chunk_lock; +GType _gst_caps_type; + void _gst_caps_initialize (void) { @@ -38,6 +38,11 @@ sizeof (GstCaps), sizeof (GstCaps) * 256, G_ALLOC_AND_FREE); _gst_caps_chunk_lock = g_mutex_new (); + + _gst_caps_type = g_boxed_type_register_static ("GstCaps", + (GBoxedCopyFunc) gst_caps_ref, + (GBoxedFreeFunc) gst_caps_unref); + } static guint16 @@ -104,7 +109,6 @@ caps->properties = props; caps->next = NULL; caps->refcount = 1; - caps->lock = g_mutex_new (); if (props) caps->fixed = props->fixed; else @@ -128,11 +132,8 @@ if (caps == NULL) return; - GST_CAPS_LOCK (caps); next = caps->next; - GST_CAPS_UNLOCK (caps); - g_mutex_free (caps->lock); gst_props_unref (caps->properties); g_free (caps->name); g_mutex_lock (_gst_caps_chunk_lock); @@ -189,11 +190,9 @@ g_return_val_if_fail (caps->refcount > 0, NULL); - GST_CAPS_LOCK (caps); caps->refcount--; zero = (caps->refcount == 0); next = &caps->next; - GST_CAPS_UNLOCK (caps); if (*next) *next = gst_caps_unref (*next); @@ -218,9 +217,7 @@ { g_return_val_if_fail (caps != NULL, NULL); - GST_CAPS_LOCK (caps); caps->refcount++; - GST_CAPS_UNLOCK (caps); return caps; } @@ -296,9 +293,7 @@ g_return_val_if_fail (caps != NULL, NULL); - GST_CAPS_LOCK (caps); needcopy = (caps->refcount > 1); - GST_CAPS_UNLOCK (caps); if (needcopy) { new = gst_caps_copy (caps); @@ -798,7 +793,6 @@ g_mutex_unlock (_gst_caps_chunk_lock); caps->refcount = 1; - caps->lock = g_mutex_new (); caps->next = NULL; caps->fixed = TRUE; Index: gstcaps.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstcaps.h,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstcaps.h 3 Mar 2002 00:44:40 -0000 1.33 +++ gstcaps.h 30 Mar 2002 17:05:00 -0000 1.34 @@ -30,13 +30,14 @@ typedef struct _GstCaps GstCaps; +extern GType _gst_caps_type; + +#define GST_TYPE_CAPS (_get_caps_type) + + #define GST_CAPS(caps) \ ((GstCaps *)(caps)) -#define GST_CAPS_LOCK(caps) (g_mutex_lock(GST_CAPS(caps)->lock)) -#define GST_CAPS_TRYLOCK(caps) (g_mutex_trylock(GST_CAPS(caps)->lock)) -#define GST_CAPS_UNLOCK(caps) (g_mutex_unlock(GST_CAPS(caps)->lock)) - #define GST_CAPS_IS_FIXED(caps) ((caps)->fixed) #define GST_CAPS_IS_CHAINED(caps) ((caps)->next) @@ -45,7 +46,6 @@ guint16 id; /* type id (major type) */ guint refcount; - GMutex *lock; /* global lock for this capability */ gboolean fixed; /* this caps doesn't contain variable properties */ GstProps *properties; /* properties for this capability */ @@ -104,14 +104,16 @@ GstProps* gst_caps_get_props (GstCaps *caps); #define gst_caps_set(caps, name, args...) gst_props_set ((caps)->properties, name, args) +#define gst_caps_get(caps, name, args...) gst_props_get ((caps)->properties, name, args) -#define gst_caps_get_int(caps, name) gst_props_get_int ((caps)->properties, name) -#define gst_caps_get_float(caps, name) gst_props_get_float ((caps)->properties, name) -#define gst_caps_get_fourcc_int(caps, name) gst_props_get_fourcc_int ((caps)->properties, name) -#define gst_caps_get_boolean(caps, name) gst_props_get_boolean ((caps)->properties, name) -#define gst_caps_get_string(caps, name) gst_props_get_string ((caps)->properties, name) +#define gst_caps_get_int(caps,name,res) gst_props_entry_get_int(gst_props_get_entry((caps)->properties,name),res) +#define gst_caps_get_float(caps,name,res) gst_props_entry_get_float(gst_props_get_entry((caps)->properties,name),res) +#define gst_caps_get_fourcc_int(caps,name,res) gst_props_entry_get_fourcc_int(gst_props_get_entry((caps)->properties,name),res) +#define gst_caps_get_boolean(caps,name,res) gst_props_entry_get_boolean(gst_props_get_entry((caps)->properties,name),res) +#define gst_caps_get_string(caps,name,res) gst_props_entry_get_string(gst_props_get_entry((caps)->properties,name),res) #define gst_caps_has_property(caps, name) gst_props_has_property ((caps)->properties, name) +#define gst_caps_has_property_typed(caps, name) gst_props_has_property_typed ((caps)->properties, name) #define gst_caps_has_fixed_property(caps, name) gst_props_has_fixed_property ((caps)->properties, name) GstCaps* gst_caps_get_by_name (GstCaps *caps, const gchar *name); Index: gstclock.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstclock.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstclock.c 3 Feb 2002 20:07:09 -0000 1.16 +++ gstclock.c 30 Mar 2002 17:05:00 -0000 1.17 @@ -29,13 +29,80 @@ #define CLASS(clock) GST_CLOCK_CLASS (G_OBJECT_GET_CLASS (clock)) +static GMemChunk *_gst_clock_entries_chunk; +static GMutex *_gst_clock_entries_chunk_lock; +static GList *_gst_clock_entries_pool; static void gst_clock_class_init (GstClockClass *klass); static void gst_clock_init (GstClock *clock); + static GstObjectClass *parent_class = NULL; /* static guint gst_clock_signals[LAST_SIGNAL] = { 0 }; */ +typedef struct _GstClockEntry GstClockEntry; + +static void gst_clock_free_entry (GstClock *clock, GstClockEntry *entry); + +typedef enum { + GST_ENTRY_OK, + GST_ENTRY_RESTART, +} GstEntryStatus; + +struct _GstClockEntry { + GstClockTime time; + GstEntryStatus status; + GstClockCallback func; + gpointer user_data; + GMutex *lock; + GCond *cond; +}; + +#define GST_CLOCK_ENTRY(entry) ((GstClockEntry *)(entry)) +#define GST_CLOCK_ENTRY_TIME(entry) (((GstClockEntry *)(entry))->time) +#define GST_CLOCK_ENTRY_LOCK(entry) (g_mutex_lock ((entry)->lock)) +#define GST_CLOCK_ENTRY_UNLOCK(entry) (g_mutex_unlock ((entry)->lock)) +#define GST_CLOCK_ENTRY_SIGNAL(entry) (g_cond_signal ((entry)->cond)) +#define GST_CLOCK_ENTRY_WAIT(entry) (g_cond_wait (entry->cond, entry->lock)) +#define GST_CLOCK_ENTRY_TIMED_WAIT(entry, time) (g_cond_timed_wait (entry->cond, entry->lock, (time))) + +static GstClockEntry* +gst_clock_entry_new (GstClockTime time, + GstClockCallback func, gpointer user_data) +{ + GstClockEntry *entry; + + g_mutex_lock (_gst_clock_entries_chunk_lock); + if (_gst_clock_entries_pool) { + entry = GST_CLOCK_ENTRY (_gst_clock_entries_pool->data); + + _gst_clock_entries_pool = g_list_remove (_gst_clock_entries_pool, entry); + g_mutex_unlock (_gst_clock_entries_chunk_lock); + } + else { + entry = g_mem_chunk_alloc (_gst_clock_entries_chunk); + g_mutex_unlock (_gst_clock_entries_chunk_lock); + + entry->lock = g_mutex_new (); + entry->cond = g_cond_new (); + } + entry->time = time; + entry->func = func; + entry->user_data = user_data; + + return entry; +} + +static gint +clock_compare_func (gconstpointer a, + gconstpointer b) +{ + GstClockEntry *entry1 = (GstClockEntry *)a; + GstClockEntry *entry2 = (GstClockEntry *)b; + + return (entry1->time - entry2->time); +} + GType gst_clock_get_type (void) { @@ -43,19 +110,19 @@ if (!clock_type) { static const GTypeInfo clock_info = { - sizeof (GstObjectClass), + sizeof (GstClockClass), NULL, NULL, (GClassInitFunc) gst_clock_class_init, NULL, NULL, - sizeof (GstObject), + sizeof (GstClock), 4, (GInstanceInitFunc) gst_clock_init, NULL }; clock_type = g_type_register_static (GST_TYPE_OBJECT, "GstClock", - &clock_info, G_TYPE_FLAG_ABSTRACT); + &clock_info, G_TYPE_FLAG_ABSTRACT); } return clock_type; } @@ -70,6 +137,12 @@ gstobject_class = (GstObjectClass*) klass; parent_class = g_type_class_ref (GST_TYPE_OBJECT); + + _gst_clock_entries_chunk = g_mem_chunk_new ("GstClockEntries", + sizeof (GstClockEntry), sizeof (GstClockEntry) * 32, + G_ALLOC_AND_FREE); + _gst_clock_entries_chunk_lock = g_mutex_new (); + _gst_clock_entries_pool = NULL; } static void @@ -78,37 +151,66 @@ clock->speed = 1.0; clock->active = FALSE; clock->start_time = 0; + clock->last_time = 0; + clock->entries = NULL; + clock->async_supported = FALSE; clock->active_mutex = g_mutex_new (); clock->active_cond = g_cond_new (); } +gboolean +gst_clock_async_supported (GstClock *clock) +{ + g_return_val_if_fail (GST_IS_CLOCK (clock), FALSE); + + return clock->async_supported; +} + + void gst_clock_reset (GstClock *clock) { + GstClockTime time = 0LL; + g_return_if_fail (GST_IS_CLOCK (clock)); - clock->start_time = 0; - clock->active = FALSE; + if (CLASS (clock)->get_internal_time) { + time = CLASS (clock)->get_internal_time (clock); + } - if (CLASS (clock)->reset) - CLASS (clock)->reset (clock); + GST_LOCK (clock); + clock->active = FALSE; + clock->start_time = time; + clock->last_time = 0LL; + GST_UNLOCK (clock); } void gst_clock_activate (GstClock *clock, gboolean active) { + GstClockTime time = 0LL; + g_return_if_fail (GST_IS_CLOCK (clock)); clock->active = active; + + if (CLASS (clock)->get_internal_time) { + time = CLASS (clock)->get_internal_time (clock); + } - if (CLASS (clock)->activate) - CLASS (clock)->activate (clock, active); + GST_LOCK (clock); + if (active) { + clock->start_time = time - clock->last_time;; + } + else { + clock->last_time = time - clock->start_time; + } + GST_UNLOCK (clock); g_mutex_lock (clock->active_mutex); - g_cond_signal (clock->active_cond); + g_cond_broadcast (clock->active_cond); g_mutex_unlock (clock->active_mutex); - } gboolean @@ -119,40 +221,166 @@ return clock->active; } -void -gst_clock_set_time (GstClock *clock, GstClockTime time) -{ - g_return_if_fail (GST_IS_CLOCK (clock)); - - if (CLASS (clock)->set_time) - CLASS (clock)->set_time (clock, time); -} - GstClockTime gst_clock_get_time (GstClock *clock) { + GstClockTime ret = 0LL; + g_return_val_if_fail (GST_IS_CLOCK (clock), 0LL); - if (CLASS (clock)->get_time) - return CLASS (clock)->get_time (clock); + if (!clock->active) { + /* clock is not activen return previous time */ + ret = clock->last_time; + } + else { + if (CLASS (clock)->get_internal_time) { + ret = CLASS (clock)->get_internal_time (clock) - clock->start_time; + } + /* make sure the time is increasing, else return last_time */ + if (ret < clock->last_time) { + ret = clock->last_time; + } + else { + clock->last_time = ret; + } + } - return 0LL; + return ret; } -GstClockReturn -gst_clock_wait (GstClock *clock, GstClockTime time) +static GstClockID +gst_clock_wait_async_func (GstClock *clock, GstClockTime time, + GstClockCallback func, gpointer user_data) { - g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_STOPPED); + GstClockEntry *entry = NULL; + g_return_val_if_fail (GST_IS_CLOCK (clock), NULL); if (!clock->active) { g_mutex_lock (clock->active_mutex); g_cond_wait (clock->active_cond, clock->active_mutex); g_mutex_unlock (clock->active_mutex); } - if (CLASS (clock)->wait) - return CLASS (clock)->wait (clock, time); - return GST_CLOCK_TIMEOUT; + entry = gst_clock_entry_new (time, func, user_data); + + GST_LOCK (clock); + clock->entries = g_list_insert_sorted (clock->entries, entry, clock_compare_func); + GST_UNLOCK (clock); + + return entry; +} + +GstClockReturn +gst_clock_wait (GstClock *clock, GstClockTime time) +{ + GstClockID id; + GstClockReturn res; + + g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_STOPPED); + + id = gst_clock_wait_async_func (clock, time, NULL, NULL); + res = gst_clock_wait_id (clock, id); + + return res; +} + +GstClockID +gst_clock_wait_async (GstClock *clock, GstClockTime time, + GstClockCallback func, gpointer user_data) +{ + g_return_val_if_fail (GST_IS_CLOCK (clock), NULL); + + if (clock->async_supported) { + return gst_clock_wait_async_func (clock, time, func, user_data); + } + return NULL; +} + +static void +gst_clock_unlock_func (GstClock *clock, GstClockTime time, GstClockID id, gpointer user_data) +{ + GstClockEntry *entry = (GstClockEntry *) id; + + GST_CLOCK_ENTRY_LOCK (entry); + GST_CLOCK_ENTRY_SIGNAL (entry); + GST_CLOCK_ENTRY_UNLOCK (entry); +} + +GstClockReturn +gst_clock_wait_id (GstClock *clock, GstClockID id) +{ + GstClockReturn res = GST_CLOCK_TIMEOUT; + GstClockEntry *entry = (GstClockEntry *) id; + GstClockTime current_real, current, target; + GTimeVal timeval; + + g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_ERROR); + g_return_val_if_fail (entry, GST_CLOCK_ERROR); + + current = gst_clock_get_time (clock); + + g_get_current_time (&timeval); + current_real = GST_TIMEVAL_TO_TIME (timeval); + + GST_CLOCK_ENTRY_LOCK (entry); + entry->func = gst_clock_unlock_func; + target = GST_CLOCK_ENTRY_TIME (entry) - current + current_real; + + //g_print ("%lld %lld %lld\n", target, current, current_real); + + if (target > current_real) { + timeval.tv_usec = target % 1000000; + timeval.tv_sec = target / 1000000; + + GST_CLOCK_ENTRY_TIMED_WAIT (entry, &timeval); + } + GST_CLOCK_ENTRY_UNLOCK (entry); + + gst_clock_free_entry (clock, entry); + + return res; +} + +GstClockID +gst_clock_get_next_id (GstClock *clock) +{ + GstClockEntry *entry = NULL; + + GST_LOCK (clock); + if (clock->entries) + entry = GST_CLOCK_ENTRY (clock->entries->data); + GST_UNLOCK (clock); + + return (GstClockID *) entry; +} + +GstClockTime +gst_clock_id_get_time (GstClockID id) +{ + return GST_CLOCK_ENTRY_TIME (id); +} + +static void +gst_clock_free_entry (GstClock *clock, GstClockEntry *entry) +{ + GST_LOCK (clock); + clock->entries = g_list_remove (clock->entries, entry); + GST_UNLOCK (clock); + + g_mutex_lock (_gst_clock_entries_chunk_lock); + _gst_clock_entries_pool = g_list_prepend (_gst_clock_entries_pool, entry); + g_mutex_unlock (_gst_clock_entries_chunk_lock); +} + +void +gst_clock_unlock_id (GstClock *clock, GstClockID id) +{ + GstClockEntry *entry = (GstClockEntry *) id; + + if (entry->func) + entry->func (clock, gst_clock_get_time (clock), id, entry->user_data); + + gst_clock_free_entry (clock, entry); } void @@ -172,6 +400,6 @@ if (CLASS (clock)->get_resolution) return CLASS (clock)->get_resolution (clock); - return 0LL; + return 1LL; } Index: gstclock.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstclock.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstclock.h 3 Feb 2002 20:07:09 -0000 1.6 +++ gstclock.h 30 Mar 2002 17:05:00 -0000 1.7 @@ -65,8 +65,11 @@ GstObject object; GstClockTime start_time; + GstClockTime last_time; gdouble speed; gboolean active; + GList *entries; + gboolean async_supported; GMutex *active_mutex; GCond *active_cond; @@ -76,20 +79,8 @@ GstObjectClass parent_class; /* vtable */ - void (*activate) (GstClock *clock, gboolean active); - void (*reset) (GstClock *clock); - - void (*set_time) (GstClock *clock, GstClockTime time); - GstClockTime (*get_time) (GstClock *clock); + GstClockTime (*get_internal_time) (GstClock *clock); - GstClockReturn (*wait) (GstClock *clock, GstClockTime time); - GstClockID (*wait_async) (GstClock *clock, GstClockTime time, - GstClockCallback func, gpointer user_data); - void (*cancel_wait_async) (GstClock *clock, GstClockID id); - GstClockID (*notify_async) (GstClock *clock, GstClockTime interval, - GstClockCallback func, gpointer user_data); - void (*remove_notify_async) (GstClock *clock, GstClockID id); - void (*set_resolution) (GstClock *clock, guint64 resolution); guint64 (*get_resolution) (GstClock *clock); @@ -104,8 +95,8 @@ void gst_clock_activate (GstClock *clock, gboolean active); gboolean gst_clock_is_active (GstClock *clock); void gst_clock_reset (GstClock *clock); +gboolean gst_clock_async_supported (GstClock *clock); -void gst_clock_set_time (GstClock *clock, GstClockTime time); GstClockTime gst_clock_get_time (GstClock *clock); GstClockReturn gst_clock_wait (GstClock *clock, GstClockTime time); @@ -115,6 +106,12 @@ GstClockID gst_clock_notify_async (GstClock *clock, GstClockTime interval, GstClockCallback func, gpointer user_data); void gst_clock_remove_notify_async (GstClock *clock, GstClockID id); +GstClockReturn gst_clock_wait_id (GstClock *clock, GstClockID id); + +GstClockID gst_clock_get_next_id (GstClock *clock); +void gst_clock_unlock_id (GstClock *clock, GstClockID id); + +GstClockTime gst_clock_id_get_time (GstClockID id); void gst_clock_set_resolution (GstClock *clock, guint64 resolution); guint64 gst_clock_get_resolution (GstClock *clock); Index: gstelement.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.123 retrieving revision 1.124 diff -u -d -r1.123 -r1.124 --- gstelement.c 24 Mar 2002 22:07:06 -0000 1.123 +++ gstelement.c 30 Mar 2002 17:05:00 -0000 1.124 @@ -315,8 +315,11 @@ g_return_val_if_fail (element != NULL, GST_CLOCK_ERROR); g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_ERROR); - /* FIXME inform the scheduler */ - return gst_clock_wait (clock, time); + if (GST_ELEMENT_SCHED (element)) { + return gst_scheduler_clock_wait (GST_ELEMENT_SCHED (element), element, clock, time); + } + else + return GST_CLOCK_TIMEOUT; } /** @@ -489,7 +492,9 @@ /* look through the list, matching by name */ walk = element->pads; while (walk) { - GstPad *pad = GST_PAD(walk->data); + GstPad *pad; + + pad = GST_PAD(walk->data); if (!strcmp (GST_PAD_NAME(pad), name)) { GST_INFO(GST_CAT_ELEMENT_PADS,"found pad %s:%s",GST_DEBUG_PAD_NAME(pad)); return pad; @@ -718,6 +723,7 @@ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL); g_return_val_if_fail (name != NULL, NULL); + if (strstr (name, "%")) { templ = gst_element_get_padtemplate_by_name (element, name); req_name = NULL; @@ -1182,35 +1188,6 @@ } /** - * gst_element_info: - * @element: Element with the info - * @info: String describing the info - * @...: arguments for the string. - * - * This function is used internally by elements to signal an info - * condition. It results in the "info" signal. - */ -void -gst_element_info (GstElement *element, const gchar *info, ...) -{ - g_warning ("The function gst_element_info is gone. Use g_object_notify instead."); -} - - -/** - * gst_element_send_event: - * @element: Element generating the event - * @event: the event to send - * - * This function is deprecated and doesn't work anymore. - */ -void -gst_element_send_event (GstElement *element, GstEvent *event) -{ - g_warning ("The function gst_element_send_event is gone. Use g_object_notify instead."); -} - -/** * gst_element_get_state: * @element: element to get state of * @@ -1258,13 +1235,13 @@ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE); - GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "setting state from %s to %s\n", - gst_element_statename (GST_STATE (element)), - gst_element_statename (state)); - /* start with the current state */ curpending = GST_STATE(element); + GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "setting state from %s to %s\n", + gst_element_statename (curpending), + gst_element_statename (state)); + /* loop until the final requested state is set */ while (GST_STATE (element) != state && GST_STATE (element) != GST_STATE_VOID_PENDING) { /* move the curpending state in the correct direction */ @@ -1277,9 +1254,10 @@ /* FIXME: should probably check to see that we don't already have one */ GST_STATE_PENDING (element) = curpending; - if (curpending != state) + if (curpending != state) { GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "intermediate: setting state to %s\n", gst_element_statename (curpending)); + } /* call the state change function so it can set the state */ oclass = CLASS (element); @@ -1297,7 +1275,11 @@ /* Last thing we do is verify that a successful state change really * did change the state... */ if (GST_STATE (element) != curpending) { - GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "element claimed state-change success, but state didn't change\n"); + GST_DEBUG_ELEMENT (GST_CAT_STATES, element, + "element claimed state-change success, but state didn't change %s, %s <-> %s\n", + gst_element_statename (GST_STATE (element)), + gst_element_statename (GST_STATE_PENDING (element)), + gst_element_statename (curpending)); return GST_STATE_FAILURE; } break; @@ -1429,9 +1411,6 @@ } } - g_signal_emit (G_OBJECT (element), gst_element_signals[STATE_CHANGE], - 0, old_state, GST_STATE (element)); - parent = GST_ELEMENT_PARENT (element); /* tell our parent about the state change */ @@ -1439,6 +1418,9 @@ gst_bin_child_state_change (GST_BIN (parent), old_state, GST_STATE (element), element); } + g_signal_emit (G_OBJECT (element), gst_element_signals[STATE_CHANGE], + 0, old_state, GST_STATE (element)); + /* signal the state change in case somebody is waiting for us */ g_mutex_lock (element->state_mutex); g_cond_signal (element->state_cond); @@ -1688,7 +1670,7 @@ */ void gst_element_set_sched (GstElement *element, - GstScheduler *sched) + GstScheduler *sched) { g_return_if_fail (GST_IS_ELEMENT (element)); @@ -1727,8 +1709,8 @@ * a new loopfunc to be assigned, this should be no problem. */ void -gst_element_set_loop_function(GstElement *element, - GstElementLoopFunction loop) +gst_element_set_loop_function (GstElement *element, + GstElementLoopFunction loop) { g_return_if_fail (GST_IS_ELEMENT (element)); Index: gstelement.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- gstelement.h 18 Mar 2002 04:41:35 -0000 1.84 +++ gstelement.h 30 Mar 2002 17:05:00 -0000 1.85 @@ -38,7 +38,6 @@ #define GST_NUM_STATES 4 - /* NOTE: this probably should be done with an #ifdef to decide * whether to safe-cast or to just do the non-checking cast. */ @@ -171,7 +170,6 @@ GstElementStateReturn (*change_state) (GstElement *element); /* request a new pad */ GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name); - void (*send_event) (GstElement *element, GstEvent *event); }; void gst_element_class_add_padtemplate (GstElementClass *klass, GstPadTemplate *templ); @@ -228,8 +226,7 @@ void gst_element_set_eos (GstElement *element); -void gst_element_send_event (GstElement *element, GstEvent *event); - +void gst_element_error (GstElement *element, const gchar *error, ...); GstElementState gst_element_get_state (GstElement *element); gint gst_element_set_state (GstElement *element, GstElementState state); @@ -237,9 +234,6 @@ void gst_element_wait_state_change (GstElement *element); const gchar* gst_element_statename (GstElementState state); - -void gst_element_info (GstElement *element, const gchar *info, ...); -void gst_element_error (GstElement *element, const gchar *error, ...); GstElementFactory* gst_element_get_factory (GstElement *element); Index: gstpad.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.154 retrieving revision 1.155 diff -u -d -r1.154 -r1.155 --- gstpad.c 24 Mar 2002 22:07:06 -0000 1.154 +++ gstpad.c 30 Mar 2002 17:05:00 -0000 1.155 @@ -535,7 +535,7 @@ realsink = GST_PAD_REALIZE (sinkpad); g_return_if_fail (GST_RPAD_PEER (realsrc) != NULL); - g_return_if_fail (GST_RPAD_PEER (realsink) != NULL); + g_return_if_fail (GST_RPAD_PEER (realsink) == realsrc); if ((GST_RPAD_DIRECTION (realsrc) == GST_PAD_SINK) && (GST_RPAD_DIRECTION (realsink) == GST_PAD_SRC)) { @@ -1013,8 +1013,8 @@ debug_string = "DELAYED"; break; default: - g_warning ("unknown return code from connect function of pad %s:%s", - GST_DEBUG_PAD_NAME (pad)); + g_warning ("unknown return code from connect function of pad %s:%s %d", + GST_DEBUG_PAD_NAME (pad), res); return GST_PAD_CONNECT_REFUSED; } @@ -1337,9 +1337,9 @@ GST_INFO (GST_CAT_CAPS, "proxy connect to pad %s:%s", GST_DEBUG_PAD_NAME (realpad)); - if (peer && !gst_pad_try_set_caps_func (peer, caps, TRUE)) + if (peer && gst_pad_try_set_caps_func (peer, caps, TRUE) < 0) return GST_PAD_CONNECT_REFUSED; - if (!gst_pad_try_set_caps_func (realpad, caps, FALSE)) + if (gst_pad_try_set_caps_func (realpad, caps, FALSE) < 0) return GST_PAD_CONNECT_REFUSED; return GST_PAD_CONNECT_OK; Index: gstpad.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.h,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstpad.h 20 Feb 2002 21:31:16 -0000 1.80 +++ gstpad.h 30 Mar 2002 17:05:00 -0000 1.81 @@ -40,7 +40,7 @@ extern GType _gst_real_pad_type; extern GType _gst_ghost_pad_type; -/*#define GST_TYPE_PARANOID */ +#define GST_TYPE_PARANOID /* * Pad base class @@ -118,10 +118,10 @@ } GstRegionType; typedef enum { - GST_PAD_CONNECT_REFUSED = 0, - GST_PAD_CONNECT_OK = 1, - GST_PAD_CONNECT_DONE = 2, - GST_PAD_CONNECT_DELAYED = 3, + GST_PAD_CONNECT_REFUSED = -1, + GST_PAD_CONNECT_DELAYED = 0, + GST_PAD_CONNECT_OK = 1, + GST_PAD_CONNECT_DONE = 2, } GstPadConnectReturn; /* this defines the functions used to chain buffers Index: gstprops.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- gstprops.c 27 Mar 2002 04:29:46 -0000 1.53 +++ gstprops.c 30 Mar 2002 17:05:00 -0000 1.54 @@ -25,7 +25,39 @@ #include "gstlog.h" #include "gstprops.h" -#include "gstpropsprivate.h" + +GType _gst_props_type; + +#define GST_PROPS_ENTRY_IS_VARIABLE(a) (((GstPropsEntry*)(a))->propstype > GST_PROPS_VAR_TYPE) + +struct _GstPropsEntry { + GQuark propid; [...985 lines suppressed...] entry->propid = g_quark_from_string (prop); g_free (prop); @@ -1613,7 +1730,7 @@ g_free (prop); } else if (!strcmp(field->name, "string")) { - entry->propstype = GST_PROPS_STRING_ID; + entry->propstype = GST_PROPS_STRING_TYPE; prop = xmlGetProp(field, "name"); entry->propid = g_quark_from_string (prop); g_free (prop); @@ -1655,7 +1772,7 @@ prop = xmlGetProp (field, "name"); entry->propid = g_quark_from_string (prop); g_free (prop); - entry->propstype = GST_PROPS_LIST_ID; + entry->propstype = GST_PROPS_LIST_TYPE; entry->data.list_data.entries = NULL; while (subfield) { Index: gstprops.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstprops.h 13 Jan 2002 22:22:42 -0000 1.23 +++ gstprops.h 30 Mar 2002 17:05:00 -0000 1.24 @@ -26,86 +26,110 @@ #include <gst/gstconfig.h> -#include <glib.h> +#include <glib-object.h> typedef struct _GstProps GstProps; +extern GType _gst_props_type; + +#define GST_TYPE_PROPS (_get_props_type) typedef enum { - GST_PROPS_END_ID = 0, - GST_PROPS_INT_ID, - GST_PROPS_FLOAT_ID, - GST_PROPS_FOURCC_ID, - GST_PROPS_BOOL_ID, - GST_PROPS_STRING_ID, + GST_PROPS_END_TYPE = 0, - GST_PROPS_VAR_ID, /* after this marker start the variable properties */ + GST_PROPS_INVALID_TYPE, - GST_PROPS_LIST_ID, - GST_PROPS_FLOAT_RANGE_ID, - GST_PROPS_INT_RANGE_ID, + GST_PROPS_INT_TYPE, + GST_PROPS_FLOAT_TYPE, + GST_PROPS_FOURCC_TYPE, + GST_PROPS_BOOL_TYPE, + GST_PROPS_STRING_TYPE, - GST_PROPS_LAST_ID = GST_PROPS_END_ID + 16, -} GstPropsId; + GST_PROPS_VAR_TYPE, /* after this marker start the variable properties */ + + GST_PROPS_LIST_TYPE, + GST_PROPS_FLOAT_RANGE_TYPE, + GST_PROPS_INT_RANGE_TYPE, + + GST_PROPS_LAST_TYPE = GST_PROPS_END_TYPE + 16, +} GstPropsType; #define GST_MAKE_FOURCC(a,b,c,d) ((a)|(b)<<8|(c)<<16|(d)<<24) #define GST_STR_FOURCC(f) (((f)[0])|((f)[1]<<8)|((f)[2]<<16)|((f)[3]<<24)) -#define GST_PROPS_LIST(a...) GST_PROPS_LIST_ID,##a,NULL -#define GST_PROPS_INT(a) GST_PROPS_INT_ID,(a) -#define GST_PROPS_INT_RANGE(a,b) GST_PROPS_INT_RANGE_ID,(a),(b) -#define GST_PROPS_FLOAT(a) GST_PROPS_FLOAT_ID,(a) -#define GST_PROPS_FLOAT_RANGE(a,b) GST_PROPS_FLOAT_RANGE_ID,(a),(b) -#define GST_PROPS_FOURCC(a) GST_PROPS_FOURCC_ID,(a) -#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOL_ID,(a) -#define GST_PROPS_STRING(a) GST_PROPS_STRING_ID,(a) +#define GST_PROPS_LIST(a...) GST_PROPS_LIST_TYPE,##a,NULL +#define GST_PROPS_INT(a) GST_PROPS_INT_TYPE,(a) +#define GST_PROPS_INT_RANGE(a,b) GST_PROPS_INT_RANGE_TYPE,(a),(b) +#define GST_PROPS_FLOAT(a) GST_PROPS_FLOAT_TYPE,(a) +#define GST_PROPS_FLOAT_RANGE(a,b) GST_PROPS_FLOAT_RANGE_TYPE,(a),(b) +#define GST_PROPS_FOURCC(a) GST_PROPS_FOURCC_TYPE,(a) +#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOL_TYPE,(a) +#define GST_PROPS_STRING(a) GST_PROPS_STRING_TYPE,(a) #define GST_PROPS_INT_POSITIVE GST_PROPS_INT_RANGE(0,G_MAXINT) #define GST_PROPS_INT_NEGATIVE GST_PROPS_INT_RANGE(G_MININT,0) #define GST_PROPS_INT_ANY GST_PROPS_INT_RANGE(G_MININT,G_MAXINT) +typedef struct _GstPropsEntry GstPropsEntry; struct _GstProps { gint refcount; - GMutex *lock; gboolean fixed; GList *properties; /* real properties for this property */ }; /* initialize the subsystem */ -void _gst_props_initialize (void); +void _gst_props_initialize (void); -GstProps* gst_props_new (const gchar *firstname, ...); -GstProps* gst_props_newv (const gchar *firstname, va_list var_args); +GstProps* gst_props_new (const gchar *firstname, ...); +GstProps* gst_props_newv (const gchar *firstname, va_list var_args); -void gst_props_unref (GstProps *props); -void gst_props_ref (GstProps *props); -void gst_props_destroy (GstProps *props); +void gst_props_unref (GstProps *props); +void gst_props_ref (GstProps *props); +void gst_props_destroy (GstProps *props); -void gst_props_debug (GstProps *props); +void gst_props_debug (GstProps *props); -GstProps* gst_props_copy (GstProps *props); -GstProps* gst_props_copy_on_write (GstProps *props); +GstProps* gst_props_copy (GstProps *props); +GstProps* gst_props_copy_on_write (GstProps *props); -GstProps* gst_props_merge (GstProps *props, GstProps *tomerge); +GstProps* gst_props_merge (GstProps *props, GstProps *tomerge); -gboolean gst_props_check_compatibility (GstProps *fromprops, GstProps *toprops); -GstProps* gst_props_intersect (GstProps *props1, GstProps *props2); -GList* gst_props_normalize (GstProps *props); +gboolean gst_props_check_compatibility (GstProps *fromprops, GstProps *toprops); +GstProps* gst_props_intersect (GstProps *props1, GstProps *props2); +GList* gst_props_normalize (GstProps *props); -GstProps* gst_props_set (GstProps *props, const gchar *name, ...); +GstProps* gst_props_set (GstProps *props, const gchar *name, ...); +gboolean gst_props_get (GstProps *props, gchar *first_name, ...); -gboolean gst_props_has_property (GstProps *props, const gchar *name); +gboolean gst_props_has_property (GstProps *props, const gchar *name); +gboolean gst_props_has_property_typed (GstProps *props, const gchar *name, GstPropsType type); +gboolean gst_props_has_fixed_property (GstProps *props, const gchar *name); + + +/* working with props entries */ +const GstPropsEntry* gst_props_get_entry (GstProps *props, const gchar *name); +GstPropsType gst_props_entry_get_type (const GstPropsEntry *entry); +const gchar* gst_props_entry_get_name (const GstPropsEntry *entry); +gboolean gst_props_entry_is_fixed (const GstPropsEntry *entry); + +gboolean gst_props_entry_get (const GstPropsEntry *props, ...); + +gboolean gst_props_entry_get_int (const GstPropsEntry *entry, gint *val); +gboolean gst_props_entry_get_float (const GstPropsEntry *entry, gfloat *val); +gboolean gst_props_entry_get_fourcc_int (const GstPropsEntry *entry, guint32 *val); +gboolean gst_props_entry_get_boolean (const GstPropsEntry *entry, gboolean *val); +gboolean gst_props_entry_get_string (const GstPropsEntry *entry, const gchar **val); +gboolean gst_props_entry_get_int_range (const GstPropsEntry *entry, gint *min, gint *max); +gboolean gst_props_entry_get_float_range (const GstPropsEntry *entry, gfloat *min, gfloat *max); +gboolean gst_props_entry_get_list (const GstPropsEntry *entry, const GList **val); -gint gst_props_get_int (GstProps *props, const gchar *name); -gfloat gst_props_get_float (GstProps *props, const gchar *name); -gulong gst_props_get_fourcc_int (GstProps *props, const gchar *name); -gboolean gst_props_get_boolean (GstProps *props, const gchar *name); -const gchar* gst_props_get_string (GstProps *props, const gchar *name); #ifndef GST_DISABLE_LOADSAVE -xmlNodePtr gst_props_save_thyself (GstProps *props, xmlNodePtr parent); -GstProps* gst_props_load_thyself (xmlNodePtr parent); +xmlNodePtr gst_props_save_thyself (GstProps *props, xmlNodePtr parent); +GstProps* gst_props_load_thyself (xmlNodePtr parent); #endif + + #endif /* __GST_PROPS_H__ */ --- gstpropsprivate.h DELETED --- Index: gstqueue.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstqueue.c 19 Mar 2002 04:10:10 -0000 1.35 +++ gstqueue.c 30 Mar 2002 17:05:00 -0000 1.36 @@ -83,7 +83,6 @@ static GstBufferPool* gst_queue_get_bufferpool (GstPad *pad); static void gst_queue_locked_flush (GstQueue *queue); -static void gst_queue_flush (GstQueue *queue); static GstElementStateReturn gst_queue_change_state (GstElement *element); @@ -275,15 +274,6 @@ } static void -gst_queue_flush (GstQueue *queue) -{ - g_mutex_lock (queue->qlock); - gst_queue_locked_flush (queue); - g_mutex_unlock (queue->qlock); -} - - -static void gst_queue_chain (GstPad *pad, GstBuffer *buf) { GstQueue *queue; @@ -378,7 +368,7 @@ return; } else { - gst_element_info (GST_ELEMENT (queue), "waiting for the app to restart source pad elements"); + g_print ("%s: waiting for the app to restart source pad elements\n", GST_ELEMENT_NAME (queue)); } } @@ -459,7 +449,7 @@ goto restart; } else { - gst_element_info (GST_ELEMENT (queue), "waiting for the app to restart sink pad elements"); + g_print ("%s: waiting for the app to restart source pad elements\n", GST_ELEMENT_NAME (queue)); } } Index: gstscheduler.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstscheduler.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gstscheduler.c 24 Mar 2002 22:07:06 -0000 1.50 +++ gstscheduler.c 30 Mar 2002 17:05:01 -0000 1.51 @@ -24,6 +24,7 @@ #include "gst_private.h" +#include "gstsystemclock.h" #include "gstscheduler.h" static void gst_scheduler_class_init (GstSchedulerClass *klass); @@ -67,6 +68,13 @@ static void gst_scheduler_init (GstScheduler *sched) { + sched->clock_providers = NULL; + sched->clock_receivers = NULL; + sched->schedulers = NULL; + sched->state = GST_SCHEDULER_STATE_NONE; + sched->parent = NULL; + sched->parent_sched = NULL; + sched->clock = NULL; } /** @@ -171,11 +179,48 @@ g_return_if_fail (GST_IS_SCHEDULER (sched)); g_return_if_fail (GST_IS_ELEMENT (element)); + if (element->getclockfunc) { + sched->clock_providers = g_list_prepend (sched->clock_providers, element); + } + if (element->setclockfunc) { + sched->clock_receivers = g_list_prepend (sched->clock_receivers, element); + } + if (CLASS (sched)->add_element) CLASS (sched)->add_element (sched, element); } /** + * gst_scheduler_remove_element: + * @sched: the schedulerr + * @element: the element to remov + * + * Remove an element from the schedulerr. + */ +void +gst_scheduler_remove_element (GstScheduler *sched, GstElement *element) +{ + GList *pads; + + g_return_if_fail (GST_IS_SCHEDULER (sched)); + g_return_if_fail (GST_IS_ELEMENT (element)); + + sched->clock_providers = g_list_remove (sched->clock_providers, element); + sched->clock_receivers = g_list_remove (sched->clock_receivers, element); + + if (CLASS (sched)->remove_element) + CLASS (sched)->remove_element (sched, element); + + for (pads = element->pads; pads; pads = pads->next) { + GstPad *pad = GST_PAD (pads->data); + + if (GST_IS_REAL_PAD (pad)) { + gst_pad_unset_sched (GST_PAD (pads->data)); + } + } +} + +/** * gst_scheduler_state_transition: * @sched: the scheduler * @element: the element with the state transition @@ -192,39 +237,66 @@ g_return_val_if_fail (GST_IS_SCHEDULER (sched), GST_STATE_FAILURE); g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE); + if (element == sched->parent && sched->parent_sched == NULL) { + + switch (transition) { + case GST_STATE_READY_TO_PAUSED: + { + GstClock *clock = gst_scheduler_get_clock (sched); + + if (clock) + gst_clock_reset (clock); + + sched->current_clock = clock; + break; + } + case GST_STATE_PAUSED_TO_PLAYING: + { + gst_scheduler_set_clock (sched, sched->current_clock); + if (sched->current_clock) + gst_clock_activate (sched->current_clock, TRUE); + break; + } + case GST_STATE_PLAYING_TO_PAUSED: + if (sched->current_clock) + gst_clock_activate (sched->current_clock, FALSE); + break; + } + } + if (CLASS (sched)->state_transition) return CLASS (sched)->state_transition (sched, element, transition); return GST_STATE_SUCCESS; } -/** - * gst_scheduler_remove_element: - * @sched: the schedulerr - * @element: the element to remov - * - * Remove an element from the schedulerr. - */ void -gst_scheduler_remove_element (GstScheduler *sched, GstElement *element) +gst_scheduler_add_scheduler (GstScheduler *sched, GstScheduler *sched2) { - GList *pads; - g_return_if_fail (GST_IS_SCHEDULER (sched)); - g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (GST_IS_SCHEDULER (sched2)); - if (CLASS (sched)->remove_element) - CLASS (sched)->remove_element (sched, element); - - for (pads = element->pads; pads; pads = pads->next) { - GstPad *pad = GST_PAD (pads->data); - - if (GST_IS_REAL_PAD (pad)) { - gst_pad_unset_sched (GST_PAD (pads->data)); - } - } + sched->schedulers = g_list_prepend (sched->schedulers, sched2); + sched2->parent_sched = sched; + + if (CLASS (sched)->add_scheduler) + CLASS (sched)->add_scheduler (sched, sched2); +} + +void +gst_scheduler_remove_scheduler (GstScheduler *sched, GstScheduler *sched2) +{ + g_return_if_fail (GST_IS_SCHEDULER (sched)); + g_return_if_fail (GST_IS_SCHEDULER (sched2)); + + sched->schedulers = g_list_remove (sched->schedulers, sched2); + sched2->parent_sched = NULL; + + if (CLASS (sched)->remove_scheduler) + CLASS (sched)->remove_scheduler (sched, sched2); } + /** * gst_scheduler_lock_element: * @sched: the scheduler @@ -313,6 +385,106 @@ return CLASS (sched)->interrupt (sched, element); return FALSE; +} + +GstClock* +gst_scheduler_get_clock (GstScheduler *sched) +{ + GstClock *clock = NULL; + + if (GST_FLAG_IS_SET (sched, GST_SCHEDULER_FLAG_FIXED_CLOCK)) { + clock = sched->clock; + } + else { + if (sched->schedulers) { + GList *schedulers = sched->schedulers; + + while (schedulers) { + GstScheduler *scheduler = GST_SCHEDULER (schedulers->data); + + clock = gst_scheduler_get_clock (scheduler); + if (clock) + break; + + schedulers = g_list_next (schedulers); + } + } + if (!clock && sched->clock_providers) { + clock = gst_element_get_clock (GST_ELEMENT (sched->clock_providers->data)); + } + if (!clock && sched->parent_sched == NULL) { + clock = gst_system_clock_obtain (); + } + } + + return clock; +} + +void +gst_scheduler_use_clock (GstScheduler *sched, GstClock *clock) +{ + g_return_if_fail (sched != NULL); + g_return_if_fail (GST_IS_SCHEDULER (sched)); + + GST_FLAG_SET (sched, GST_SCHEDULER_FLAG_FIXED_CLOCK); + sched->clock = clock; +} + +void +gst_scheduler_set_clock (GstScheduler *sched, GstClock *clock) +{ + GList *receivers; + GList *schedulers; + + g_return_if_fail (sched != NULL); + g_return_if_fail (GST_IS_SCHEDULER (sched)); + + receivers = sched->clock_receivers; + schedulers = sched->schedulers; + + sched->current_clock = clock; + + while (receivers) { + GstElement *element = GST_ELEMENT (receivers->data); + + gst_element_set_clock (element, clock); + receivers = g_list_next (receivers); + } + while (schedulers) { + GstScheduler *scheduler = GST_SCHEDULER (schedulers->data); + + gst_scheduler_set_clock (scheduler, clock); + schedulers = g_list_next (schedulers); + } +} + +void +gst_scheduler_auto_clock (GstScheduler *sched) +{ + g_return_if_fail (sched != NULL); + g_return_if_fail (GST_IS_SCHEDULER (sched)); + + GST_FLAG_UNSET (sched, GST_SCHEDULER_FLAG_FIXED_CLOCK); + sched->clock = NULL; +} + +/** + * gst_scheduler_clock_wait: + * @sched: the scheduler + * + * Perform one iteration on the schedulerr. + * + * Returns: a boolean indicating something usefull has happened. + */ +GstClockReturn +gst_scheduler_clock_wait (GstScheduler *sched, GstElement *element, GstClock *clock, GstClockTime time) +{ + g_return_val_if_fail (GST_IS_SCHEDULER (sched), GST_CLOCK_ERROR); + + if (CLASS (sched)->clock_wait) + return CLASS (sched)->clock_wait (sched, element, clock, time); + + return GST_CLOCK_TIMEOUT; } /** Index: gstscheduler.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstscheduler.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstscheduler.h 2 Feb 2002 13:36:21 -0000 1.18 +++ gstscheduler.h 30 Mar 2002 17:05:01 -0000 1.19 @@ -44,6 +44,13 @@ #define GST_IS_SCHEDULER_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SCHEDULER)) +typedef enum { + /* this scheduler works with a fixed clock */ + GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST, + + /* padding */ + GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4, +} GstSchedulerFlags; #define GST_SCHEDULER_PARENT(sched) ((sched)->parent) #define GST_SCHEDULER_STATE(sched) ((sched)->state) @@ -58,11 +65,19 @@ } GstSchedulerState; struct _GstScheduler { - GstObject object; + GstObject object; - GstElement *parent; + GstElement *parent; + GstScheduler *parent_sched; - GstSchedulerState state; + GstSchedulerState state; + GstClock *clock; + GstClock *current_clock; + + GList *clock_providers; + GList *clock_receivers; + + GList *schedulers; }; struct _GstSchedulerClass { @@ -73,6 +88,8 @@ void (*reset) (GstScheduler *sched); void (*add_element) (GstScheduler *sched, GstElement *element); void (*remove_element) (GstScheduler *sched, GstElement *element); + void (*add_scheduler) (GstScheduler *sched, GstScheduler *sched2); + void (*remove_scheduler) (GstScheduler *sched, GstScheduler *sched2); GstElementStateReturn (*state_transition) (GstScheduler *sched, GstElement *element, gint transition); void (*lock_element) (GstScheduler *sched, GstElement *element); void (*unlock_element) (GstScheduler *sched, GstElement *element); @@ -82,6 +99,8 @@ void (*pad_connect) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); void (*pad_disconnect) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); void (*pad_select) (GstScheduler *sched, GList *padlist); + GstClockReturn (*clock_wait) (GstScheduler *sched, GstElement *element, + GstClock *clock, GstClockTime time); GstSchedulerState (*iterate) (GstScheduler *sched); /* for debugging */ void (*show) (GstScheduler *sched); @@ -98,6 +117,8 @@ void gst_scheduler_reset (GstS... [truncated message content] |
From: Wim T. <wt...@us...> - 2002-04-14 11:06:36
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Apr 14 2002 04:06:32 PDT Log message: Made dynamic pads work for sinkpads with no padtemplate Modified files: gst : gstparse.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstparse.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: gstparse.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstparse.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstparse.c 13 Apr 2002 17:11:41 -0000 1.48 +++ gstparse.c 14 Apr 2002 11:06:20 -0000 1.49 @@ -37,7 +37,8 @@ typedef struct { gchar *srcpadname; - GstPad *target; + GstPad *target_pad; + GstElement *target_element; GstElement *pipeline; } dynamic_connection_t; @@ -56,12 +57,27 @@ dynamic_connect (GstElement * element, GstPad * newpad, gpointer data) { dynamic_connection_t *dc = (dynamic_connection_t *) data; + gboolean warn = TRUE; - if (!strcmp (gst_pad_get_name (newpad), dc->srcpadname)) { + /* do we know the exact srcpadname? */ + if (dc->srcpadname) { + /* see if this is the one */ + if (strcmp (gst_pad_get_name (newpad), dc->srcpadname)) { + return; + } + } + /* try to find a target pad if we don't know it yet */ + if (!dc->target_pad) { + dc->target_pad = gst_element_get_compatible_pad (dc->target_element, newpad); + warn = FALSE; + } + + if (!GST_PAD_IS_CONNECTED (newpad)) { gst_element_set_state (dc->pipeline, GST_STATE_PAUSED); - if (!gst_pad_connect (newpad, dc->target)) + if (!gst_pad_connect (newpad, dc->target_pad) && warn) { g_warning ("could not connect %s:%s to %s:%s", GST_DEBUG_PAD_NAME (newpad), - GST_DEBUG_PAD_NAME (dc->target)); + GST_DEBUG_PAD_NAME (dc->target_pad)); + } gst_element_set_state (dc->pipeline, GST_STATE_PLAYING); } } @@ -249,7 +265,8 @@ pt1->presence == GST_PAD_SOMETIMES) { dc = g_new0 (dynamic_connection_t, 1); dc->srcpadname = (gchar*)a->data; - dc->target = p2; + dc->target_pad = p2; + dc->target_element = sink; dc->pipeline = g->bin; GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s and %s:%s", @@ -277,7 +294,8 @@ // g_print ("got the pad\n"); dc = g_new0 (dynamic_connection_t, 1); dc->srcpadname = (gchar*)a->data; - dc->target = p2; + dc->target_pad = p2; + dc->target_element = NULL; dc->pipeline = g->bin; GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s and %s:%s", @@ -285,17 +303,29 @@ (gchar*)a->data, GST_DEBUG_PAD_NAME (p2)); g_signal_connect (G_OBJECT (src), "new_pad", G_CALLBACK (dynamic_connect), dc); + goto next; } else { /* both pt1 and pt2 are sometimes templates. sheesh. */ goto both_templates_have_sometimes_presence; } } else { - goto could_not_get_compatible_to_a; + /* if the target pad has no padtemplate we will figure out a target + * pad later on */ + dc = g_new0 (dynamic_connection_t, 1); + dc->srcpadname = NULL; + dc->target_pad = NULL; + dc->target_element = sink; + dc->pipeline = g->bin; + + GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s, and some pad in %s", + GST_OBJECT_NAME (GST_OBJECT (src)), + (gchar*)a->data, GST_OBJECT_NAME (sink)); + + g_signal_connect (G_OBJECT (src), "new_pad", G_CALLBACK (dynamic_connect), dc); + goto next; } } else { - if (!(p2 = gst_element_get_compatible_pad (sink, p1))) { - goto could_not_get_compatible_to_a; - } + goto could_not_get_compatible_to_a; } } else { goto could_not_get_pad_a; @@ -323,6 +353,7 @@ goto could_not_connect_elements; } } +next: l = g_list_next (l); } |
From: Wim T. <wt...@us...> - 2002-04-14 11:35:17
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Apr 14 2002 04:35:15 PDT Log message: Added more funky cases Modified files: gst : gstparse.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstparse.c.diff?r1=1.49&r2=1.50 ====Begin Diffs==== Index: gstparse.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstparse.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gstparse.c 14 Apr 2002 11:06:20 -0000 1.49 +++ gstparse.c 14 Apr 2002 11:35:03 -0000 1.50 @@ -66,13 +66,18 @@ return; } } + /* try to find a target pad if we don't know it yet */ if (!dc->target_pad) { - dc->target_pad = gst_element_get_compatible_pad (dc->target_element, newpad); - warn = FALSE; + if (!GST_PAD_IS_CONNECTED (newpad)) { + dc->target_pad = gst_element_get_compatible_pad (dc->target_element, newpad); + warn = FALSE; + } + else { + return; + } } - - if (!GST_PAD_IS_CONNECTED (newpad)) { + if (!GST_PAD_IS_CONNECTED (dc->target_pad)) { gst_element_set_state (dc->pipeline, GST_STATE_PAUSED); if (!gst_pad_connect (newpad, dc->target_pad) && warn) { g_warning ("could not connect %s:%s to %s:%s", GST_DEBUG_PAD_NAME (newpad), |
From: Wim T. <wt...@us...> - 2002-04-14 13:39:31
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Apr 14 2002 06:39:27 PDT Log message: This is all a quick hack... Modified files: gst : gstparse.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstparse.c.diff?r1=1.50&r2=1.51 ====Begin Diffs==== Index: gstparse.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstparse.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gstparse.c 14 Apr 2002 11:35:03 -0000 1.50 +++ gstparse.c 14 Apr 2002 13:39:15 -0000 1.51 @@ -77,7 +77,7 @@ return; } } - if (!GST_PAD_IS_CONNECTED (dc->target_pad)) { + if (!GST_PAD_IS_CONNECTED (dc->target_pad) && !GST_PAD_IS_CONNECTED (newpad)) { gst_element_set_state (dc->pipeline, GST_STATE_PAUSED); if (!gst_pad_connect (newpad, dc->target_pad) && warn) { g_warning ("could not connect %s:%s to %s:%s", GST_DEBUG_PAD_NAME (newpad), |
From: Wim T. <wt...@us...> - 2002-04-28 19:39:43
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Apr 28 2002 06:27:45 PDT Log message: Added method for releasing request pads. Fix state changes. Modified files: gst : gstelement.c gstelement.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.134&r2=1.135 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.89&r2=1.90 ====Begin Diffs==== Index: gstelement.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.134 retrieving revision 1.135 diff -u -d -r1.134 -r1.135 --- gstelement.c 23 Apr 2002 14:59:50 -0000 1.134 +++ gstelement.c 28 Apr 2002 13:27:32 -0000 1.135 @@ -205,6 +205,19 @@ return newpad; } +void +gst_element_release_request_pad (GstElement *element, GstPad *pad) +{ + GstElementClass *oclass; + + g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (GST_IS_PAD (pad)); + + oclass = CLASS (element); + if (oclass->release_pad) + (oclass->release_pad) (element, pad); +} + /** * gst_element_set_name: @@ -1329,10 +1342,10 @@ switch (return_val) { case GST_STATE_FAILURE: GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "have failed change_state return"); - break; + goto exit; case GST_STATE_ASYNC: GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "element will change state async"); - break; + goto exit; case GST_STATE_SUCCESS: /* Last thing we do is verify that a successful state change really * did change the state... */ @@ -1350,6 +1363,7 @@ g_assert_not_reached (); } } +exit: return return_val; } Index: gstelement.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- gstelement.h 23 Apr 2002 11:15:18 -0000 1.89 +++ gstelement.h 28 Apr 2002 13:27:32 -0000 1.90 @@ -170,6 +170,7 @@ GstElementStateReturn (*change_state) (GstElement *element); /* request a new pad */ GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name); + void (*release_pad) (GstElement *element, GstPad *pad); }; void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ); @@ -203,6 +204,7 @@ GstPad* gst_element_get_pad (GstElement *element, const gchar *name); GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name); GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name); +void gst_element_release_request_pad (GstElement *element, GstPad *pad); GList* gst_element_get_pad_list (GstElement *element); GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad); |
From: Wim T. <wt...@us...> - 2002-05-01 19:43:32
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 01 2002 12:43:30 PDT Log message: Small cleanup Modified files: gst : gstobject.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstobject.c.diff?r1=1.43&r2=1.44 ====Begin Diffs==== Index: gstobject.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstobject.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gstobject.c 14 Apr 2002 14:59:33 -0000 1.43 +++ gstobject.c 1 May 2002 19:43:18 -0000 1.44 @@ -639,9 +639,12 @@ while (gst_object) { /* need own category? */ - GST_DEBUG (GST_CAT_EVENT, "deep notification from %s to %s", GST_OBJECT_NAME (object), GST_OBJECT_NAME (gst_object)); - for (i = 0; i < n_pspecs; i++) - g_signal_emit (gst_object, gst_object_signals[DEEP_NOTIFY], g_quark_from_string (pspecs[i]->name), (GstObject *) object, pspecs[i]); + for (i = 0; i < n_pspecs; i++) { + GST_DEBUG (GST_CAT_EVENT, "deep notification from %s to %s (%s)", GST_OBJECT_NAME (object), + GST_OBJECT_NAME (gst_object), pspecs[i]->name); + g_signal_emit (gst_object, gst_object_signals[DEEP_NOTIFY], g_quark_from_string (pspecs[i]->name), + (GstObject *) object, pspecs[i]); + } gst_object = GST_OBJECT_PARENT (gst_object); } |
From: Wim T. <wt...@us...> - 2002-05-01 19:46:01
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 01 2002 12:45:58 PDT Log message: Small cleanups Modified files: gst : gstelement.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.135&r2=1.136 ====Begin Diffs==== Index: gstelement.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.135 retrieving revision 1.136 diff -u -d -r1.135 -r1.136 --- gstelement.c 28 Apr 2002 13:27:32 -0000 1.135 +++ gstelement.c 1 May 2002 19:45:46 -0000 1.136 @@ -88,7 +88,8 @@ (GInstanceInitFunc)gst_element_init, NULL }; - _gst_element_type = g_type_register_static(GST_TYPE_OBJECT, "GstElement", &element_info, G_TYPE_FLAG_ABSTRACT); + _gst_element_type = g_type_register_static(GST_TYPE_OBJECT, "GstElement", + &element_info, G_TYPE_FLAG_ABSTRACT); } return _gst_element_type; } @@ -1893,13 +1894,13 @@ } else if (prop_id == bytesperread_id) { - pspec = g_param_spec_int ("bytesperread", "bytesperread", - "bytesperread", + pspec = g_param_spec_int ("bytesperread", "Bytes per read", + "Number of bytes to read per buffer", G_MININT, G_MAXINT, 0, flags); } else if (prop_id == dump_id) { - pspec = g_param_spec_boolean ("dump", "dump", "dump", FALSE, flags); + pspec = g_param_spec_boolean ("dump", "Dump", "Dump bytes to stdout", FALSE, flags); } else if (prop_id == filesize_id) { @@ -1927,7 +1928,7 @@ } else if (prop_id == silent_id) { - pspec = g_param_spec_boolean ("silent", "silent", "silent", + pspec = g_param_spec_boolean ("silent", "Silent", "Don't produce events", FALSE, flags); } |
From: Wim T. <wt...@us...> - 2002-05-01 19:39:15
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 01 2002 12:39:10 PDT Log message: Added some more useful functions to create props Modified files: gst : gstprops.c gstprops.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.c.diff?r1=1.56&r2=1.57 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.h.diff?r1=1.26&r2=1.27 ====Begin Diffs==== Index: gstprops.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- gstprops.c 3 Apr 2002 18:26:03 -0000 1.56 +++ gstprops.c 1 May 2002 19:38:58 -0000 1.57 @@ -274,8 +274,15 @@ g_mutex_unlock (_gst_props_entries_chunk_lock); } -static GstProps* -gst_props_alloc (void) +/** + * gst_props_empty_new: + * + * Create a new empty property. + * + * Returns: the new property + */ +GstProps* +gst_props_empty_new (void) { GstProps *props; @@ -290,7 +297,14 @@ return props; } -static void +/** + * gst_props_add_entry: + * @props: the property to add the entry to + * @entry: the entry to add + * + * Addes the given propsentry to the props + */ +void gst_props_add_entry (GstProps *props, GstPropsEntry *entry) { g_return_if_fail (props); @@ -455,6 +469,40 @@ return g_list_prepend (entries, newentry); } +static GstPropsEntry* +gst_props_entry_newv (const gchar *name, va_list var_args) +{ + GstPropsEntry *entry; + + entry = gst_props_alloc_entry (); + entry->propid = g_quark_from_string (name); + GST_PROPS_ENTRY_FILL (entry, var_args); + + return entry; +} + +/** + * gst_props_entry_new: + * @name: the name of the props entry + * @...: the value of the entry + * + * Create a new property entry with the given key/value. + * + * Returns: the new entry. + */ +GstPropsEntry* +gst_props_entry_new (const gchar *name, ...) +{ + va_list var_args; + GstPropsEntry *entry; + + va_start (var_args, name); + entry = gst_props_entry_newv (name, var_args); + va_end (var_args); + + return entry; +} + /** * gst_props_newv: * @firstname: the first property name @@ -487,7 +535,7 @@ if (firstname == NULL) return NULL; - props = gst_props_alloc (); + props = gst_props_empty_new (); prop_name = firstname; @@ -599,6 +647,8 @@ GQuark quark; GList *lentry; va_list var_args; + + g_return_val_if_fail (props != NULL, NULL); quark = g_quark_from_string (name); @@ -622,6 +672,7 @@ return props; } + /** * gst_props_unref: * @props: the props to unref @@ -738,7 +789,7 @@ if (props == NULL) return NULL; - new = gst_props_alloc (); + new = gst_props_empty_new (); new->properties = gst_props_list_copy (props->properties); new->fixed = props->fixed; @@ -1575,7 +1626,7 @@ GList *leftovers; GstPropsEntry *iprops = NULL; - intersection = gst_props_alloc (); + intersection = gst_props_empty_new (); intersection->fixed = TRUE; g_return_val_if_fail (props1 != NULL, NULL); @@ -1697,7 +1748,7 @@ GstProps *newprops; GList *lentry; - newprops = gst_props_alloc (); + newprops = gst_props_empty_new (); newprops->properties = gst_props_list_copy (props->properties); lentry = g_list_find_custom (newprops->properties, GINT_TO_POINTER (list_entry->propid), props_find_func); if (lentry) { @@ -1940,7 +1991,7 @@ xmlNodePtr field = parent->xmlChildrenNode; gchar *prop; - props = gst_props_alloc (); + props = gst_props_empty_new (); while (field) { if (!strcmp (field->name, "list")) { Index: gstprops.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstprops.h 6 Apr 2002 18:59:39 -0000 1.26 +++ gstprops.h 1 May 2002 19:38:58 -0000 1.27 @@ -87,6 +87,7 @@ GstProps* gst_props_new (const gchar *firstname, ...); GstProps* gst_props_newv (const gchar *firstname, va_list var_args); +GstProps* gst_props_empty_new (void); void gst_props_unref (GstProps *props); void gst_props_ref (GstProps *props); @@ -110,9 +111,12 @@ gboolean gst_props_has_property_typed (GstProps *props, const gchar *name, GstPropsType type); gboolean gst_props_has_fixed_property (GstProps *props, const gchar *name); +const GstPropsEntry* gst_props_get_entry (GstProps *props, const gchar *name); +void gst_props_add_entry (GstProps *props, GstPropsEntry *entry); /* working with props entries */ -const GstPropsEntry* gst_props_get_entry (GstProps *props, const gchar *name); +GstPropsEntry* gst_props_entry_new (const gchar *name, ...); + GstPropsType gst_props_entry_get_type (const GstPropsEntry *entry); const gchar* gst_props_entry_get_name (const GstPropsEntry *entry); gboolean gst_props_entry_is_fixed (const GstPropsEntry *entry); |
From: Wim T. <wt...@us...> - 2002-05-01 19:47:54
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 01 2002 12:47:50 PDT Log message: Small cleanups Modified files: gst : gstparse.c gstqueue.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstparse.c.diff?r1=1.52&r2=1.53 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.38&r2=1.39 ====Begin Diffs==== Index: gstparse.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstparse.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- gstparse.c 14 Apr 2002 14:59:33 -0000 1.52 +++ gstparse.c 1 May 2002 19:47:38 -0000 1.53 @@ -289,14 +289,11 @@ } } else if (a) { if ((pt1 = gst_element_get_pad_template (src, (gchar*)a->data))) { - /* g_print ("have padtemplate %s, SOMETIMES=%s\n", pt1->name_template, pt1->presence == GST_PAD_SOMETIMES ? "TRUE" : "FALSE"); */ if ((p1 = gst_element_get_pad (src, (gchar*)a->data)) || pt1->presence == GST_PAD_SOMETIMES) { if (!p1) { /* sigh, a hack until i fix the gstelement api... */ if ((pt2 = gst_element_get_compatible_pad_template (sink, pt1))) { - /* g_print ("have compatible pad template %s\n", pt2->name_template); */ if ((p2 = gst_element_get_pad (sink, pt2->name_template))) { - /* g_print ("got the pad\n"); */ dc = g_new0 (dynamic_connection_t, 1); dc->srcpadname = (gchar*)a->data; dc->target_pad = p2; Index: gstqueue.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- gstqueue.c 20 Apr 2002 21:42:52 -0000 1.38 +++ gstqueue.c 1 May 2002 19:47:38 -0000 1.39 @@ -535,6 +535,7 @@ } else if (new_state == GST_STATE_PLAYING) { if (!GST_PAD_IS_CONNECTED (queue->sinkpad)) { + GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s is not connected", GST_ELEMENT_NAME (queue)); /* FIXME can this be? */ if (queue->reader) g_cond_signal (queue->not_empty); |
From: Wim T. <wt...@us...> - 2002-05-08 20:08:07
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 08 2002 13:00:47 PDT Log message: Added gst_props_get_safe Modified files: gst : gstprops.c gstprops.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.c.diff?r1=1.59&r2=1.60 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstprops.h.diff?r1=1.27&r2=1.28 ====Begin Diffs==== Index: gstprops.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- gstprops.c 4 May 2002 18:12:11 -0000 1.59 +++ gstprops.c 8 May 2002 20:00:34 -0000 1.60 @@ -1008,6 +1008,22 @@ return result; } +static gboolean +gst_props_getv (GstProps *props, gboolean safe, gchar *first_name, va_list var_args) +{ + while (first_name) { + const GstPropsEntry *entry = gst_props_get_entry (props, first_name); + gboolean result; + + if (!entry) return FALSE; + GST_PROPS_ENTRY_READ (entry, var_args, FALSE, &result); + if (!result) return FALSE; + + first_name = va_arg (var_args, gchar *); + } + return TRUE; +} + /** * gst_props_get: * @props: the props to query @@ -1022,22 +1038,36 @@ gst_props_get (GstProps *props, gchar *first_name, ...) { va_list var_args; + gboolean ret; va_start (var_args, first_name); + ret = gst_props_getv (props, FALSE, first_name, var_args); + va_end (var_args); + + return ret; +} - while (first_name) { - const GstPropsEntry *entry = gst_props_get_entry (props, first_name); - gboolean result; - - if (!entry) return FALSE; - GST_PROPS_ENTRY_READ (entry, var_args, FALSE, &result); - if (!result) return FALSE; +/** + * gst_props_get_safe: + * @props: the props to query + * @first_name: the first key + * @...: a pointer to a datastructure that can hold the value. + * + * Gets the contents of the props into given key/value pairs. + * + * Returns: TRUE is the props entry could be fetched. + */ +gboolean +gst_props_get_safe (GstProps *props, gchar *first_name, ...) +{ + va_list var_args; + gboolean ret; - first_name = va_arg (var_args, gchar *); - } + va_start (var_args, first_name); + ret = gst_props_getv (props, TRUE, first_name, var_args); va_end (var_args); - return TRUE; + return ret; } /** @@ -1432,7 +1462,8 @@ if (intersectentry) { if (intersectentry->propstype == GST_PROPS_LIST_TYPE) { - intersection = g_list_concat (intersection, intersectentry->data.list_data.entries); + intersection = g_list_concat (intersection, + g_list_copy (intersectentry->data.list_data.entries)); /* set the list to NULL because the entries are concatenated to the above * list and we don't want to free them */ intersectentry->data.list_data.entries = NULL; Index: gstprops.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstprops.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstprops.h 1 May 2002 19:38:58 -0000 1.27 +++ gstprops.h 8 May 2002 20:00:35 -0000 1.28 @@ -106,6 +106,7 @@ GstProps* gst_props_set (GstProps *props, const gchar *name, ...); gboolean gst_props_get (GstProps *props, gchar *first_name, ...); +gboolean gst_props_get_safe (GstProps *props, gchar *first_name, ...); gboolean gst_props_has_property (GstProps *props, const gchar *name); gboolean gst_props_has_property_typed (GstProps *props, const gchar *name, GstPropsType type); |
From: Wim T. <wt...@us...> - 2002-05-26 21:23:02
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun May 26 2002 14:23:02 PDT Log message: Added g_malloc instead of a memchunk when using memprof Modified files: gst : gstbuffer.c gstbuffer.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.c.diff?r1=1.48&r2=1.49 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.h.diff?r1=1.35&r2=1.36 ====Begin Diffs==== Index: gstbuffer.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbuffer.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstbuffer.c 17 Apr 2002 15:19:56 -0000 1.48 +++ gstbuffer.c 26 May 2002 21:22:50 -0000 1.49 @@ -26,6 +26,7 @@ #include "gstbuffer.h" +/* #define MEMPROF */ GType _gst_buffer_type; @@ -88,7 +89,11 @@ GstBuffer *buffer; g_mutex_lock (_gst_buffer_chunk_lock); +#ifdef MEMPROF + buffer = g_new0 (GstBuffer, 1); +#else buffer = g_mem_chunk_alloc (_gst_buffer_chunk); +#endif _gst_buffer_live++; g_mutex_unlock (_gst_buffer_chunk_lock); GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer); @@ -169,7 +174,11 @@ g_return_val_if_fail ((offset+size) <= parent->size, NULL); g_mutex_lock (_gst_buffer_chunk_lock); +#ifdef MEMPROF + buffer = g_new0 (GstBuffer, 1); +#else buffer = g_mem_chunk_alloc (_gst_buffer_chunk); +#endif _gst_buffer_live++; g_mutex_unlock (_gst_buffer_chunk_lock); GST_INFO (GST_CAT_BUFFER,"creating new subbuffer %p from parent %p (size %u, offset %u)", @@ -314,7 +323,11 @@ /* remove it entirely from memory */ g_mutex_lock (_gst_buffer_chunk_lock); +#ifdef MEMPROF + g_free (buffer); +#else g_mem_chunk_free (_gst_buffer_chunk,buffer); +#endif _gst_buffer_live--; g_mutex_unlock (_gst_buffer_chunk_lock); } Index: gstbuffer.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbuffer.h,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstbuffer.h 19 Apr 2002 10:26:56 -0000 1.35 +++ gstbuffer.h 26 May 2002 21:22:50 -0000 1.36 @@ -84,7 +84,6 @@ GST_BUFFER_READONLY, GST_BUFFER_ORIGINAL, GST_BUFFER_DONTFREE, - } GstBufferFlag; |
From: Wim T. <wt...@us...> - 2002-05-29 15:00:01
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 29 2002 08:00:00 PDT Log message: Some cleanups, more debugging info Modified files: gst : cothreads.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/cothreads.c.diff?r1=1.63&r2=1.64 ====Begin Diffs==== Index: cothreads.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- cothreads.c 19 Apr 2002 10:26:56 -0000 1.63 +++ cothreads.c 29 May 2002 14:59:48 -0000 1.64 @@ -33,6 +33,7 @@ #include "cothreads.h" #include "gstarch.h" #include "gstlog.h" +#include "gstutils.h" #define STACK_SIZE 0x200000 @@ -86,7 +87,7 @@ memset (ctx->threads, 0, sizeof (ctx->threads)); - ctx->threads[0] = (cothread_state *) g_malloc (sizeof (cothread_state)); + ctx->threads[0] = (cothread_state *) g_malloc0 (sizeof (cothread_state)); ctx->threads[0]->ctx = ctx; ctx->threads[0]->threadnum = 0; ctx->threads[0]->func = NULL; @@ -491,21 +492,22 @@ #endif enter = setjmp (current->jmp); if (enter != 0) { - GST_DEBUG (0, "enter thread #%d %d %p<->%p (%d)", current->threadnum, enter, - current->sp, current->top_sp, (char*)current->top_sp - (char*)current->sp); + GST_DEBUG (0, "enter thread #%d %d %p<->%p (%d) %p", current->threadnum, enter, + current->sp, current->top_sp, (char*)current->top_sp - (char*)current->sp, current->jmp); return; } - GST_DEBUG (0, "exit thread #%d %d %p<->%p (%d)", current->threadnum, enter, - current->sp, current->top_sp, (char*)current->top_sp - (char*)current->sp); + GST_DEBUG (0, "exit thread #%d %d %p<->%p (%d) %p", current->threadnum, enter, + current->sp, current->top_sp, (char*)current->top_sp - (char*)current->sp, current->jmp); enter = 1; - if (current->flags & COTHREAD_DESTROYED) + if (current->flags & COTHREAD_DESTROYED) { cothread_destroy (current); + } GST_DEBUG (0, "set stack to %p", thread->sp); /* restore stack pointer and other stuff of new cothread */ if (thread->flags & COTHREAD_STARTED) { - GST_DEBUG (0, "in thread "); + GST_DEBUG (0, "in thread %p", thread->jmp); /* switch to it */ longjmp (thread->jmp, 1); } |
From: Wim T. <wt...@us...> - 2002-05-29 15:02:03
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Wed May 29 2002 08:02:03 PDT Log message: Error checking in pthread creation more info in gst_util_dump_mem Modified files: gst : gstthread.c gstutils.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstthread.c.diff?r1=1.80&r2=1.81 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstutils.c.diff?r1=1.29&r2=1.30 ====Begin Diffs==== Index: gstthread.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstthread.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- gstthread.c 26 May 2002 21:54:25 -0000 1.80 +++ gstthread.c 29 May 2002 15:01:50 -0000 1.81 @@ -271,7 +271,11 @@ g_mutex_lock (thread->lock); /* create the thread */ - pthread_create (&thread->thread_id, NULL, gst_thread_main_loop, thread); + if (pthread_create (&thread->thread_id, NULL, gst_thread_main_loop, thread) != 0) { + g_mutex_unlock (thread->lock); + THR_DEBUG ("could not create thread \"%s\"", GST_ELEMENT_NAME (element)); + return GST_STATE_FAILURE; + } /* wait for it to 'spin up' */ THR_DEBUG ("waiting for child thread spinup"); Index: gstutils.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstutils.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstutils.c 30 Mar 2002 17:05:01 -0000 1.29 +++ gstutils.c 29 May 2002 15:01:50 -0000 1.30 @@ -22,6 +22,7 @@ #include <stdio.h> #include <string.h> +#include <ctype.h> #include "gst_private.h" #include "gstutils.h" @@ -213,7 +214,18 @@ i = j = 0; while (i < size) { if (j == 0) { - g_print ("\n%08x : ", i); + if (i != 0) { + guint k; + + for (k = i - 16; k < i; k++) { + if (isprint (mem[k])) + g_print ("%c", mem[k]); + else + g_print ("."); + } + g_print ("\n"); + } + g_print ("%08x : ", i); j = 15; } else { |
From: Wim T. <wt...@us...> - 2002-05-30 19:03:43
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Thu May 30 2002 12:03:42 PDT Log message: Created an overridable method for seeking on an element, along with a default implementation. make queue flush on discont (not entirely correct) removed the new_media from the discont event. Modified files: gst : gstelement.c gstelement.h gstevent.c gstevent.h gstqueue.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.142&r2=1.143 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.h.diff?r1=1.95&r2=1.96 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.c.diff?r1=1.14&r2=1.15 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.40&r2=1.41 ====Begin Diffs==== Index: gstelement.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.142 retrieving revision 1.143 diff -u -d -r1.142 -r1.143 --- gstelement.c 27 May 2002 04:48:57 -0000 1.142 +++ gstelement.c 30 May 2002 19:03:29 -0000 1.143 @@ -63,6 +63,8 @@ static void gst_element_dispose (GObject *object); +static gboolean gst_element_send_event_default (GstElement *element, GstEvent *event); + static GstElementStateReturn gst_element_change_state (GstElement *element); static void gst_element_error_func (GstElement* element, GstElement *source, gchar *errormsg); @@ -159,6 +161,7 @@ klass->elementfactory = NULL; klass->padtemplates = NULL; klass->numpadtemplates = 0; + klass->send_event = GST_DEBUG_FUNCPTR (gst_element_send_event_default); } static void @@ -1592,7 +1595,7 @@ srcpads = gst_element_get_pad_list (src); while (srcpads) { - pad = GST_PAD (srcpads->data); + pad = GST_PAD_CAST (srcpads->data); if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) if (GST_OBJECT_PARENT (GST_PAD_PEER (pad)) == (GstObject*) dest) @@ -1616,6 +1619,39 @@ } } +static gboolean +gst_element_send_event_default (GstElement *element, GstEvent *event) +{ + GList *pads = element->pads; + gboolean res = FALSE; + + while (pads) { + GstPad *pad = GST_PAD_CAST (pads->data); + + if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) { + if (GST_PAD_IS_CONNECTED (pad)) { + res = gst_pad_send_event (GST_PAD_PEER (pad), event); + break; + } + } + pads = g_list_next (pads); + } + return res; +} + +gboolean +gst_element_send_event (GstElement *element, GstEvent *event) +{ + g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + if (CLASS (element)->send_event) + return CLASS (element)->send_event (element, event); + + return FALSE; +} + + /** * gst_element_error: * @element: Element with the error @@ -1633,7 +1669,6 @@ /* checks */ g_return_if_fail (GST_IS_ELEMENT (element)); - g_return_if_fail (element != NULL); g_return_if_fail (error != NULL); /* create error message */ Index: gstelement.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.h,v retrieving revision 1.95 retrieving revision 1.96 diff -u -d -r1.95 -r1.96 --- gstelement.h 26 May 2002 21:54:25 -0000 1.95 +++ gstelement.h 30 May 2002 19:03:29 -0000 1.96 @@ -171,6 +171,7 @@ /* vtable*/ gboolean (*release_locks) (GstElement *element); + gboolean (*send_event) (GstElement *element, GstEvent *event); /* change the element state */ GstElementStateReturn (*change_state) (GstElement *element); /* request a new pad */ @@ -260,6 +261,8 @@ GstCaps *filtercaps); void gst_element_disconnect_pads (GstElement *src, const gchar *srcpadname, GstElement *dest, const gchar *destpadname); + +gboolean gst_element_send_event (GstElement *element, GstEvent *event); void gst_element_set_eos (GstElement *element); Index: gstevent.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstevent.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstevent.c 26 May 2002 21:54:25 -0000 1.14 +++ gstevent.c 30 May 2002 19:03:30 -0000 1.15 @@ -168,14 +168,14 @@ } GstEvent* -gst_event_new_discontinuous (gboolean new_media, GstSeekType format1, ...) +gst_event_new_discontinuous (gboolean flush, GstSeekType format1, ...) { va_list var_args; GstEvent *event; gint count = 0; event = gst_event_new (GST_EVENT_DISCONTINUOUS); - GST_EVENT_DISCONT_NEW_MEDIA (event) = new_media; + GST_EVENT_DISCONT_FLUSH (event) = flush; va_start (var_args, format1); Index: gstevent.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstevent.h 26 May 2002 21:54:25 -0000 1.10 +++ gstevent.h 30 May 2002 19:03:30 -0000 1.11 @@ -88,7 +88,6 @@ #define GST_EVENT_SEEK_OFFSET(event) (GST_EVENT(event)->event_data.seek.offset) #define GST_EVENT_SEEK_ACCURACY(event) (GST_EVENT(event)->event_data.seek.accuracy) -#define GST_EVENT_DISCONT_NEW_MEDIA(event) (GST_EVENT(event)->event_data.discont.new_media) #define GST_EVENT_DISCONT_FLUSH(event) (GST_EVENT(event)->event_data.discont.flush) #define GST_EVENT_DISCONT_OFFSET(event,i) (GST_EVENT(event)->event_data.discont.offsets[i]) #define GST_EVENT_DISCONT_OFFSET_LEN(event) (GST_EVENT(event)->event_data.discont.noffsets) @@ -109,9 +108,7 @@ struct { GstFormatValue offsets[8]; gint noffsets; - gboolean new_media; gboolean flush; - GstSeekAccuracy accuracy; } discont; } event_data; }; @@ -122,8 +119,10 @@ GstEvent* gst_event_copy (GstEvent *event); void gst_event_free (GstEvent *event); -/* seek events */ +/* seek event */ GstEvent* gst_event_new_seek (GstSeekType type, gint64 offset); + +/* discontinous event */ GstEvent* gst_event_new_discontinuous (gboolean new_media, GstFormat format1, ...); gboolean gst_event_discont_get_value (GstEvent *event, GstFormat format, gint64 *value); Index: gstqueue.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gstqueue.c 26 May 2002 21:54:25 -0000 1.40 +++ gstqueue.c 30 May 2002 19:03:30 -0000 1.41 @@ -308,7 +308,7 @@ GST_ELEMENT_NAME (queue), queue->level_buffers); break; case GST_EVENT_DISCONTINUOUS: - //gst_queue_locked_flush (queue); + gst_queue_locked_flush (queue); break; default: /*gst_pad_event_default (pad, GST_EVENT (buf)); */ |
From: Wim T. <wt...@us...> - 2002-05-31 21:34:59
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Fri May 31 2002 14:34:58 PDT Log message: Set the element to eos after all EOS events are pushed Modified files: gst : gstpad.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.165&r2=1.166 ====Begin Diffs==== Index: gstpad.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.165 retrieving revision 1.166 diff -u -d -r1.165 -r1.166 --- gstpad.c 26 May 2002 21:54:25 -0000 1.165 +++ gstpad.c 31 May 2002 21:34:45 -0000 1.166 @@ -2355,8 +2355,8 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - gst_element_set_eos (element); gst_pad_event_default_dispatch (pad, element, event); + gst_element_set_eos (element); /* we have to try to schedule another element because this one is disabled */ gst_element_yield (element); break; |
From: Wim T. <wt...@us...> - 2002-06-02 11:50:11
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Jun 02 2002 04:50:10 PDT Log message: Some cleanups Add a KEY_UNIT flag for a seek event. Modified files: gst : gstbuffer.c gstevent.h gstpad.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.c.diff?r1=1.49&r2=1.50 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.h.diff?r1=1.87&r2=1.88 ====Begin Diffs==== Index: gstbuffer.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstbuffer.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gstbuffer.c 26 May 2002 21:22:50 -0000 1.49 +++ gstbuffer.c 2 Jun 2002 11:49:57 -0000 1.50 @@ -73,7 +73,7 @@ gst_buffer_print_stats (void) { g_log (g_log_domain_gstreamer, G_LOG_LEVEL_INFO, - "%d live buffers", _gst_buffer_live); + "%d live buffer(s)", _gst_buffer_live); } /** Index: gstevent.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstevent.h 30 May 2002 19:03:30 -0000 1.11 +++ gstevent.h 2 Jun 2002 11:49:57 -0000 1.12 @@ -68,6 +68,7 @@ GST_SEEK_FLAG_FLUSH = (1 << (GST_SEEK_FLAGS_SHIFT + 0)), GST_SEEK_FLAG_ACCURATE = (1 << (GST_SEEK_FLAGS_SHIFT + 1)), + GST_SEEK_FLAG_KEY_UNIT = (1 << (GST_SEEK_FLAGS_SHIFT + 2)), } GstSeekType; typedef enum { Index: gstpad.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstpad.h,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- gstpad.h 26 May 2002 21:54:25 -0000 1.87 +++ gstpad.h 2 Jun 2002 11:49:57 -0000 1.88 @@ -131,10 +131,10 @@ typedef GstBuffer* (*GstPadGetFunction) (GstPad *pad); typedef gboolean (*GstPadEventFunction) (GstPad *pad, GstEvent *event); typedef gboolean (*GstPadConvertFunction) (GstPad *pad, - GstSeekType src_format, gint64 src_value, - GstSeekType *dest_format, gint64 *dest_value); + GstFormat src_format, gint64 src_value, + GstFormat *dest_format, gint64 *dest_value); typedef gboolean (*GstPadQueryFunction) (GstPad *pad, GstPadQueryType type, - GstSeekType *format, gint64 *value); + GstFormat *format, gint64 *value); typedef GList* (*GstPadIntConnFunction) (GstPad *pad); typedef GstPadConnectReturn (*GstPadConnectFunction) (GstPad *pad, GstCaps *caps); |
From: Wim T. <wt...@us...> - 2002-06-02 11:51:39
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Jun 02 2002 04:51:38 PDT Log message: unlock the queue Modified files: gst : gstqueue.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.41&r2=1.42 ====Begin Diffs==== Index: gstqueue.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- gstqueue.c 30 May 2002 19:03:30 -0000 1.41 +++ gstqueue.c 2 Jun 2002 11:51:26 -0000 1.42 @@ -529,7 +529,9 @@ g_mutex_lock (queue->qlock); if (gst_element_get_state (GST_ELEMENT (queue)) == GST_STATE_PLAYING) { + g_mutex_unlock (queue->qlock); g_warning ("queue event in playing state"); + return FALSE; } switch (GST_EVENT_TYPE (event)) { |
From: Wim T. <wt...@us...> - 2002-06-02 11:54:51
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Jun 02 2002 04:54:48 PDT Log message: Remove the media specific types, the unit type is now defined by the caps (frames/samples/etc..) Modified files: gst : gstformat.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstformat.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstformat.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstformat.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstformat.h 31 May 2002 08:51:32 -0000 1.2 +++ gstformat.h 2 Jun 2002 11:54:36 -0000 1.3 @@ -32,16 +32,11 @@ GST_FORMAT_NONE = 0, GST_FORMAT_DEFAULT = 1, GST_FORMAT_BYTES = 2, - GST_FORMAT_TIME = 6, - GST_FORMAT_BUFFERS = 7, - GST_FORMAT_PERCENT = 8, - - /* audio related */ - GST_FORMAT_SAMPLES = 3, - - /* video related */ - GST_FORMAT_FRAMES = 4, /* can also be used for compressed audio */ - GST_FORMAT_FIELDS = 5, + GST_FORMAT_TIME = 3, + GST_FORMAT_BUFFERS = 4, + GST_FORMAT_PERCENT = 5, + /* samples for audio, frames/fields for video */ + GST_FORMAT_UNIT = 6, } GstFormat; G_END_DECLS |
From: Wim T. <wt...@us...> - 2002-06-02 13:24:49
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Jun 02 2002 06:24:48 PDT Log message: Make clock use nanoseconds Modified files: gst : gstclock.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstclock.h.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: gstclock.h =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstclock.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstclock.h 26 May 2002 21:54:25 -0000 1.10 +++ gstclock.h 2 Jun 2002 13:24:35 -0000 1.11 @@ -45,7 +45,9 @@ typedef gint64 GstClockTimeDiff; typedef gpointer GstClockID; -#define GST_SECOND ((guint64)G_USEC_PER_SEC) +#define GST_CLOCK_TIME_NONE ((guint64)-1) + +#define GST_SECOND ((guint64)G_USEC_PER_SEC * 1000LL) #define GST_MSECOND ((guint64)GST_SECOND/1000LL) #define GST_USECOND ((guint64)GST_SECOND/1000000LL) #define GST_NSECOND ((guint64)GST_SECOND/1000000000LL) @@ -55,7 +57,7 @@ #define GST_TIME_TO_TIMEVAL(t,tv) \ G_STMT_START { \ (tv).tv_sec = (t) / GST_SECOND; \ - (tv).tv_usec = ((t) / GST_USECOND) % GST_SECOND; \ + (tv).tv_usec = ((t) / GST_USECOND) % GST_MSECOND; \ } G_STMT_END typedef struct _GstClock GstClock; |
From: Wim T. <wt...@us...> - 2002-06-02 15:34:47
|
CVS Root: /cvsroot/gstreamer Module: gstreamer Changes by: wtay Date: Sun Jun 02 2002 08:34:47 PDT Log message: Don't update state if the peer event failed Modified files: gst : gstqueue.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: gstqueue.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- gstqueue.c 2 Jun 2002 11:51:26 -0000 1.42 +++ gstqueue.c 2 Jun 2002 15:34:34 -0000 1.43 @@ -523,6 +523,7 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event) { GstQueue *queue; + gboolean res = TRUE; queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); @@ -534,19 +535,23 @@ return FALSE; } - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_FLUSH: - GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "FLUSH event, flushing queue\n"); - gst_queue_locked_flush (queue); - break; - case GST_EVENT_SEEK: - gst_queue_locked_flush (queue); - default: - gst_pad_event_default (pad, event); - break; + res = gst_pad_event_default (pad, event); + if (res) { + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH: + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "FLUSH event, flushing queue\n"); + gst_queue_locked_flush (queue); + break; + case GST_EVENT_SEEK: + if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) + gst_queue_locked_flush (queue); + default: + break; + } } g_mutex_unlock (queue->qlock); - return TRUE; + + return res; } static gboolean |