2005-10-18 Wim Taymans <wim@fluendo.com>
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_get_state_func),
+ (gst_bin_recalc_func):
+ * gst/gstelement.c: (gst_element_set_clock),
+ (gst_element_abort_state), (gst_element_lost_state):
+ Cleanups, prepare for state change fixes.
+
+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):
static void gst_bin_restore_thyself (GstObject * object, xmlNodePtr self);
#endif
+static void gst_bin_recalc_func (GstBin * child, gpointer data);
static gint bin_element_is_sink (GstElement * child, GstBin * bin);
/* Bin signals and properties */
GObjectClass *gobject_class;
GstObjectClass *gstobject_class;
GstElementClass *gstelement_class;
+ GError *err;
gobject_class = (GObjectClass *) klass;
gstobject_class = (GstObjectClass *) klass;
klass->add_element = GST_DEBUG_FUNCPTR (gst_bin_add_func);
klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func);
+
+ GST_DEBUG ("creating bin thread pool");
+ err = NULL;
+ klass->pool =
+ g_thread_pool_new ((GFunc) gst_bin_recalc_func, NULL, 1, FALSE, &err);
+ if (err != NULL) {
+ g_critical ("could alloc threadpool %s", err->message);
+ }
}
static void
GstState * pending, GstClockTime timeout)
{
GstBin *bin = GST_BIN (element);
+ GstStateChangeReturn ret;
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "getting state");
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "getting state");
/* do a non forced recalculation of the state */
gst_bin_recalc_state (bin, FALSE);
- return parent_class->get_state (element, state, pending, timeout);
+ ret = parent_class->get_state (element, state, pending, timeout);
+
+ return ret;
}
static void
return res;
}
+static void
+gst_bin_recalc_func (GstBin * bin, gpointer data)
+{
+ GST_DEBUG_OBJECT (bin, "doing state recalc");
+ GST_STATE_LOCK (bin);
+ gst_bin_recalc_state (bin, FALSE);
+ GST_STATE_UNLOCK (bin);
+ GST_DEBUG_OBJECT (bin, "state recalc done");
+ gst_object_unref (bin);
+}
+
static GstBusSyncReply
bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin)
{
oclass = GST_ELEMENT_GET_CLASS (element);
+ GST_DEBUG_OBJECT (element, "setting clock %p", clock);
+
if (oclass->set_clock)
oclass->set_clock (element, clock);
{
GstState pending;
+#ifndef GST_DISABLE_GST_DEBUG
+ GstState old_state;
+#endif
g_return_if_fail (GST_IS_ELEMENT (element));
pending = GST_STATE_PENDING (element);
- if (pending != GST_STATE_VOID_PENDING &&
- GST_STATE_RETURN (element) != GST_STATE_CHANGE_FAILURE) {
+ if (pending == GST_STATE_VOID_PENDING ||
+ GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
+ goto nothing_aborted;
+
#ifndef GST_DISABLE_GST_DEBUG
- GstState old_state = GST_STATE (element);
+ old_state = GST_STATE (element);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "aborting state from %s to %s", gst_element_state_get_name (old_state),
+ gst_element_state_get_name (pending));
#endif
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
- "aborting state from %s to %s", gst_element_state_get_name (old_state),
- gst_element_state_get_name (pending));
- /* flag error */
- GST_STATE_RETURN (element) = GST_STATE_CHANGE_FAILURE;
+ /* flag error */
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_FAILURE;
+
+ GST_STATE_BROADCAST (element);
+
+ return;
- GST_STATE_BROADCAST (element);
+nothing_aborted:
+ {
+ return;
}
}
void
gst_element_lost_state (GstElement * element)
{
+ GstState current_state;
+ GstMessage *message;
+
g_return_if_fail (GST_IS_ELEMENT (element));
- if (GST_STATE_PENDING (element) == GST_STATE_VOID_PENDING &&
- GST_STATE_RETURN (element) != GST_STATE_CHANGE_FAILURE) {
- GstState current_state;
- GstMessage *message;
+ if (GST_STATE_PENDING (element) != GST_STATE_VOID_PENDING ||
+ GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
+ goto nothing_lost;
- current_state = GST_STATE (element);
+ current_state = GST_STATE (element);
- GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
- "lost state of %s", gst_element_state_get_name (current_state));
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "lost state of %s", gst_element_state_get_name (current_state));
- GST_STATE_NEXT (element) = current_state;
- GST_STATE_PENDING (element) = current_state;
- GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
+ GST_STATE_NEXT (element) = current_state;
+ GST_STATE_PENDING (element) = current_state;
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
- message = gst_message_new_state_changed (GST_OBJECT (element),
- FALSE, current_state, current_state, current_state);
- gst_element_post_message (element, message);
+ message = gst_message_new_state_changed (GST_OBJECT (element),
+ FALSE, current_state, current_state, current_state);
+ gst_element_post_message (element, message);
+
+ return;
+
+nothing_lost:
+ {
+ return;
}
}