diff --git a/subprojects/gstreamer/gst/gstcaps.c b/subprojects/gstreamer/gst/gstcaps.c
index a1d34b6a3d..3faf0b34cd 100644
--- a/subprojects/gstreamer/gst/gstcaps.c
+++ b/subprojects/gstreamer/gst/gstcaps.c
@@ -285,6 +285,42 @@ gst_caps_new_any (void)
   return caps;
 }
 
+/**
+ * gst_caps_new_id_str_empty_simple:
+ * @media_type: the media type of the structure
+ *
+ * Creates a new #GstCaps that contains one #GstStructure with name
+ * @media_type.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ *
+ * Since: 1.26
+ */
+GstCaps *
+gst_caps_new_id_str_empty_simple (const GstIdStr * media_type)
+{
+  GstCaps *caps;
+  GstStructure *structure;
+
+  caps = gst_caps_new_empty ();
+  if (gst_id_str_is_equal_to_str (media_type, "ANY")) {
+    g_warning
+        ("media_type should not be ANY. Please consider using `gst_caps_new_any` or `gst_caps_from_string`.");
+  }
+  if (gst_id_str_get_len (media_type) == 0
+      || gst_id_str_is_equal_to_str (media_type, "EMPTY")
+      || gst_id_str_is_equal_to_str (media_type, "NONE")) {
+    g_warning
+        ("media_type should not be `%s`. Please consider using `gst_caps_new_empty` or `gst_caps_from_string`.",
+        gst_id_str_as_str (media_type));
+  }
+  structure = gst_structure_new_id_str_empty (media_type);
+  if (structure)
+    gst_caps_append_structure_unchecked (caps, structure, NULL);
+
+  return caps;
+}
+
 /**
  * gst_caps_new_empty_simple:
  * @media_type: the media type of the structure
@@ -356,6 +392,42 @@ gst_caps_new_static_str_empty_simple (const char *media_type)
   return caps;
 }
 
+/**
+ * gst_caps_new_id_str_simple:
+ * @media_type: the media type of the structure
+ * @fieldname: first field to set
+ * @...: additional arguments
+ *
+ * Creates a new #GstCaps that contains one #GstStructure.  The
+ * structure is defined by the arguments, which have the same format
+ * as gst_structure_new().
+ *
+ * Returns: (transfer full): the new #GstCaps
+ *
+ * Since: 1.26
+ */
+GstCaps *
+gst_caps_new_id_str_simple (const GstIdStr * media_type,
+    const GstIdStr * fieldname, ...)
+{
+  GstCaps *caps;
+  GstStructure *structure;
+  va_list var_args;
+
+  caps = gst_caps_new_empty ();
+
+  va_start (var_args, fieldname);
+  structure = gst_structure_new_id_str_valist (media_type, fieldname, var_args);
+  va_end (var_args);
+
+  if (structure)
+    gst_caps_append_structure_unchecked (caps, structure, NULL);
+  else
+    gst_caps_replace (&caps, NULL);
+
+  return caps;
+}
+
 /**
  * gst_caps_new_simple:
  * @media_type: the media type of the structure
@@ -1171,6 +1243,36 @@ gst_caps_truncate (GstCaps * caps)
   return caps;
 }
 
+/**
+ * gst_caps_id_str_set_value:
+ * @caps: a writable caps
+ * @field: name of the field to set
+ * @value: value to set the field to
+ *
+ * Sets the given @field on all structures of @caps to the given @value.
+ * This is a convenience function for calling gst_structure_set_value() on
+ * all structures of @caps.
+ *
+ * Since: 1.26
+ **/
+void
+gst_caps_id_str_set_value (GstCaps * caps, const GstIdStr * field,
+    const GValue * value)
+{
+  guint i, len;
+
+  g_return_if_fail (GST_IS_CAPS (caps));
+  g_return_if_fail (IS_WRITABLE (caps));
+  g_return_if_fail (field != NULL);
+  g_return_if_fail (G_IS_VALUE (value));
+
+  len = GST_CAPS_LEN (caps);
+  for (i = 0; i < len; i++) {
+    GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
+    gst_structure_id_str_set_value (structure, field, value);
+  }
+}
+
 /**
  * gst_caps_set_value:
  * @caps: a writable caps
@@ -1231,6 +1333,47 @@ gst_caps_set_value_static_str (GstCaps * caps, const char *field,
   }
 }
 
+/**
+ * gst_caps_id_str_set_simple_valist:
+ * @caps: the #GstCaps to set
+ * @field: first field to set
+ * @varargs: additional parameters
+ *
+ * Sets fields in a #GstCaps.  The arguments must be passed in the same
+ * manner as gst_structure_id_str_set(), and be %NULL-terminated.
+ *
+ * Since: 1.26
+ */
+void
+gst_caps_id_str_set_simple_valist (GstCaps * caps, const GstIdStr * field,
+    va_list varargs)
+{
+  GValue value = { 0, };
+
+  g_return_if_fail (GST_IS_CAPS (caps));
+  g_return_if_fail (IS_WRITABLE (caps));
+
+  while (field) {
+    GType type;
+    char *err;
+
+    type = va_arg (varargs, GType);
+
+    G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
+    if (G_UNLIKELY (err)) {
+      g_critical ("%s", err);
+      g_free (err);
+      return;
+    }
+
+    gst_caps_id_str_set_value (caps, field, &value);
+
+    g_value_unset (&value);
+
+    field = va_arg (varargs, const GstIdStr *);
+  }
+}
+
 /**
  * gst_caps_set_simple_valist:
  * @caps: the #GstCaps to set
@@ -1313,6 +1456,30 @@ gst_caps_set_simple_static_str_valist (GstCaps * caps, const char *field,
   }
 }
 
+/**
+ * gst_caps_id_str_set_simple:
+ * @caps: the #GstCaps to set
+ * @field: first field to set
+ * @...: additional parameters
+ *
+ * Sets fields in a #GstCaps.  The arguments must be passed in the same
+ * manner as gst_structure_id_str_set(), and be %NULL-terminated.
+ *
+ * Since: 1.26
+ */
+void
+gst_caps_id_str_set_simple (GstCaps * caps, const GstIdStr * field, ...)
+{
+  va_list var_args;
+
+  g_return_if_fail (GST_IS_CAPS (caps));
+  g_return_if_fail (IS_WRITABLE (caps));
+
+  va_start (var_args, field);
+  gst_caps_id_str_set_simple_valist (caps, field, var_args);
+  va_end (var_args);
+}
+
 /**
  * gst_caps_set_simple:
  * @caps: the #GstCaps to set
diff --git a/subprojects/gstreamer/gst/gstcaps.h b/subprojects/gstreamer/gst/gstcaps.h
index ece02a9be4..62448e3e26 100644
--- a/subprojects/gstreamer/gst/gstcaps.h
+++ b/subprojects/gstreamer/gst/gstcaps.h
@@ -366,12 +366,19 @@ GstCaps *         gst_caps_new_empty               (void);
 GST_API
 GstCaps *         gst_caps_new_any                 (void);
 
+GST_API
+GstCaps *         gst_caps_new_id_str_empty_simple (const GstIdStr *media_type) G_GNUC_WARN_UNUSED_RESULT;
+
 GST_API
 GstCaps *         gst_caps_new_empty_simple        (const char    *media_type) G_GNUC_WARN_UNUSED_RESULT;
 
 GST_API
 GstCaps *         gst_caps_new_static_str_empty_simple (const char    *media_type) G_GNUC_WARN_UNUSED_RESULT;
 
+GST_API
+GstCaps *         gst_caps_new_id_str_simple       (const GstIdStr *media_type,
+                                                    const GstIdStr *fieldname,
+                                                    ...) G_GNUC_NULL_TERMINATED G_GNUC_WARN_UNUSED_RESULT;
 GST_API
 GstCaps *         gst_caps_new_simple              (const char    *media_type,
                                                     const char    *fieldname,
@@ -450,6 +457,10 @@ GstCaps *         gst_caps_copy_nth                (const GstCaps *caps, guint n
 GST_API
 GstCaps *         gst_caps_truncate                (GstCaps       *caps) G_GNUC_WARN_UNUSED_RESULT;
 
+GST_API
+void              gst_caps_id_str_set_value        (GstCaps        *caps,
+                                                    const GstIdStr *field,
+                                                    const GValue   *value);
 GST_API
 void              gst_caps_set_value               (GstCaps       *caps,
                                                     const char    *field,
@@ -459,12 +470,19 @@ void              gst_caps_set_value_static_str    (GstCaps       *caps,
                                                     const char    *field,
                                                     const GValue  *value);
 GST_API
+void              gst_caps_id_str_set_simple       (GstCaps        *caps,
+                                                    const GstIdStr *field, ...) G_GNUC_NULL_TERMINATED;
+GST_API
 void              gst_caps_set_simple              (GstCaps       *caps,
                                                     const char    *field, ...) G_GNUC_NULL_TERMINATED;
 GST_API
 void              gst_caps_set_simple_static_str   (GstCaps       *caps,
                                                     const char    *field, ...) G_GNUC_NULL_TERMINATED;
 GST_API
+void              gst_caps_id_str_set_simple_valist(GstCaps        *caps,
+                                                    const GstIdStr *field,
+                                                    va_list         varargs);
+GST_API
 void              gst_caps_set_simple_valist       (GstCaps       *caps,
                                                     const char    *field,
                                                     va_list        varargs);
diff --git a/subprojects/gstreamer/gst/gststructure.c b/subprojects/gstreamer/gst/gststructure.c
index fdec12c690..1b1288d7bf 100644
--- a/subprojects/gstreamer/gst/gststructure.c
+++ b/subprojects/gstreamer/gst/gststructure.c
@@ -510,6 +510,53 @@ gst_structure_new (const gchar * name, const gchar * firstfield, ...)
   return structure;
 }
 
+/**
+ * gst_structure_new_id_str_valist:
+ * @name: name of new structure
+ * @firstfield: name of first field to set
+ * @varargs: variable argument list
+ *
+ * Creates a new #GstStructure with the given @name.  Structure fields
+ * are set according to the varargs in a manner similar to
+ * gst_structure_new_id_str().
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new #GstStructure
+ *
+ * Since: 1.26
+ */
+GstStructure *
+gst_structure_new_id_str_valist (const GstIdStr * name,
+    const GstIdStr * firstfield, va_list varargs)
+{
+  GstStructure *structure;
+  va_list copy;
+  guint len = 0;
+  const GstIdStr *field_copy = firstfield;
+  GType type_copy;
+
+  g_return_val_if_fail (gst_structure_validate_name (gst_id_str_as_str (name)),
+      NULL);
+
+  /* Calculate size of varargs */
+  va_copy (copy, varargs);
+  while (field_copy) {
+    type_copy = va_arg (copy, GType);
+    G_VALUE_COLLECT_SKIP (type_copy, copy);
+    field_copy = va_arg (copy, const GstIdStr *);
+    len++;
+  }
+  va_end (copy);
+
+  structure = gst_structure_new_id_str_empty_with_size (name, len);
+
+  if (structure)
+    gst_structure_id_str_set_valist (structure, firstfield, varargs);
+
+  return structure;
+}
+
 /**
  * gst_structure_new_valist:
  * @name: name of new structure
@@ -860,6 +907,27 @@ gst_structure_get_name_id_str (const GstStructure * structure)
   return GST_STRUCTURE_NAME (structure);
 }
 
+/**
+ * gst_structure_set_name_id_str:
+ * @structure: a #GstStructure
+ * @name: the new name of the structure
+ *
+ * Sets the name of the structure to the given @name.  The string
+ * provided is copied before being used. It must not be empty, start with a
+ * letter and can be followed by letters, numbers and any of "/-_.:".
+ *
+ * Since: 1.26
+ */
+void
+gst_structure_set_name_id_str (GstStructure * structure, const GstIdStr * name)
+{
+  g_return_if_fail (structure != NULL);
+  g_return_if_fail (IS_MUTABLE (structure));
+  g_return_if_fail (gst_structure_validate_name (gst_id_str_as_str (name)));
+
+  gst_id_str_copy_into (GST_STRUCTURE_NAME (structure), name);
+}
+
 /**
  * gst_structure_set_name:
  * @structure: a #GstStructure
@@ -1482,8 +1550,8 @@ gst_structure_new_id (GQuark name_quark, GQuark field_quark, ...)
  *
  * Creates a new #GstStructure with the given name as a GQuark, followed by
  * fieldname GstIdStr, GType, argument(s) "triplets" in the same format as
- * gst_structure_id_set(). Basically a convenience wrapper around
- * gst_structure_new_id_empty() and gst_structure_id_set().
+ * gst_structure_id_str_set(). Basically a convenience wrapper around
+ * gst_structure_new_id_str_empty() and gst_structure_id_str_set().
  *
  * The last variable argument must be %NULL (or 0).
  *
@@ -1968,6 +2036,35 @@ gst_structure_get_field_type (const GstStructure * structure,
   return G_VALUE_TYPE (&field->value);
 }
 
+/**
+ * gst_structure_id_str_get_field_type:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field
+ *
+ * Finds the field with the given name, and returns the type of the
+ * value it contains.  If the field is not found, G_TYPE_INVALID is
+ * returned.
+ *
+ * Returns: the #GValue of the field
+ *
+ * Since: 1.26
+ */
+GType
+gst_structure_id_str_get_field_type (const GstStructure * structure,
+    const GstIdStr * fieldname)
+{
+  GstStructureField *field;
+
+  g_return_val_if_fail (structure != NULL, G_TYPE_INVALID);
+  g_return_val_if_fail (fieldname != NULL, G_TYPE_INVALID);
+
+  field = gst_structure_id_str_get_field (structure, fieldname);
+  if (field == NULL)
+    return G_TYPE_INVALID;
+
+  return G_VALUE_TYPE (&field->value);
+}
+
 /**
  * gst_structure_n_fields:
  * @structure: a #GstStructure
diff --git a/subprojects/gstreamer/gst/gststructure.h b/subprojects/gstreamer/gst/gststructure.h
index 9e4578b353..dcad0eaa97 100644
--- a/subprojects/gstreamer/gst/gststructure.h
+++ b/subprojects/gstreamer/gst/gststructure.h
@@ -207,6 +207,10 @@ GstStructure *        gst_structure_new_static_str       (const gchar * name,
                                                           const gchar * firstfield,
                                                           ...) G_GNUC_NULL_TERMINATED  G_GNUC_MALLOC;
 GST_API
+GstStructure *        gst_structure_new_id_str_valist    (const GstIdStr * name,
+                                                          const GstIdStr * firstfield,
+                                                          va_list       varargs) G_GNUC_MALLOC;
+GST_API
 GstStructure *        gst_structure_new_valist           (const gchar * name,
                                                           const gchar * firstfield,
                                                           va_list       varargs) G_GNUC_MALLOC;
@@ -256,8 +260,12 @@ GST_API
 gboolean              gst_structure_has_name             (const GstStructure  * structure,
                                                           const gchar         * name);
 GST_API
+void                  gst_structure_set_name_id_str      (GstStructure        * structure,
+                                                          const GstIdStr      * name);
+GST_API
 void                  gst_structure_set_name             (GstStructure        * structure,
                                                           const gchar         * name);
+GST_API
 void                  gst_structure_set_name_static_str  (GstStructure        * structure,
                                                           const gchar         * name);
 GST_DEPRECATED_FOR(gst_structure_id_str_set_value)
@@ -393,6 +401,9 @@ void                  gst_structure_remove_all_fields    (GstStructure        *
 GST_API
 GType                 gst_structure_get_field_type       (const GstStructure  * structure,
                                                           const gchar         * fieldname);
+GST_API
+GType                 gst_structure_id_str_get_field_type(const GstStructure  * structure,
+                                                          const GstIdStr      * fieldname);
 GST_DEPRECATED_FOR(gst_structure_foreach_id_str)
 gboolean              gst_structure_foreach              (const GstStructure  * structure,
                                                           GstStructureForeachFunc   func,