3 * unit test for the controller library
5 * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
6 * Copyright (C) <2006-2007> Sebastian Dröge <slomo@circular-chaos.org>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
28 #include <gst/check/gstcheck.h>
29 #include <gst/controller/gstinterpolationcontrolsource.h>
30 #include <gst/controller/gstlfocontrolsource.h>
31 #include <gst/controller/gsttriggercontrolsource.h>
33 /* enum for text element */
35 #define GST_TYPE_TEST_ENUM (gst_test_enum_get_type ())
47 gst_test_enum_get_type (void)
49 static gsize gtype = 0;
50 static const GEnumValue values[] = {
51 {ENUM_V0, "ENUM_V0", "0"},
52 {ENUM_V10, "ENUM_V10", "10"},
53 {ENUM_V11, "ENUM_V11", "11"},
54 {ENUM_V12, "ENUM_V12", "12"},
55 {ENUM_V255, "ENUM_V255", "255"},
59 if (g_once_init_enter (>ype)) {
60 GType tmp = g_enum_register_static ("GstTestEnum", values);
61 g_once_init_leave (>ype, tmp);
67 /* local test element */
82 #define GST_TYPE_TEST_OBJ (gst_test_obj_get_type ())
83 #define GST_TEST_OBJ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_OBJ, GstTestObj))
84 #define GST_TEST_OBJ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_OBJ, GstTestObjClass))
85 #define GST_IS_TEST_OBJ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_OBJ))
86 #define GST_IS_TEST_OBJ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_OBJ))
87 #define GST_TEST_OBJ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_OBJ, GstTestObjClass))
89 typedef struct _GstTestObj GstTestObj;
90 typedef struct _GstTestObjClass GstTestObjClass;
101 struct _GstTestObjClass
103 GstElementClass parent_class;
106 static GType gst_test_obj_get_type (void);
109 gst_test_obj_get_property (GObject * object,
110 guint property_id, GValue * value, GParamSpec * pspec)
112 GstTestObj *self = GST_TEST_OBJ (object);
114 switch (property_id) {
116 g_value_set_int (value, self->val_int);
119 g_value_set_float (value, self->val_float);
122 g_value_set_double (value, self->val_double);
125 g_value_set_boolean (value, self->val_boolean);
128 g_value_set_enum (value, self->val_enum);
131 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
137 gst_test_obj_set_property (GObject * object,
138 guint property_id, const GValue * value, GParamSpec * pspec)
140 GstTestObj *self = GST_TEST_OBJ (object);
142 switch (property_id) {
144 self->val_int = g_value_get_int (value);
145 GST_DEBUG ("test value int=%d", self->val_int);
148 self->val_float = g_value_get_float (value);
149 GST_DEBUG ("test value float=%f", self->val_float);
152 self->val_double = g_value_get_double (value);
153 GST_DEBUG ("test value double=%lf", self->val_double);
156 self->val_boolean = g_value_get_boolean (value);
157 GST_DEBUG ("test value boolean=%d", self->val_boolean);
160 self->val_enum = g_value_get_enum (value);
161 GST_DEBUG ("test value enum=%d", self->val_enum);
163 case PROP_CONSTRUCTONLY:
166 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
172 gst_test_obj_class_init (GstTestObjClass * klass)
174 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
176 gobject_class->set_property = gst_test_obj_set_property;
177 gobject_class->get_property = gst_test_obj_get_property;
179 g_object_class_install_property (gobject_class, PROP_INT,
180 g_param_spec_int ("int",
182 "int number parameter",
183 0, 100, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
185 g_object_class_install_property (gobject_class, PROP_FLOAT,
186 g_param_spec_float ("float",
188 "float number parameter",
189 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
191 g_object_class_install_property (gobject_class, PROP_DOUBLE,
192 g_param_spec_double ("double",
194 "double number parameter",
195 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
197 g_object_class_install_property (gobject_class, PROP_BOOLEAN,
198 g_param_spec_boolean ("boolean",
201 FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
203 g_object_class_install_property (gobject_class, PROP_ENUM,
204 g_param_spec_enum ("enum",
207 GST_TYPE_TEST_ENUM, ENUM_V0,
208 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
210 g_object_class_install_property (gobject_class, PROP_READONLY,
211 g_param_spec_int ("readonly",
213 "readonly parameter",
214 0, G_MAXINT, 0, G_PARAM_READABLE | GST_PARAM_CONTROLLABLE));
216 g_object_class_install_property (gobject_class, PROP_STATIC,
217 g_param_spec_int ("static",
219 "static parameter", 0, G_MAXINT, 0, G_PARAM_READWRITE));
221 g_object_class_install_property (gobject_class, PROP_CONSTRUCTONLY,
222 g_param_spec_int ("construct-only",
223 "construct-only prop",
224 "construct-only parameter",
225 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
229 gst_test_obj_base_init (GstTestObjClass * klass)
231 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
233 gst_element_class_set_details_simple (element_class,
234 "test object for unit tests",
235 "Test", "Use in unit tests", "Stefan Sauer <ensonic@users.sf.net>");
239 gst_test_obj_get_type (void)
241 static volatile gsize test_obj_type = 0;
243 if (g_once_init_enter (&test_obj_type)) {
245 static const GTypeInfo info = {
246 (guint16) sizeof (GstTestObjClass),
247 (GBaseInitFunc) gst_test_obj_base_init, // base_init
248 NULL, // base_finalize
249 (GClassInitFunc) gst_test_obj_class_init, // class_init
250 NULL, // class_finalize
252 (guint16) sizeof (GstTestObj),
254 NULL, // instance_init
257 type = g_type_register_static (GST_TYPE_ELEMENT, "GstTestObj", &info, 0);
258 g_once_init_leave (&test_obj_type, type);
260 return test_obj_type;
266 gst_element_register (NULL, "testobj", GST_RANK_NONE, GST_TYPE_TEST_OBJ);
277 /* tests if we don't fail on empty interpolation controlsources */
278 GST_START_TEST (controller_controlsource_empty1)
281 GstControlSource *csource;
283 elem = gst_element_factory_make ("testobj", NULL);
285 csource = (GstControlSource *) gst_interpolation_control_source_new ();
286 fail_unless (csource != NULL, NULL);
288 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int",
291 /* don't fail on empty control point lists */
292 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
295 gst_object_unref (csource);
296 gst_object_unref (elem);
301 /* tests if we don't fail on interpolation controlsources that are empty again */
302 GST_START_TEST (controller_controlsource_empty2)
305 GstInterpolationControlSource *csource;
306 GstTimedValueControlSource *cs;
308 elem = gst_element_factory_make ("testobj", NULL);
310 csource = gst_interpolation_control_source_new ();
311 fail_unless (csource != NULL, NULL);
313 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int",
314 (GstControlSource *) csource));
316 /* set control values */
317 cs = (GstTimedValueControlSource *) csource;
318 gst_timed_value_control_source_set (cs, 0 * GST_SECOND, 0);
320 /* ... and unset the value */
321 gst_timed_value_control_source_unset (cs, 0 * GST_SECOND);
323 /* don't fail on empty control point lists */
324 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
327 gst_object_unref (csource);
328 gst_object_unref (elem);
333 /* test timed value handling without interpolation */
334 GST_START_TEST (controller_interpolation_none)
336 GstInterpolationControlSource *csource;
337 GstTimedValueControlSource *tvcs;
338 GstControlSource *cs;
342 elem = gst_element_factory_make ("testobj", NULL);
344 /* new interpolation control source */
345 csource = gst_interpolation_control_source_new ();
346 tvcs = (GstTimedValueControlSource *) csource;
347 cs = (GstControlSource *) csource;
349 fail_unless (csource != NULL);
350 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
352 /* set interpolation mode */
353 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_NONE, NULL);
355 /* set control values */
356 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
357 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
359 /* check values on control source directly */
360 fail_unless (gst_control_source_get_value (cs, 0 * GST_SECOND, &v));
361 fail_unless_equals_float (v, 0.0);
362 fail_unless (gst_control_source_get_value (cs, 1 * GST_SECOND, &v));
363 fail_unless_equals_float (v, 0.0);
364 fail_unless (gst_control_source_get_value (cs, 2 * GST_SECOND, &v));
365 fail_unless_equals_float (v, 1.0);
366 fail_unless (gst_control_source_get_value (cs, 3 * GST_SECOND, &v));
367 fail_unless_equals_float (v, 1.0);
369 /* now pull in values for some timestamps */
370 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
371 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
372 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
373 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
374 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
375 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
376 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
377 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
379 gst_object_unref (csource);
380 gst_object_unref (elem);
385 /* test timed value handling with linear interpolation */
386 GST_START_TEST (controller_interpolation_linear)
388 GstInterpolationControlSource *csource;
389 GstTimedValueControlSource *tvcs;
390 GstControlSource *cs;
393 elem = gst_element_factory_make ("testobj", NULL);
395 /* new interpolation control source */
396 csource = gst_interpolation_control_source_new ();
397 tvcs = (GstTimedValueControlSource *) csource;
398 cs = (GstControlSource *) csource;
400 fail_unless (csource != NULL);
401 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
403 /* set interpolation mode */
404 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
406 /* set control values */
407 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
408 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
410 /* now pull in values for some timestamps */
411 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
412 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
413 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
414 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
415 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
416 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
418 gst_object_unref (csource);
419 gst_object_unref (elem);
424 /* test timed value handling with cubic interpolation */
425 GST_START_TEST (controller_interpolation_cubic)
427 GstInterpolationControlSource *csource;
428 GstTimedValueControlSource *tvcs;
429 GstControlSource *cs;
432 elem = gst_element_factory_make ("testobj", NULL);
434 /* new interpolation control source */
435 csource = gst_interpolation_control_source_new ();
436 tvcs = (GstTimedValueControlSource *) csource;
437 cs = (GstControlSource *) csource;
439 fail_unless (csource != NULL);
440 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "double", cs));
442 /* set interpolation mode */
443 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_CUBIC, NULL);
445 /* set control values */
446 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
447 fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 0.5));
448 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.2));
449 fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 0.8));
451 /* now pull in values for some timestamps */
452 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
453 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
454 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
455 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 50.0);
456 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
457 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
458 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
459 fail_unless (GST_TEST_OBJ (elem)->val_double > 20.0 &&
460 GST_TEST_OBJ (elem)->val_double < 80.0, NULL);
461 gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND);
462 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 80.0);
463 gst_object_sync_values (GST_OBJECT (elem), 5 * GST_SECOND);
464 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 80.0);
466 gst_object_unref (csource);
467 gst_object_unref (elem);
472 /* test timed value handling with cubic interpolation */
473 GST_START_TEST (controller_interpolation_cubic_too_few_cp)
475 GstInterpolationControlSource *csource;
476 GstTimedValueControlSource *tvcs;
477 GstControlSource *cs;
480 elem = gst_element_factory_make ("testobj", NULL);
482 /* new interpolation control source */
483 csource = gst_interpolation_control_source_new ();
484 tvcs = (GstTimedValueControlSource *) csource;
485 cs = (GstControlSource *) csource;
487 fail_unless (csource != NULL);
488 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "double", cs));
490 /* set interpolation mode */
491 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_CUBIC, NULL);
493 /* set 2 control values */
494 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
495 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.4));
497 /* now pull in values for some timestamps and verify that it used linear
498 * interpolation as we don't gave enough control points
500 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
501 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
502 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
503 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
504 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
505 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0);
507 gst_object_unref (csource);
508 gst_object_unref (elem);
514 GST_START_TEST (controller_interpolation_unset)
516 GstInterpolationControlSource *csource;
517 GstTimedValueControlSource *tvcs;
518 GstControlSource *cs;
521 elem = gst_element_factory_make ("testobj", NULL);
523 /* new interpolation control source */
524 csource = gst_interpolation_control_source_new ();
525 tvcs = (GstTimedValueControlSource *) csource;
526 cs = (GstControlSource *) csource;
528 fail_unless (csource != NULL);
529 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
531 /* set interpolation mode */
532 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_NONE, NULL);
534 /* set control values */
535 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
536 fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0));
537 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.5));
540 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
541 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
542 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
543 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
544 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
545 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
548 fail_unless (gst_timed_value_control_source_unset (tvcs, 1 * GST_SECOND));
550 /* verify value again */
551 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
552 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
553 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
554 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
556 /* unset all values, reset and try to unset again */
557 fail_unless (gst_timed_value_control_source_unset (tvcs, 0 * GST_SECOND));
558 fail_unless (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND));
559 gst_timed_value_control_source_unset_all (tvcs);
560 fail_if (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND));
562 gst_object_unref (csource);
563 gst_object_unref (elem);
568 /* test _unset_all() */
569 GST_START_TEST (controller_interpolation_unset_all)
571 GstInterpolationControlSource *csource;
572 GstTimedValueControlSource *tvcs;
573 GstControlSource *cs;
576 elem = gst_element_factory_make ("testobj", NULL);
578 /* new interpolation control source */
579 csource = gst_interpolation_control_source_new ();
580 tvcs = (GstTimedValueControlSource *) csource;
581 cs = (GstControlSource *) csource;
583 fail_unless (csource != NULL);
584 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
586 /* set interpolation mode */
587 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_NONE, NULL);
589 /* set control values */
590 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
591 fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0));
594 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
595 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
596 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
597 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
600 gst_timed_value_control_source_unset_all (tvcs);
601 GST_TEST_OBJ (elem)->val_int = 0;
603 /* verify value again */
604 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
605 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
607 gst_object_unref (csource);
608 gst_object_unref (elem);
613 /* test retrieval of an array of values with get_value_array() */
614 GST_START_TEST (controller_interpolation_linear_value_array)
616 GstInterpolationControlSource *csource;
617 GstTimedValueControlSource *tvcs;
618 GstControlSource *cs;
623 elem = gst_element_factory_make ("testobj", NULL);
625 /* new interpolation control source */
626 csource = gst_interpolation_control_source_new ();
627 tvcs = (GstTimedValueControlSource *) csource;
628 cs = (GstControlSource *) csource;
630 fail_unless (csource != NULL);
631 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
633 /* set interpolation mode */
634 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
636 /* set control values */
637 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
638 fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0));
640 /* now pull in raw-values for some timestamps */
641 raw_values = g_new (gdouble, 3);
643 fail_unless (gst_control_source_get_value_array (cs,
644 0, GST_SECOND / 2, 3, raw_values));
645 fail_unless_equals_float ((raw_values)[0], 0.0);
646 fail_unless_equals_float ((raw_values)[1], 0.5);
647 fail_unless_equals_float ((raw_values)[2], 1.0);
651 /* now pull in mapped values for some timestamps */
652 g_values = g_new0 (GValue, 3);
654 fail_unless (gst_object_get_value_array (GST_OBJECT (elem), "int",
655 0, GST_SECOND / 2, 3, g_values));
656 fail_unless_equals_int (g_value_get_int (&g_values[0]), 0);
657 fail_unless_equals_int (g_value_get_int (&g_values[1]), 50);
658 fail_unless_equals_int (g_value_get_int (&g_values[2]), 100);
662 gst_object_unref (csource);
663 gst_object_unref (elem);
668 /* test if values below minimum and above maximum are clipped */
669 GST_START_TEST (controller_interpolation_linear_invalid_values)
671 GstInterpolationControlSource *csource;
672 GstTimedValueControlSource *tvcs;
673 GstControlSource *cs;
676 elem = gst_element_factory_make ("testobj", NULL);
678 /* new interpolation control source */
679 csource = gst_interpolation_control_source_new ();
680 tvcs = (GstTimedValueControlSource *) csource;
681 cs = (GstControlSource *) csource;
683 fail_unless (csource != NULL);
684 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "float", cs));
686 /* set interpolation mode */
687 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
689 /* set control values */
690 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 2.0));
691 fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, -2.0));
693 /* now pull in values for some timestamps and see if clipping works */
695 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
696 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 100.0);
698 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
699 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 100.0);
701 gst_object_sync_values (GST_OBJECT (elem),
702 1 * GST_SECOND + 500 * GST_MSECOND);
703 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 50.0);
705 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
706 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0);
708 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
709 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0);
711 gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND);
712 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0);
714 gst_object_unref (csource);
715 gst_object_unref (elem);
720 GST_START_TEST (controller_interpolation_linear_default_values)
722 GstInterpolationControlSource *csource;
723 GstTimedValueControlSource *tvcs;
724 GstControlSource *cs;
727 elem = gst_element_factory_make ("testobj", NULL);
729 /* new interpolation control source */
730 csource = gst_interpolation_control_source_new ();
731 tvcs = (GstTimedValueControlSource *) csource;
732 cs = (GstControlSource *) csource;
734 fail_unless (csource != NULL);
735 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
737 /* set interpolation mode */
738 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
740 /* Should fail if no value was set yet
741 * FIXME: will not fail, as interpolation assumes val[0]=default_value if
742 * nothing else is set.
743 fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
744 1 * GST_SECOND, &val_int));
747 /* set control values */
748 fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 0.0));
749 fail_unless (gst_timed_value_control_source_set (tvcs, 3 * GST_SECOND, 1.0));
751 /* now pull in values for some timestamps */
752 /* should give the value of the first control point for timestamps before it */
753 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
754 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
755 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
756 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
757 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
758 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
759 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
760 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
762 /* set control values */
763 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
764 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
766 /* unset the old ones */
767 fail_unless (gst_timed_value_control_source_unset (tvcs, 1 * GST_SECOND));
768 fail_unless (gst_timed_value_control_source_unset (tvcs, 3 * GST_SECOND));
770 /* now pull in values for some timestamps */
771 /* should now give our value for timestamp 0 */
772 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
773 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
774 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
775 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
776 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
777 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
779 gst_object_unref (csource);
780 gst_object_unref (elem);
785 /* test gst_controller_set_disabled() with linear interpolation */
786 GST_START_TEST (controller_interpolation_linear_disabled)
788 GstInterpolationControlSource *csource1, *csource2;
789 GstTimedValueControlSource *tvcs1, *tvcs2;
790 GstControlSource *cs1, *cs2;
793 elem = gst_element_factory_make ("testobj", NULL);
795 /* new interpolation control source */
796 csource1 = gst_interpolation_control_source_new ();
797 tvcs1 = (GstTimedValueControlSource *) csource1;
798 cs1 = (GstControlSource *) csource1;
800 csource2 = gst_interpolation_control_source_new ();
801 tvcs2 = (GstTimedValueControlSource *) csource2;
802 cs2 = (GstControlSource *) csource2;
804 fail_unless (csource1 != NULL);
805 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs1));
806 fail_unless (csource2 != NULL);
807 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "double",
810 /* set interpolation mode */
811 g_object_set (csource1, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
812 g_object_set (csource2, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
814 /* set control values */
815 fail_unless (gst_timed_value_control_source_set (tvcs1, 0 * GST_SECOND, 0.0));
816 fail_unless (gst_timed_value_control_source_set (tvcs1, 2 * GST_SECOND, 1.0));
818 /* set control values */
819 fail_unless (gst_timed_value_control_source_set (tvcs2, 0 * GST_SECOND, 0.2));
820 fail_unless (gst_timed_value_control_source_set (tvcs2, 2 * GST_SECOND, 0.4));
822 /* now pull in values for some timestamps */
823 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
824 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
825 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
826 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
827 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
828 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0);
829 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
830 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
831 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0);
833 /* now pull in values for some timestamps, prop double disabled */
834 GST_TEST_OBJ (elem)->val_int = 0;
835 GST_TEST_OBJ (elem)->val_double = 0.0;
836 gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", TRUE);
837 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
838 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
839 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
840 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
841 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
842 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
843 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
844 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
845 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
847 /* now pull in values for some timestamps, after enabling double again */
848 GST_TEST_OBJ (elem)->val_int = 0;
849 GST_TEST_OBJ (elem)->val_double = 0.0;
850 gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", FALSE);
851 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
852 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
853 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
854 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
855 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
856 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0);
857 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
858 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
859 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0);
861 /* now pull in values for some timestamps, after disabling all props */
862 GST_TEST_OBJ (elem)->val_int = 0;
863 GST_TEST_OBJ (elem)->val_double = 0.0;
864 gst_object_set_control_bindings_disabled (GST_OBJECT (elem), TRUE);
865 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
866 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
867 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
868 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
869 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
870 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
871 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
872 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
873 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0);
875 /* now pull in values for some timestamps, enabling double again */
876 GST_TEST_OBJ (elem)->val_int = 0;
877 GST_TEST_OBJ (elem)->val_double = 0.0;
878 gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", FALSE);
879 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
880 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
881 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
882 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
883 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
884 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0);
885 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
886 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
887 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0);
889 /* now pull in values for some timestamps, enabling all */
890 GST_TEST_OBJ (elem)->val_int = 0;
891 GST_TEST_OBJ (elem)->val_double = 0.0;
892 gst_object_set_control_bindings_disabled (GST_OBJECT (elem), FALSE);
893 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
894 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
895 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0);
896 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
897 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
898 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0);
899 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
900 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
901 fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0);
903 gst_object_unref (csource1);
904 gst_object_unref (csource2);
905 gst_object_unref (elem);
911 GST_START_TEST (controller_interpolation_set_from_list)
913 GstInterpolationControlSource *csource;
914 GstTimedValueControlSource *tvcs;
915 GstControlSource *cs;
920 /* test that an invalid timestamp throws a warning of some sort */
921 elem = gst_element_factory_make ("testobj", NULL);
923 /* new interpolation control source */
924 csource = gst_interpolation_control_source_new ();
925 tvcs = (GstTimedValueControlSource *) csource;
926 cs = (GstControlSource *) csource;
928 fail_unless (csource != NULL);
929 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
931 /* set interpolation mode */
932 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
934 /* set control value */
935 tval = g_new0 (GstTimedValue, 1);
936 tval->timestamp = GST_CLOCK_TIME_NONE;
939 list = g_slist_append (list, tval);
941 fail_if (gst_timed_value_control_source_set_from_list (tvcs, list));
943 /* try again with a valid stamp, should work now */
945 fail_unless (gst_timed_value_control_source_set_from_list (tvcs, list));
947 /* allocated GstTimedValue now belongs to the controller, but list not */
950 gst_object_unref (csource);
951 gst_object_unref (elem);
957 /* test linear interpolation for ts < first control point */
958 GST_START_TEST (controller_interpolation_linear_before_ts0)
960 GstInterpolationControlSource *csource;
961 GstTimedValueControlSource *tvcs;
962 GstControlSource *cs;
965 elem = gst_element_factory_make ("testobj", NULL);
967 /* new interpolation control source */
968 csource = gst_interpolation_control_source_new ();
969 tvcs = (GstTimedValueControlSource *) csource;
970 cs = (GstControlSource *) csource;
972 fail_unless (csource != NULL);
973 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
975 /* set interpolation mode */
976 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
978 /* set control values */
979 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
980 fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 0.0));
982 /* now pull in values for some timestamps after first control point */
983 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
984 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
985 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
986 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
987 gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND);
988 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
990 /* now pull in values for some timestamps before first control point */
991 GST_TEST_OBJ (elem)->val_int = 25;
992 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
993 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
994 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
995 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
997 gst_object_unref (csource);
998 gst_object_unref (elem);
1003 /* test linear interpolation of enums */
1004 GST_START_TEST (controller_interpolation_linear_enums)
1006 GstInterpolationControlSource *csource;
1007 GstTimedValueControlSource *tvcs;
1008 GstControlSource *cs;
1011 elem = gst_element_factory_make ("testobj", NULL);
1013 /* new interpolation control source */
1014 csource = gst_interpolation_control_source_new ();
1015 tvcs = (GstTimedValueControlSource *) csource;
1016 cs = (GstControlSource *) csource;
1018 fail_unless (csource != NULL);
1019 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "enum", cs));
1021 /* set interpolation mode */
1022 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
1024 /* set control values */
1025 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
1026 fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 1.0));
1028 /* now pull in values going over the enum values */
1029 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
1030 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V0);
1031 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
1032 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V10);
1033 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
1034 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V11);
1035 gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND);
1036 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V12);
1037 gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND);
1038 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V255);
1040 gst_object_unref (csource);
1041 gst_object_unref (elem);
1046 /* test timed value counts */
1047 GST_START_TEST (controller_timed_value_count)
1049 GstInterpolationControlSource *csource;
1050 GstTimedValueControlSource *tvcs;
1051 GstControlSource *cs;
1054 elem = gst_element_factory_make ("testobj", NULL);
1056 /* new interpolation control source */
1057 csource = gst_interpolation_control_source_new ();
1058 tvcs = (GstTimedValueControlSource *) csource;
1059 cs = (GstControlSource *) csource;
1061 fail_unless (csource != NULL);
1062 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1064 /* set interpolation mode */
1065 g_object_set (csource, "mode", GST_INTERPOLATION_MODE_NONE, NULL);
1067 fail_unless (gst_timed_value_control_source_get_count (tvcs) == 0);
1069 /* set control values */
1070 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0));
1071 fail_unless (gst_timed_value_control_source_get_count (tvcs) == 1);
1072 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
1073 fail_unless (gst_timed_value_control_source_get_count (tvcs) == 2);
1075 /* unset control values */
1076 fail_unless (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND));
1077 fail_unless (gst_timed_value_control_source_get_count (tvcs) == 1);
1078 fail_unless (gst_timed_value_control_source_unset (tvcs, 0 * GST_SECOND));
1079 fail_unless (gst_timed_value_control_source_get_count (tvcs) == 0);
1081 gst_object_unref (csource);
1082 gst_object_unref (elem);
1088 /* test lfo control source with sine waveform */
1089 GST_START_TEST (controller_lfo_sine)
1091 GstLFOControlSource *csource;
1092 GstControlSource *cs;
1095 elem = gst_element_factory_make ("testobj", NULL);
1097 /* new lfo control source */
1098 csource = gst_lfo_control_source_new ();
1099 cs = (GstControlSource *) csource;
1101 fail_unless (csource != NULL);
1102 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1105 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE,
1106 "frequency", 1.0, "timeshift", (GstClockTime) 0,
1107 "amplitude", 0.5, "offset", 0.5, NULL);
1109 /* now pull in values for some timestamps */
1110 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1111 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1112 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1113 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1114 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1115 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1116 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1117 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1118 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1119 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1120 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1121 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1122 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1123 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1124 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1125 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1126 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1127 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1128 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1129 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1130 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1131 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1132 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1133 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1135 gst_object_unref (csource);
1136 gst_object_unref (elem);
1141 /* test lfo control source with sine waveform and timeshift */
1142 GST_START_TEST (controller_lfo_sine_timeshift)
1144 GstLFOControlSource *csource;
1145 GstControlSource *cs;
1148 elem = gst_element_factory_make ("testobj", NULL);
1150 /* new lfo control source */
1151 csource = gst_lfo_control_source_new ();
1152 cs = (GstControlSource *) csource;
1154 fail_unless (csource != NULL);
1155 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1158 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE,
1159 "frequency", 1.0, "timeshift", 250 * GST_MSECOND,
1160 "amplitude", 0.5, "offset", 0.5, NULL);
1162 /* now pull in values for some timestamps */
1163 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1164 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1165 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1166 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1167 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1168 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1169 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1170 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1171 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1172 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1173 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1174 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1175 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1176 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1177 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1178 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1179 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1180 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1181 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1182 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1183 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1184 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1185 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1186 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1188 gst_object_unref (csource);
1189 gst_object_unref (elem);
1194 /* test lfo control source with square waveform */
1195 GST_START_TEST (controller_lfo_square)
1197 GstLFOControlSource *csource;
1198 GstControlSource *cs;
1201 elem = gst_element_factory_make ("testobj", NULL);
1203 /* new lfo control source */
1204 csource = gst_lfo_control_source_new ();
1205 cs = (GstControlSource *) csource;
1207 fail_unless (csource != NULL);
1208 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1211 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SQUARE,
1212 "frequency", 1.0, "timeshift", (GstClockTime) 0,
1213 "amplitude", 0.5, "offset", 0.5, NULL);
1215 /* now pull in values for some timestamps */
1216 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1217 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1218 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1219 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1220 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1221 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1222 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1223 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1224 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1225 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1226 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1227 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1228 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1229 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1230 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1231 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1232 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1233 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1234 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1235 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1236 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1237 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1238 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1239 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1241 gst_object_unref (csource);
1242 gst_object_unref (elem);
1247 /* test lfo control source with saw waveform */
1248 GST_START_TEST (controller_lfo_saw)
1250 GstLFOControlSource *csource;
1251 GstControlSource *cs;
1254 elem = gst_element_factory_make ("testobj", NULL);
1256 /* new lfo control source */
1257 csource = gst_lfo_control_source_new ();
1258 cs = (GstControlSource *) csource;
1260 fail_unless (csource != NULL);
1261 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1264 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SAW,
1265 "frequency", 1.0, "timeshift", (GstClockTime) 0,
1266 "amplitude", 0.5, "offset", 0.5, NULL);
1268 /* now pull in values for some timestamps */
1269 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1270 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1271 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1272 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1273 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1274 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1275 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1276 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1277 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1278 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1279 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1280 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1281 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1282 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1283 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1284 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1285 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1286 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1287 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1288 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1289 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1290 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1291 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1292 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1294 gst_object_unref (csource);
1295 gst_object_unref (elem);
1300 /* test lfo control source with reverse saw waveform */
1301 GST_START_TEST (controller_lfo_rsaw)
1303 GstLFOControlSource *csource;
1304 GstControlSource *cs;
1307 elem = gst_element_factory_make ("testobj", NULL);
1309 /* new lfo control source */
1310 csource = gst_lfo_control_source_new ();
1311 cs = (GstControlSource *) csource;
1313 fail_unless (csource != NULL);
1314 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1317 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_REVERSE_SAW,
1318 "frequency", 1.0, "timeshift", (GstClockTime) 0,
1319 "amplitude", 0.5, "offset", 0.5, NULL);
1321 /* now pull in values for some timestamps */
1322 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1323 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1324 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1325 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1326 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1327 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1328 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1329 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1330 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1331 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1332 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1333 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1334 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1335 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1336 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1337 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1338 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1339 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1340 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1341 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25);
1342 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1343 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1344 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1345 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75);
1347 gst_object_unref (csource);
1348 gst_object_unref (elem);
1353 /* test lfo control source with saw waveform */
1354 GST_START_TEST (controller_lfo_triangle)
1356 GstLFOControlSource *csource;
1357 GstControlSource *cs;
1360 elem = gst_element_factory_make ("testobj", NULL);
1362 /* new lfo control source */
1363 csource = gst_lfo_control_source_new ();
1364 cs = (GstControlSource *) csource;
1366 fail_unless (csource != NULL);
1367 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1370 g_object_set (csource, "waveform", GST_LFO_WAVEFORM_TRIANGLE,
1371 "frequency", 1.0, "timeshift", (GstClockTime) 0,
1372 "amplitude", 0.5, "offset", 0.5, NULL);
1374 /* now pull in values for some timestamps */
1375 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1376 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1377 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1378 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1379 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1380 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1381 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1382 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1383 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1384 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1385 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1386 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1387 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1388 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1389 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1390 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1391 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1392 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1393 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1394 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1395 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1396 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1397 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1398 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1400 gst_object_unref (csource);
1401 gst_object_unref (elem);
1406 /* test lfo control source with nothing set */
1407 GST_START_TEST (controller_lfo_none)
1409 GstLFOControlSource *csource;
1410 GstControlSource *cs;
1413 elem = gst_element_factory_make ("testobj", NULL);
1415 /* new lfo control source */
1416 csource = gst_lfo_control_source_new ();
1417 cs = (GstControlSource *) csource;
1419 fail_unless (csource != NULL);
1420 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1422 /* now pull in values for some timestamps */
1423 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND);
1424 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1425 gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND);
1426 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1427 gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND);
1428 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1429 gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND);
1430 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1431 gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND);
1432 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1433 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1434 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1435 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1436 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1437 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1438 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1439 gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND);
1440 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1441 gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND);
1442 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1443 gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND);
1444 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1445 gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND);
1446 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1448 gst_object_unref (csource);
1449 gst_object_unref (elem);
1454 /* test timed value handling in trigger mode */
1455 GST_START_TEST (controller_trigger_exact)
1457 GstTriggerControlSource *csource;
1458 GstControlSource *cs;
1459 GstTimedValueControlSource *tvcs;
1463 elem = gst_element_factory_make ("testobj", NULL);
1465 /* new interpolation control source */
1466 csource = gst_trigger_control_source_new ();
1467 tvcs = (GstTimedValueControlSource *) csource;
1468 cs = (GstControlSource *) csource;
1470 fail_unless (csource != NULL);
1471 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int", cs));
1473 fail_if (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val));
1475 /* set control values */
1476 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.5));
1477 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
1479 /* now pull in values for some timestamps */
1480 fail_unless (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val));
1482 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
1483 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1485 GST_TEST_OBJ (elem)->val_int = 0;
1486 fail_if (gst_control_source_get_value (cs, 1 * GST_SECOND, &raw_val));
1487 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
1488 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1490 fail_unless (gst_control_source_get_value (cs, 2 * GST_SECOND, &raw_val));
1491 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
1492 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1494 gst_object_unref (csource);
1495 gst_object_unref (elem);
1500 GST_START_TEST (controller_trigger_tolerance)
1502 GstTriggerControlSource *csource;
1503 GstControlSource *cs;
1504 GstTimedValueControlSource *tvcs;
1508 elem = gst_element_factory_make ("testobj", NULL);
1510 /* new interpolation control source */
1511 csource = gst_trigger_control_source_new ();
1512 tvcs = (GstTimedValueControlSource *) csource;
1513 cs = (GstControlSource *) csource;
1515 fail_unless (csource != NULL);
1516 fail_unless (gst_object_set_control_source (GST_OBJECT (elem), "int",
1517 GST_CONTROL_SOURCE (csource)));
1519 g_object_set (csource, "tolerance", G_GINT64_CONSTANT (10), NULL);
1521 fail_if (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val));
1523 /* set control values */
1524 fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.5));
1525 fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0));
1527 /* now pull in values for some timestamps */
1528 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND);
1529 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1530 gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND + 5);
1531 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50);
1533 GST_TEST_OBJ (elem)->val_int = 0;
1534 gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND);
1535 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0);
1537 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND - 5);
1538 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1539 gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND);
1540 fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100);
1542 gst_object_unref (csource);
1543 gst_object_unref (elem);
1550 gst_controller_suite (void)
1552 Suite *s = suite_create ("Controller");
1553 TCase *tc = tcase_create ("general");
1555 suite_add_tcase (s, tc);
1556 tcase_add_checked_fixture (tc, setup, teardown);
1557 tcase_add_test (tc, controller_controlsource_empty1);
1558 tcase_add_test (tc, controller_controlsource_empty2);
1559 tcase_add_test (tc, controller_interpolation_none);
1560 tcase_add_test (tc, controller_interpolation_linear);
1561 tcase_add_test (tc, controller_interpolation_cubic);
1562 tcase_add_test (tc, controller_interpolation_cubic_too_few_cp);
1563 tcase_add_test (tc, controller_interpolation_unset);
1564 tcase_add_test (tc, controller_interpolation_unset_all);
1565 tcase_add_test (tc, controller_interpolation_linear_value_array);
1566 tcase_add_test (tc, controller_interpolation_linear_invalid_values);
1567 tcase_add_test (tc, controller_interpolation_linear_default_values);
1568 tcase_add_test (tc, controller_interpolation_linear_disabled);
1569 tcase_add_test (tc, controller_interpolation_set_from_list);
1570 tcase_add_test (tc, controller_interpolation_linear_before_ts0);
1571 tcase_add_test (tc, controller_interpolation_linear_enums);
1572 tcase_add_test (tc, controller_timed_value_count);
1573 tcase_add_test (tc, controller_lfo_sine);
1574 tcase_add_test (tc, controller_lfo_sine_timeshift);
1575 tcase_add_test (tc, controller_lfo_square);
1576 tcase_add_test (tc, controller_lfo_saw);
1577 tcase_add_test (tc, controller_lfo_rsaw);
1578 tcase_add_test (tc, controller_lfo_triangle);
1579 tcase_add_test (tc, controller_lfo_none);
1580 tcase_add_test (tc, controller_trigger_exact);
1581 tcase_add_test (tc, controller_trigger_tolerance);
1586 GST_CHECK_MAIN (gst_controller);