gst/gstbin.c: Fix typos, add comments.

Original commit message from CVS:
* gst/gstbin.c: (is_eos), (update_degree), (gst_bin_change_state),
(gst_bin_dispose), (bin_bus_handler):
Fix typos, add comments.
Clear EOS list when going to PAUSED from any direction and do it
in a threadsafe way.
Get base time in a threadsafe way too.
Fix confusing debug in the change_state function.
Various other mall cleanups.

* gst/gstelement.c: (gst_element_post_message):
Fix very verbose bus posting code.

* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_set_property), (gst_pipeline_get_property),
(gst_pipeline_change_state):
Small ARG_ -> PROP_ cleanup
This commit is contained in:
Wim Taymans 2005-10-08 18:01:04 +00:00
parent 3988477b17
commit ae25867a05
4 changed files with 69 additions and 43 deletions

View file

@ -1,3 +1,22 @@
2005-10-08 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (is_eos), (update_degree), (gst_bin_change_state),
(gst_bin_dispose), (bin_bus_handler):
Fix typos, add comments.
Clear EOS list when going to PAUSED from any direction and do it
in a threadsafe way.
Get base time in a threadsafe way too.
Fix confusing debug in the change_state function.
Various other mall cleanups.
* gst/gstelement.c: (gst_element_post_message):
Fix very verbose bus posting code.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_set_property), (gst_pipeline_get_property),
(gst_pipeline_change_state):
Small ARG_ -> PROP_ cleanup
2005-10-08 Wim Taymans <wim@fluendo.com> 2005-10-08 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (is_eos), (bin_bus_handler): * gst/gstbin.c: (is_eos), (bin_bus_handler):

View file

