From: Stefan Kost Date: Sun, 27 Nov 2005 22:43:08 +0000 (+0000) Subject: gst/gstelement.c: don't loop forever X-Git-Tag: RELEASE-0_9_7~110 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b347681d536892c8286d31c6b6b18f02584561d;p=platform%2Fupstream%2Fgstreamer.git gst/gstelement.c: don't loop forever Original commit message from CVS: * gst/gstelement.c: (gst_element_dispose): don't loop forever * gst/gstiterator.c: * gst/gststructure.c: doc fixes * libs/gst/controller/gstcontroller.c: (gst_controlled_property_set_interpolation_mode): * libs/gst/controller/gstcontroller.h: * libs/gst/controller/gstinterpolation.c: (interpolate_none_get_enum_value_array): support controlling enums --- diff --git a/ChangeLog b/ChangeLog index e4cc4d2..fcf7d02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-11-27 Stefan Kost + + * gst/gstelement.c: (gst_element_dispose): + don't loop forever + + * gst/gstiterator.c: + * gst/gststructure.c: + doc fixes + + * libs/gst/controller/gstcontroller.c: + (gst_controlled_property_set_interpolation_mode): + * libs/gst/controller/gstcontroller.h: + * libs/gst/controller/gstinterpolation.c: + (interpolate_none_get_enum_value_array): + support controlling enums + 2005-11-27 Tim-Philipp Müller * gst/gstvalue.c: diff --git a/gst/gstelement.c b/gst/gstelement.c index 19e5f2f..e4196d4 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2403,8 +2403,10 @@ gst_element_dispose (GObject * object) } g_return_if_fail (GST_STATE_PENDING (element) == GST_STATE_VOID_PENDING); + GST_DEBUG ("removing %d pads", g_list_length (element->pads)); /* first we break all our links with the outside */ - while (element->pads) { + while (element->pads && element->pads->data) { + /* don't call _remove_pad with NULL */ gst_element_remove_pad (element, GST_PAD_CAST (element->pads->data)); } if (G_UNLIKELY (element->pads != 0)) { diff --git a/gst/gstiterator.c b/gst/gstiterator.c index c8659ab..72acaff 100644 --- a/gst/gstiterator.c +++ b/gst/gstiterator.c @@ -48,6 +48,10 @@ * ...rollback changes to items... * gst_iterator_resync (it); * break; + * case GST_ITERATOR_ERROR: + * ...wrong parameter were given... + * done = TRUE; + * break; * case GST_ITERATOR_DONE: * done = TRUE; * break; diff --git a/gst/gststructure.c b/gst/gststructure.c index 9485e38..51d79f4 100644 --- a/gst/gststructure.c +++ b/gst/gststructure.c @@ -1341,7 +1341,7 @@ gst_structure_value_get_generic_type (GValue * val) * * Converts @structure to a human-readable string representation. * - * Returns: a pointer to string allocated by g_malloc(). g_free after + * Returns: a pointer to string allocated by g_malloc(). g_free() after * usage. */ gchar * diff --git a/libs/gst/controller/gstcontroller.c b/libs/gst/controller/gstcontroller.c index 457d719..3745bb5 100644 --- a/libs/gst/controller/gstcontroller.c +++ b/libs/gst/controller/gstcontroller.c @@ -170,6 +170,11 @@ gst_controlled_property_set_interpolation_mode (GstControlledProperty * self, self->interpolation = mode; if (mode != GST_INTERPOLATE_USER) { + /* @todo: if it is not a fundamental type, recursively check parent + * until we found the fundamental one + * GType base=self->type; + * while( base=g_type_get_parent(self->base) ) self->base = base; + */ switch (self->type) { case G_TYPE_INT: self->get = interpolation_methods[mode]->get_int; @@ -206,13 +211,23 @@ gst_controlled_property_set_interpolation_mode (GstControlledProperty * self, self->get_value_array = interpolation_methods[mode]->get_boolean_value_array; break; - break; + case G_TYPE_ENUM: + self->get = interpolation_methods[mode]->get_uint; + self->get_value_array = + interpolation_methods[mode]->get_enum_value_array; default: - self->get = NULL; - self->get_value_array = NULL; + if (g_type_is_a (self->type, G_TYPE_ENUM)) { + self->get = interpolation_methods[mode]->get_uint; + self->get_value_array = + interpolation_methods[mode]->get_enum_value_array; + } else { + self->get = NULL; + self->get_value_array = NULL; + } } if (!self->get) { /* || !self->get_value_array) */ - GST_WARNING ("incomplete implementation for type '%d'", self->type); + GST_WARNING ("incomplete implementation for type '%d':'%s'", self->type, + g_type_name (self->type)); res = FALSE; } } else { @@ -318,6 +333,12 @@ gst_controlled_property_new (GObject * object, const gchar * name) g_value_set_boolean (&prop->default_value, tpspec->default_value); } break; + case G_TYPE_ENUM:{ + GParamSpecEnum *tpspec = G_PARAM_SPEC_ENUM (pspec); + + g_value_set_enum (&prop->default_value, tpspec->default_value); + } + break; default: GST_WARNING ("incomplete implementation for paramspec type '%s'", G_PARAM_SPEC_TYPE_NAME (pspec)); diff --git a/libs/gst/controller/gstcontroller.h b/libs/gst/controller/gstcontroller.h index 776ffd1..aececd6 100644 --- a/libs/gst/controller/gstcontroller.h +++ b/libs/gst/controller/gstcontroller.h @@ -129,6 +129,8 @@ typedef struct _GstInterpolateMethod InterpolateGetValueArray get_double_value_array; InterpolateGet get_boolean; InterpolateGetValueArray get_boolean_value_array; + InterpolateGet get_enum; + InterpolateGetValueArray get_enum_value_array; } GstInterpolateMethod; /** diff --git a/libs/gst/controller/gstinterpolation.c b/libs/gst/controller/gstinterpolation.c index 31e031f..1cb8fee 100644 --- a/libs/gst/controller/gstinterpolation.c +++ b/libs/gst/controller/gstinterpolation.c @@ -115,22 +115,41 @@ DEFINE_NONE_GET (float) DEFINE_NONE_GET (double) DEFINE_NONE_GET (boolean) - static GstInterpolateMethod interpolate_none = { - interpolate_none_get, - interpolate_none_get_int_value_array, - interpolate_none_get, - interpolate_none_get_uint_value_array, - interpolate_none_get, - interpolate_none_get_long_value_array, - interpolate_none_get, - interpolate_none_get_ulong_value_array, - interpolate_none_get, - interpolate_none_get_float_value_array, - interpolate_none_get, - interpolate_none_get_double_value_array, - interpolate_none_get, - interpolate_none_get_boolean_value_array - }; + static gboolean + interpolate_none_get_enum_value_array (GstControlledProperty * prop, + GstClockTime timestamp, GstValueArray * value_array) +{ + gint i; + GstClockTime ts = timestamp; + gint *values = (gint *) value_array->values; + + for (i = 0; i < value_array->nbsamples; i++) { + *values = g_value_get_enum (interpolate_none_get (prop, ts)); + ts += value_array->sample_interval; + values++; + } + return (TRUE); +} + + +static GstInterpolateMethod interpolate_none = { + interpolate_none_get, + interpolate_none_get_int_value_array, + interpolate_none_get, + interpolate_none_get_uint_value_array, + interpolate_none_get, + interpolate_none_get_long_value_array, + interpolate_none_get, + interpolate_none_get_ulong_value_array, + interpolate_none_get, + interpolate_none_get_float_value_array, + interpolate_none_get, + interpolate_none_get_double_value_array, + interpolate_none_get, + interpolate_none_get_boolean_value_array, + interpolate_none_get, + interpolate_none_get_enum_value_array +}; /* returns the default value of the property, except for times with specific values */ /* needed for one-shot events, such as notes and triggers */ @@ -173,6 +192,8 @@ static GstInterpolateMethod interpolate_trigger = { interpolate_trigger_get, NULL, interpolate_trigger_get, + NULL, + interpolate_trigger_get, NULL }; @@ -253,6 +274,8 @@ DEFINE_LINEAR_GET (double) interpolate_linear_get_double, interpolate_linear_get_double_value_array, NULL, + NULL, + NULL, NULL };