diff --git a/ChangeLog b/ChangeLog index fa88208b83..9546703920 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-10-18 Wim Taymans + + * gst/gstbin.h: + * gst/gstelement.c: (gst_element_class_init), + (gst_element_set_state), (gst_element_set_state_func): + * gst/gstelement.h: + Pending ABI changes. + GThreadPool in GstBinClass to monitor async state changes. + state_cookie in GstElement to detect concurrent gst/set state. + set_state is now virtual too in case a very complicated element + has to be constructed. + 2005-10-18 Wim Taymans * check/gst/gstbin.c: (GST_START_TEST): diff --git a/gst/gstbin.h b/gst/gstbin.h index 206842b8d1..a5c9cea7ec 100644 --- a/gst/gstbin.h +++ b/gst/gstbin.h @@ -104,6 +104,8 @@ struct _GstBinClass { GstElementClass parent_class; /*< private >*/ + GThreadPool *pool; + /* signals */ void (*element_added) (GstBin *bin, GstElement *child); void (*element_removed) (GstBin *bin, GstElement *child); diff --git a/gst/gstelement.c b/gst/gstelement.c index 329bb1304f..f4978cc6df 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -119,10 +119,10 @@ static GstStateChangeReturn gst_element_change_state (GstElement * element, GstStateChange transition); static GstStateChangeReturn gst_element_change_state_func (GstElement * element, GstStateChange transition); -static GstStateChangeReturn gst_element_change_state_func (GstElement * element, - GstStateChange transition); static GstStateChangeReturn gst_element_get_state_func (GstElement * element, GstState * state, GstState * pending, GstClockTime timeout); +static GstStateChangeReturn gst_element_set_state_func (GstElement * element, + GstState state); static void gst_element_set_bus_func (GstElement * element, GstBus * bus); #ifndef GST_DISABLE_LOADSAVE @@ -213,6 +213,7 @@ gst_element_class_init (GstElementClass * klass) #endif klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func); + klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func); klass->get_state = GST_DEBUG_FUNCPTR (gst_element_get_state_func); klass->set_bus = GST_DEBUG_FUNCPTR (gst_element_set_bus_func); klass->numpadtemplates = 0; @@ -1929,6 +1930,26 @@ gst_element_lost_state (GstElement * element) */ GstStateChangeReturn gst_element_set_state (GstElement * element, GstState state) +{ + GstElementClass *oclass; + GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE; + + g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE); + + oclass = GST_ELEMENT_GET_CLASS (element); + + if (oclass->set_state) + result = (oclass->set_state) (element, state); + + return result; +} + +/** + * default set state function, calculates the next state based + * on current state and calls the change_state function + */ +static GstStateChangeReturn +gst_element_set_state_func (GstElement * element, GstState state) { GstState current, next, old_pending; GstStateChangeReturn ret; @@ -2017,7 +2038,6 @@ was_busy: return GST_STATE_CHANGE_ASYNC; } - } /* with STATE_LOCK */ diff --git a/gst/gstelement.h b/gst/gstelement.h index b93493dc29..416b22dee1 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -296,6 +296,7 @@ struct _GstElement /* element state */ GStaticRecMutex *state_lock; GCond *state_cond; + guint32 state_cookie; GstState current_state; GstState next_state; GstState pending_state; @@ -355,6 +356,7 @@ struct _GstElementClass /* state changes */ GstStateChangeReturn (*get_state) (GstElement * element, GstState * state, GstState * pending, GstClockTime timeout); + GstStateChangeReturn (*set_state) (GstElement *element, GstState state); GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition); /* bus */