@ -1133,7 +1133,7 @@ update_degree (GstElement * element, GstBinSortIterator * bit)
gboolean linked = FALSE; gboolean linked = FALSE;
GST_LOCK (element); GST_LOCK (element);
/* don't touch degree is element has no sourcepads */ /* don't touch degree if element has no sourcepads */
if (element->numsinkpads != 0) { if (element->numsinkpads != 0) {
/* loop over all sinkpads, decrement degree for all connected /* loop over all sinkpads, decrement degree for all connected
* elements in this bin */ * elements in this bin */
@ -1147,6 +1147,7 @@ update_degree (GstElement * element, GstBinSortIterator * bit)
if ((peer_element = gst_pad_get_parent_element (peer))) { if ((peer_element = gst_pad_get_parent_element (peer))) {
GST_LOCK (peer_element); GST_LOCK (peer_element);
/* check that we don't go outside of this bin */
if (GST_OBJECT_CAST (peer_element)->parent == if (GST_OBJECT_CAST (peer_element)->parent ==
GST_OBJECT_CAST (bit->bin)) { GST_OBJECT_CAST (bit->bin)) {
gint old_deg, new_deg; gint old_deg, new_deg;
@ -1175,7 +1176,8 @@ update_degree (GstElement * element, GstBinSortIterator * bit)
} }
} }
if (!linked) { if (!linked) {
GST_DEBUG ("element %s not linked to anything", GST_ELEMENT_NAME (element)); GST_DEBUG ("element %s not linked on any sinkpads",
GST_ELEMENT_NAME (element));
} }
GST_UNLOCK (element); GST_UNLOCK (element);
} }
@ -1357,10 +1359,13 @@ gst_bin_change_state (GstElement * element, GstStateChange transition)
bin = GST_BIN_CAST (element); bin = GST_BIN_CAST (element);
/* Clear eosed element list on READY-> PAUSED */ /* Clear eosed element list on -> PAUSED */
if (transition == GST_STATE_CHANGE_READY_TO_PAUSED) { if (transition == GST_STATE_CHANGE_READY_TO_PAUSED ||
transition == GST_STATE_CHANGE_PLAYING_TO_PAUSED) {
GST_LOCK (bin);
g_list_free (bin->eosed); g_list_free (bin->eosed);
bin->eosed = NULL; bin->eosed = NULL;
GST_UNLOCK (bin);
} }
/* iterate in state change order */ /* iterate in state change order */
@ -1368,7 +1373,7 @@ gst_bin_change_state (GstElement * element, GstStateChange transition)
restart: restart:
/* take base time */ /* take base time */
base_time = element->base_time; base_time = gst_element_get_base_time (element);
have_async = FALSE; have_async = FALSE;
have_no_preroll = FALSE; have_no_preroll = FALSE;
@ -1380,40 +1385,40 @@ restart:
switch (gst_iterator_next (it, &data)) { switch (gst_iterator_next (it, &data)) {
case GST_ITERATOR_OK: case GST_ITERATOR_OK:
{ {
GstElement *element; GstElement *child;
element = GST_ELEMENT_CAST (data); child = GST_ELEMENT_CAST (data);
/* set base time on element */ /* set base time on element */
gst_element_set_base_time (element, base_time); gst_element_set_base_time (child, base_time);
/* set state now */ /* set state now */
ret = gst_bin_element_set_state (bin, element, pending); ret = gst_bin_element_set_state (bin, child, pending);
switch (ret) { switch (ret) {
case GST_STATE_CHANGE_SUCCESS: case GST_STATE_CHANGE_SUCCESS:
GST_CAT_DEBUG (GST_CAT_STATES, GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
"child '%s' changed state to %d(%s) successfully", "child '%s' changed state to %d(%s) successfully",
GST_ELEMENT_NAME (element), pending, GST_ELEMENT_NAME (child), pending,
gst_element_state_get_name (pending)); gst_element_state_get_name (pending));
break; break;
case GST_STATE_CHANGE_ASYNC: case GST_STATE_CHANGE_ASYNC:
GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
"child '%s' is changing state asynchronously", "child '%s' is changing state asynchronously",
GST_ELEMENT_NAME (element)); GST_ELEMENT_NAME (child));
have_async = TRUE; have_async = TRUE;
break; break;
case GST_STATE_CHANGE_FAILURE: case GST_STATE_CHANGE_FAILURE:
GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
"child '%s' failed to go to state %d(%s)", "child '%s' failed to go to state %d(%s)",
GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (child),
pending, gst_element_state_get_name (pending)); pending, gst_element_state_get_name (pending));
gst_object_unref (element); gst_object_unref (child);
goto done; goto done;
case GST_STATE_CHANGE_NO_PREROLL: case GST_STATE_CHANGE_NO_PREROLL:
GST_CAT_DEBUG (GST_CAT_STATES, GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
"child '%s' changed state to %d(%s) successfully without preroll", "child '%s' changed state to %d(%s) successfully without preroll",
GST_ELEMENT_NAME (element), pending, GST_ELEMENT_NAME (child), pending,
gst_element_state_get_name (pending)); gst_element_state_get_name (pending));
have_no_preroll = TRUE; have_no_preroll = TRUE;
break; break;
@ -1421,7 +1426,7 @@ restart:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
} }
gst_object_unref (element); gst_object_unref (child);
break; break;
} }
case GST_ITERATOR_RESYNC: case GST_ITERATOR_RESYNC:
@ -1446,14 +1451,14 @@ restart:
} }
done: done:
gst_iterator_free (it);
GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
"done changing bin's state from %s to %s, now in %s, ret %d", "done changing bin's state from %s to %s, now in %s, ret %d",
gst_element_state_get_name (old_state), gst_element_state_get_name (old_state),
gst_element_state_get_name (pending), gst_element_state_get_name (pending),
gst_element_state_get_name (GST_STATE (element)), ret); gst_element_state_get_name (GST_STATE (element)), ret);
gst_iterator_free (it);
return ret; return ret;
} }
@ -1470,7 +1475,7 @@ gst_bin_dispose (GObject * object)
bin->child_bus = NULL; bin->child_bus = NULL;
while (bin->children) { while (bin->children) {
gst_bin_remove (bin, GST_ELEMENT (bin->children->data)); gst_bin_remove (bin, GST_ELEMENT_CAST (bin->children->data));
} }
if (G_UNLIKELY (bin->children != NULL)) { if (G_UNLIKELY (bin->children != NULL)) {
g_critical ("could not remove elements from bin %s", g_critical ("could not remove elements from bin %s",
@ -1547,16 +1552,16 @@ bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin)
g_free (name); g_free (name);
/* collect all eos messages from the children */ /* collect all eos messages from the children */
GST_LOCK (bin->child_bus); GST_LOCK (bin);
bin->eosed = g_list_prepend (bin->eosed, src); bin->eosed = g_list_prepend (bin->eosed, src);
eos = is_eos (bin); eos = is_eos (bin);
GST_UNLOCK (bin->child_bus); GST_UNLOCK (bin);
/* if we are completely EOS, we forward an EOS message */ /* if we are completely EOS, we forward an EOS message */
if (eos) { if (eos) {
GST_DEBUG_OBJECT (bin, "all sinks posted EOS"); GST_DEBUG_OBJECT (bin, "all sinks posted EOS");
gst_element_post_message (GST_ELEMENT (bin), gst_element_post_message (GST_ELEMENT_CAST (bin),
gst_message_new_eos (GST_OBJECT (bin))); gst_message_new_eos (GST_OBJECT_CAST (bin)));
} }
} else { } else {
GST_DEBUG_OBJECT (bin, "got EOS message from (NULL), not processing"); GST_DEBUG_OBJECT (bin, "got EOS message from (NULL), not processing");
@ -1568,7 +1573,7 @@ bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin)
default: default:
/* Send all other messages upward */ /* Send all other messages upward */
GST_DEBUG_OBJECT (bin, "posting message upward"); GST_DEBUG_OBJECT (bin, "posting message upward");
gst_element_post_message (GST_ELEMENT (bin), message); gst_element_post_message (GST_ELEMENT_CAST (bin), message);
break; break;
} }

