From: <sl...@ke...> - 2007-07-06 21:50:53
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: slomo Date: Fri Jul 06 2007 21:50:17 UTC Log message: Reviewed by: Stefan Kost <en...@us...> * libs/gst/controller/Makefile.am: * libs/gst/controller/gstcontroller.c: (gst_controlled_property_add_interpolation_control_source), (gst_controlled_property_new), (gst_controlled_property_free), (gst_controller_find_controlled_property), (gst_controller_new_valist), (gst_controller_new_list), (gst_controller_new), (gst_controller_remove_properties_valist), (gst_controller_remove_properties_list), (gst_controller_remove_properties), (gst_controller_set_property_disabled), (gst_controller_set_disabled), (gst_controller_set_control_source), (gst_controller_get_control_source), (gst_controller_get), (gst_controller_sync_values), (gst_controller_get_value_array), (_gst_controller_dispose), (gst_controller_get_type), (gst_controlled_property_set_interpolation_mode), (gst_controller_set), (gst_controller_set_from_list), (gst_controller_unset), (gst_controller_unset_all), (gst_controller_get_all), (gst_controller_set_interpolation_mode): * libs/gst/controller/gstcontroller.h: * libs/gst/controller/gstcontrollerprivate.h: * libs/gst/controller/gstcontrolsource.c: (gst_control_source_class_init), (gst_control_source_init), (gst_control_source_get_value), (gst_control_source_get_value_array), (gst_control_source_bind): * libs/gst/controller/gstcontrolsource.h: * libs/gst/controller/gsthelper.c: (gst_object_set_control_source), (gst_object_get_control_source): * libs/gst/controller/gstinterpolation.c: (gst_interpolation_control_source_find_control_point_node), (gst_interpolation_control_source_get_first_value), (_interpolate_none_get), (interpolate_none_get), (interpolate_none_get_boolean_value_array), (interpolate_none_get_enum_value_array), (interpolate_none_get_string_value_array), (_interpolate_trigger_get), (interpolate_trigger_get), (interpolate_trigger_get_boolean_value_array), (interpolate_trigger_get_enum_value_array), (interpolate_trigger_get_string_value_array): * libs/gst/controller/gstinterpolationcontrolsource.c: (gst_control_point_free), (gst_interpolation_control_source_reset), (gst_interpolation_control_source_new), (gst_interpolation_control_source_set_interpolation_mode), (gst_interpolation_control_source_bind), (gst_control_point_compare), (gst_control_point_find), (gst_interpolation_control_source_set_internal), (gst_interpolation_control_source_set), (gst_interpolation_control_source_set_from_list), (gst_interpolation_control_source_unset), (gst_interpolation_control_source_unset_all), (gst_interpolation_control_source_get_all), (gst_interpolation_control_source_get_count), (gst_interpolation_control_source_init), (gst_interpolation_control_source_finalize), (gst_interpolation_control_source_dispose), (gst_interpolation_control_source_class_init): * libs/gst/controller/gstinterpolationcontrolsource.h: * libs/gst/controller/gstinterpolationcontrolsourceprivate.h: API: Refactor GstController into the core controller which can take a GstControlSource for providing actual values for timestamps. Implement a interpolation control source and use this for backward compatibility, deprecate a bunch of functions that are now handled by GstControlSource or GstInterpolationControlSource. Make it possible to disable the controller completely or only for specific properties. Fixes #450711. * docs/libs/gstreamer-libs-docs.sgml: * docs/libs/gstreamer-libs-sections.txt: * docs/libs/gstreamer-libs.types: Add new functions and classes to the docs. * tests/check/libs/controller.c: (GST_START_TEST), (gst_controller_suite): * tests/examples/controller/audio-example.c: (main): Port unit test and example to the new API and add some new unit tests. Modified files: . : ChangeLog docs/libs : gstreamer-libs-docs.sgml gstreamer-libs-sections.txt gstreamer-libs.types libs/gst/controller: Makefile.am gstcontroller.c gstcontroller.h gstcontrollerprivate.h gsthelper.c gstinterpolation.c tests/check/libs: controller.c tests/examples/controller: audio-example.c Added files: libs/gst/controller: gstcontrolsource.c gstcontrolsource.h gstinterpolationcontrolsource.c gstinterpolationcontrolsource.h gstinterpolationcontrolsourceprivate.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.3312&r2=1.3313 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/libs/gstreamer-libs-docs.sgml.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/libs/gstreamer-libs-sections.txt.diff?r1=1.61&r2=1.62 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/libs/gstreamer-libs.types.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/Makefile.am.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstcontroller.c.diff?r1=1.49&r2=1.50 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstcontroller.h.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstcontrollerprivate.h.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstcontrolsource.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstcontrolsource.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gsthelper.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstinterpolation.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstinterpolationcontrolsource.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstinterpolationcontrolsource.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gstinterpolationcontrolsourceprivate.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/check/libs/controller.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/examples/controller/audio-example.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.3312 retrieving revision 1.3313 diff -u -d -r1.3312 -r1.3313 --- ChangeLog 5 Jul 2007 09:06:02 -0000 1.3312 +++ ChangeLog 6 Jul 2007 21:50:02 -0000 1.3313 @@ -1,3 +1,81 @@ +2007-07-06 Sebastian Dröge <sl...@ci...> + + Reviewed by: Stefan Kost <en...@us...> + * libs/gst/controller/Makefile.am: + * libs/gst/controller/gstcontroller.c: + (gst_controlled_property_add_interpolation_control_source), + (gst_controlled_property_new), (gst_controlled_property_free), + (gst_controller_find_controlled_property), + (gst_controller_new_valist), (gst_controller_new_list), + (gst_controller_new), (gst_controller_remove_properties_valist), + (gst_controller_remove_properties_list), + (gst_controller_remove_properties), + (gst_controller_set_property_disabled), + (gst_controller_set_disabled), (gst_controller_set_control_source), + (gst_controller_get_control_source), (gst_controller_get), + (gst_controller_sync_values), (gst_controller_get_value_array), + (_gst_controller_dispose), (gst_controller_get_type), + (gst_controlled_property_set_interpolation_mode), + (gst_controller_set), (gst_controller_set_from_list), + (gst_controller_unset), (gst_controller_unset_all), + (gst_controller_get_all), (gst_controller_set_interpolation_mode): + * libs/gst/controller/gstcontroller.h: + * libs/gst/controller/gstcontrollerprivate.h: + * libs/gst/controller/gstcontrolsource.c: + (gst_control_source_class_init), (gst_control_source_init), + (gst_control_source_get_value), + (gst_control_source_get_value_array), (gst_control_source_bind): + * libs/gst/controller/gstcontrolsource.h: + * libs/gst/controller/gsthelper.c: (gst_object_set_control_source), + (gst_object_get_control_source): + * libs/gst/controller/gstinterpolation.c: + (gst_interpolation_control_source_find_control_point_node), + (gst_interpolation_control_source_get_first_value), + (_interpolate_none_get), (interpolate_none_get), + (interpolate_none_get_boolean_value_array), + (interpolate_none_get_enum_value_array), + (interpolate_none_get_string_value_array), + (_interpolate_trigger_get), (interpolate_trigger_get), + (interpolate_trigger_get_boolean_value_array), + (interpolate_trigger_get_enum_value_array), + (interpolate_trigger_get_string_value_array): + * libs/gst/controller/gstinterpolationcontrolsource.c: + (gst_control_point_free), (gst_interpolation_control_source_reset), + (gst_interpolation_control_source_new), + (gst_interpolation_control_source_set_interpolation_mode), + (gst_interpolation_control_source_bind), + (gst_control_point_compare), (gst_control_point_find), + (gst_interpolation_control_source_set_internal), + (gst_interpolation_control_source_set), + (gst_interpolation_control_source_set_from_list), + (gst_interpolation_control_source_unset), + (gst_interpolation_control_source_unset_all), + (gst_interpolation_control_source_get_all), + (gst_interpolation_control_source_get_count), + (gst_interpolation_control_source_init), + (gst_interpolation_control_source_finalize), + (gst_interpolation_control_source_dispose), + (gst_interpolation_control_source_class_init): + * libs/gst/controller/gstinterpolationcontrolsource.h: + * libs/gst/controller/gstinterpolationcontrolsourceprivate.h: + API: Refactor GstController into the core controller which can take + a GstControlSource for providing actual values for timestamps. + Implement a interpolation control source and use this for backward + compatibility, deprecate a bunch of functions that are now handled + by GstControlSource or GstInterpolationControlSource. + Make it possible to disable the controller completely or only for + specific properties. Fixes #450711. + * docs/libs/gstreamer-libs-docs.sgml: + * docs/libs/gstreamer-libs-sections.txt: + * docs/libs/gstreamer-libs.types: + Add new functions and classes to the docs. + * tests/check/libs/controller.c: (GST_START_TEST), + (gst_controller_suite): + * tests/examples/controller/audio-example.c: (main): + Port unit test and example to the new API and add some new + unit tests. 2007-07-05 Wim Taymans <wim...@gm...> Patch by: Mark Nauwelaerts <manauw at skynet be> Index: Makefile.am RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/Makefile.am,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- Makefile.am 1 Jul 2006 23:26:06 -0000 1.7 +++ Makefile.am 6 Jul 2007 21:50:02 -0000 1.8 @@ -2,14 +2,21 @@ libgstcontroller_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/controller libgstcontroller_@GST_MAJORMINOR@_include_HEADERS = \ - gstcontroller.h -noinst_HEADERS = gstcontrollerprivate.h + gstcontroller.h \ + gstcontrolsource.h \ + gstinterpolationcontrolsource.h +noinst_HEADERS = \ + gstcontrollerprivate.h \ + gstinterpolationcontrolsourceprivate.h libgstcontroller_@GST_MAJORMINOR@_la_SOURCES = \ lib.c \ gstcontroller.c \ gstinterpolation.c \ - gsthelper.c + gsthelper.c \ + gstcontrolsource.c \ + gstinterpolationcontrolsource.c libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) libgstcontroller_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) Index: gstcontroller.c RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gstcontroller.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gstcontroller.c 14 Jun 2007 20:29:09 -0000 1.49 +++ gstcontroller.c 6 Jul 2007 21:50:02 -0000 1.50 @@ -53,13 +53,15 @@ * controller = g_object_control_properties(object, "prop1", "prop2",...); * </para></listitem> * <listitem><para> - * set how the controller will smooth inbetween values. - * gst_controller_set_interpolation_mode(controller,"prop1",mode); + * Get a #GstControlSource for the property and set it up. + * csource = gst_interpolation_control_source_new (); + * gst_interpolation_control_source_set_interpolation_mode(csource, mode); + * gst_interpolation_control_source_set (csource,0 * GST_SECOND, value1); + * gst_interpolation_control_source_set (csource,1 * GST_SECOND, value2); [...1246 lines suppressed...] + * Returns: %TRUE if the property is handled by the controller, %FALSE otherwise + */ +gboolean +gst_controller_set_interpolation_mode (GstController * self, + gchar * property_name, GstInterpolateMode mode) +{ + gboolean res = FALSE; + GstControlledProperty *prop; + g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE); + g_return_val_if_fail (property_name, FALSE); + g_mutex_lock (self->lock); + if ((prop = gst_controller_find_controlled_property (self, property_name))) { + res = gst_controlled_property_set_interpolation_mode (prop, mode); + } + g_mutex_unlock (self->lock); + return res; +} Index: gstcontroller.h RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gstcontroller.h,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstcontroller.h 21 May 2007 21:34:49 -0000 1.24 +++ gstcontroller.h 6 Jul 2007 21:50:02 -0000 1.25 @@ -30,6 +30,9 @@ #include <glib/gprintf.h> #include <gst/gst.h> +#include "gstcontrolsource.h" +#include "gstinterpolationcontrolsource.h" G_BEGIN_DECLS /** @@ -41,59 +44,6 @@ */ #define GST_PARAM_CONTROLLABLE (1 << (G_PARAM_USER_SHIFT + 1)) - -/** - * GstTimedValue: - * - * a structure for value+time - */ -typedef struct _GstTimedValue -{ - GstClockTime timestamp; /* timestamp of the value change */ - GValue value; /* the new value */ -} GstTimedValue; - * GstValueArray: - * @property_name: the name of the property this array belongs to - * @nbsamples: number of samples requested - * @sample_interval: interval between each sample - * @values: pointer to the array - * Structure to receive multiple values at once. -typedef struct _GstValueArray - gchar *property_name; - gint nbsamples; - GstClockTime sample_interval; - gpointer *values; -} GstValueArray; - * GstInterpolateMode: - * @GST_INTERPOLATE_NONE: steps-like interpolation, default - * @GST_INTERPOLATE_TRIGGER: returns the default value of the property, - * except for times with specific values - * @GST_INTERPOLATE_LINEAR: linear interpolation - * @GST_INTERPOLATE_QUADRATIC: square interpolation (not yet available) - * @GST_INTERPOLATE_CUBIC: cubic interpolation (not yet available) - * @GST_INTERPOLATE_USER: user-provided interpolation (not yet available) - * The various interpolation modes available. -typedef enum - GST_INTERPOLATE_NONE, - GST_INTERPOLATE_TRIGGER, - GST_INTERPOLATE_LINEAR, - GST_INTERPOLATE_QUADRATIC, - GST_INTERPOLATE_CUBIC, - GST_INTERPOLATE_USER -} GstInterpolateMode; /* type macros */ #define GST_TYPE_CONTROLLER (gst_controller_get_type ()) @@ -107,7 +57,6 @@ typedef struct _GstControllerClass GstControllerClass; typedef struct _GstControllerPrivate GstControllerPrivate; * GstController: * @@ -135,7 +84,7 @@ gpointer _gst_reserved[GST_PADDING]; }; -GType gst_controller_get_type (void); +GType gst_controller_get_type (); /* GstController functions */ @@ -149,33 +98,22 @@ GList *list); gboolean gst_controller_remove_properties (GstController * self, ...) G_GNUC_NULL_TERMINATED; -gboolean gst_controller_set (GstController * self, gchar * property_name, - GstClockTime timestamp, GValue * value); -gboolean gst_controller_set_from_list (GstController * self, - gchar * property_name, GSList * timedvalues); -gboolean gst_controller_unset (GstController * self, gchar * property_name, - GstClockTime timestamp); -gboolean gst_controller_unset_all (GstController * self, gchar * property_name); -GValue *gst_controller_get (GstController * self, gchar * property_name, -const GList *gst_controller_get_all (GstController * self, - gchar * property_name); +void gst_controller_set_disabled (GstController *self, gboolean disabled); +void gst_controller_set_property_disabled (GstController *self, gchar * property_name, gboolean disabled); +gboolean gst_controller_set_control_source (GstController *self, gchar * property_name, GstControlSource *csource); +GstControlSource * gst_controller_get_control_source (GstController *self, gchar * property_name); GstClockTime gst_controller_suggest_next_sync (GstController *self); gboolean gst_controller_sync_values (GstController * self, GstClockTime timestamp); +GValue *gst_controller_get (GstController * self, gchar * property_name, + GstClockTime timestamp); gboolean gst_controller_get_value_arrays (GstController * self, GstClockTime timestamp, GSList * value_arrays); gboolean gst_controller_get_value_array (GstController * self, GstClockTime timestamp, GstValueArray * value_array); -gboolean gst_controller_set_interpolation_mode (GstController * self, - gchar * property_name, GstInterpolateMode mode); /* GObject convenience functions */ GstController *gst_object_control_properties (GObject * object, ...) G_GNUC_NULL_TERMINATED; @@ -187,6 +125,9 @@ GstClockTime gst_object_suggest_next_sync (GObject * object); gboolean gst_object_sync_values (GObject * object, GstClockTime timestamp); +gboolean gst_object_set_control_source (GObject *object, gchar * property_name, GstControlSource *csource); +GstControlSource * gst_object_get_control_source (GObject *object, gchar * property_name); gboolean gst_object_get_value_arrays (GObject * object, gboolean gst_object_get_value_array (GObject * object, @@ -199,5 +140,25 @@ gboolean gst_controller_init (int * argc, char ***argv); +/* FIXME: deprecated functions */ +#ifndef GST_DISABLE_DEPRECATED +gboolean gst_controller_set (GstController * self, gchar * property_name, + GstClockTime timestamp, GValue * value); +gboolean gst_controller_set_from_list (GstController * self, + gchar * property_name, GSList * timedvalues); +gboolean gst_controller_unset (GstController * self, gchar * property_name, +gboolean gst_controller_unset_all (GstController * self, gchar * property_name); +const GList *gst_controller_get_all (GstController * self, + gchar * property_name); +gboolean gst_controller_set_interpolation_mode (GstController * self, + gchar * property_name, GstInterpolateMode mode); +#endif /* GST_DISABLE_DEPRECATED */ G_END_DECLS #endif /* __GST_CONTROLLER_H__ */ Index: gstcontrollerprivate.h RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gstcontrollerprivate.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstcontrollerprivate.h 9 Jun 2007 16:58:30 -0000 1.5 +++ gstcontrollerprivate.h 6 Jul 2007 21:50:02 -0000 1.6 @@ -28,97 +28,19 @@ #include "gstcontroller.h" -struct _GstControlledProperty; -typedef GValue *(*InterpolateGet) (struct _GstControlledProperty * prop, - GstClockTime timestamp); -typedef gboolean (*InterpolateGetValueArray) (struct _GstControlledProperty * prop, - GstClockTime timestamp, GstValueArray * value_array); - * GstInterpolateMethod: - * Function pointer structure to do user-defined interpolation methods -typedef struct _GstInterpolateMethod - InterpolateGet get_int; - InterpolateGetValueArray get_int_value_array; - InterpolateGet get_uint; - InterpolateGetValueArray get_uint_value_array; - InterpolateGet get_long; - InterpolateGetValueArray get_long_value_array; - InterpolateGet get_ulong; - InterpolateGetValueArray get_ulong_value_array; - InterpolateGet get_float; - InterpolateGetValueArray get_float_value_array; - InterpolateGet get_double; - InterpolateGetValueArray get_double_value_array; - InterpolateGet get_boolean; - InterpolateGetValueArray get_boolean_value_array; - InterpolateGet get_enum; - InterpolateGetValueArray get_enum_value_array; - InterpolateGet get_string; - InterpolateGetValueArray get_string_value_array; -} GstInterpolateMethod; - * GstControlPoint: - * a internal structure for value+time and various temporary - * values used for interpolation. This "inherits" from - * GstTimedValue. -/* FIXME 0.11: This should be merged with GstTimedValue for 0.11 */ -typedef struct _GstControlPoint - /* fields from GstTimedValue. DO NOT CHANGE! */ - /* internal fields */ - /* Caches for the interpolators */ - union { - struct { - gdouble h; - gdouble z; - } cubic; - } cache; -} GstControlPoint; * GstControlledProperty: typedef struct _GstControlledProperty { + GParamSpec *pspec; /* GParamSpec for this property */ gchar *name; /* name of the property */ - GType type; /* type of the handled property */ - GType base; /* base-type of the handled property */ - GValue default_value; /* default value for the handled property */ - GValue min_value; /* min value for the handled property */ - GValue max_value; /* max value for the handled property */ - GValue result_value; /* result value location for the interpolation method */ - GstControlPoint last_value; /* the last value a _sink call wrote */ - GstControlPoint live_value; /* temporary value override for live input */ - gulong notify_handler_id; /* id of the notify::<name> signal handler */ - GstInterpolateMode interpolation; /* Interpolation mode */ - /* TODO instead of *method, have pointers to get() and get_value_array() here - gst_controller_set_interpolation_mode() will pick the right ones for the - properties value type - GstInterpolateMethod *method; // User-implemented handler (if interpolation == GST_INTERPOLATE_USER) - */ - InterpolateGet get; - InterpolateGetValueArray get_value_array; - GList *values; /* List of GstControlPoint */ - gint nvalues; /* Number of control points */ - GList *last_requested_value; /* last search result, can be used for incremental searches */ - gboolean valid_cache; + GstControlSource *csource; /* GstControlSource for this property */ + gboolean disabled; } GstControlledProperty; #define GST_CONTROLLED_PROPERTY(obj) ((GstControlledProperty *)(obj)) --- NEW FILE: gstcontrolsource.c --- /* GStreamer * * Copyright (C) 2007 Sebastian Dröge <sl...@ci...> * gstcontrolsource.c: Interface declaration for control sources * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:gstcontrolsource * @short_description: base class for control source sources * The #GstControlSource is a base class for control value sources that could * be used by #GstController to get timestamp-value pairs. * A #GstControlSource is used by first getting an instance, binding it to a * #GParamSpec (for example by using gst_controller_set_control_source()) and * then by having it used by the #GstController or calling * gst_control_source_get_value() or gst_control_source_get_value_array(). * For implementing a new #GstControlSource one has to implement a * #GstControlSourceBind method, which will depending on the #GParamSpec set up * the control source for use and sets the #GstControlSourceGetValue and * #GstControlSourceGetValueArray functions. These are then used by * gst_control_source_get_value() or gst_control_source_get_value_array() * to get values for specific timestamps. #include <glib-object.h> #include <gst/gst.h> #include "gstcontrolsource.h" #define GST_CAT_DEFAULT gst_controller_debug GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT); static void gst_control_source_class_init (GstControlSourceClass * klass); static void gst_control_source_init (GstControlSource * self); G_DEFINE_ABSTRACT_TYPE (GstControlSource, gst_control_source, G_TYPE_OBJECT); static GObjectClass *parent_class = NULL; static void gst_control_source_class_init (GstControlSourceClass * klass) { //GObjectClass *gobject_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); /* Has to be implemented by children */ klass->bind = NULL; } gst_control_source_init (GstControlSource * self) /* Set default handlers that print a warning */ self->get_value = NULL; self->get_value_array = NULL; self->bound = FALSE; * gst_control_source_get_value: * @self: the #GstControlSource object * @timestamp: the time for which the value should be returned * @value: the value * Gets the value for this #GstControlSource at a given timestamp. * Returns: FALSE if the value couldn't be returned, TRUE otherwise. gboolean gst_control_source_get_value (GstControlSource * self, GstClockTime timestamp, GValue * value) g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE); if (self->get_value) { return self->get_value (self, timestamp, value); } else { GST_ERROR ("Not bound to a specific property yet!"); return FALSE; } * gst_control_source_get_value_array: * @timestamp: the time that should be processed * @value_array: array to put control-values in * Gets an array of values for one element property. * All fields of @value_array must be filled correctly. Especially the * @value_array->values array must be big enough to keep the requested amount * of values. * The type of the values in the array is the same as the property's type. * Returns: %TRUE if the given array could be filled, %FALSE otherwise gst_control_source_get_value_array (GstControlSource * self, GstClockTime timestamp, GstValueArray * value_array) if (self->get_value_array) { return self->get_value_array (self, timestamp, value_array); * gst_control_source_bind: * @pspec: #GParamSpec for the property for which this #GstControlSource should generate values. * Binds a #GstControlSource to a specific property. This must be called only once for a * #GstControlSource. * Returns: %TRUE if the #GstControlSource was bound correctly, %FALSE otherwise. gst_control_source_bind (GstControlSource * self, GParamSpec * pspec) gboolean ret = FALSE; g_return_val_if_fail (GST_CONTROL_SOURCE_GET_CLASS (self)->bind, FALSE); g_return_val_if_fail (!self->bound, FALSE); ret = GST_CONTROL_SOURCE_GET_CLASS (self)->bind (self, pspec); if (ret) self->bound = TRUE; return ret; --- NEW FILE: gstcontrolsource.h --- * gstcontrolsource.h: Interface declaration for control sources #ifndef __GST_CONTROL_SOURCE_H__ #define __GST_CONTROL_SOURCE_H__ G_BEGIN_DECLS #define GST_TYPE_CONTROL_SOURCE \ (gst_control_source_get_type()) #define GST_CONTROL_SOURCE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CONTROL_SOURCE,GstControlSource)) #define GST_CONTROL_SOURCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CONTROL_SOURCE,GstControlSourceClass)) #define GST_IS_CONTROL_SOURCE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CONTROL_SOURCE)) #define GST_IS_CONTROL_SOURCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CONTROL_SOURCE)) #define GST_CONTROL_SOURCE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CONTOL_SOURCE, GstControlSourceClass)) typedef struct _GstControlSource GstControlSource; typedef struct _GstControlSourceClass GstControlSourceClass; typedef struct _GstTimedValue GstTimedValue; typedef struct _GstValueArray GstValueArray; * GstTimedValue: * Structure for saving a timestamp and a value. struct _GstTimedValue GstClockTime timestamp; /* timestamp of the value change */ GValue value; /* the corresponding value */ }; * GstValueArray: * @property_name: the name of the property this array belongs to * @nbsamples: number of samples requested * @sample_interval: interval between each sample * @values: pointer to the array * Structure to receive multiple values at once. struct _GstValueArray gchar *property_name; gint nbsamples; GstClockTime sample_interval; gpointer *values; /** * GstControlSourceGetValue * @self: the #GstControlSource instance * @timestamp: timestamp for which a value should be calculated * @value: a #GValue which will be set to the result. It must be initialized to the correct type. * Function for returning a value for a given timestamp. * Returns: %TRUE if the value was successfully calculated. typedef gboolean (* GstControlSourceGetValue) (GstControlSource *self, GstClockTime timestamp, GValue *value); * GstControlSourceGetValueArray * Function for returning a #GstValueArray for a given timestamp. * Returns: %TRUE if the values were successfully calculated. typedef gboolean (* GstControlSourceGetValueArray) (GstControlSource *self, GstClockTime timestamp, GstValueArray *value_array); * GstControlSourceBind * @pspec: #GParamSpec that should be bound to * Function for binding a #GstControlSource to a #GParamSpec. * Returns: %TRUE if the property could be bound to the #GstControlSource, %FALSE otherwise. typedef gboolean (* GstControlSourceBind) (GstControlSource *self, GParamSpec *pspec); * GstControlSource: * @get_value: Function for returning a value for a given timestamp * @get_value_array: Function for returning a #GstValueArray for a given timestamp * The instance structure of #GstControlSource. struct _GstControlSource { GObject parent; /*< public >*/ GstControlSourceGetValue get_value; /* Returns the value for a property at a given timestamp */ GstControlSourceGetValueArray get_value_array; /* Returns values for a property in a given timespan */ /*< private >*/ gboolean bound; gpointer _gst_reserved[GST_PADDING]; * GstControlSourceClass: * @parent_class: Parent class * @bind: Class method for binding the #GstControlSource to a specific GParamSpec * The class structure of #GstControlSource. struct _GstControlSourceClass GObjectClass parent_class; GstControlSourceBind bind; /* Binds the GstControlSource to a specific GParamSpec */ GType gst_control_source_get_type (); /* Functions */ gboolean gst_control_source_get_value (GstControlSource *self, GstClockTime timestamp, GValue *value); gboolean gst_control_source_get_value_array (GstControlSource *self, GstClockTime timestamp, GstValueArray *value_array); gboolean gst_control_source_bind (GstControlSource *self, GParamSpec *pspec); G_END_DECLS #endif /* __GST_CONTROL_SOURCE_H__ */ Index: gsthelper.c RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gsthelper.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gsthelper.c 17 May 2007 17:37:58 -0000 1.14 +++ gsthelper.c 6 Jul 2007 21:50:02 -0000 1.15 @@ -148,7 +148,6 @@ /** * gst_object_suggest_next_sync: * @object: the object that has controlled properties - * @timestamp: the time that should be processed * Convenience function for GObject @@ -193,6 +192,61 @@ } + * gst_object_set_control_source: + * @object: the controller object + * @property_name: name of the property for which the #GstControlSource should be set + * @csource: the #GstControlSource that should be used for the property + * + * Sets the #GstControlSource for @property_name. If there already was a #GstControlSource + * for this property it will be unreferenced. + * Returns: %FALSE if the given property isn't handled by the controller or the new #GstControlSource + * couldn't be bound to the property, %TRUE if everything worked as expected. + * Since: 0.10.14 +gst_object_set_control_source (GObject * object, gchar * property_name, + GstControlSource * csource) + GstController *ctrl = NULL; + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + g_return_val_if_fail (GST_IS_CONTROL_SOURCE (csource), FALSE); + if ((ctrl = g_object_get_qdata (object, __gst_controller_key))) { + return gst_controller_set_control_source (ctrl, property_name, csource); + return FALSE; +/** + * gst_object_get_control_source: + * @object: the object + * @property_name: name of the property for which the #GstControlSource should be get + * Gets the corresponding #GstControlSource for the property. This should be unreferenced + * again after use. + * Returns: the #GstControlSource for @property_name or NULL if the property is not + * controlled by this controller or no #GstControlSource was assigned yet. +GstControlSource * +gst_object_get_control_source (GObject * object, gchar * property_name) + return gst_controller_get_control_source (ctrl, property_name); * gst_object_get_value_arrays: * @timestamp: the time that should be processed Index: gstinterpolation.c RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gstinterpolation.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstinterpolation.c 11 Jun 2007 07:14:53 -0000 1.21 +++ gstinterpolation.c 6 Jul 2007 21:50:02 -0000 1.22 @@ -24,8 +24,9 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include "gstcontrollerprivate.h" -#include "gstcontroller.h" +#include "gstinterpolationcontrolsourceprivate.h" #define GST_CAT_DEFAULT gst_controller_debug GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT); @@ -33,28 +34,29 @@ /* common helper */ /* - * gst_controlled_property_find_control_point_node: - * @prop: the controlled property to search in + * gst_interpolation_control_source_find_control_point_node: + * @self: the interpolation control source to search in * @timestamp: the search key * Find last value before given timestamp in control point list. * Returns: the found #GList node or %NULL -GList * -gst_controlled_property_find_control_point_node (GstControlledProperty * prop, - GstClockTime timestamp) +static GList *gst_interpolation_control_source_find_control_point_node + (GstInterpolationControlSource * self, GstClockTime timestamp) - GList *prev_node = g_list_last (prop->values); + GList *prev_node = g_list_last (self->priv->values); GList *node; GstControlPoint *cp; - node = prop->values; - if (prop->last_requested_value) { - GstControlPoint *last_cp = prop->last_requested_value->data; + /* Check if we can start from the last requested value + * to save some time */ + node = self->priv->values; + if (self->priv->last_requested_value) { + GstControlPoint *last_cp = self->priv->last_requested_value->data; if (timestamp > last_cp->timestamp) - node = prop->last_requested_value; + node = self->priv->last_requested_value; } /* iterate over timed value list */ @@ -68,286 +70,476 @@ } + /* If we have something to return save it as a + * potential start position for the next search */ if (prev_node) - prop->last_requested_value = prev_node; + self->priv->last_requested_value = prev_node; return prev_node; -/* steps-like (no-)interpolation, default */ -/* just returns the value for the most recent key-frame */ -static GValue * -interpolate_none_get (GstControlledProperty * prop, GstClockTime timestamp) +/* + * gst_interpolation_control_source_get_first_value: + * 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) - GList *node; - if ((node = - gst_controlled_property_find_control_point_node (prop, timestamp))) { - GstControlPoint *cp = node->data; + if (self->priv->values && self->priv->nvalues > 0) { + GstControlPoint *cp = self->priv->values->data; return &cp->value; + } else { + return NULL; - return &prop->default_value; -#define interpolate_none_get_boolean interpolate_none_get +/* steps-like (no-)interpolation, default */ +/* just returns the value for the most recent key-frame */ #define DEFINE_NONE_GET(type) \ -static GValue * \ -interpolate_none_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +static inline GValue * \ +_interpolate_none_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp) \ { \ + GValue *ret; \ GList *node; \ \ if ((node = \ - gst_controlled_property_find_control_point_node (prop, timestamp))) { \ + gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \ GstControlPoint *cp = node->data; \ - g##type ret = g_value_get_##type (&cp->value); \ - if (g_value_get_##type (&prop->min_value) > ret) \ - return &prop->min_value; \ - else if (g_value_get_##type (&prop->max_value) < ret) \ - return &prop->max_value; \ - return &cp->value; \ + g##type ret_val = g_value_get_##type (&cp->value); \ + \ + if (g_value_get_##type (&self->priv->minimum_value) > ret_val) \ + ret = &self->priv->minimum_value; \ + else if (g_value_get_##type (&self->priv->maximum_value) < ret_val) \ + ret = &self->priv->maximum_value; \ + else \ + ret = &cp->value; \ + } else { \ + ret = gst_interpolation_control_source_get_first_value (self); \ } \ - return &prop->default_value; \ -} -DEFINE_NONE_GET (int); -DEFINE_NONE_GET (uint); -DEFINE_NONE_GET (long); -DEFINE_NONE_GET (ulong); -DEFINE_NONE_GET (float); -DEFINE_NONE_GET (double); -#define DEFINE_NONE_GET_VALUE_ARRAY(type) \ + return ret; \ +} \ +\ static gboolean \ -interpolate_none_get_##type##_value_array (GstControlledProperty * prop, \ +interpolate_none_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \ +{ \ + g_mutex_lock (self->lock); \ + \ + ret = _interpolate_none_get_##type (self, timestamp); \ + if (!ret) { \ + g_mutex_unlock (self->lock); \ + return FALSE; \ + } \ + g_value_copy (ret, value); \ + g_mutex_unlock (self->lock); \ + return TRUE; \ +static gboolean \ +interpolate_none_get_##type##_value_array (GstInterpolationControlSource *self, \ GstClockTime timestamp, GstValueArray * value_array) \ gint i; \ GstClockTime ts = timestamp; \ g##type *values = (g##type *) value_array->values; \ for(i = 0; i < value_array->nbsamples; i++) { \ - *values = g_value_get_##type (interpolate_none_get_##type (prop,ts)); \ + ret = _interpolate_none_get_##type (self, timestamp); \ + if (!ret) { \ + g_mutex_unlock (self->lock); \ + return FALSE; \ + } \ + *values = g_value_get_##type (ret); \ ts += value_array->sample_interval; \ values++; \ return TRUE; \ -DEFINE_NONE_GET_VALUE_ARRAY (int); -DEFINE_NONE_GET_VALUE_ARRAY (uint); -DEFINE_NONE_GET_VALUE_ARRAY (long); +DEFINE_NONE_GET (int); +DEFINE_NONE_GET (uint); +DEFINE_NONE_GET (long); -DEFINE_NONE_GET_VALUE_ARRAY (ulong); -DEFINE_NONE_GET_VALUE_ARRAY (float); -DEFINE_NONE_GET_VALUE_ARRAY (double); +DEFINE_NONE_GET (ulong); +DEFINE_NONE_GET (int64); +DEFINE_NONE_GET (uint64); +DEFINE_NONE_GET (float); +DEFINE_NONE_GET (double); -DEFINE_NONE_GET_VALUE_ARRAY (boolean); +_interpolate_none_get (GstInterpolationControlSource * self, + GstClockTime timestamp) + GList *node; + GValue *ret; + if ((node = + gst_interpolation_control_source_find_control_point_node (self, + timestamp))) { + GstControlPoint *cp = node->data; + ret = &cp->value; + ret = gst_interpolation_control_source_get_first_value (self); + return ret; static gboolean -interpolate_none_get_enum_value_array (GstControlledProperty * prop, +interpolate_none_get (GstInterpolationControlSource * self, + GstClockTime timestamp, GValue * value) + ret = _interpolate_none_get (self, timestamp); + if (!ret) { + g_mutex_unlock (self->lock); + return FALSE; + g_value_copy (ret, value); + return TRUE; +static gboolean +interpolate_none_get_boolean_value_array (GstInterpolationControlSource * self, + GstClockTime timestamp, GstValueArray * value_array) + gint i; + GstClockTime ts = timestamp; + gboolean *values = (gboolean *) value_array->values; + for (i = 0; i < value_array->nbsamples; i++) { + ret = _interpolate_none_get (self, timestamp); + if (!ret) { + g_mutex_unlock (self->lock); + return FALSE; + } + *values = g_value_get_boolean (ret); + ts += value_array->sample_interval; + values++; +interpolate_none_get_enum_value_array (GstInterpolationControlSource * self, GstClockTime timestamp, GstValueArray * value_array) gint i; GstClockTime ts = timestamp; gint *values = (gint *) value_array->values; for (i = 0; i < value_array->nbsamples; i++) { - *values = g_value_get_enum (interpolate_none_get (prop, ts)); + *values = g_value_get_enum (ret); ts += value_array->sample_interval; values++; return TRUE; -interpolate_none_get_string_value_array (GstControlledProperty * prop, +interpolate_none_get_string_value_array (GstInterpolationControlSource * self, gchar **values = (gchar **) value_array->values; - *values = (gchar *) g_value_get_string (interpolate_none_get (prop, ts)); + *values = (gchar *) g_value_get_string (ret); static GstInterpolateMethod interpolate_none = { - interpolate_none_get_int, - interpolate_none_get_int_value_array, - interpolate_none_get_uint, - interpolate_none_get_uint_value_array, - interpolate_none_get_long, - interpolate_none_get_long_value_array, - interpolate_none_get_ulong, - interpolate_none_get_ulong_value_array, - interpolate_none_get_float, - interpolate_none_get_float_value_array, - interpolate_none_get_double, - interpolate_none_get_double_value_array, - interpolate_none_get, - interpolate_none_get_boolean_value_array, - interpolate_none_get_enum_value_array, - interpolate_none_get_string_value_array + (GstControlSourceGetValue) interpolate_none_get_int, + (GstControlSourceGetValueArray) interpolate_none_get_int_value_array, + (GstControlSourceGetValue) interpolate_none_get_uint, + (GstControlSourceGetValueArray) interpolate_none_get_uint_value_array, + (GstControlSourceGetValue) interpolate_none_get_long, + (GstControlSourceGetValueArray) interpolate_none_get_long_value_array, + (GstControlSourceGetValue) interpolate_none_get_ulong, + (GstControlSourceGetValueArray) interpolate_none_get_ulong_value_array, + (GstControlSourceGetValue) interpolate_none_get_int64, + (GstControlSourceGetValueArray) interpolate_none_get_int64_value_array, + (GstControlSourceGetValue) interpolate_none_get_uint64, + (GstControlSourceGetValueArray) interpolate_none_get_uint64_value_array, + (GstControlSourceGetValue) interpolate_none_get_float, + (GstControlSourceGetValueArray) interpolate_none_get_float_value_array, + (GstControlSourceGetValue) interpolate_none_get_double, + (GstControlSourceGetValueArray) interpolate_none_get_double_value_array, + (GstControlSourceGetValue) interpolate_none_get, + (GstControlSourceGetValueArray) interpolate_none_get_boolean_value_array, + (GstControlSourceGetValueArray) interpolate_none_get_enum_value_array, + (GstControlSourceGetValueArray) interpolate_none_get_string_value_array /* returns the default value of the property, except for times with specific values */ /* needed for one-shot events, such as notes and triggers */ -interpolate_trigger_get (GstControlledProperty * prop, GstClockTime timestamp) - GstControlPoint *cp; - /* check if there is a value at the registered timestamp */ - cp = node->data; - if (timestamp == cp->timestamp) { - return &cp->value; - } - } -#define interpolate_trigger_get_boolean interpolate_trigger_get #define DEFINE_TRIGGER_GET(type) \ -interpolate_trigger_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +_interpolate_trigger_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp) \ GstControlPoint *cp; \ /* check if there is a value at the registered timestamp */ \ cp = node->data; \ if (timestamp == cp->timestamp) { \ g##type ret = g_value_get_##type (&cp->value); \ - if (g_value_get_##type (&prop->min_value) > ret) \ - return &prop->min_value; \ - else if (g_value_get_##type (&prop->max_value) < ret) \ - return &prop->max_value; \ - return &cp->value; \ + if (g_value_get_##type (&self->priv->minimum_value) > ret) \ + return &self->priv->minimum_value; \ + else if (g_value_get_##type (&self->priv->maximum_value) < ret) \ + return &self->priv->maximum_value; \ + else \ + return &cp->value; \ } \ -DEFINE_TRIGGER_GET (int); -DEFINE_TRIGGER_GET (uint); -DEFINE_TRIGGER_GET (long); -DEFINE_TRIGGER_GET (ulong); -DEFINE_TRIGGER_GET (float); -DEFINE_TRIGGER_GET (double); -#define DEFINE_TRIGGER_GET_VALUE_ARRAY(type) \ + if (self->priv->nvalues > 0) \ + return &self->priv->default_value; \ + else \ + return NULL; \ -interpolate_trigger_get_##type##_value_array (GstControlledProperty * prop, \ +interpolate_trigger_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \ + ret = _interpolate_trigger_get_##type (self, timestamp); \ +interpolate_trigger_get_##type##_value_array (GstInterpolationControlSource *self, \ - *values = g_value_get_##type (interpolate_trigger_get_##type (prop,ts)); \ + ret = _interpolate_trigger_get_##type (self, timestamp); \ -DEFINE_TRIGGER_GET_VALUE_ARRAY (int); -DEFINE_TRIGGER_GET_VALUE_ARRAY (uint); -DEFINE_TRIGGER_GET_VALUE_ARRAY (long); +DEFINE_TRIGGER_GET (int); -DEFINE_TRIGGER_GET_VALUE_ARRAY (ulong); -DEFINE_TRIGGER_GET_VALUE_ARRAY (float); -DEFINE_TRIGGER_GET_VALUE_ARRAY (double); +DEFINE_TRIGGER_GET (uint); +DEFINE_TRIGGER_GET (long); -DEFINE_TRIGGER_GET_VALUE_ARRAY (boolean); +DEFINE_TRIGGER_GET (ulong); +DEFINE_TRIGGER_GET (int64); +DEFINE_TRIGGER_GET (uint64); +DEFINE_TRIGGER_GET (float); +DEFINE_TRIGGER_GET (double); +_interpolate_trigger_get (GstInterpolationControlSource * self, + GstControlPoint *cp; + /* check if there is a value at the registered timestamp */ + cp = node->data; + if (timestamp == cp->timestamp) { + return &cp->value; + if (self->priv->nvalues > 0) + return &self->priv->default_value; + else -interpolate_trigger_get_enum_value_array (GstControlledProperty * prop, - GstClockTime timestamp, GstValueArray * value_array) +interpolate_trigger_get (GstInterpolationControlSource * self, + ret = _interpolate_trigger_get (self, timestamp); +interpolate_trigger_get_boolean_value_array (GstInterpolationControlSource * + self, GstClockTime timestamp, GstValueArray * value_array) - *values = g_value_get_enum (interpolate_trigger_get (prop, ts)); + ret = _interpolate_trigger_get (self, timestamp); -interpolate_trigger_get_string_value_array (GstControlledProperty * prop, +interpolate_trigger_get_enum_value_array (GstInterpolationControlSource * self, + gint *values = (gint *) value_array->values; +interpolate_trigger_get_string_value_array (GstInterpolationControlSource * - *values = (gchar *) g_value_get_string (interpolate_trigger_get (prop, ts)); static GstInterpolateMethod interpolate_trigger = { - interpolate_trigger_get_int, - interpolate_trigger_get_int_value_array, - interpolate_trigger_get_uint, - interpolate_trigger_get_uint_value_array, - interpolate_trigger_get_long, - interpolate_trigger_get_long_value_array, - interpolate_trigger_get_ulong, - interpolate_trigger_get_ulong_value_array, - interpolate_trigger_get_float, - interpolate_trigger_get_float_value_array, - interpolate_trigger_get_double, - interpolate_trigger_get_double_value_array, - interpolate_trigger_get, - interpolate_trigger_get_boolean_value_array, - interpolate_trigger_get_enum_value_array, - interpolate_trigger_get_string_value_array + (GstControlSourceGetValue) interpolate_trigger_get_int, + (GstControlSourceGetValueArray) interpolate_trigger_get_int_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_uint, + (GstControlSourceGetValueArray) interpolate_trigger_get_uint_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_long, + (GstControlSourceGetValueArray) interpolate_trigger_get_long_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_ulong, + (GstControlSourceGetValueArray) interpolate_trigger_get_ulong_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_int64, + (GstControlSourceGetValueArray) interpolate_trigger_get_int64_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_uint64, + (GstControlSourceGetValueArray) interpolate_trigger_get_uint64_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_float, + (GstControlSourceGetValueArray) interpolate_trigger_get_float_value_array, + (GstControlSourceGetValue) interpolate_trigger_get_double, + (GstControlSourceGetValueArray) interpolate_trigger_get_double_value_array, + (GstControlSourceGetValue) interpolate_trigger_get, + (GstControlSourceGetValueArray) interpolate_trigger_get_boolean_value_array, + (GstControlSourceGetValueArray) interpolate_trigger_get_enum_value_array, + (GstControlSourceGetValueArray) interpolate_trigger_get_string_value_array /* linear interpolation */ /* smoothes inbetween values */ #define DEFINE_LINEAR_GET(type) \ -static g##type \ -_interpolate_linear_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +static inline gboolean \ +_interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \ - g##type ret; \ - if ((node = gst_controlled_property_find_control_point_node (prop, timestamp))) { \ + if ((node = gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \ GstControlPoint *cp1, *cp2; \ \ cp1 = node->data; \ @@ -361,38 +553,53 @@ value2 = g_value_get_##type (&cp2->value); \ slope = (gdouble) (value2 - value1) / gst_guint64_to_gdouble (cp2->timestamp - cp1->timestamp); \ \ - ret = (g##type) (value1 + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \ + *ret = (g##type) (value1 + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \ else { \ - ret = g_value_get_##type (&cp1->value); \ + *ret = g_value_get_##type (&cp1->value); \ } else { \ - ret = g_value_get_##type (&prop->default_value); \ + GValue *first = gst_interpolation_control_source_get_first_value (self); \ + if (!first) \ + *ret = g_value_get_##type (first); \ - ret = CLAMP (ret, g_value_get_##type (&prop->min_value), g_value_get_##type (&prop->max_value)); \ - return ret; \ + *ret = CLAMP (*ret, g_value_get_##type (&self->priv->minimum_value), g_value_get_##type (&self->priv->maximum_value)); \ } \ \ -interpolate_linear_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \ - g_value_set_##type (&prop->result_value,_interpolate_linear_get_##type (prop,timestamp)); \ - return &prop->result_value; \ + g##type ret; \ + if (_interpolate_linear_get_##type (self, timestamp, &ret)) { \ + g_value_set_##type (value, ret); \ + return TRUE; \ + return FALSE; \ -interpolate_linear_get_##type##_value_array (GstControlledProperty * prop, \ +interpolate_linear_get_##type##_value_array (GstInterpolationControlSource *self, \ - *values = _interpolate_linear_get_##type (prop, ts); \ + if (! _interpolate_linear_get_##type (self, ts, values)) { \ @@ -402,28 +609,34 @@ DEFINE_LINEAR_GET (long); DEFINE_LINEAR_GET (ulong); +DEFINE_LINEAR_GET (int64); +DEFINE_LINEAR_GET (uint64); DEFINE_LINEAR_GET (float); DEFINE_LINEAR_GET (double); static GstInterpolateMethod interpolate_linear = { - interpolate_linear_get_int, - interpolate_linear_get_int_value_array, - interpolate_linear_get_uint, - interpolate_linear_get_uint_value_array, - interpolate_linear_get_long, - interpolate_linear_get_long_value_array, - interpolate_linear_get_ulong, - interpolate_linear_get_ulong_value_array, - interpolate_linear_get_float, - interpolate_linear_get_float_value_array, - interpolate_linear_get_double, - interpolate_linear_get_double_value_array, - NULL, - NULL + (GstControlSourceGetValue) interpolate_linear_get_int, + (GstControlSourceGetValueArray) interpolate_linear_get_int_value_array, + (GstControlSourceGetValue) interpolate_linear_get_uint, + (GstControlSourceGetValueArray) interpolate_linear_get_uint_value_array, + (GstControlSourceGetValue) interpolate_linear_get_long, + (GstControlSourceGetValueArray) interpolate_linear_get_long_value_array, + (GstControlSourceGetValue) interpolate_linear_get_ulong, + (GstControlSourceGetValueArray) interpolate_linear_get_ulong_value_array, + (GstControlSourceGetValue) interpolate_linear_get_int64, + (GstControlSourceGetValueArray) interpolate_linear_get_int64_value_array, + (GstControlSourceGetValue) interpolate_linear_get_uint64, + (GstControlSourceGetValueArray) interpolate_linear_get_uint64_value_array, + (GstControlSourceGetValue) interpolate_linear_get_float, + (GstControlSourceGetValueArray) interpolate_linear_get_float_value_array, + (GstControlSourceGetValue) interpolate_linear_get_double, + (GstControlSourceGetValueArray) interpolate_linear_get_double_value_array, + (GstControlSourceGetValue) NULL, + (GstControlSourceGetValueArray) NULL, + (GstControlSourceGetValueArray) NULL /* square interpolation */ @@ -445,9 +658,9 @@ #define DEFINE_CUBIC_GET(type) \ static void \ -_interpolate_cubic_update_cache_##type (GstControlledProperty *prop) \ +_interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \ - gint i, n = prop->nvalues; \ + gint i, n = self->priv->nvalues; \ gdouble *o = g_new0 (gdouble, n); \ gdouble *p = g_new0 (gdouble, n); \ gdouble *q = g_new0 (gdouble, n); \ @@ -462,7 +675,7 @@ g##type y_prev, y, y_next; \ /* Fill linear system of equations */ \ - node = prop->values; \ + node = self->priv->values; \ cp = node->data; \ x = cp->timestamp; \ y = g_value_get_##type (&cp->value); \ @@ -508,7 +721,7 @@ /* Save cache next in the GstControlPoint */ \ for (i = 0; i < n; i++) { \ cp->cache.cubic.h = h[i]; \ @@ -525,21 +738,20 @@ g_free (z); \ -_interpolate_cubic_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +_interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \ - if (prop->nvalues <= 2) \ - return _interpolate_linear_get_##type (prop, timestamp); \ + if (self->priv->nvalues <= 2) \ + return _interpolate_linear_get_##type (self, timestamp, ret); \ - if (!prop->valid_cache) { \ - _interpolate_cubic_update_cache_##type (prop); \ - prop->valid_cache = TRUE; \ + if (!self->priv->valid_cache) { \ + _interpolate_cubic_update_cache_##type (self); \ + self->priv->valid_cache = TRUE; \ @@ -560,38 +772,53 @@ out += (value2 / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \ out += (value1 / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \ - ret = (g##type) out; \ + *ret = (g##type) out; \ - } else {\ -interpolate_cubic_get_##type (GstControlledProperty * prop, GstClockTime timestamp) \ +interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \ - g_value_set_##type (&prop->result_value,_interpolate_cubic_get_##type (prop,timestamp)); \ + if (_interpolate_cubic_get_##type (self, timestamp, &ret)) { \ -interpolate_cubic_get_##type##_value_array (GstControlledProperty * prop, \ +interpolate_cubic_get_##type##_value_array (GstInterpolationControlSource *self, \ - *values = _interpolate_cubic_get_##type (prop, ts); \ + if (! _interpolate_cubic_get_##type (self, ts, values)) { \ @@ -601,28 +828,34 @@ DEFINE_CUBIC_GET (long); DEFINE_CUBIC_GET (ulong); +DEFINE_CUBIC_GET (int64); +DEFINE_CUBIC_GET (uint64); DEFINE_CUBIC_GET (float); DEFINE_CUBIC_GET (double); static GstInterpolateMethod interpolate_cubic = { - interpolate_cubic_get_int, - interpolate_cubic_get_int_value_array, - interpolate_cubic_get_uint, - interpolate_cubic_get_uint_value_array, - interpolate_cubic_get_long, - interpolate_cubic_get_long_value_array, - interpolate_cubic_get_ulong, - interpolate_cubic_get_ulong_value_array, - interpolate_cubic_get_float, - interpolate_cubic_get_float_value_array, - interpolate_cubic_get_double, - interpolate_cubic_get_double_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_int, + (GstControlSourceGetValueArray) interpolate_cubic_get_int_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_uint, + (GstControlSourceGetValueArray) interpolate_cubic_get_uint_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_long, + (GstControlSourceGetValueArray) interpolate_cubic_get_long_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_ulong, + (GstControlSourceGetValueArray) interpolate_cubic_get_ulong_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_int64, + (GstControlSourceGetValueArray) interpolate_cubic_get_int64_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_uint64, + (GstControlSourceGetValueArray) interpolate_cubic_get_uint64_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_float, + (GstControlSourceGetValueArray) interpolate_cubic_get_float_value_array, + (GstControlSourceGetValue) interpolate_cubic_get_double, + (GstControlSourceGetValueArray) interpolate_cubic_get_double_value_array, --- NEW FILE: gstinterpolationcontrolsource.c --- * gstinterpolationcontrolsource.c: Control source that provides several * interpolation methods * SECTION:gstinterpolationcontrolsource * @short_description: interpolation control source * #GstInterpolationControlSource is a #GstControlSource, that interpolates values between user-given * control points. It supports several interpolation modes and property types. * To use #GstInterpolationControlSource get a new instance by calling * gst_interpolation_control_source_new(), bind it to a #GParamSpec, select a interpolation mode with * gst_interpolation_control_source_set_interpolation_mode() and set some control points by calling * gst_interpolation_control_source_set(). * All functions are MT-safe. #include "gstinterpolationcontrolsource.h" #include "gstinterpolationcontrolsourceprivate.h" extern GstInterpolateMethod *interpolation_methods[]; extern guint num_interpolation_methods; static void gst_interpolation_control_source_init (GstInterpolationControlSource * self); gst_interpolation_control_source_class_init (GstInterpolationControlSourceClass * klass); G_DEFINE_TYPE (GstInterpolationControlSource, gst_interpolation_control_source, GST_TYPE_CONTROL_SOURCE); /* * gst_control_point_free: * @prop: the object to free * Private method which frees all data allocated by a #GstControlPoint * instance. gst_control_point_free (GstControlPoint * cp) g_return_if_fail (cp); g_value_unset (&cp->value); g_free (cp); gst_interpolation_control_source_reset (GstInterpolationControlSource * self) GstControlSource *csource = GST_CONTROL_SOURCE (self); csource->get_value = NULL; csource->get_value_array = NULL; self->priv->type = self->priv->base = G_TYPE_INVALID; if (G_IS_VALUE (&self->priv->default_value)) g_value_unset (&self->priv->default_value); if (G_IS_VALUE (&self->priv->minimum_value)) g_value_unset (&self->priv->minimum_value); if (G_IS_VALUE (&self->priv->maximum_value)) g_value_unset (&self->priv->maximum_value); if (self->priv->values) { g_list_foreach (self->priv->values, (GFunc) gst_control_point_free, NULL); g_list_free (self->priv->values); self->priv->values = NULL; self->priv->nvalues = 0; self->priv->last_requested_value = NUL... [truncated message content] |