X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstmessage.c;h=9a790d381b49a725fe22e41a350f416429feb517;hb=e10266e3f3cf9b05b69198b1ac6faa9a62840e30;hp=91881bb08cfc72cdfbf98c9e0602a42221cc03fc;hpb=2d7f9cfe92de5fe8faa767d9261d3adb55c7f5e2;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstmessage.c b/gst/gstmessage.c index 91881bb..9a790d3 100644 --- a/gst/gstmessage.c +++ b/gst/gstmessage.c @@ -15,8 +15,8 @@ * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. */ /** @@ -32,20 +32,14 @@ * * Messages are posted by objects in the pipeline and are passed to the * application using the #GstBus. - - * The basic use pattern of posting a message on a #GstBus is as follows: * - * - * Posting a #GstMessage - * - * gst_bus_post (bus, gst_message_new_eos()); - * - * + * The basic use pattern of posting a message on a #GstBus is as follows: + * |[ + * gst_bus_post (bus, gst_message_new_eos()); + * ]| * * A #GstElement usually posts messages on the bus provided by the parent * container using gst_element_post_message(). - * - * Last reviewed on 2005-11-09 (0.9.4) */ @@ -67,7 +61,7 @@ typedef struct GstStructure *structure; } GstMessageImpl; -#define GST_MESSAGE_STRUCTURE(m) (((GstMessageImpl *)(m))->structure) +#define GST_MESSAGE_STRUCTURE(m) (((GstMessageImpl *)(m))->structure) typedef struct { @@ -96,7 +90,7 @@ static GstMessageQuarks message_quarks[] = { {GST_MESSAGE_ELEMENT, "element", 0}, {GST_MESSAGE_SEGMENT_START, "segment-start", 0}, {GST_MESSAGE_SEGMENT_DONE, "segment-done", 0}, - {GST_MESSAGE_DURATION, "duration", 0}, + {GST_MESSAGE_DURATION_CHANGED, "duration-changed", 0}, {GST_MESSAGE_LATENCY, "latency", 0}, {GST_MESSAGE_ASYNC_START, "async-start", 0}, {GST_MESSAGE_ASYNC_DONE, "async-done", 0}, @@ -104,6 +98,13 @@ static GstMessageQuarks message_quarks[] = { {GST_MESSAGE_STEP_START, "step-start", 0}, {GST_MESSAGE_QOS, "qos", 0}, {GST_MESSAGE_PROGRESS, "progress", 0}, + {GST_MESSAGE_TOC, "toc", 0}, + {GST_MESSAGE_RESET_TIME, "reset-time", 0}, + {GST_MESSAGE_STREAM_START, "stream-start", 0}, + {GST_MESSAGE_NEED_CONTEXT, "need-context", 0}, + {GST_MESSAGE_HAVE_CONTEXT, "have-context", 0}, + {GST_MESSAGE_DEVICE_ADDED, "device-added", 0}, + {GST_MESSAGE_DEVICE_REMOVED, "device-removed", 0}, {0, NULL, 0} }; @@ -185,7 +186,7 @@ _gst_message_free (GstMessage * message) GST_MESSAGE_SRC (message) = NULL; } - if (message->lock) { + if (message->lock.p) { GST_MESSAGE_LOCK (message); GST_MESSAGE_SIGNAL (message); GST_MESSAGE_UNLOCK (message); @@ -197,9 +198,13 @@ _gst_message_free (GstMessage * message) gst_structure_free (structure); } - g_slice_free1 (GST_MINI_OBJECT_SIZE (message), message); + g_slice_free1 (sizeof (GstMessageImpl), message); } +static void +gst_message_init (GstMessageImpl * message, GstMessageType type, + GstObject * src); + static GstMessage * _gst_message_copy (GstMessage * message) { @@ -212,34 +217,41 @@ _gst_message_copy (GstMessage * message) copy = g_slice_new0 (GstMessageImpl); - gst_mini_object_init (GST_MINI_OBJECT_CAST (copy), - _gst_message_type, sizeof (GstMessageImpl)); - - copy->message.mini_object.copy = - (GstMiniObjectCopyFunction) _gst_message_copy; - copy->message.mini_object.free = - (GstMiniObjectFreeFunction) _gst_message_free; + gst_message_init (copy, GST_MESSAGE_TYPE (message), + GST_MESSAGE_SRC (message)); - GST_MESSAGE_TYPE (copy) = GST_MESSAGE_TYPE (message); GST_MESSAGE_TIMESTAMP (copy) = GST_MESSAGE_TIMESTAMP (message); GST_MESSAGE_SEQNUM (copy) = GST_MESSAGE_SEQNUM (message); - if (GST_MESSAGE_SRC (message)) { - GST_MESSAGE_SRC (copy) = gst_object_ref (GST_MESSAGE_SRC (message)); - } - - GST_MESSAGE_GET_LOCK (copy) = GST_MESSAGE_GET_LOCK (message); - GST_MESSAGE_COND (copy) = GST_MESSAGE_COND (message); structure = GST_MESSAGE_STRUCTURE (message); if (structure) { - copy->structure = gst_structure_copy (structure); - gst_structure_set_parent_refcount (copy->structure, + GST_MESSAGE_STRUCTURE (copy) = gst_structure_copy (structure); + gst_structure_set_parent_refcount (GST_MESSAGE_STRUCTURE (copy), ©->message.mini_object.refcount); + } else { + GST_MESSAGE_STRUCTURE (copy) = NULL; } return GST_MESSAGE_CAST (copy); } +static void +gst_message_init (GstMessageImpl * message, GstMessageType type, + GstObject * src) +{ + gst_mini_object_init (GST_MINI_OBJECT_CAST (message), 0, _gst_message_type, + (GstMiniObjectCopyFunction) _gst_message_copy, NULL, + (GstMiniObjectFreeFunction) _gst_message_free); + + GST_MESSAGE_TYPE (message) = type; + if (src) + gst_object_ref (src); + GST_MESSAGE_SRC (message) = src; + GST_MESSAGE_TIMESTAMP (message) = GST_CLOCK_TIME_NONE; + GST_MESSAGE_SEQNUM (message) = gst_util_seqnum_next (); +} + + /** * gst_message_new_custom: * @type: The #GstMessageType to distinguish messages @@ -249,7 +261,7 @@ _gst_message_copy (GstMessage * message) * * Create a new custom-typed message. This can be used for anything not * handled by other message-specific functions to pass a message to the - * app. The structure field can be NULL. + * app. The structure field can be %NULL. * * Returns: (transfer full): The new message. * @@ -263,32 +275,29 @@ gst_message_new_custom (GstMessageType type, GstObject * src, message = g_slice_new0 (GstMessageImpl); - gst_mini_object_init (GST_MINI_OBJECT_CAST (message), - _gst_message_type, sizeof (GstMessageImpl)); - - message->message.mini_object.copy = - (GstMiniObjectCopyFunction) _gst_message_copy; - message->message.mini_object.free = - (GstMiniObjectFreeFunction) _gst_message_free; - GST_CAT_LOG (GST_CAT_MESSAGE, "source %s: creating new message %p %s", (src ? GST_OBJECT_NAME (src) : "NULL"), message, gst_message_type_get_name (type)); - GST_MESSAGE_TYPE (message) = type; - if (src) - gst_object_ref (src); - GST_MESSAGE_SRC (message) = src; - GST_MESSAGE_TIMESTAMP (message) = GST_CLOCK_TIME_NONE; - GST_MESSAGE_SEQNUM (message) = gst_util_seqnum_next (); - if (structure) { - gst_structure_set_parent_refcount (structure, - &message->message.mini_object.refcount); + /* structure must not have a parent */ + if (!gst_structure_set_parent_refcount (structure, + &message->message.mini_object.refcount)) + goto had_parent; } - message->structure = structure; + gst_message_init (message, type, src); + + GST_MESSAGE_STRUCTURE (message) = structure; return GST_MESSAGE_CAST (message); + + /* ERRORS */ +had_parent: + { + g_slice_free1 (sizeof (GstMessageImpl), message); + g_warning ("structure is already owned by another object"); + return NULL; + } } /** @@ -311,8 +320,6 @@ gst_message_new_custom (GstMessageType type, GstObject * src, * Returns: The message's sequence number. * * MT safe. - * - * Since: 0.10.22 */ guint32 gst_message_get_seqnum (GstMessage * message) @@ -334,8 +341,6 @@ gst_message_get_seqnum (GstMessage * message) * for more information. * * MT safe. - * - * Since: 0.10.22 */ void gst_message_set_seqnum (GstMessage * message, guint32 seqnum) @@ -375,7 +380,7 @@ gst_message_new_eos (GstObject * src) * * Create a new error message. The message will copy @error and * @debug. This message is posted by element when a fatal event - * occured. The pipeline will probably (partially) stop. The application + * occurred. The pipeline will probably (partially) stop. The application * receiving this message should stop the pipeline. * * Returns: (transfer full): the new error message. @@ -389,7 +394,7 @@ gst_message_new_error (GstObject * src, GError * error, const gchar * debug) GstStructure *structure; structure = gst_structure_new_id (GST_QUARK (MESSAGE_ERROR), - GST_QUARK (GERROR), GST_TYPE_G_ERROR, error, + GST_QUARK (GERROR), G_TYPE_ERROR, error, GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); message = gst_message_new_custom (GST_MESSAGE_ERROR, src, structure); @@ -416,7 +421,7 @@ gst_message_new_warning (GstObject * src, GError * error, const gchar * debug) GstStructure *structure; structure = gst_structure_new_id (GST_QUARK (MESSAGE_WARNING), - GST_QUARK (GERROR), GST_TYPE_G_ERROR, error, + GST_QUARK (GERROR), G_TYPE_ERROR, error, GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); message = gst_message_new_custom (GST_MESSAGE_WARNING, src, structure); @@ -435,8 +440,6 @@ gst_message_new_warning (GstObject * src, GError * error, const gchar * debug) * MT safe. * * Returns: (transfer full): the new info message. - * - * Since: 0.10.12 */ GstMessage * gst_message_new_info (GstObject * src, GError * error, const gchar * debug) @@ -445,7 +448,7 @@ gst_message_new_info (GstObject * src, GError * error, const gchar * debug) GstStructure *structure; structure = gst_structure_new_id (GST_QUARK (MESSAGE_INFO), - GST_QUARK (GERROR), GST_TYPE_G_ERROR, error, + GST_QUARK (GERROR), G_TYPE_ERROR, error, GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); message = gst_message_new_custom (GST_MESSAGE_INFO, src, structure); @@ -467,13 +470,17 @@ gst_message_new_info (GstObject * src, GError * error, const gchar * debug) GstMessage * gst_message_new_tag (GstObject * src, GstTagList * tag_list) { + GstStructure *s; GstMessage *message; + GValue val = G_VALUE_INIT; - g_return_val_if_fail (GST_IS_STRUCTURE (tag_list), NULL); - - message = - gst_message_new_custom (GST_MESSAGE_TAG, src, (GstStructure *) tag_list); + g_return_val_if_fail (GST_IS_TAG_LIST (tag_list), NULL); + s = gst_structure_new_id_empty (GST_QUARK (MESSAGE_TAG)); + g_value_init (&val, GST_TYPE_TAG_LIST); + g_value_take_boxed (&val, tag_list); + gst_structure_id_take_value (s, GST_QUARK (TAGLIST), &val); + message = gst_message_new_custom (GST_MESSAGE_TAG, src, s); return message; } @@ -491,29 +498,29 @@ gst_message_new_tag (GstObject * src, GstTagList * tag_list) * The application must be prepared to receive BUFFERING messages in the * PREROLLING state and may only set the pipeline to PLAYING after receiving a * message with @percent set to 100, which can happen after the pipeline - * completed prerolling. + * completed prerolling. * * MT safe. * * Returns: (transfer full): The new buffering message. - * - * Since: 0.10.11 */ GstMessage * gst_message_new_buffering (GstObject * src, gint percent) { GstMessage *message; GstStructure *structure; + gint64 buffering_left; g_return_val_if_fail (percent >= 0 && percent <= 100, NULL); + buffering_left = (percent == 100 ? 0 : -1); + structure = gst_structure_new_id (GST_QUARK (MESSAGE_BUFFERING), GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent, GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM, GST_QUARK (AVG_IN_RATE), G_TYPE_INT, -1, GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, -1, - GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, G_GINT64_CONSTANT (-1), - GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL); + GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, buffering_left, NULL); message = gst_message_new_custom (GST_MESSAGE_BUFFERING, src, structure); return message; @@ -540,7 +547,7 @@ gst_message_new_state_changed (GstObject * src, GstMessage *message; GstStructure *structure; - structure = gst_structure_new_id (GST_QUARK (MESSAGE_STATE), + structure = gst_structure_new_id (GST_QUARK (MESSAGE_STATE_CHANGED), GST_QUARK (OLD_STATE), GST_TYPE_STATE, (gint) oldstate, GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) newstate, GST_QUARK (PENDING_STATE), GST_TYPE_STATE, (gint) pending, NULL); @@ -575,7 +582,7 @@ gst_message_new_state_dirty (GstObject * src) * gst_message_new_clock_provide: * @src: (transfer none): the object originating the message. * @clock: (transfer none): the clock it provides - * @ready: TRUE if the sender can provide a clock + * @ready: %TRUE if the sender can provide a clock * * Create a clock provide message. This message is posted whenever an * element is ready to provide a clock or lost its ability to provide @@ -638,7 +645,7 @@ gst_message_new_clock_lost (GstObject * src, GstClock * clock) * @clock: (transfer none): the new selected clock * * Create a new clock message. This message is posted whenever the - * pipeline selectes a new clock for the pipeline. + * pipeline selects a new clock for the pipeline. * * Returns: (transfer full): The new new clock message. * @@ -673,8 +680,6 @@ gst_message_new_new_clock (GstObject * src, GstClock * clock) * Returns: (transfer full): the new structure change message. * * MT safe. - * - * Since: 0.10.22. */ GstMessage * gst_message_new_structure_change (GstObject * src, GstStructureChangeType type, @@ -786,7 +791,7 @@ gst_message_new_application (GstObject * src, GstStructure * structure) * Create a new element-specific message. This is meant as a generic way of * allowing one-way communication from an element to an application, for example * "the firewire cable was unplugged". The format of the message should be - * documented in the element's documentation. The structure field can be NULL. + * documented in the element's documentation. The structure field can be %NULL. * * Returns: (transfer full): The new element message. * @@ -799,33 +804,28 @@ gst_message_new_element (GstObject * src, GstStructure * structure) } /** - * gst_message_new_duration: + * gst_message_new_duration_changed: * @src: (transfer none): The object originating the message. - * @format: The format of the duration - * @duration: The new duration * - * Create a new duration message. This message is posted by elements that - * know the duration of a stream in a specific format. This message + * Create a new duration changed message. This message is posted by elements + * that know the duration of a stream when the duration changes. This message * is received by bins and is used to calculate the total duration of a * pipeline. Elements may post a duration message with a duration of * GST_CLOCK_TIME_NONE to indicate that the duration has changed and the * cached duration should be discarded. The new duration can then be * retrieved via a query. * - * Returns: (transfer full): The new duration message. + * Returns: (transfer full): The new duration-changed message. * * MT safe. */ GstMessage * -gst_message_new_duration (GstObject * src, GstFormat format, gint64 duration) +gst_message_new_duration_changed (GstObject * src) { GstMessage *message; - GstStructure *structure; - structure = gst_structure_new_id (GST_QUARK (MESSAGE_DURATION), - GST_QUARK (FORMAT), GST_TYPE_FORMAT, format, - GST_QUARK (DURATION), G_TYPE_INT64, duration, NULL); - message = gst_message_new_custom (GST_MESSAGE_DURATION, src, structure); + message = gst_message_new_custom (GST_MESSAGE_DURATION_CHANGED, src, + gst_structure_new_id_empty (GST_QUARK (MESSAGE_DURATION_CHANGED))); return message; } @@ -853,24 +853,26 @@ gst_message_new_async_start (GstObject * src) /** * gst_message_new_async_done: * @src: (transfer none): The object originating the message. - * @reset_time: if the running_time should be reset + * @running_time: the desired running_time * * The message is posted when elements completed an ASYNC state change. - * @reset_time is set to TRUE when the element requests a new running_time - * before going to PLAYING. + * @running_time contains the time of the desired running_time when this + * elements goes to PLAYING. A value of #GST_CLOCK_TIME_NONE for @running_time + * means that the element has no clock interaction and thus doesn't care about + * the running_time of the pipeline. * * Returns: (transfer full): The new async_done message. * * MT safe. */ GstMessage * -gst_message_new_async_done (GstObject * src, gboolean reset_time) +gst_message_new_async_done (GstObject * src, GstClockTime running_time) { GstMessage *message; GstStructure *structure; structure = gst_structure_new_id (GST_QUARK (MESSAGE_ASYNC_DONE), - GST_QUARK (RESET_TIME), G_TYPE_BOOLEAN, reset_time, NULL); + GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time, NULL); message = gst_message_new_custom (GST_MESSAGE_ASYNC_DONE, src, structure); return message; @@ -886,8 +888,6 @@ gst_message_new_async_done (GstObject * src, gboolean reset_time) * Returns: (transfer full): The new latency message. * * MT safe. - * - * Since: 0.10.12 */ GstMessage * gst_message_new_latency (GstObject * src) @@ -908,11 +908,9 @@ gst_message_new_latency (GstObject * src) * changed. A typical use case would be an audio server that wants to pause the * pipeline because a higher priority stream is being played. * - * Returns: (transfer full): the new requst state message. + * Returns: (transfer full): the new request state message. * * MT safe. - * - * Since: 0.10.23 */ GstMessage * gst_message_new_request_state (GstObject * src, GstState state) @@ -956,8 +954,6 @@ gst_message_get_structure (GstMessage * message) * check the name of a custom message. * * Returns: %TRUE if @name matches the name of the message structure. - * - * Since: 0.10.20 */ gboolean gst_message_has_name (GstMessage * message, const gchar * name) @@ -991,7 +987,7 @@ gst_message_has_name (GstMessage * message, const gchar * name) * gst_message_parse_tag (msg, &tags); * g_print ("Got tags from element %s\n", GST_OBJECT_NAME (msg->src)); * handle_tags (tags); - * gst_tag_list_free (tags); + * gst_tag_list_unref (tags); * break; * } * ... @@ -1004,16 +1000,12 @@ gst_message_has_name (GstMessage * message, const gchar * name) void gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list) { - GstStructure *ret; - g_return_if_fail (GST_IS_MESSAGE (message)); g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG); g_return_if_fail (tag_list != NULL); - ret = gst_structure_copy (GST_MESSAGE_STRUCTURE (message)); - gst_structure_remove_field (ret, "source-pad"); - - *tag_list = (GstTagList *) ret; + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (TAGLIST), GST_TYPE_TAG_LIST, tag_list, NULL); } /** @@ -1025,8 +1017,6 @@ gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list) * gst_message_new_buffering(). * * MT safe. - * - * Since: 0.10.11 */ void gst_message_parse_buffering (GstMessage * message, gint * percent) @@ -1049,8 +1039,6 @@ gst_message_parse_buffering (GstMessage * message, gint * percent) * @buffering_left: amount of buffering time left in milliseconds * * Configures the buffering stats values in @message. - * - * Since: 0.10.20 */ void gst_message_set_buffering_stats (GstMessage * message, GstBufferingMode mode, @@ -1068,15 +1056,13 @@ gst_message_set_buffering_stats (GstMessage * message, GstBufferingMode mode, /** * gst_message_parse_buffering_stats: * @message: A valid #GstMessage of type GST_MESSAGE_BUFFERING. - * @mode: (out) (allow-none): a buffering mode, or NULL - * @avg_in: (out) (allow-none): the average input rate, or NULL - * @avg_out: (out) (allow-none): the average output rate, or NULL + * @mode: (out) (allow-none): a buffering mode, or %NULL + * @avg_in: (out) (allow-none): the average input rate, or %NULL + * @avg_out: (out) (allow-none): the average output rate, or %NULL * @buffering_left: (out) (allow-none): amount of buffering time left in - * milliseconds, or NULL + * milliseconds, or %NULL * * Extracts the buffering stats values from @message. - * - * Since: 0.10.20 */ void gst_message_parse_buffering_stats (GstMessage * message, @@ -1107,9 +1093,9 @@ gst_message_parse_buffering_stats (GstMessage * message, /** * gst_message_parse_state_changed: * @message: a valid #GstMessage of type GST_MESSAGE_STATE_CHANGED - * @oldstate: (out) (allow-none): the previous state, or NULL - * @newstate: (out) (allow-none): the new (current) state, or NULL - * @pending: (out) (allow-none): the pending (target) state, or NULL + * @oldstate: (out) (allow-none): the previous state, or %NULL + * @newstate: (out) (allow-none): the new (current) state, or %NULL + * @pending: (out) (allow-none): the pending (target) state, or %NULL * * Extracts the old and new states from the GstMessage. * @@ -1162,8 +1148,8 @@ gst_message_parse_state_changed (GstMessage * message, * gst_message_parse_clock_provide: * @message: A valid #GstMessage of type GST_MESSAGE_CLOCK_PROVIDE. * @clock: (out) (allow-none) (transfer none): a pointer to hold a clock - * object, or NULL - * @ready: (out) (allow-none): a pointer to hold the ready flag, or NULL + * object, or %NULL + * @ready: (out) (allow-none): a pointer to hold the ready flag, or %NULL * * Extracts the clock and ready flag from the GstMessage. * The clock object returned remains valid until the message is freed. @@ -1262,8 +1248,6 @@ gst_message_parse_new_clock (GstMessage * message, GstClock ** clock) * Extracts the change type and completion status from the GstMessage. * * MT safe. - * - * Since: 0.10.22 */ void gst_message_parse_structure_change (GstMessage * message, @@ -1297,7 +1281,7 @@ gst_message_parse_structure_change (GstMessage * message, * @message: A valid #GstMessage of type GST_MESSAGE_ERROR. * @gerror: (out) (allow-none) (transfer full): location for the GError * @debug: (out) (allow-none) (transfer full): location for the debug message, - * or NULL + * 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. @@ -1328,28 +1312,12 @@ gst_message_parse_structure_change (GstMessage * message, void gst_message_parse_error (GstMessage * message, GError ** gerror, gchar ** debug) { - const GValue *error_gvalue; - GError *error_val; - GstStructure *structure; - g_return_if_fail (GST_IS_MESSAGE (message)); g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR); - structure = GST_MESSAGE_STRUCTURE (message); - error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (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_value_dup_string (gst_structure_id_get_value (structure, - GST_QUARK (DEBUG))); + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (GERROR), G_TYPE_ERROR, gerror, + GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); } /** @@ -1357,7 +1325,7 @@ gst_message_parse_error (GstMessage * message, GError ** gerror, gchar ** debug) * @message: A valid #GstMessage of type GST_MESSAGE_WARNING. * @gerror: (out) (allow-none) (transfer full): location for the GError * @debug: (out) (allow-none) (transfer full): location for the debug message, - * or NULL + * 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. @@ -1368,28 +1336,12 @@ void gst_message_parse_warning (GstMessage * message, GError ** gerror, gchar ** debug) { - const GValue *error_gvalue; - GError *error_val; - GstStructure *structure; - g_return_if_fail (GST_IS_MESSAGE (message)); g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_WARNING); - structure = GST_MESSAGE_STRUCTURE (message); - error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (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_value_dup_string (gst_structure_id_get_value (structure, - GST_QUARK (DEBUG))); + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (GERROR), G_TYPE_ERROR, gerror, + GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); } /** @@ -1397,47 +1349,29 @@ gst_message_parse_warning (GstMessage * message, GError ** gerror, * @message: A valid #GstMessage of type GST_MESSAGE_INFO. * @gerror: (out) (allow-none) (transfer full): location for the GError * @debug: (out) (allow-none) (transfer full): location for the debug message, - * or NULL + * 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; - GstStructure *structure; - g_return_if_fail (GST_IS_MESSAGE (message)); g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_INFO); - structure = GST_MESSAGE_STRUCTURE (message); - error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (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_value_dup_string (gst_structure_id_get_value (structure, - GST_QUARK (DEBUG))); + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (GERROR), G_TYPE_ERROR, gerror, + GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL); } /** * gst_message_parse_segment_start: * @message: A valid #GstMessage of type GST_MESSAGE_SEGMENT_START. - * @format: (out): Result location for the format, or NULL - * @position: (out): Result location for the position, or NULL + * @format: (out) (allow-none): Result location for the format, or %NULL + * @position: (out) (allow-none): Result location for the position, or %NULL * * Extracts the position and format from the segment start message. * @@ -1466,10 +1400,10 @@ gst_message_parse_segment_start (GstMessage * message, GstFormat * format, /** * gst_message_parse_segment_done: * @message: A valid #GstMessage of type GST_MESSAGE_SEGMENT_DONE. - * @format: (out): Result location for the format, or NULL - * @position: (out): Result location for the position, or NULL + * @format: (out) (allow-none): Result location for the format, or %NULL + * @position: (out) (allow-none): Result location for the position, or %NULL * - * Extracts the position and format from the segment start message. + * Extracts the position and format from the segment done message. * * MT safe. */ @@ -1494,49 +1428,16 @@ gst_message_parse_segment_done (GstMessage * message, GstFormat * format, } /** - * gst_message_parse_duration: - * @message: A valid #GstMessage of type GST_MESSAGE_DURATION. - * @format: (out): Result location for the format, or NULL - * @duration: (out): Result location for the duration, or NULL - * - * Extracts the duration and format from the duration message. The duration - * might be GST_CLOCK_TIME_NONE, which indicates that the duration has - * changed. Applications should always use a query to retrieve the duration - * of a pipeline. - * - * MT safe. - */ -void -gst_message_parse_duration (GstMessage * message, GstFormat * format, - gint64 * duration) -{ - GstStructure *structure; - - g_return_if_fail (GST_IS_MESSAGE (message)); - g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_DURATION); - - structure = GST_MESSAGE_STRUCTURE (message); - if (format) - *format = (GstFormat) - g_value_get_enum (gst_structure_id_get_value (structure, - GST_QUARK (FORMAT))); - if (duration) - *duration = - g_value_get_int64 (gst_structure_id_get_value (structure, - GST_QUARK (DURATION))); -} - -/** * gst_message_parse_async_done: * @message: A valid #GstMessage of type GST_MESSAGE_ASYNC_DONE. - * @reset_time: (out): Result location for the reset_time or NULL + * @running_time: (out) (allow-none): Result location for the running_time or %NULL * - * Extract the reset_time from the async_done message. + * Extract the running_time from the async_done message. * * MT safe. */ void -gst_message_parse_async_done (GstMessage * message, gboolean * reset_time) +gst_message_parse_async_done (GstMessage * message, GstClockTime * running_time) { GstStructure *structure; @@ -1544,22 +1445,20 @@ gst_message_parse_async_done (GstMessage * message, gboolean * reset_time) g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ASYNC_DONE); structure = GST_MESSAGE_STRUCTURE (message); - if (reset_time) - *reset_time = - g_value_get_boolean (gst_structure_id_get_value (structure, - GST_QUARK (RESET_TIME))); + if (running_time) + *running_time = + g_value_get_uint64 (gst_structure_id_get_value (structure, + GST_QUARK (RUNNING_TIME))); } /** * gst_message_parse_request_state: * @message: A valid #GstMessage of type GST_MESSAGE_REQUEST_STATE. - * @state: (out): Result location for the requested state or NULL + * @state: (out) (allow-none): Result location for the requested state or %NULL * * Extract the requested state from the request_state message. * * MT safe. - * - * Since: 0.10.23 */ void gst_message_parse_request_state (GstMessage * message, GstState * state) @@ -1588,8 +1487,6 @@ gst_message_parse_request_state (GstMessage * message, GstState * state) * Returns: (transfer full): the new stream status message. * * MT safe. - * - * Since: 0.10.24. */ GstMessage * gst_message_new_stream_status (GstObject * src, GstStreamStatusType type, @@ -1617,8 +1514,6 @@ gst_message_new_stream_status (GstObject * src, GstStreamStatusType type, * should thus not be unreffed. * * MT safe. - * - * Since: 0.10.24. */ void gst_message_parse_stream_status (GstMessage * message, @@ -1649,8 +1544,6 @@ gst_message_parse_stream_status (GstMessage * message, * * Configures the object handling the streaming thread. This is usually a * GstTask object but other objects might be added in the future. - * - * Since: 0.10.24 */ void gst_message_set_stream_status_object (GstMessage * message, @@ -1674,8 +1567,6 @@ gst_message_set_stream_status_object (GstMessage * message, * Returns: a GValue containing the object that manages the streaming thread. * This object is usually of type GstTask but other types can be added in the * future. The object remains valid as long as @message is valid. - * - * Since: 0.10.24 */ const GValue * gst_message_get_stream_status_object (GstMessage * message) @@ -1705,7 +1596,7 @@ gst_message_get_stream_status_object (GstMessage * message) * @eos: the step caused EOS * * This message is posted by elements when they complete a part, when @intermediate set - * to TRUE, or a complete step operation. + * to %TRUE, or a complete step operation. * * @duration will contain the amount of time (in GST_FORMAT_TIME) of the stepped * @amount of media in format @format. @@ -1713,8 +1604,6 @@ gst_message_get_stream_status_object (GstMessage * message) * Returns: (transfer full): the new step_done message. * * MT safe. - * - * Since: 0.10.24 */ GstMessage * gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount, @@ -1751,8 +1640,6 @@ gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount, * Extract the values the step_done message. * * MT safe. - * - * Since: 0.10.24 */ void gst_message_parse_step_done (GstMessage * message, GstFormat * format, @@ -1788,19 +1675,17 @@ gst_message_parse_step_done (GstMessage * message, GstFormat * format, * This message is posted by elements when they accept or activate a new step * event for @amount in @format. * - * @active is set to FALSE when the element accepted the new step event and has + * @active is set to %FALSE when the element accepted the new step event and has * queued it for execution in the streaming threads. * - * @active is set to TRUE when the element has activated the step operation and + * @active is set to %TRUE when the element has activated the step operation and * is now ready to start executing the step in the streaming thread. After this - * message is emited, the application can queue a new step operation in the + * message is emitted, the application can queue a new step operation in the * element. * * Returns: (transfer full): The new step_start message. * * MT safe. - * - * Since: 0.10.24 */ GstMessage * gst_message_new_step_start (GstObject * src, gboolean active, GstFormat format, @@ -1834,8 +1719,6 @@ gst_message_new_step_start (GstObject * src, gboolean active, GstFormat format, * Extract the values from step_start message. * * MT safe. - * - * Since: 0.10.24 */ void gst_message_parse_step_start (GstMessage * message, gboolean * active, @@ -1883,8 +1766,6 @@ gst_message_parse_step_start (GstMessage * message, gboolean * active, * Returns: (transfer full): The new qos message. * * MT safe. - * - * Since: 0.10.29 */ GstMessage * gst_message_new_qos (GstObject * src, gboolean live, guint64 running_time, @@ -1922,8 +1803,6 @@ gst_message_new_qos (GstObject * src, gboolean live, guint64 running_time, * Set the QoS values that have been calculated/analysed from the QoS data * * MT safe. - * - * Since: 0.10.29 */ void gst_message_set_qos_values (GstMessage * message, gint64 jitter, @@ -1959,8 +1838,6 @@ gst_message_set_qos_values (GstMessage * message, gint64 jitter, * invalid. Values of -1 for either @processed or @dropped mean unknown values. * * MT safe. - * - * Since: 0.10.29 */ void gst_message_set_qos_stats (GstMessage * message, GstFormat format, @@ -1998,8 +1875,6 @@ gst_message_set_qos_stats (GstMessage * message, GstFormat format, * values. * * MT safe. - * - * Since: 0.10.29 */ void gst_message_parse_qos (GstMessage * message, gboolean * live, @@ -2034,8 +1909,6 @@ gst_message_parse_qos (GstMessage * message, gboolean * live, * Extract the QoS values that have been calculated/analysed from the QoS data * * MT safe. - * - * Since: 0.10.29 */ void gst_message_parse_qos_values (GstMessage * message, gint64 * jitter, @@ -2072,8 +1945,6 @@ gst_message_parse_qos_values (GstMessage * message, gint64 * jitter, * invalid. Values of -1 for either @processed or @dropped mean unknown values. * * MT safe. - * - * Since: 0.10.29 */ void gst_message_parse_qos_stats (GstMessage * message, GstFormat * format, @@ -2105,8 +1976,6 @@ gst_message_parse_qos_stats (GstMessage * message, GstFormat * format, * @test should contain a user visible string detailing the current action. * * Returns: (transfer full): The new qos message. - * - * Since: 0.10.33 */ GstMessage * gst_message_new_progress (GstObject * src, GstProgressType type, @@ -2141,8 +2010,6 @@ gst_message_new_progress (GstObject * src, GstProgressType type, * @text: (out) (allow-none) (transfer full): location for the text * * Parses the progress @type, @code and @text. - * - * Since: 0.10.33 */ void gst_message_parse_progress (GstMessage * message, GstProgressType * type, @@ -2159,3 +2026,408 @@ gst_message_parse_progress (GstMessage * message, GstProgressType * type, GST_QUARK (CODE), G_TYPE_STRING, code, GST_QUARK (TEXT), G_TYPE_STRING, text, NULL); } + +/** + * gst_message_new_toc: + * @src: the object originating the message. + * @toc: (transfer none): #GstToc structure for the message. + * @updated: whether TOC was updated or not. + * + * Create a new TOC message. The message is posted by elements + * that discovered or updated a TOC. + * + * Returns: (transfer full): a new TOC message. + * + * MT safe. + */ +GstMessage * +gst_message_new_toc (GstObject * src, GstToc * toc, gboolean updated) +{ + GstStructure *toc_struct; + + g_return_val_if_fail (toc != NULL, NULL); + + toc_struct = gst_structure_new_id (GST_QUARK (MESSAGE_TOC), + GST_QUARK (TOC), GST_TYPE_TOC, toc, + GST_QUARK (UPDATED), G_TYPE_BOOLEAN, updated, NULL); + + return gst_message_new_custom (GST_MESSAGE_TOC, src, toc_struct); +} + +/** + * gst_message_parse_toc: + * @message: a valid #GstMessage of type GST_MESSAGE_TOC. + * @toc: (out) (transfer full): return location for the TOC. + * @updated: (out): return location for the updated flag. + * + * Extract the TOC from the #GstMessage. The TOC returned in the + * output argument is a copy; the caller must free it with + * gst_toc_unref() when done. + * + * MT safe. + */ +void +gst_message_parse_toc (GstMessage * message, GstToc ** toc, gboolean * updated) +{ + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TOC); + g_return_if_fail (toc != NULL); + + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (TOC), GST_TYPE_TOC, toc, + GST_QUARK (UPDATED), G_TYPE_BOOLEAN, updated, NULL); +} + +/** + * gst_message_new_reset_time: + * @src: (transfer none): The object originating the message. + * @running_time: the requested running-time + * + * This message is posted when the pipeline running-time should be reset to + * @running_time, like after a flushing seek. + * + * Returns: (transfer full): The new reset_time message. + * + * MT safe. + */ +GstMessage * +gst_message_new_reset_time (GstObject * src, GstClockTime running_time) +{ + GstMessage *message; + GstStructure *structure; + + structure = gst_structure_new_id (GST_QUARK (MESSAGE_RESET_TIME), + GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time, NULL); + message = gst_message_new_custom (GST_MESSAGE_RESET_TIME, src, structure); + + return message; +} + +/** + * gst_message_parse_reset_time: + * @message: A valid #GstMessage of type GST_MESSAGE_RESET_TIME. + * @running_time: (out) (allow-none): Result location for the running_time or + * %NULL + * + * Extract the running-time from the RESET_TIME message. + * + * MT safe. + */ +void +gst_message_parse_reset_time (GstMessage * message, GstClockTime * running_time) +{ + GstStructure *structure; + + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_RESET_TIME); + + structure = GST_MESSAGE_STRUCTURE (message); + if (running_time) + *running_time = + g_value_get_uint64 (gst_structure_id_get_value (structure, + GST_QUARK (RUNNING_TIME))); +} + +/** + * gst_message_new_stream_start: + * @src: (transfer none): The object originating the message. + * + * Create a new stream_start message. This message is generated and posted in + * the sink elements of a GstBin. The bin will only forward the STREAM_START + * message to the application if all sinks have posted an STREAM_START message. + * + * Returns: (transfer full): The new stream_start message. + * + * MT safe. + */ +GstMessage * +gst_message_new_stream_start (GstObject * src) +{ + GstMessage *message; + GstStructure *s; + + s = gst_structure_new_id_empty (GST_QUARK (MESSAGE_STREAM_START)); + message = gst_message_new_custom (GST_MESSAGE_STREAM_START, src, s); + + return message; +} + + +/** + * gst_message_set_group_id: + * @message: the message + * @group_id: the group id + * + * Sets the group id on the stream-start message. + * + * All streams that have the same group id are supposed to be played + * together, i.e. all streams inside a container file should have the + * same group id but different stream ids. The group id should change + * each time the stream is started, resulting in different group ids + * each time a file is played for example. + * + * MT safe. + * + * Since: 1.2 + */ +void +gst_message_set_group_id (GstMessage * message, guint group_id) +{ + GstStructure *structure; + + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_START); + g_return_if_fail (gst_message_is_writable (message)); + + structure = GST_MESSAGE_STRUCTURE (message); + gst_structure_id_set (structure, GST_QUARK (GROUP_ID), G_TYPE_UINT, group_id, + NULL); +} + +/** + * gst_message_parse_group_id: + * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_START. + * @group_id: (out) (allow-none): Result location for the group id or + * %NULL + * + * Extract the group from the STREAM_START message. + * + * Returns: %TRUE if the message had a group id set, %FALSE otherwise + * + * MT safe. + * + * Since: 1.2 + */ +gboolean +gst_message_parse_group_id (GstMessage * message, guint * group_id) +{ + GstStructure *structure; + const GValue *v; + + g_return_val_if_fail (GST_IS_MESSAGE (message), FALSE); + g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_START, + FALSE); + + if (!group_id) + return TRUE; + + structure = GST_MESSAGE_STRUCTURE (message); + + v = gst_structure_id_get_value (structure, GST_QUARK (GROUP_ID)); + if (!v) + return FALSE; + + *group_id = g_value_get_uint (v); + return TRUE; +} + +/** + * gst_message_new_need_context: + * @src: (transfer none): The object originating the message. + * @context_type: The context type that is needed + * + * This message is posted when an element needs a specific #GstContext. + * + * Returns: (transfer full): The new need-context message. + * + * MT safe. + * + * Since: 1.2 + */ +GstMessage * +gst_message_new_need_context (GstObject * src, const gchar * context_type) +{ + GstMessage *message; + GstStructure *structure; + + g_return_val_if_fail (context_type != NULL, NULL); + + structure = gst_structure_new_id (GST_QUARK (MESSAGE_NEED_CONTEXT), + GST_QUARK (CONTEXT_TYPE), G_TYPE_STRING, context_type, NULL); + message = gst_message_new_custom (GST_MESSAGE_NEED_CONTEXT, src, structure); + + return message; +} + +/** + * gst_message_parse_context_type: + * @message: a GST_MESSAGE_NEED_CONTEXT type message + * @context_type: (out) (allow-none): the context type, or %NULL + * + * Parse a context type from an existing GST_MESSAGE_NEED_CONTEXT message. + * + * Returns: a #gboolean indicating if the parsing succeeded. + * + * Since: 1.2 + */ +gboolean +gst_message_parse_context_type (GstMessage * message, + const gchar ** context_type) +{ + GstStructure *structure; + const GValue *value; + + g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_NEED_CONTEXT, + FALSE); + + structure = GST_MESSAGE_STRUCTURE (message); + + if (context_type) { + value = gst_structure_id_get_value (structure, GST_QUARK (CONTEXT_TYPE)); + *context_type = g_value_get_string (value); + } + + return TRUE; +} + +/** + * gst_message_new_have_context: + * @src: (transfer none): The object originating the message. + * @context: (transfer full): the context + * + * This message is posted when an element has a new local #GstContext. + * + * Returns: (transfer full): The new have-context message. + * + * MT safe. + * + * Since: 1.2 + */ +GstMessage * +gst_message_new_have_context (GstObject * src, GstContext * context) +{ + GstMessage *message; + GstStructure *structure; + + structure = gst_structure_new_id (GST_QUARK (MESSAGE_HAVE_CONTEXT), + GST_QUARK (CONTEXT), GST_TYPE_CONTEXT, context, NULL); + message = gst_message_new_custom (GST_MESSAGE_HAVE_CONTEXT, src, structure); + gst_context_unref (context); + + return message; +} + +/** + * gst_message_parse_have_context: + * @message: A valid #GstMessage of type GST_MESSAGE_HAVE_CONTEXT. + * @context: (out) (transfer full) (allow-none): Result location for the + * context or %NULL + * + * Extract the context from the HAVE_CONTEXT message. + * + * MT safe. + * + * Since: 1.2 + */ +void +gst_message_parse_have_context (GstMessage * message, GstContext ** context) +{ + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_HAVE_CONTEXT); + + if (context) + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (CONTEXT), GST_TYPE_CONTEXT, context, NULL); +} + +/** + * gst_message_new_device_added: + * @src: The #GstObject that created the message + * @device: (transfer none): The new #GstDevice + * + * Creates a new device-added message. The device-added message is produced by + * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the appearance + * of monitored devices. + * + * Returns: a newly allocated #GstMessage + * + * Since: 1.4 + */ +GstMessage * +gst_message_new_device_added (GstObject * src, GstDevice * device) +{ + GstMessage *message; + GstStructure *structure; + + g_return_val_if_fail (device != NULL, NULL); + g_return_val_if_fail (GST_IS_DEVICE (device), NULL); + + structure = gst_structure_new_id (GST_QUARK (MESSAGE_DEVICE_ADDED), + GST_QUARK (DEVICE), GST_TYPE_DEVICE, device, NULL); + message = gst_message_new_custom (GST_MESSAGE_DEVICE_ADDED, src, structure); + + return message; +} + +/** + * gst_message_parse_device_added: + * @device: (out) (allow-none) (transfer none): A location where to store a + * pointer to the new #GstDevice, or %NULL + * + * Parses a device-added message. The device-added message is produced by + * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the appearance + * of monitored devices. + * + * Since: 1.4 + */ +void +gst_message_parse_device_added (GstMessage * message, GstDevice ** device) +{ + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_DEVICE_ADDED); + + if (device) + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (DEVICE), GST_TYPE_DEVICE, device, NULL); +} + +/** + * gst_message_new_device_removed: + * @src: The #GstObject that created the message + * @device: (transfer none): The removed #GstDevice + * + * Creates a new device-removed message. The device-removed message is produced + * by #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the + * disappearance of monitored devices. + * + * Returns: a newly allocated #GstMessage + * + * Since: 1.4 + */ +GstMessage * +gst_message_new_device_removed (GstObject * src, GstDevice * device) +{ + GstMessage *message; + GstStructure *structure; + + g_return_val_if_fail (device != NULL, NULL); + g_return_val_if_fail (GST_IS_DEVICE (device), NULL); + + structure = gst_structure_new_id (GST_QUARK (MESSAGE_DEVICE_REMOVED), + GST_QUARK (DEVICE), GST_TYPE_DEVICE, device, NULL); + message = gst_message_new_custom (GST_MESSAGE_DEVICE_REMOVED, src, structure); + + return message; +} + +/** + * gst_message_parse_device_removed: + * @device: (out) (allow-none) (transfer none): A location where to store a + * pointer to the removed #GstDevice, or %NULL + * + * Parses a device-removed message. The device-removed message is produced by + * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the + * disappearance of monitored devices. + * + * Since: 1.4 + */ +void +gst_message_parse_device_removed (GstMessage * message, GstDevice ** device) +{ + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_DEVICE_REMOVED); + + if (device) + gst_structure_id_get (GST_MESSAGE_STRUCTURE (message), + GST_QUARK (DEVICE), GST_TYPE_DEVICE, device, NULL); +}