mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
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:
parent
20c719ae81
commit
65ef6ed5a4
2 changed files with 29 additions and 16 deletions
|
@ -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),
|
||||||
|
|
36
gst/gstbin.c
36
gst/gstbin.c
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue