Branch data Line data Source code
1 : : /* GStreamer
2 : : *
3 : : * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
4 : : *
5 : : * gstcontrolsource.c: Interface declaration for control sources
6 : : *
7 : : * This library is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU Library General Public
9 : : * License as published by the Free Software Foundation; either
10 : : * version 2 of the License, or (at your option) any later version.
11 : : *
12 : : * This library is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : * Library General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU Library General Public
18 : : * License along with this library; if not, write to the
19 : : * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 : : * Boston, MA 02111-1307, USA.
21 : : */
22 : :
23 : : /**
24 : : * SECTION:gstcontrolsource
25 : : * @short_description: base class for control source sources
26 : : *
27 : : * The #GstControlSource is a base class for control value sources that could
28 : : * be used by #GstController to get timestamp-value pairs.
29 : : *
30 : : * A #GstControlSource is used by first getting an instance, binding it to a
31 : : * #GParamSpec (for example by using gst_controller_set_control_source()) and
32 : : * then by having it used by the #GstController or calling
33 : : * gst_control_source_get_value() or gst_control_source_get_value_array().
34 : : *
35 : : * For implementing a new #GstControlSource one has to implement a
36 : : * #GstControlSourceBind method, which will depending on the #GParamSpec set up
37 : : * the control source for use and sets the #GstControlSourceGetValue and
38 : : * #GstControlSourceGetValueArray functions. These are then used by
39 : : * gst_control_source_get_value() or gst_control_source_get_value_array()
40 : : * to get values for specific timestamps.
41 : : *
42 : : */
43 : :
44 : : #include <glib-object.h>
45 : : #include <gst/gst.h>
46 : :
47 : : #include "gstcontrolsource.h"
48 : :
49 : : #define GST_CAT_DEFAULT controller_debug
50 : : GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
51 : :
52 [ + + ]: 343 : G_DEFINE_ABSTRACT_TYPE (GstControlSource, gst_control_source, G_TYPE_OBJECT);
53 : :
54 : : static GObjectClass *parent_class = NULL;
55 : :
56 : : static void
57 : 25 : gst_control_source_class_init (GstControlSourceClass * klass)
58 : : {
59 : : //GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
60 : :
61 : 25 : parent_class = g_type_class_peek_parent (klass);
62 : :
63 : : /* Has to be implemented by children */
64 : 25 : klass->bind = NULL;
65 : 25 : }
66 : :
67 : : static void
68 : 26 : gst_control_source_init (GstControlSource * self)
69 : : {
70 : : /* Set default handlers that print a warning */
71 : 26 : self->get_value = NULL;
72 : 26 : self->get_value_array = NULL;
73 : 26 : self->bound = FALSE;
74 : 26 : }
75 : :
76 : : /**
77 : : * gst_control_source_get_value:
78 : : * @self: the #GstControlSource object
79 : : * @timestamp: the time for which the value should be returned
80 : : * @value: the value
81 : : *
82 : : * Gets the value for this #GstControlSource at a given timestamp.
83 : : *
84 : : * Returns: FALSE if the value couldn't be returned, TRUE otherwise.
85 : : */
86 : : gboolean
87 : 158 : gst_control_source_get_value (GstControlSource * self, GstClockTime timestamp,
88 : : GValue * value)
89 : : {
90 [ - + ][ + - ]: 158 : g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
[ - + ][ - + ]
91 : :
92 [ + - ]: 158 : if (G_LIKELY (self->get_value)) {
93 : 158 : return self->get_value (self, timestamp, value);
94 : : } else {
95 [ # # ]: 0 : GST_ERROR ("Not bound to a specific property yet!");
96 : 158 : return FALSE;
97 : : }
98 : : }
99 : :
100 : : /**
101 : : * gst_control_source_get_value_array:
102 : : * @self: the #GstControlSource object
103 : : * @timestamp: the time that should be processed
104 : : * @value_array: array to put control-values in
105 : : *
106 : : * Gets an array of values for one element property.
107 : : *
108 : : * All fields of @value_array must be filled correctly. Especially the
109 : : * @value_array->values array must be big enough to keep the requested amount
110 : : * of values.
111 : : *
112 : : * The type of the values in the array is the same as the property's type.
113 : : *
114 : : * Returns: %TRUE if the given array could be filled, %FALSE otherwise
115 : : */
116 : : gboolean
117 : 1 : gst_control_source_get_value_array (GstControlSource * self,
118 : : GstClockTime timestamp, GstValueArray * value_array)
119 : : {
120 [ - + ][ + - ]: 1 : g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
[ - + ][ - + ]
121 : :
122 [ + - ]: 1 : if (G_LIKELY (self->get_value_array)) {
123 : 1 : return self->get_value_array (self, timestamp, value_array);
124 : : } else {
125 [ # # ]: 0 : GST_ERROR ("Not bound to a specific property yet!");
126 : 1 : return FALSE;
127 : : }
128 : : }
129 : :
130 : : /**
131 : : * gst_control_source_bind:
132 : : * @self: the #GstControlSource object
133 : : * @pspec: #GParamSpec for the property for which this #GstControlSource should generate values.
134 : : *
135 : : * Binds a #GstControlSource to a specific property. This must be called only once for a
136 : : * #GstControlSource.
137 : : *
138 : : * Returns: %TRUE if the #GstControlSource was bound correctly, %FALSE otherwise.
139 : : */
140 : : gboolean
141 : 26 : gst_control_source_bind (GstControlSource * self, GParamSpec * pspec)
142 : : {
143 : 26 : gboolean ret = FALSE;
144 : :
145 [ - + ][ + - ]: 26 : g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
[ - + ][ - + ]
146 [ - + ]: 26 : g_return_val_if_fail (GST_CONTROL_SOURCE_GET_CLASS (self)->bind, FALSE);
147 [ - + ]: 26 : g_return_val_if_fail (!self->bound, FALSE);
148 : :
149 : 26 : ret = GST_CONTROL_SOURCE_GET_CLASS (self)->bind (self, pspec);
150 : :
151 [ + - ]: 26 : if (ret)
152 : 26 : self->bound = TRUE;
153 : :
154 : 26 : return ret;
155 : : }
|