+ * gst_event_new_select_streams:
+ * @streams: (element-type utf8) (transfer none): the list of streams to
+ * activate
+ *
+ * Allocate a new select-streams event.
+ *
+ * The select-streams event requests the specified @streams to be activated.
+ *
+ * The list of @streams corresponds to the "Stream ID" of each stream to be
+ * activated. Those ID can be obtained via the #GstStream objects present
+ * in #GST_EVENT_STREAM_START, #GST_EVENT_STREAM_COLLECTION or
+ * #GST_MESSAGE_STREAM_COLLECTION.
+ *
+ * Note: The list of @streams can not be empty.
+ *
+ * Returns: (transfer full): a new select-streams event or %NULL in case of
+ * an error (like an empty streams list).
+ *
+ * Since: 1.10
+ */
+GstEvent *
+gst_event_new_select_streams (GList * streams)
+{
+ GstEvent *event;
+ GValue val = G_VALUE_INIT;
+ GstStructure *struc;
+ GList *tmpl;
+
+ g_return_val_if_fail (streams != NULL, NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT, "Creating new select-streams event");
+ struc = gst_structure_new_id_empty (GST_QUARK (EVENT_SELECT_STREAMS));
+ g_value_init (&val, GST_TYPE_LIST);
+ /* Fill struc with streams */
+ for (tmpl = streams; tmpl; tmpl = tmpl->next) {
+ GValue strval = G_VALUE_INIT;
+ const gchar *str = (const gchar *) tmpl->data;
+ g_value_init (&strval, G_TYPE_STRING);
+ g_value_set_string (&strval, str);
+ gst_value_list_append_and_take_value (&val, &strval);
+ }
+ gst_structure_id_take_value (struc, GST_QUARK (STREAMS), &val);
+ event = gst_event_new_custom (GST_EVENT_SELECT_STREAMS, struc);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_select_streams:
+ * @event: The event to parse
+ * @streams: (out) (element-type utf8) (transfer full): the streams
+ *
+ * Parse the SELECT_STREAMS event and retrieve the contained streams.
+ *
+ * Since: 1.10
+ */
+void
+gst_event_parse_select_streams (GstEvent * event, GList ** streams)
+{
+ GstStructure *structure;
+ GList *res = NULL;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SELECT_STREAMS);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (G_LIKELY (streams)) {
+ const GValue *vlist =
+ gst_structure_id_get_value (structure, GST_QUARK (STREAMS));
+ guint i, sz = gst_value_list_get_size (vlist);
+ for (i = 0; i < sz; i++) {
+ const GValue *strv = gst_value_list_get_value (vlist, i);
+ res = g_list_append (res, g_value_dup_string (strv));
+ }
+ *streams = res;
+ }
+}
+
+
+/**
+ * gst_event_new_stream_group_done:
+ * @group_id: the group id of the stream group which is ending
+ *
+ * Create a new Stream Group Done event. The stream-group-done event can
+ * only travel downstream synchronized with the buffer flow. Elements
+ * that receive the event on a pad should handle it mostly like EOS,
+ * and emit any data or pending buffers that would depend on more data
+ * arriving and unblock, since there won't be any more data.
+ *
+ * This event is followed by EOS at some point in the future, and is
+ * generally used when switching pads - to unblock downstream so that
+ * new pads can be exposed before sending EOS on the existing pads.
+ *
+ * Returns: (transfer full): the new stream-group-done event.
+ *
+ * Since: 1.10
+ */
+GstEvent *
+gst_event_new_stream_group_done (guint group_id)
+{
+ GstStructure *s;
+
+ s = gst_structure_new_id (GST_QUARK (EVENT_STREAM_GROUP_DONE),
+ GST_QUARK (GROUP_ID), G_TYPE_UINT, group_id, NULL);
+
+ return gst_event_new_custom (GST_EVENT_STREAM_GROUP_DONE, s);
+}
+
+/**
+ * gst_event_parse_stream_group_done:
+ * @event: a stream-group-done event.
+ * @group_id: (out): address of variable to store the group id into
+ *
+ * Parse a stream-group-done @event and store the result in the given
+ * @group_id location.
+ *
+ * Since: 1.10
+ */
+void
+gst_event_parse_stream_group_done (GstEvent * event, guint * group_id)
+{
+ g_return_if_fail (event != NULL);
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_GROUP_DONE);
+
+ if (group_id) {
+ gst_structure_id_get (GST_EVENT_STRUCTURE (event),
+ GST_QUARK (GROUP_ID), G_TYPE_UINT, group_id, NULL);
+ }
+}
+
+/**