X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstparamspecs.c;h=7de51d7baf1f44eb48ea88997bd39a6866a04dc2;hb=53e879c750f6b37da424123d469d162fe9cddbed;hp=bed692d425d7852c704250f524b733927fb03c8e;hpb=4348851cd98d50013f341e067c06f4176ff41fce;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstparamspecs.c b/gst/gstparamspecs.c index bed692d..7de51d7 100644 --- a/gst/gstparamspecs.c +++ b/gst/gstparamspecs.c @@ -13,17 +13,16 @@ * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. */ /** * SECTION:gstparamspec + * @title: GstParamSpec * @short_description: GParamSpec implementations specific * to GStreamer * * GParamSpec implementations specific to GStreamer. - * - * Last reviewed on 2008-03-11 (0.10.18) */ #ifdef HAVE_CONFIG_H @@ -124,10 +123,11 @@ _gst_param_fraction_values_cmp (GParamSpec * pspec, const GValue * value1, GType gst_param_spec_fraction_get_type (void) { - static GType type; /* 0 */ + static volatile GType gst_faction_type = 0; /* register GST_TYPE_PARAM_FRACTION */ - if (type == 0) { + if (g_once_init_enter (&gst_faction_type)) { + GType type; static GParamSpecTypeInfo pspec_info = { sizeof (GstParamSpecFraction), /* instance_size */ 0, /* n_preallocs */ @@ -138,10 +138,12 @@ gst_param_spec_fraction_get_type (void) _gst_param_fraction_validate, /* value_validate */ _gst_param_fraction_values_cmp, /* values_cmp */ }; - pspec_info.value_type = GST_TYPE_FRACTION; + pspec_info.value_type = gst_fraction_get_type (); type = g_param_type_register_static ("GstParamFraction", &pspec_info); + g_once_init_leave (&gst_faction_type, type); } - return type; + + return gst_faction_type; } /** @@ -162,9 +164,7 @@ gst_param_spec_fraction_get_type (void) * used in connection with g_object_class_install_property() in a GObjects's * instance_init function. * - * Returns: (transfer full): a newly created parameter specification - * - * Since: 0.10.14 + * Returns: (transfer full) (nullable): a newly created parameter specification */ GParamSpec * gst_param_spec_fraction (const gchar * name, const gchar * nick, @@ -205,3 +205,165 @@ gst_param_spec_fraction (const gchar * name, const gchar * nick, return pspec; } + +static void +_gst_param_array_init (GParamSpec * pspec) +{ + GstParamSpecArray *aspec = GST_PARAM_SPEC_ARRAY_LIST (pspec); + + aspec->element_spec = NULL; +} + +static void +_gst_param_array_finalize (GParamSpec * pspec) +{ + GstParamSpecArray *aspec = GST_PARAM_SPEC_ARRAY_LIST (pspec); + GParamSpecClass *parent_class = + g_type_class_peek (g_type_parent (GST_TYPE_PARAM_ARRAY_LIST)); + + if (aspec->element_spec) { + g_param_spec_unref (aspec->element_spec); + aspec->element_spec = NULL; + } + + parent_class->finalize (pspec); +} + +static gboolean +_gst_param_array_validate (GParamSpec * pspec, GValue * value) +{ + GstParamSpecArray *aspec = GST_PARAM_SPEC_ARRAY_LIST (pspec); + gboolean ret = FALSE; + + /* ensure array values validity against a present element spec */ + if (aspec->element_spec) { + GParamSpec *element_spec = aspec->element_spec; + guint i; + + for (i = 0; i < gst_value_array_get_size (value); i++) { + GValue *element = (GValue *) gst_value_array_get_value (value, i); + + /* need to fixup value type, or ensure that the array value is initialized at all */ + if (!g_value_type_compatible (G_VALUE_TYPE (element), + G_PARAM_SPEC_VALUE_TYPE (element_spec))) { + if (G_VALUE_TYPE (element) != 0) + g_value_unset (element); + g_value_init (element, G_PARAM_SPEC_VALUE_TYPE (element_spec)); + g_param_value_set_default (element_spec, element); + ret = TRUE; + } + + /* validate array value against element_spec */ + if (g_param_value_validate (element_spec, element)) + ret = TRUE; + } + } + + return ret; +} + +static gint +_gst_param_array_values_cmp (GParamSpec * pspec, const GValue * value1, + const GValue * value2) +{ + GstParamSpecArray *aspec = GST_PARAM_SPEC_ARRAY_LIST (pspec); + guint size1, size2; + + if (!value1 || !value2) + return value2 ? -1 : value1 != value2; + + size1 = gst_value_array_get_size (value1); + size2 = gst_value_array_get_size (value2); + + if (size1 != size2) + return size1 < size2 ? -1 : 1; + else if (!aspec->element_spec) { + /* we need an element specification for comparisons, so there's not much + * to compare here, try to at least provide stable lesser/greater result + */ + return size1 < size2 ? -1 : size1 > size2; + } else { /* size1 == size2 */ + guint i; + + for (i = 0; i < size1; i++) { + const GValue *element1 = gst_value_array_get_value (value1, i); + const GValue *element2 = gst_value_array_get_value (value2, i); + gint cmp; + + /* need corresponding element types, provide stable result otherwise */ + if (G_VALUE_TYPE (element1) != G_VALUE_TYPE (element2)) + return G_VALUE_TYPE (element1) < G_VALUE_TYPE (element2) ? -1 : 1; + cmp = g_param_values_cmp (aspec->element_spec, element1, element2); + if (cmp) + return cmp; + } + return 0; + } +} + +GType +gst_param_spec_array_get_type (void) +{ + static volatile GType gst_array_type = 0; + + /* register GST_TYPE_PARAM_FRACTION */ + if (g_once_init_enter (&gst_array_type)) { + GType type; + static GParamSpecTypeInfo pspec_info = { + sizeof (GstParamSpecArray), /* instance_size */ + 0, /* n_preallocs */ + _gst_param_array_init, /* instance_init */ + G_TYPE_INVALID, /* value_type */ + _gst_param_array_finalize, /* finalize */ + NULL, /* value_set_default */ + _gst_param_array_validate, /* value_validate */ + _gst_param_array_values_cmp, /* values_cmp */ + }; + pspec_info.value_type = gst_value_array_get_type (); + type = g_param_type_register_static ("GstParamArray", &pspec_info); + g_once_init_leave (&gst_array_type, type); + } + + return gst_array_type; +} + +/** + * gst_param_spec_array: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @element_spec: GParamSpec of the array + * @flags: flags for the property specified + * + * This function creates a GstArray GParamSpec for use by objects/elements + * that want to expose properties of GstArray type. This function is + * typically * used in connection with g_object_class_install_property() in a + * GObjects's instance_init function. + * + * Returns: (transfer full): a newly created parameter specification + * + * Since: 1.14 + */ + +GParamSpec * +gst_param_spec_array (const gchar * name, + const gchar * nick, + const gchar * blurb, GParamSpec * element_spec, GParamFlags flags) +{ + GstParamSpecArray *aspec; + + g_return_val_if_fail (element_spec == NULL + || G_IS_PARAM_SPEC (element_spec), NULL); + + aspec = g_param_spec_internal (GST_TYPE_PARAM_ARRAY_LIST, + name, nick, blurb, flags); + if (aspec == NULL) + return NULL; + + if (element_spec) { + aspec->element_spec = g_param_spec_ref (element_spec); + g_param_spec_sink (element_spec); + } + + return G_PARAM_SPEC (aspec); +}