diff --git a/subprojects/gstreamer/gst/gstcaps.c b/subprojects/gstreamer/gst/gstcaps.c index 68b38ee952..720cd6ceff 100644 --- a/subprojects/gstreamer/gst/gstcaps.c +++ b/subprojects/gstreamer/gst/gstcaps.c @@ -318,6 +318,44 @@ gst_caps_new_empty_simple (const char *media_type) return caps; } +/** + * gst_caps_new_empty_simple_static_str: + * @media_type: the media type of the structure + * + * Creates a new #GstCaps that contains one #GstStructure with name + * @media_type. + * + * @media_type needs to be valid for the remaining lifetime of the process, e.g. + * has to be a static string. + * + * Returns: (transfer full): the new #GstCaps + * + * Since: 1.26 + */ +GstCaps * +gst_caps_new_empty_simple_static_str (const char *media_type) +{ + GstCaps *caps; + GstStructure *structure; + + caps = gst_caps_new_empty (); + if (strcmp ("ANY", media_type) == 0) { + g_warning + ("media_type should not be ANY. Please consider using `gst_caps_new_any` or `gst_caps_from_string`."); + } + if (strcmp ("", media_type) == 0 || strcmp ("EMPTY", media_type) == 0 + || strcmp ("NONE", media_type) == 0) { + g_warning + ("media_type should not be `%s`. Please consider using `gst_caps_new_empty` or `gst_caps_from_string`.", + media_type); + } + structure = gst_structure_new_static_str_empty (media_type); + if (structure) + gst_caps_append_structure_unchecked (caps, structure, NULL); + + return caps; +} + /** * gst_caps_new_simple: * @media_type: the media type of the structure @@ -351,6 +389,46 @@ gst_caps_new_simple (const char *media_type, const char *fieldname, ...) return caps; } +/** + * gst_caps_new_simple_static_str: + * @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(). + * + * @media_type, @fieldname and all other fieldnames need to be valid for the + * remaining lifetime of the process, e.g. have to be static strings. + * + * Returns: (transfer full): the new #GstCaps + * + * Since: 1.26 + */ +GstCaps * +gst_caps_new_simple_static_str (const char *media_type, const char *fieldname, + ...) +{ + GstCaps *caps; + GstStructure *structure; + va_list var_args; + + caps = gst_caps_new_empty (); + + va_start (var_args, fieldname); + structure = + gst_structure_new_static_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_full: * @struct1: the first structure to add @@ -1120,6 +1198,39 @@ gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value) } } +/** + * gst_caps_set_value_static_str: + * @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. + * + * @field needs to be valid for the remaining lifetime of the process, e.g. + * has to be a static string. + * + * Since: 1.26 + **/ +void +gst_caps_set_value_static_str (GstCaps * caps, const char *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_set_value_static_str (structure, field, value); + } +} + /** * gst_caps_set_simple_valist: * @caps: the #GstCaps to set @@ -1158,6 +1269,50 @@ gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs) } } +/** + * gst_caps_set_simple_static_str_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_set(), and be %NULL-terminated. + * + * @field and all other field names need to be valid for the remaining lifetime + * of the process, e.g. have to be static strings. + * + * Since: 1.26 + */ +void +gst_caps_set_simple_static_str_valist (GstCaps * caps, const char *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_set_value_static_str (caps, field, &value); + + g_value_unset (&value); + + field = va_arg (varargs, const gchar *); + } +} + /** * gst_caps_set_simple: * @caps: the #GstCaps to set @@ -1180,6 +1335,33 @@ gst_caps_set_simple (GstCaps * caps, const char *field, ...) va_end (var_args); } +/** + * gst_caps_set_simple_static_str: + * @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_set(), and be %NULL-terminated. + * + * @field and all other field names need to be valid for the remaining lifetime + * of the process, e.g. have to be static strings. + * + * Since: 1.26 + */ +void +gst_caps_set_simple_static_str (GstCaps * caps, const char *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_set_simple_static_str_valist (caps, field, var_args); + va_end (var_args); +} + /* tests */ /** @@ -1255,7 +1437,8 @@ gst_caps_is_fixed (const GstCaps * caps) structure = gst_caps_get_structure_unchecked (caps, 0); - return gst_structure_foreach_id_str (structure, gst_caps_is_fixed_foreach, NULL); + return gst_structure_foreach_id_str (structure, gst_caps_is_fixed_foreach, + NULL); } /** @@ -1973,7 +2156,8 @@ typedef struct _NormalizeForeach } NormalizeForeach; static gboolean -gst_caps_normalize_foreach (const GstIdStr * field, const GValue * value, gpointer ptr) +gst_caps_normalize_foreach (const GstIdStr * field, const GValue * value, + gpointer ptr) { NormalizeForeach *nf = (NormalizeForeach *) ptr; GValue val = { 0 }; @@ -2060,8 +2244,8 @@ typedef struct } UnionField; static gboolean -gst_caps_structure_figure_out_union (const GstIdStr * field, const GValue * value, - gpointer user_data) +gst_caps_structure_figure_out_union (const GstIdStr * field, + const GValue * value, gpointer user_data) { UnionField *u = user_data; const GValue *val = gst_structure_id_str_get_value (u->compare, field); diff --git a/subprojects/gstreamer/gst/gstcaps.h b/subprojects/gstreamer/gst/gstcaps.h index d031b6fc78..7afb527ec6 100644 --- a/subprojects/gstreamer/gst/gstcaps.h +++ b/subprojects/gstreamer/gst/gstcaps.h @@ -369,11 +369,18 @@ GstCaps * gst_caps_new_any (void); GST_API GstCaps * gst_caps_new_empty_simple (const char *media_type) G_GNUC_WARN_UNUSED_RESULT; +GST_API +GstCaps * gst_caps_new_empty_simple_static_str (const char *media_type) G_GNUC_WARN_UNUSED_RESULT; + GST_API GstCaps * gst_caps_new_simple (const char *media_type, const char *fieldname, ...) G_GNUC_NULL_TERMINATED G_GNUC_WARN_UNUSED_RESULT; GST_API +GstCaps * gst_caps_new_simple_static_str (const char *media_type, + const char *fieldname, + ...) G_GNUC_NULL_TERMINATED G_GNUC_WARN_UNUSED_RESULT; +GST_API GstCaps * gst_caps_new_full (GstStructure *struct1, ...) G_GNUC_NULL_TERMINATED G_GNUC_WARN_UNUSED_RESULT; GST_API @@ -448,13 +455,24 @@ void gst_caps_set_value (GstCaps *caps, const char *field, const GValue *value); GST_API +void gst_caps_set_value_static_str (GstCaps *caps, + const char *field, + const GValue *value); +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_set_simple_valist (GstCaps *caps, const char *field, va_list varargs); GST_API +void gst_caps_set_simple_static_str_valist (GstCaps *caps, + const char *field, + va_list varargs); +GST_API gboolean gst_caps_foreach (const GstCaps *caps, GstCapsForeachFunc func, gpointer user_data);