gst/gstelement.c: Handle INFO messages from the GST_ELEMENT_INFO macro as well.

Original commit message from CVS:
* gst/gstelement.c: (gst_element_message_full),
(gst_element_set_locked_state), (gst_element_get_state_func),
(gst_element_change_state):
Handle INFO messages from the GST_ELEMENT_INFO macro as well.
Documentation updates.
Small code cleanups.
* gst/gstmessage.c: (gst_message_new_info),
(gst_message_parse_info):
* gst/gstmessage.h:
API: gst_message_new_info()
API: gst_message_parse_info()
Add INFO message create and parse code.
This commit is contained in:
Wim Taymans 2007-02-28 16:40:02 +00:00
parent 05cf4d83c3
commit 31be175723
4 changed files with 122 additions and 27 deletions

View file

@ -1,3 +1,19 @@
2007-02-28 Wim Taymans <wim@fluendo.com>
* gst/gstelement.c: (gst_element_message_full),
(gst_element_set_locked_state), (gst_element_get_state_func),
(gst_element_change_state):
Handle INFO messages from the GST_ELEMENT_INFO macro as well.
Documentation updates.
Small code cleanups.
* gst/gstmessage.c: (gst_message_new_info),
(gst_message_parse_info):
* gst/gstmessage.h:
API: gst_message_new_info()
API: gst_message_parse_info()
Add INFO message create and parse code.
2007-02-28 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (bin_query_min_max_init), (bin_query_latency_fold),

View file

@ -1556,7 +1556,7 @@ void gst_element_message_full
GST_DEBUG_OBJECT (element, "start");
g_return_if_fail (GST_IS_ELEMENT (element));
g_return_if_fail ((type == GST_MESSAGE_ERROR) ||
(type == GST_MESSAGE_WARNING));
(type == GST_MESSAGE_WARNING) || (type == GST_MESSAGE_INFO));
/* check if we send the given text or the default error text */
if ((text == NULL) || (text[0] == 0)) {
@ -1587,14 +1587,22 @@ void gst_element_message_full
sent_text);
gerror = g_error_new_literal (domain, code, sent_text);
if (type == GST_MESSAGE_ERROR) {
message =
gst_message_new_error (GST_OBJECT_CAST (element), gerror, sent_debug);
} else if (type == GST_MESSAGE_WARNING) {
message = gst_message_new_warning (GST_OBJECT_CAST (element), gerror,
sent_debug);
} else {
g_assert_not_reached ();
switch (type) {
case GST_MESSAGE_ERROR:
message =
gst_message_new_error (GST_OBJECT_CAST (element), gerror, sent_debug);
break;
case GST_MESSAGE_WARNING:
message = gst_message_new_warning (GST_OBJECT_CAST (element), gerror,
sent_debug);
break;
case GST_MESSAGE_INFO:
message = gst_message_new_info (GST_OBJECT_CAST (element), gerror,
sent_debug);
break;
default:
g_assert_not_reached ();
break;
}
gst_element_post_message (element, message);
@ -1645,7 +1653,7 @@ gst_element_is_locked_state (GstElement * element)
*
* MT safe.
*
* Returns: TRUE if the state was changed, FALSE if bad parameterss were given
* Returns: TRUE if the state was changed, FALSE if bad parameters were given
* or the elements state-locking needed no change.
*/
gboolean
@ -1675,11 +1683,13 @@ gst_element_set_locked_state (GstElement * element, gboolean locked_state)
return TRUE;
was_ok:
GST_CAT_DEBUG (GST_CAT_STATES, "elements %s was in locked state %d",
GST_ELEMENT_NAME (element), old);
GST_OBJECT_UNLOCK (element);
{
GST_CAT_DEBUG (GST_CAT_STATES, "elements %s was in locked state %d",
GST_ELEMENT_NAME (element), old);
GST_OBJECT_UNLOCK (element);
return FALSE;
return FALSE;
}
}
/**
@ -1741,10 +1751,13 @@ gst_element_get_state_func (GstElement * element,
GstStateChangeReturn ret = GST_STATE_CHANGE_FAILURE;
GstState old_pending;
GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "getting state");
GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "getting state, timeout %"
GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
GST_OBJECT_LOCK (element);
ret = GST_STATE_RETURN (element);
GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "RETURN is %s",
gst_element_state_change_return_get_name (ret));
/* we got an error, report immediatly */
if (ret == GST_STATE_CHANGE_FAILURE)
@ -1860,13 +1873,12 @@ interrupted:
*
* This function returns %GST_STATE_CHANGE_NO_PREROLL if the element
* successfully changed its state but is not able to provide data yet.
* This mostly
* happens for live sources that only produce data in the PLAYING state.
* While the state change return is equivalent to %GST_STATE_CHANGE_SUCCESS, it
* is returned to the application to signal that some sink elements might not
* be able to complete their state change because an element is not producing
* data to complete the preroll. When setting the element to playing,
* the preroll will complete and playback will start.
* This mostly happens for live sources that only produce data in the PLAYING
* state. While the state change return is equivalent to
* %GST_STATE_CHANGE_SUCCESS, it is returned to the application to signal that
* some sink elements might not be able to complete their state change because
* an element is not producing data to complete the preroll. When setting the
* element to playing, the preroll will complete and playback will start.
*
* Returns: %GST_STATE_CHANGE_SUCCESS if the element has no more pending state
* and the last state change succeeded, %GST_STATE_CHANGE_ASYNC if the
@ -1955,13 +1967,13 @@ nothing_aborted:
* by elements that do asynchronous state changes.
* The core will normally call this method automatically when an
* element returned %GST_STATE_CHANGE_SUCCESS from the state change function.
* Elements that return %GST_STATE_CHANGE_ASYNC from the change_state function
* should eventually call this method from the streaming thread to signal
* successfull state change completion.
*
*
* If after calling this method the element still has not reached
* the pending state, the next state change is performed.
*
* This method is used internally and should normally not be called by plugins
* or applications.
*
* Returns: The result of the commit state change.
*
* MT safe.
@ -2067,7 +2079,8 @@ complete:
* This function can only be called when the element is currently
* not in error or an async state change.
*
* This function can only be called with the STATE_LOCK held.
* This function is used internally and should normally not be called from
* plugins or applications.
*
* MT safe.
*/
@ -2336,6 +2349,7 @@ invalid_return:
g_critical ("%s: unknown return value %d from a state change function",
GST_ELEMENT_NAME (element), ret);
/* we are in error now */
ret = GST_STATE_CHANGE_FAILURE;
GST_STATE_RETURN (element) = ret;
GST_OBJECT_UNLOCK (element);

