gst/gstbin.c: Enable latency for next release.

Original commit message from CVS:
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_get_state_func),
(gst_bin_continue_func):
Enable latency for next release.
Restore STATE_LOCK around recalc_state that was left out during the
rewrite and could result in racy behaviour when _get_state and
recalc_state are run concurrently. See #440463.
This commit is contained in:
Wim Taymans 2007-05-24 08:35:04 +00:00
parent 20c719ae81
commit 65ef6ed5a4
2 changed files with 29 additions and 16 deletions

View file

@ -1,3 +1,12 @@
2007-05-24 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_get_state_func),
(gst_bin_continue_func):
Enable latency for next release.
Restore STATE_LOCK around recalc_state that was left out during the
rewrite and could result in racy behaviour when _get_state and
recalc_state are run concurrently. See #440463.
2007-05-23 Wim Taymans <wim@fluendo.com> 2007-05-23 Wim Taymans <wim@fluendo.com>
* tests/check/gst/gstsystemclock.c: (store_callback), * tests/check/gst/gstsystemclock.c: (store_callback),

View file

@ -176,15 +176,11 @@
* their duration when it changes so we return inaccurate values. */ * their duration when it changes so we return inaccurate values. */
#undef DURATION_CACHING #undef DURATION_CACHING
/* latency is by default disabled for non CVS for now. /* latency is by default enabled now.
* live-preroll and no-live-preroll in the environment var GST_COMPAT * live-preroll and no-live-preroll in the environment var GST_COMPAT
* to enables or disable it respectively. * to enables or disable it respectively.
*/ */
#if GST_VERSION_NANO == 1
static gboolean enable_latency = TRUE; static gboolean enable_latency = TRUE;
#else
static gboolean enable_latency = FALSE;
#endif
GST_DEBUG_CATEGORY_STATIC (bin_debug); GST_DEBUG_CATEGORY_STATIC (bin_debug);
#define GST_CAT_DEFAULT bin_debug #define GST_CAT_DEFAULT bin_debug
@ -390,8 +386,7 @@ gst_bin_class_init (GstBinClass * klass)
* of its childs on its own. * of its childs on its own.
* *
* Since: 0.10.13 * Since: 0.10.13
**/ */
g_object_class_install_property (gobject_class, PROP_ASYNC_HANDLING, g_object_class_install_property (gobject_class, PROP_ASYNC_HANDLING,
g_param_spec_boolean ("async-handling", "Async Handling", g_param_spec_boolean ("async-handling", "Async Handling",
"The bin will handle Asynchronous state changes", "The bin will handle Asynchronous state changes",
@ -1603,7 +1598,9 @@ gst_bin_get_state_func (GstElement * element, GstState * state,
GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "getting state"); GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "getting state");
/* do a non forced recalculation of the state */ /* do a non forced recalculation of the state */
GST_STATE_LOCK (bin);
gst_bin_recalc_state (bin, FALSE); gst_bin_recalc_state (bin, FALSE);
GST_STATE_UNLOCK (bin);
ret = parent_class->get_state (element, state, pending, timeout); ret = parent_class->get_state (element, state, pending, timeout);
@ -2272,7 +2269,7 @@ gst_bin_continue_func (GstBin * bin, gpointer data)
GstState current, next, pending, target, old_state, old_next; GstState current, next, pending, target, old_state, old_next;
GstStateChangeReturn old_ret, ret; GstStateChangeReturn old_ret, ret;
GstStateChange transition; GstStateChange transition;
gboolean busy, post; gboolean post;
GST_DEBUG_OBJECT (bin, "waiting for state lock"); GST_DEBUG_OBJECT (bin, "waiting for state lock");
GST_STATE_LOCK (bin); GST_STATE_LOCK (bin);
@ -2282,7 +2279,6 @@ gst_bin_continue_func (GstBin * bin, gpointer data)
old_ret = GST_STATE_RETURN (bin); old_ret = GST_STATE_RETURN (bin);
GST_STATE_RETURN (bin) = GST_STATE_CHANGE_SUCCESS; GST_STATE_RETURN (bin) = GST_STATE_CHANGE_SUCCESS;
busy = (old_ret == GST_STATE_CHANGE_ASYNC);
target = GST_STATE_TARGET (bin); target = GST_STATE_TARGET (bin);
pending = GST_STATE_PENDING (bin); pending = GST_STATE_PENDING (bin);
@ -2294,8 +2290,8 @@ gst_bin_continue_func (GstBin * bin, gpointer data)
/* this is the state we should go to next */ /* this is the state we should go to next */
old_next = GST_STATE_NEXT (bin); old_next = GST_STATE_NEXT (bin);
GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "busy %d, target %s", GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "target %s",
busy, gst_element_state_get_name (target)); gst_element_state_get_name (target));
if (old_next == GST_STATE_PLAYING) { if (old_next == GST_STATE_PLAYING) {
post = FALSE; post = FALSE;
@ -2338,11 +2334,9 @@ gst_bin_continue_func (GstBin * bin, gpointer data)
old_state, old_next, pending)); old_state, old_next, pending));
} }
if (busy) { GST_DEBUG_OBJECT (bin, "posting ASYNC_DONE");
GST_DEBUG_OBJECT (bin, "posting ASYNC_DONE"); gst_element_post_message (GST_ELEMENT_CAST (bin),
gst_element_post_message (GST_ELEMENT_CAST (bin), gst_message_new_async_done (GST_OBJECT_CAST (bin)));
gst_message_new_async_done (GST_OBJECT_CAST (bin)));
}
GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
"continue state change %s to %s, final %s", "continue state change %s to %s, final %s",
@ -2362,6 +2356,11 @@ nothing_pending:
{ {
GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "nothing pending"); GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "nothing pending");
GST_OBJECT_UNLOCK (bin); GST_OBJECT_UNLOCK (bin);
GST_DEBUG_OBJECT (bin, "posting ASYNC_DONE");
gst_element_post_message (GST_ELEMENT_CAST (bin),
gst_message_new_async_done (GST_OBJECT_CAST (bin)));
goto done; goto done;
} }
complete: complete:
@ -2380,6 +2379,11 @@ complete:
* We do signal the cond though as a _get_state() might be blocking * We do signal the cond though as a _get_state() might be blocking
* on it. */ * on it. */
if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) { if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) {
GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
"changed %s to %s, VOID pending",
gst_element_state_get_name (old_state),
gst_element_state_get_name (old_next));
gst_element_post_message (GST_ELEMENT_CAST (bin), gst_element_post_message (GST_ELEMENT_CAST (bin),
gst_message_new_state_changed (GST_OBJECT_CAST (bin), gst_message_new_state_changed (GST_OBJECT_CAST (bin),
old_state, old_next, GST_STATE_VOID_PENDING)); old_state, old_next, GST_STATE_VOID_PENDING));