+ 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) (allow-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) (allow-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) (allow-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) (transfer none) (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) (allow-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
+ * #GstDeviceProvider or a #GstDeviceMonitor. 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:
+ * @message: a #GstMessage of type %GST_MESSAGE_DEVICE_ADDED
+ * @device: (out) (allow-none) (transfer full): 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
+ * #GstDeviceProvider or a #GstDeviceMonitor. 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 #GstDeviceProvider or a #GstDeviceMonitor. 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:
+ * @message: a #GstMessage of type %GST_MESSAGE_DEVICE_REMOVED
+ * @device: (out) (allow-none) (transfer full): 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
+ * #GstDeviceProvider or a #GstDeviceMonitor. 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);
+}
+
+/**
+ * gst_message_new_property_notify:
+ * @src: The #GstObject whose property changed (may or may not be a #GstElement)
+ * @property_name: name of the property that changed
+ * @val: (allow-none) (transfer full): new property value, or %NULL
+ *
+ * Returns: a newly allocated #GstMessage
+ *
+ * Since: 1.10
+ */
+GstMessage *
+gst_message_new_property_notify (GstObject * src, const gchar * property_name,
+ GValue * val)
+{
+ GstStructure *structure;
+ GValue name_val = G_VALUE_INIT;
+
+ g_return_val_if_fail (property_name != NULL, NULL);
+
+ structure = gst_structure_new_id_empty (GST_QUARK (MESSAGE_PROPERTY_NOTIFY));
+ g_value_init (&name_val, G_TYPE_STRING);
+ /* should already be interned, but let's make sure */
+ g_value_set_static_string (&name_val, g_intern_string (property_name));
+ gst_structure_id_take_value (structure, GST_QUARK (PROPERTY_NAME), &name_val);
+ if (val != NULL)
+ gst_structure_id_take_value (structure, GST_QUARK (PROPERTY_VALUE), val);
+
+ return gst_message_new_custom (GST_MESSAGE_PROPERTY_NOTIFY, src, structure);
+}
+
+/**
+ * gst_message_parse_property_notify:
+ * @message: a #GstMessage of type %GST_MESSAGE_PROPERTY_NOTIFY
+ * @object: (out) (allow-none) (transfer none): location where to store a
+ * pointer to the object whose property got changed, or %NULL
+ * @property_name: (out) (transfer none) (allow-none): return location for
+ * the name of the property that got changed, or %NULL
+ * @property_value: (out) (transfer none) (allow-none): return location for
+ * the new value of the property that got changed, or %NULL. This will
+ * only be set if the property notify watch was told to include the value
+ * when it was set up
+ *
+ * Parses a property-notify message. These will be posted on the bus only
+ * when set up with gst_element_add_property_notify_watch() or
+ * gst_element_add_property_deep_notify_watch().
+ *
+ * Since: 1.10
+ */
+void
+gst_message_parse_property_notify (GstMessage * message, GstObject ** object,
+ const gchar ** property_name, const GValue ** property_value)
+{
+ const GstStructure *s = GST_MESSAGE_STRUCTURE (message);
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_PROPERTY_NOTIFY);
+
+ if (object)
+ *object = GST_MESSAGE_SRC (message);
+
+ if (property_name) {
+ const GValue *name_value;
+
+ name_value = gst_structure_id_get_value (s, GST_QUARK (PROPERTY_NAME));
+ *property_name = g_value_get_string (name_value);
+ }
+
+ if (property_value)
+ *property_value =
+ gst_structure_id_get_value (s, GST_QUARK (PROPERTY_VALUE));
+}
+
+/**
+ * gst_message_new_stream_collection:
+ * @src: The #GstObject that created the message
+ * @collection: (transfer none): The #GstStreamCollection
+ *
+ * Creates a new stream-collection message. The message is used to announce new
+ * #GstStreamCollection
+ *
+ * Returns: a newly allocated #GstMessage
+ *
+ * Since: 1.10
+ */
+GstMessage *
+gst_message_new_stream_collection (GstObject * src,
+ GstStreamCollection * collection)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ g_return_val_if_fail (collection != NULL, NULL);
+ g_return_val_if_fail (GST_IS_STREAM_COLLECTION (collection), NULL);
+
+ structure =
+ gst_structure_new_id (GST_QUARK (MESSAGE_STREAM_COLLECTION),
+ GST_QUARK (COLLECTION), GST_TYPE_STREAM_COLLECTION, collection, NULL);
+ message =
+ gst_message_new_custom (GST_MESSAGE_STREAM_COLLECTION, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_parse_stream_collection:
+ * @message: a #GstMessage of type %GST_MESSAGE_STREAM_COLLECTION
+ * @collection: (out) (allow-none) (transfer full): A location where to store a
+ * pointer to the #GstStreamCollection, or %NULL
+ *
+ * Parses a stream-collection message.
+ *
+ * Since: 1.10
+ */
+void
+gst_message_parse_stream_collection (GstMessage * message,
+ GstStreamCollection ** collection)
+{
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) ==
+ GST_MESSAGE_STREAM_COLLECTION);
+
+ if (collection)
+ gst_structure_id_get (GST_MESSAGE_STRUCTURE (message),
+ GST_QUARK (COLLECTION), GST_TYPE_STREAM_COLLECTION, collection, NULL);
+}
+
+/**
+ * gst_message_new_streams_selected:
+ * @src: The #GstObject that created the message
+ * @collection: (transfer none): The #GstStreamCollection
+ *
+ * Creates a new steams-selected message. The message is used to announce
+ * that an array of streams has been selected. This is generally in response
+ * to a #GST_EVENT_SELECT_STREAMS event, or when an element (such as decodebin3)
+ * makes an initial selection of streams.
+ *
+ * The message also contains the #GstStreamCollection to which the various streams
+ * belong to.
+ *
+ * Users of gst_message_new_streams_selected() can add the selected streams with
+ * gst_message_streams_selected_add().
+ *
+ * Returns: a newly allocated #GstMessage
+ *
+ * Since: 1.10
+ */
+GstMessage *
+gst_message_new_streams_selected (GstObject * src,
+ GstStreamCollection * collection)
+{
+ GstMessage *message;
+ GstStructure *structure;
+ GValue val = G_VALUE_INIT;
+
+ g_return_val_if_fail (collection != NULL, NULL);
+ g_return_val_if_fail (GST_IS_STREAM_COLLECTION (collection), NULL);
+
+ structure =
+ gst_structure_new_id (GST_QUARK (MESSAGE_STREAMS_SELECTED),
+ GST_QUARK (COLLECTION), GST_TYPE_STREAM_COLLECTION, collection, NULL);
+ g_value_init (&val, GST_TYPE_ARRAY);
+ gst_structure_id_take_value (structure, GST_QUARK (STREAMS), &val);
+ message =
+ gst_message_new_custom (GST_MESSAGE_STREAMS_SELECTED, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_streams_selected_get_size:
+ * @message: a #GstMessage of type %GST_MESSAGE_STREAMS_SELECTED
+ *
+ * Returns the number of streams contained in the @message.
+ *
+ * Returns: The number of streams contained within.
+ *
+ * Since: 1.10
+ */
+guint
+gst_message_streams_selected_get_size (GstMessage * msg)
+{
+ const GValue *val;