View file

@ -373,6 +373,33 @@ gst_message_new_warning (GstObject * src, GError * error, gchar * debug)
return message;
}
/**
* gst_message_new_info:
* @src: The object originating the message.
* @error: The GError for this message.
* @debug: A debugging string for something or other.
*
* Create a new info message. The message will make copies of @error and
* @debug.
*
* Returns: The new info message.
*
* Since: 0.10.12
*
* MT safe.
*/
GstMessage *
gst_message_new_info (GstObject * src, GError * error, gchar * debug)
{
GstMessage *message;
message = gst_message_new_custom (GST_MESSAGE_INFO, src,
gst_structure_new ("GstMessageInfo", "gerror", GST_TYPE_G_ERROR, error,
"debug", G_TYPE_STRING, debug, NULL));
return message;
}
/**
* gst_message_new_tag:
* @src: The object originating the message.
@ -962,6 +989,42 @@ gst_message_parse_warning (GstMessage * message, GError ** gerror,
*debug = g_strdup (gst_structure_get_string (message->structure, "debug"));
}
/**
* gst_message_parse_info:
* @message: A valid #GstMessage of type GST_MESSAGE_INFO.
* @gerror: Location for the GError
* @debug: Location for the debug message, or NULL
*
* Extracts the GError and debug string from the GstMessage. The values returned
* in the output arguments are copies; the caller must free them when done.
*
* MT safe.
*
* Since: 0.10.12
*/
void
gst_message_parse_info (GstMessage * message, GError ** gerror, gchar ** debug)
{
const GValue *error_gvalue;
GError *error_val;
g_return_if_fail (GST_IS_MESSAGE (message));
g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_INFO);
error_gvalue = gst_structure_get_value (message->structure, "gerror");
g_return_if_fail (error_gvalue != NULL);
g_return_if_fail (G_VALUE_TYPE (error_gvalue) == GST_TYPE_G_ERROR);
error_val = (GError *) g_value_get_boxed (error_gvalue);
if (error_val)
*gerror = g_error_copy (error_val);
else
*gerror = NULL;
if (debug)
*debug = g_strdup (gst_structure_get_string (message->structure, "debug"));
}
/**
* gst_message_parse_segment_start:
* @message: A valid #GstMessage of type GST_MESSAGE_SEGMENT_START.

View file

@ -249,6 +249,7 @@ gst_message_ref (GstMessage * msg)
GstMessage * gst_message_new_eos (GstObject * src);
GstMessage * gst_message_new_error (GstObject * src, GError * error, gchar * debug);
GstMessage * gst_message_new_warning (GstObject * src, GError * error, gchar * debug);
GstMessage * gst_message_new_info (GstObject * src, GError * error, gchar * debug);
GstMessage * gst_message_new_tag (GstObject * src, GstTagList * tag_list);
GstMessage * gst_message_new_buffering (GstObject * src, gint percent);
GstMessage * gst_message_new_state_changed (GstObject * src, GstState oldstate,
@ -269,6 +270,7 @@ GstMessage * gst_message_new_custom (GstMessageType type,
void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);
void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
void gst_message_parse_info (GstMessage *message, GError **gerror, gchar **debug);
void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
void gst_message_parse_buffering (GstMessage *message, gint *percent);
void gst_message_parse_state_changed (GstMessage *message, GstState *oldstate,