diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index e4dac414b1..99073a746c 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -2085,6 +2085,7 @@ gst_structure_fixate_field_nearest_int gst_structure_fixate_field_nearest_double gst_structure_fixate_field_nearest_fraction gst_structure_fixate_field_boolean +gst_structure_fixate_field_string GST_STRUCTURE GST_IS_STRUCTURE diff --git a/gst/gststructure.c b/gst/gststructure.c index 6c8f60515c..8a3aa6f7c5 100644 --- a/gst/gststructure.c +++ b/gst/gststructure.c @@ -2344,6 +2344,61 @@ gst_structure_fixate_field_boolean (GstStructure * structure, return FALSE; } +/** + * gst_structure_fixate_field_string: + * @structure: a #GstStructure + * @field_name: a field in @structure + * @target: the target value of the fixation + * + * Fixates a #GstStructure by changing the given @field_name field to the given + * @target string if that field is not fixed yet. + * + * Returns: TRUE if the structure could be fixated + * + * Since: 0.10.30 + */ +gboolean +gst_structure_fixate_field_string (GstStructure * structure, + const gchar * field_name, const gchar * target) +{ + const GValue *value; + + g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE); + g_return_val_if_fail (IS_MUTABLE (structure), FALSE); + + value = gst_structure_get_value (structure, field_name); + + if (G_VALUE_TYPE (value) == G_TYPE_STRING) { + /* already fixed */ + return FALSE; + } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) { + const GValue *list_value; + int i, n; + const gchar *best = NULL; + int best_index = -1; + + n = gst_value_list_get_size (value); + for (i = 0; i < n; i++) { + list_value = gst_value_list_get_value (value, i); + if (G_VALUE_TYPE (list_value) == G_TYPE_STRING) { + const gchar *x = g_value_get_string (list_value); + + if (best_index == -1 || g_str_equal (x, target)) { + best_index = i; + best = x; + } + } + } + if (best_index != -1) { + gst_structure_set (structure, field_name, G_TYPE_STRING, best, NULL); + return TRUE; + } + return FALSE; + } + + return FALSE; +} + /** * gst_structure_fixate_field_nearest_fraction: * @structure: a #GstStructure diff --git a/gst/gststructure.h b/gst/gststructure.h index 84e09aa223..bbb89360b7 100644 --- a/gst/gststructure.h +++ b/gst/gststructure.h @@ -230,6 +230,9 @@ gboolean gst_structure_fixate_field_nearest_double (GstStructure gboolean gst_structure_fixate_field_boolean (GstStructure *structure, const char *field_name, gboolean target); +gboolean gst_structure_fixate_field_string (GstStructure *structure, + const char *field_name, + const gchar *target); gboolean gst_structure_fixate_field_nearest_fraction (GstStructure *structure, const char *field_name, const gint target_numerator, diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index ee2e13137a..ad8d5735fa 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -884,6 +884,7 @@ EXPORTS gst_structure_fixate_field_nearest_double gst_structure_fixate_field_nearest_fraction gst_structure_fixate_field_nearest_int + gst_structure_fixate_field_string gst_structure_foreach gst_structure_free gst_structure_from_string