Rewrite handling of default values. Fix overflow with unsigned types in linear interpolation. Remove now obsolete _fi...

Original commit message from CVS:
* libs/gst/controller/gstinterpolation.c:
* libs/gst/controller/gstinterpolationcontrolsource.c:
* tests/check/libs/controller.c:
Rewrite handling of default values. Fix overflow with unsigned types
in linear interpolation. Remove now obsolete _first_value() function.
Add more tests. Fixes #538201.
This commit is contained in:
Stefan Kost 2008-06-20 08:17:08 +00:00
parent 1380508f53
commit 27243ac326
4 changed files with 372 additions and 251 deletions

View file

@ -1,3 +1,12 @@
2008-06-20 Stefan Kost <ensonic@users.sf.net>
* libs/gst/controller/gstinterpolation.c:
* libs/gst/controller/gstinterpolationcontrolsource.c:
* tests/check/libs/controller.c:
Rewrite handling of default values. Fix overflow with unsigned types
in linear interpolation. Remove now obsolete _first_value() function.
Add more tests. Fixes #538201.
2008-06-20 Wim Taymans <wim.taymans@collabora.co.uk>
* libs/gst/base/gstbasetransform.c:

View file

@ -80,27 +80,6 @@ static GList *gst_interpolation_control_source_find_control_point_node
return prev_node;
}
/*
* gst_interpolation_control_source_get_first_value:
* @self: the interpolation control source to search in
*
* Find the first value and return it.
*
* Returns: the found #GValue or %NULL if there are none.
*/
static inline GValue *
gst_interpolation_control_source_get_first_value (GstInterpolationControlSource
* self)
{
if (self->priv->values && self->priv->nvalues > 0) {
GstControlPoint *cp = self->priv->values->data;
return &cp->value;
} else {
return NULL;
}
}
/* steps-like (no-)interpolation, default */
/* just returns the value for the most recent key-frame */
@ -123,7 +102,7 @@ _interpolate_none_get_##type (GstInterpolationControlSource *self, GstClockTime
else \
ret = &cp->value; \
} else { \
ret = gst_interpolation_control_source_get_first_value (self); \
ret = &self->priv->default_value; \
} \
return ret; \
} \
@ -193,7 +172,7 @@ _interpolate_none_get (GstInterpolationControlSource * self,
ret = &cp->value;
} else {
ret = gst_interpolation_control_source_get_first_value (self);
ret = &self->priv->default_value;
}
return ret;
}
@ -535,51 +514,53 @@ static GstInterpolateMethod interpolate_trigger = {
/* linear interpolation */
/* smoothes inbetween values */
#define DEFINE_LINEAR_GET(type,round,convert) \
#define DEFINE_LINEAR_GET(vtype,round,convert) \
static inline gboolean \
_interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \
_interpolate_linear_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, g##vtype *ret) \
{ \
GList *node; \
GstControlPoint *cp1 = NULL, *cp2, cp={0,}; \
\
if ((node = gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \
GstControlPoint *cp1, *cp2; \
\
node = gst_interpolation_control_source_find_control_point_node (self, timestamp); \
if (node) { \
cp1 = node->data; \
if ((node = g_list_next (node))) { \
gdouble slope; \
g##type value1,value2; \
\
cp2 = node->data; \
\
value1 = g_value_get_##type (&cp1->value); \
value2 = g_value_get_##type (&cp2->value); \
slope = (gdouble) convert (value2 - value1) / gst_guint64_to_gdouble (cp2->timestamp - cp1->timestamp); \
\
if (round) \
*ret = (g##type) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope + 0.5); \
else \
*ret = (g##type) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \
} \
else { \
*ret = g_value_get_##type (&cp1->value); \
} \
node = g_list_next (node); \
} else { \
GValue *first = gst_interpolation_control_source_get_first_value (self); \
if (!first) \
return FALSE; \
*ret = g_value_get_##type (first); \
cp.timestamp = G_GUINT64_CONSTANT(0); \
g_value_init (&cp.value, self->priv->type); \
g_value_copy (&self->priv->default_value, &cp.value); \
cp1 = &cp; \
node = self->priv->values; \
} \
*ret = CLAMP (*ret, g_value_get_##type (&self->priv->minimum_value), g_value_get_##type (&self->priv->maximum_value)); \
if (node) { \
gdouble slope; \
g##vtype value1,value2; \
\
cp2 = node->data; \
\
value1 = g_value_get_##vtype (&cp1->value); \
value2 = g_value_get_##vtype (&cp2->value); \
slope = ((gdouble) convert (value2) - (gdouble) convert (value1)) / gst_guint64_to_gdouble (cp2->timestamp - cp1->timestamp); \
\
if (round) \
*ret = (g##vtype) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope + 0.5); \
else \
*ret = (g##vtype) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \
} \
else { \
*ret = g_value_get_##vtype (&cp1->value); \
} \
*ret = CLAMP (*ret, g_value_get_##vtype (&self->priv->minimum_value), g_value_get_##vtype (&self->priv->maximum_value)); \
return TRUE; \
} \
\
static gboolean \
interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
interpolate_linear_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
{ \
g##type ret; \
g##vtype ret; \
g_mutex_lock (self->lock); \
if (_interpolate_linear_get_##type (self, timestamp, &ret)) { \
g_value_set_##type (value, ret); \
if (_interpolate_linear_get_##vtype (self, timestamp, &ret)) { \
g_value_set_##vtype (value, ret); \
g_mutex_unlock (self->lock); \
return TRUE; \
} \
@ -588,16 +569,16 @@ interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime
} \
\
static gboolean \
interpolate_linear_get_##type##_value_array (GstInterpolationControlSource *self, \
interpolate_linear_get_##vtype##_value_array (GstInterpolationControlSource *self, \
GstClockTime timestamp, GstValueArray * value_array) \
{ \
gint i; \
GstClockTime ts = timestamp; \
g##type *values = (g##type *) value_array->values; \
g##vtype *values = (g##vtype *) value_array->values; \
\
g_mutex_lock (self->lock); \
for(i = 0; i < value_array->nbsamples; i++) { \
if (! _interpolate_linear_get_##type (self, ts, values)) { \
if (! _interpolate_linear_get_##vtype (self, ts, values)) { \
g_mutex_unlock (self->lock); \
return FALSE; \
} \
@ -661,9 +642,9 @@ static GstInterpolateMethod interpolate_linear = {
* . . . . .
*/
#define DEFINE_CUBIC_GET(type,round, convert) \
#define DEFINE_CUBIC_GET(vtype,round, convert) \
static void \
_interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
_interpolate_cubic_update_cache_##vtype (GstInterpolationControlSource *self) \
{ \
gint i, n = self->priv->nvalues; \
gdouble *o = g_new0 (gdouble, n); \
@ -677,20 +658,20 @@ _interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
GList *node; \
GstControlPoint *cp; \
GstClockTime x_prev, x, x_next; \
g##type y_prev, y, y_next; \
g##vtype y_prev, y, y_next; \
\
/* Fill linear system of equations */ \
node = self->priv->values; \
cp = node->data; \
x = cp->timestamp; \
y = g_value_get_##type (&cp->value); \
y = g_value_get_##vtype (&cp->value); \
\
p[0] = 1.0; \
\
node = node->next; \
cp = node->data; \
x_next = cp->timestamp; \
y_next = g_value_get_##type (&cp->value); \
y_next = g_value_get_##vtype (&cp->value); \
h[0] = gst_util_guint64_to_gdouble (x_next - x); \
\
for (i = 1; i < n-1; i++) { \
@ -702,7 +683,7 @@ _interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
node = node->next; \
cp = node->data; \
x_next = cp->timestamp; \
y_next = g_value_get_##type (&cp->value); \
y_next = g_value_get_##vtype (&cp->value); \
\
h[i] = gst_util_guint64_to_gdouble (x_next - x); \
o[i] = h[i-1]; \
@ -744,64 +725,66 @@ _interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
} \
\
static inline gboolean \
_interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \
_interpolate_cubic_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, g##vtype *ret) \
{ \
GList *node; \
GstControlPoint *cp1 = NULL, *cp2, cp={0,}; \
\
if (self->priv->nvalues <= 2) \
return _interpolate_linear_get_##type (self, timestamp, ret); \
return _interpolate_linear_get_##vtype (self, timestamp, ret); \
\
if (!self->priv->valid_cache) { \
_interpolate_cubic_update_cache_##type (self); \
_interpolate_cubic_update_cache_##vtype (self); \
self->priv->valid_cache = TRUE; \
} \
\
if ((node = gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \
GstControlPoint *cp1, *cp2; \
\
node = gst_interpolation_control_source_find_control_point_node (self, timestamp); \
if (node) { \
cp1 = node->data; \
if ((node = g_list_next (node))) { \
gdouble diff1, diff2; \
g##type value1,value2; \
gdouble out; \
\
cp2 = node->data; \
\
value1 = g_value_get_##type (&cp1->value); \
value2 = g_value_get_##type (&cp2->value); \
\
diff1 = gst_guint64_to_gdouble (timestamp - cp1->timestamp); \
diff2 = gst_guint64_to_gdouble (cp2->timestamp - timestamp); \
\
out = (cp2->cache.cubic.z * diff1 * diff1 * diff1 + cp1->cache.cubic.z * diff2 * diff2 * diff2) / cp1->cache.cubic.h; \
out += (convert (value2) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \
out += (convert (value1) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \
\
if (round) \
*ret = (g##type) (out + 0.5); \
else \
*ret = (g##type) out; \
} \
else { \
*ret = g_value_get_##type (&cp1->value); \
} \
node = g_list_next (node); \
} else { \
GValue *first = gst_interpolation_control_source_get_first_value (self); \
if (!first) \
return FALSE; \
*ret = g_value_get_##type (first); \
cp.timestamp = G_GUINT64_CONSTANT(0); \
g_value_init (&cp.value, self->priv->type); \
g_value_copy (&self->priv->default_value, &cp.value); \
cp1 = &cp; \
node = self->priv->values; \
} \
*ret = CLAMP (*ret, g_value_get_##type (&self->priv->minimum_value), g_value_get_##type (&self->priv->maximum_value)); \
if (node) { \
gdouble diff1, diff2; \
g##vtype value1,value2; \
gdouble out; \
\
cp2 = node->data; \
\
value1 = g_value_get_##vtype (&cp1->value); \
value2 = g_value_get_##vtype (&cp2->value); \
\
diff1 = gst_guint64_to_gdouble (timestamp - cp1->timestamp); \
diff2 = gst_guint64_to_gdouble (cp2->timestamp - timestamp); \
\
out = (cp2->cache.cubic.z * diff1 * diff1 * diff1 + cp1->cache.cubic.z * diff2 * diff2 * diff2) / cp1->cache.cubic.h; \
out += (convert (value2) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \
out += (convert (value1) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \
\
if (round) \
*ret = (g##vtype) (out + 0.5); \
else \
*ret = (g##vtype) out; \
} \
else { \
*ret = g_value_get_##vtype (&cp1->value); \
} \
*ret = CLAMP (*ret, g_value_get_##vtype (&self->priv->minimum_value), g_value_get_##vtype (&self->priv->maximum_value)); \
return TRUE; \
} \
\
static gboolean \
interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
interpolate_cubic_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
{ \
g##type ret; \
g##vtype ret; \
g_mutex_lock (self->lock); \
if (_interpolate_cubic_get_##type (self, timestamp, &ret)) { \
g_value_set_##type (value, ret); \
if (_interpolate_cubic_get_##vtype (self, timestamp, &ret)) { \
g_value_set_##vtype (value, ret); \
g_mutex_unlock (self->lock); \
return TRUE; \
} \
@ -810,16 +793,16 @@ interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime
} \
\
static gboolean \
interpolate_cubic_get_##type##_value_array (GstInterpolationControlSource *self, \
interpolate_cubic_get_##vtype##_value_array (GstInterpolationControlSource *self, \
GstClockTime timestamp, GstValueArray * value_array) \
{ \
gint i; \
GstClockTime ts = timestamp; \
g##type *values = (g##type *) value_array->values; \
g##vtype *values = (g##vtype *) value_array->values; \
\
g_mutex_lock (self->lock); \
for(i = 0; i < value_array->nbsamples; i++) { \
if (! _interpolate_cubic_get_##type (self, ts, values)) { \
if (! _interpolate_cubic_get_##vtype (self, ts, values)) { \
g_mutex_unlock (self->lock); \
return FALSE; \
} \

View file

@ -533,19 +533,11 @@ gst_interpolation_control_source_unset (GstInterpolationControlSource * self,
/* check if a control point for the timestamp exists */
if ((node = g_list_find_custom (self->priv->values, &timestamp,
gst_control_point_find))) {
GstControlPoint *cp = node->data;
if (cp->timestamp == 0) {
/* Restore the default node */
g_value_reset (&cp->value);
g_value_copy (&self->priv->default_value, &cp->value);
} else {
if (node == self->priv->last_requested_value)
self->priv->last_requested_value = NULL;
gst_control_point_free (node->data); /* free GstControlPoint */
self->priv->values = g_list_delete_link (self->priv->values, node);
self->priv->nvalues--;
}
if (node == self->priv->last_requested_value)
self->priv->last_requested_value = NULL;
gst_control_point_free (node->data); /* free GstControlPoint */
self->priv->values = g_list_delete_link (self->priv->values, node);
self->priv->nvalues--;
self->priv->valid_cache = FALSE;
res = TRUE;
}

View file

@ -104,15 +104,19 @@ gst_test_mono_source_set_property (GObject * object,
switch (property_id) {
case ARG_ULONG:
self->val_ulong = g_value_get_ulong (value);
GST_DEBUG ("test value ulong=%lu", self->val_ulong);
break;
case ARG_FLOAT:
self->val_float = g_value_get_float (value);
GST_DEBUG ("test value float=%f", self->val_float);
break;
case ARG_DOUBLE:
self->val_double = g_value_get_double (value);
GST_DEBUG ("test value double=%f", self->val_double);
break;
case ARG_BOOLEAN:
self->val_boolean = g_value_get_boolean (value);
GST_DEBUG ("test value boolean=%d", self->val_boolean);
break;
case ARG_CONSTRUCTONLY:
break;
@ -580,11 +584,11 @@ GST_START_TEST (controller_interpolate_none)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -642,15 +646,15 @@ GST_START_TEST (controller_interpolate_trigger)
fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
0 * GST_SECOND, &val_ulong));
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
1 * GST_SECOND, &val_ulong));
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
2 * GST_SECOND, &val_ulong));
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (G_OBJECT (csource));
@ -705,11 +709,11 @@ GST_START_TEST (controller_interpolate_linear)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -876,11 +880,11 @@ GST_START_TEST (controller_interpolation_unset)
/* verify values */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
/* unset second */
res = gst_interpolation_control_source_unset (csource, 1 * GST_SECOND);
@ -890,9 +894,9 @@ GST_START_TEST (controller_interpolation_unset)
/* verify value again */
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -944,18 +948,18 @@ GST_START_TEST (controller_interpolation_unset_all)
/* verify values */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
/* unset second */
/* unset all */
gst_interpolation_control_source_unset_all (csource);
g_object_unref (csource);
/* verify value again */
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1125,10 +1129,14 @@ GST_START_TEST (controller_interpolation_linear_default_values)
fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
GST_INTERPOLATE_LINEAR));
/* Should fail if no value was set yet */
g_value_init (&val_ulong, G_TYPE_ULONG);
fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
0 * GST_SECOND, &val_ulong));
/* Should fail if no value was set yet
* FIXME: will not fail, as interpolation assumes val[0]=default_value if
* nothing else is set.
fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
1 * GST_SECOND, &val_ulong));
*/
/* set control values */
g_value_set_ulong (&val_ulong, 0);
@ -1145,13 +1153,13 @@ GST_START_TEST (controller_interpolation_linear_default_values)
/* now pull in values for some timestamps */
/* should give the value of the first control point for timestamps before it */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 3 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
/* set control values */
g_value_set_ulong (&val_ulong, 0);
@ -1174,11 +1182,11 @@ GST_START_TEST (controller_interpolation_linear_default_values)
/* now pull in values for some timestamps */
/* should now give our value for timestamp 0 */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
g_object_unref (G_OBJECT (csource));
@ -1257,13 +1265,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
/* now pull in values for some timestamps, prop double disabled */
@ -1271,13 +1279,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
gst_controller_set_property_disabled (ctrl, "double", TRUE);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
/* now pull in values for some timestamps, after enabling double again */
@ -1285,13 +1293,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
gst_controller_set_property_disabled (ctrl, "double", FALSE);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
/* now pull in values for some timestamps, after disabling all props */
@ -1299,13 +1307,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
gst_controller_set_disabled (ctrl, TRUE);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
/* now pull in values for some timestamps, enabling double again */
@ -1313,13 +1321,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
gst_controller_set_property_disabled (ctrl, "double", FALSE);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
/* now pull in values for some timestamps, enabling all */
@ -1327,13 +1335,13 @@ GST_START_TEST (controller_interpolate_linear_disabled)
GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
gst_controller_set_disabled (ctrl, FALSE);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
@ -1438,29 +1446,29 @@ GST_START_TEST (controller_lfo_sine)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1509,29 +1517,29 @@ GST_START_TEST (controller_lfo_sine_timeshift)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1540,7 +1548,6 @@ GST_START_TEST (controller_lfo_sine_timeshift)
GST_END_TEST;
/* test lfo control source with square waveform */
GST_START_TEST (controller_lfo_square)
{
@ -1581,29 +1588,29 @@ GST_START_TEST (controller_lfo_square)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1652,29 +1659,29 @@ GST_START_TEST (controller_lfo_saw)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1723,29 +1730,29 @@ GST_START_TEST (controller_lfo_rsaw)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1794,29 +1801,29 @@ GST_START_TEST (controller_lfo_triangle)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1851,29 +1858,29 @@ GST_START_TEST (controller_lfo_none)
/* now pull in values for some timestamps */
gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);;
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
@ -1979,6 +1986,134 @@ GST_START_TEST (controller_refcount_new_list)
GST_END_TEST;
/* test linear interpolation for ts < first control point */
GST_START_TEST (controller_interpolate_linear_before_ts0)
{
GstController *ctrl;
GstInterpolationControlSource *csource;
GstElement *elem;
gboolean res;
GValue val_ulong = { 0, };
gst_controller_init (NULL, NULL);
elem = gst_element_factory_make ("testmonosource", "test_source");
/* that property should exist and should be controllable */
ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
fail_unless (ctrl != NULL, NULL);
/* Get interpolation control source */
csource = gst_interpolation_control_source_new ();
fail_unless (csource != NULL);
fail_unless (gst_controller_set_control_source (ctrl, "ulong",
GST_CONTROL_SOURCE (csource)));
/* set interpolation mode */
fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
GST_INTERPOLATE_LINEAR));
/* set control values */
g_value_init (&val_ulong, G_TYPE_ULONG);
g_value_set_ulong (&val_ulong, 100);
res =
gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
&val_ulong);
fail_unless (res, NULL);
g_value_set_ulong (&val_ulong, 0);
res =
gst_interpolation_control_source_set (csource, 4 * GST_SECOND,
&val_ulong);
fail_unless (res, NULL);
g_object_unref (G_OBJECT (csource));
/* now pull in values for some timestamps after first control point */
gst_controller_sync_values (ctrl, 2 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
gst_controller_sync_values (ctrl, 3 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 4 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
/* now pull in values for some timestamps before first control point */
gst_controller_sync_values (ctrl, 1 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
gst_controller_sync_values (ctrl, 0 * GST_SECOND);
fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
gst_object_unref (elem);
}
GST_END_TEST;
/* test control-point handling in interpolation control source */
GST_START_TEST (controller_interpolation_cp_count)
{
GstController *ctrl;
GstInterpolationControlSource *csource;
GstElement *elem;
gboolean res;
GValue val_ulong = { 0, };
gst_controller_init (NULL, NULL);
elem = gst_element_factory_make ("testmonosource", "test_source");
/* that property should exist and should be controllable */
ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
fail_unless (ctrl != NULL, NULL);
/* Get interpolation control source */
csource = gst_interpolation_control_source_new ();
fail_unless (csource != NULL);
fail_unless (gst_controller_set_control_source (ctrl, "ulong",
GST_CONTROL_SOURCE (csource)));
/* set interpolation mode */
fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
GST_INTERPOLATE_NONE));
fail_unless (gst_interpolation_control_source_get_count (csource) == 0);
/* set control values */
g_value_init (&val_ulong, G_TYPE_ULONG);
g_value_set_ulong (&val_ulong, 0);
res =
gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
&val_ulong);
fail_unless (res, NULL);
fail_unless (gst_interpolation_control_source_get_count (csource) == 1);
g_value_set_ulong (&val_ulong, 100);
res =
gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
&val_ulong);
fail_unless (res, NULL);
fail_unless (gst_interpolation_control_source_get_count (csource) == 2);
/* now unset control values */
res = gst_interpolation_control_source_unset (csource, 2 * GST_SECOND);
fail_unless (res, NULL);
fail_unless (gst_interpolation_control_source_get_count (csource) == 1);
res = gst_interpolation_control_source_unset (csource, 0 * GST_SECOND);
fail_unless (res, NULL);
fail_unless (gst_interpolation_control_source_get_count (csource) == 0);
g_object_unref (G_OBJECT (csource));
GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
g_object_unref (ctrl);
gst_object_unref (elem);
}
GST_END_TEST;
static Suite *
gst_controller_suite (void)
{
@ -2019,6 +2154,8 @@ gst_controller_suite (void)
tcase_add_test (tc, controller_lfo_triangle);
tcase_add_test (tc, controller_lfo_none);
tcase_add_test (tc, controller_helper_any_gobject);
tcase_add_test (tc, controller_interpolate_linear_before_ts0);
tcase_add_test (tc, controller_interpolation_cp_count);
return s;
}