View file

@ -1347,28 +1347,30 @@ gst_element_post_message (GstElement * element, GstMessage * message)
GstBus *bus; GstBus *bus;
gboolean result = FALSE; gboolean result = FALSE;
GST_DEBUG ("posting message %p ...", message);
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (message != NULL, FALSE); g_return_val_if_fail (message != NULL, FALSE);
GST_LOCK (element); GST_LOCK (element);
bus = element->bus; bus = element->bus;
if (G_UNLIKELY (bus == NULL)) { if (G_UNLIKELY (bus == NULL))
GST_DEBUG ("... but I won't because I have no bus"); goto no_bus;
GST_UNLOCK (element);
gst_message_unref (message);
return FALSE;
}
gst_object_ref (bus); gst_object_ref (bus);
GST_DEBUG ("... on bus %" GST_PTR_FORMAT, bus);
GST_UNLOCK (element); GST_UNLOCK (element);
result = gst_bus_post (bus, message); result = gst_bus_post (bus, message);
gst_object_unref (bus); gst_object_unref (bus);
return result; return result;
no_bus:
{
GST_DEBUG ("not posting message %p: no bus", message);
GST_UNLOCK (element);
gst_message_unref (message);
return FALSE;
}
} }
/** /**

View file

@ -57,9 +57,9 @@ enum
#define DEFAULT_PLAY_TIMEOUT (2*GST_SECOND) #define DEFAULT_PLAY_TIMEOUT (2*GST_SECOND)
enum enum
{ {
ARG_0, PROP_0,
ARG_DELAY, PROP_DELAY,
ARG_PLAY_TIMEOUT, PROP_PLAY_TIMEOUT,
/* FILL ME */ /* FILL ME */
}; };
@ -130,12 +130,12 @@ gst_pipeline_class_init (gpointer g_class, gpointer class_data)
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_pipeline_set_property); gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_pipeline_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_pipeline_get_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_pipeline_get_property);
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELAY, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELAY,
g_param_spec_uint64 ("delay", "Delay", g_param_spec_uint64 ("delay", "Delay",
"Expected delay needed for elements " "Expected delay needed for elements "
"to spin up to PLAYING in nanoseconds", 0, G_MAXUINT64, DEFAULT_DELAY, "to spin up to PLAYING in nanoseconds", 0, G_MAXUINT64, DEFAULT_DELAY,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PLAY_TIMEOUT, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PLAY_TIMEOUT,
g_param_spec_uint64 ("play-timeout", "Play Timeout", g_param_spec_uint64 ("play-timeout", "Play Timeout",
"Max timeout for going to PLAYING in nanoseconds", 0, G_MAXUINT64, "Max timeout for going to PLAYING in nanoseconds", 0, G_MAXUINT64,
DEFAULT_PLAY_TIMEOUT, G_PARAM_READWRITE)); DEFAULT_PLAY_TIMEOUT, G_PARAM_READWRITE));
@ -183,10 +183,10 @@ gst_pipeline_set_property (GObject * object, guint prop_id,
GST_LOCK (pipeline); GST_LOCK (pipeline);
switch (prop_id) { switch (prop_id) {
case ARG_DELAY: case PROP_DELAY:
pipeline->delay = g_value_get_uint64 (value); pipeline->delay = g_value_get_uint64 (value);
break; break;
case ARG_PLAY_TIMEOUT: case PROP_PLAY_TIMEOUT:
pipeline->play_timeout = g_value_get_uint64 (value); pipeline->play_timeout = g_value_get_uint64 (value);
break; break;
default: default:
@ -204,10 +204,10 @@ gst_pipeline_get_property (GObject * object, guint prop_id,
GST_LOCK (pipeline); GST_LOCK (pipeline);
switch (prop_id) { switch (prop_id) {
case ARG_DELAY: case PROP_DELAY:
g_value_set_uint64 (value, pipeline->delay); g_value_set_uint64 (value, pipeline->delay);
break; break;
case ARG_PLAY_TIMEOUT: case PROP_PLAY_TIMEOUT:
g_value_set_uint64 (value, pipeline->play_timeout); g_value_set_uint64 (value, pipeline->play_timeout);
break; break;
default: default: