2005-10-18 Wim Taymans <wim@fluendo.com>
+ * 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 <wim@fluendo.com>
+
* check/gst/gstbin.c: (GST_START_TEST):
* check/gst/gstmessage.c: (GST_START_TEST):
* check/gst/gstpipeline.c: (GST_START_TEST), (message_received):
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
#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;
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;
GstStateChange transition;
return GST_STATE_CHANGE_ASYNC;
}
-
}
/* with STATE_LOCK */
/* element state */
GStaticRecMutex *state_lock;
GCond *state_cond;
+ guint32 state_cookie;
GstState current_state;
GstState next_state;
GstState pending_state;
/* 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 */