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,