1 /* GStreamer
2  *
3  * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
4  *               2011 Stefan Sauer <ensonic@users.sf.net>
5  *
6  * gsttimedvaluecontrolsource.h: Base class for timeed value based control
7  *                               sources
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public
20  * License along with this library; if not, write to the
21  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24 
25 #ifndef __GST_TIMED_VALUE_CONTROL_SOURCE_H__
26 #define __GST_TIMED_VALUE_CONTROL_SOURCE_H__
27 
28 #include <glib-object.h>
29 #include <gst/gst.h>
30 #include <gst/controller/controller-prelude.h>
31 
32 G_BEGIN_DECLS
33 
34 #define GST_TYPE_TIMED_VALUE_CONTROL_SOURCE \
35   (gst_timed_value_control_source_get_type ())
36 #define GST_TIMED_VALUE_CONTROL_SOURCE(obj) \
37   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TIMED_VALUE_CONTROL_SOURCE, GstTimedValueControlSource))
38 #define GST_TIMED_VALUE_CONTROL_SOURCE_CLASS(vtable) \
39   (G_TYPE_CHECK_CLASS_CAST ((vtable), GST_TYPE_TIMED_VALUE_CONTROL_SOURCE, GstTimedValueControlSourceClass))
40 #define GST_IS_TIMED_VALUE_CONTROL_SOURCE(obj) \
41   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TIMED_VALUE_CONTROL_SOURCE))
42 #define GST_IS_TIMED_VALUE_CONTROL_SOURCE_CLASS(vtable) \
43   (G_TYPE_CHECK_CLASS_TYPE ((vtable), GST_TYPE_TIMED_VALUE_CONTROL_SOURCE))
44 #define GST_TIMED_VALUE_CONTROL_SOURCE_GET_CLASS(inst) \
45   (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_TIMED_VALUE_CONTROL_SOURCE, GstTimedValueControlSourceClass))
46 
47 typedef struct _GstTimedValueControlSource GstTimedValueControlSource;
48 typedef struct _GstTimedValueControlSourceClass GstTimedValueControlSourceClass;
49 typedef struct _GstTimedValueControlSourcePrivate GstTimedValueControlSourcePrivate;
50 typedef struct _GstControlPoint GstControlPoint;
51 
52 /**
53  * GstControlPoint:
54  * @timestamp: timestamp of the value change
55  * @value: the new value
56  *
57  * An internal structure for value+time and various temporary
58  * values used for interpolation. This "inherits" from
59  * GstTimedValue.
60  */
61 struct _GstControlPoint
62 {
63   /* fields from GstTimedValue. DO NOT CHANGE! */
64   GstClockTime timestamp;
65   gdouble value;
66 
67   /*< private >*/
68 
69   /* Caches for the interpolators */
70   /* FIXME: we should not have this here already ... */
71   union {
72     struct { /* 16 bytes */
73       gdouble h;
74       gdouble z;
75     } cubic;
76     struct { /* 24 bytes */
77       gdouble c1s, c2s, c3s;
78     } cubic_monotonic;
79     guint8 _gst_reserved[64];
80   } cache;
81 };
82 
83 GST_CONTROLLER_API
84 GType gst_control_point_get_type (void);
85 
86 /**
87  * GstTimedValueControlSource:
88  *
89  * The instance structure of #GstControlSource.
90  */
91 struct _GstTimedValueControlSource {
92   GstControlSource parent;
93 
94   /*< protected >*/
95   GMutex lock;
96 
97   GSequence *values;            /* List of GstControlPoint */
98   gint nvalues;                 /* Number of control points */
99   gboolean valid_cache;
100 
101   /*< private >*/
102   GstTimedValueControlSourcePrivate *priv;
103   gpointer _gst_reserved[GST_PADDING];
104 };
105 
106 struct _GstTimedValueControlSourceClass {
107   GstControlSourceClass parent_class;
108 
109   /*< private >*/
110   gpointer _gst_reserved[GST_PADDING];
111 };
112 
113 #define GST_TIMED_VALUE_CONTROL_SOURCE_LOCK(o) \
114   g_mutex_lock(&((GstTimedValueControlSource *)o)->lock)
115 #define GST_TIMED_VALUE_CONTROL_SOURCE_UNLOCK(o) \
116   g_mutex_unlock(&((GstTimedValueControlSource *)o)->lock)
117 
118 GST_CONTROLLER_API
119 GType           gst_timed_value_control_source_get_type (void);
120 
121 /* Functions */
122 
123 GST_CONTROLLER_API
124 GSequenceIter * gst_timed_value_control_source_find_control_point_iter (
125                                                                GstTimedValueControlSource * self,
126                                                                GstClockTime timestamp);
127 GST_CONTROLLER_API
128 gboolean        gst_timed_value_control_source_set            (GstTimedValueControlSource * self,
129                                                                GstClockTime timestamp,
130                                                                const gdouble value);
131 GST_CONTROLLER_API
132 gboolean        gst_timed_value_control_source_set_from_list  (GstTimedValueControlSource * self,
133                                                                const GSList * timedvalues);
134 GST_CONTROLLER_API
135 gboolean        gst_timed_value_control_source_unset          (GstTimedValueControlSource * self,
136                                                                GstClockTime timestamp);
137 
138 GST_CONTROLLER_API
139 void            gst_timed_value_control_source_unset_all      (GstTimedValueControlSource *self);
140 
141 GST_CONTROLLER_API
142 GList *         gst_timed_value_control_source_get_all        (GstTimedValueControlSource * self);
143 
144 GST_CONTROLLER_API
145 gint            gst_timed_value_control_source_get_count      (GstTimedValueControlSource * self);
146 
147 GST_CONTROLLER_API
148 void            gst_timed_value_control_invalidate_cache      (GstTimedValueControlSource * self);
149 
150 GST_CONTROLLER_API
151 void            gst_control_point_free (GstControlPoint * cp);
152 
153 GST_CONTROLLER_API
154 GstControlPoint * gst_control_point_copy (GstControlPoint * cp);
155 
156 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
157 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTimedValueControlSource, gst_object_unref)
158 #endif
159 
160 G_END_DECLS
161 
162 #endif /* __GST_TIMED_VALUE_CONTROL_SOURCE_H__ */
163