From: Sebastian Dröge Date: Sat, 22 May 2010 08:01:44 +0000 (+0200) Subject: structure: API: Add gst_structure_fixate_field_string() X-Git-Tag: RELEASE-0.10.30~166 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e35fe4ef9cc7ceb88d010b9626e27ebcb71a3e5b;p=platform%2Fupstream%2Fgstreamer.git structure: API: Add gst_structure_fixate_field_string() --- diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index e4dac41..99073a7 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 6c8f605..8a3aa6f 100644 --- a/gst/gststructure.c +++ b/gst/gststructure.c @@ -2345,6 +2345,61 @@ gst_structure_fixate_field_boolean (GstStructure * structure, } /** + * 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 * @field_name: a field in @structure diff --git a/gst/gststructure.h b/gst/gststructure.h index 84e09aa..bbb8936 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 ee2e131..ad8d573 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