diff options
Diffstat (limited to 'libs/gst/controller/gstargbcontrolbinding.c')
-rw-r--r-- | libs/gst/controller/gstargbcontrolbinding.c | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/libs/gst/controller/gstargbcontrolbinding.c b/libs/gst/controller/gstargbcontrolbinding.c index 829b616..9e4728a 100644 --- a/libs/gst/controller/gstargbcontrolbinding.c +++ b/libs/gst/controller/gstargbcontrolbinding.c @@ -53,12 +53,16 @@ static GValue *gst_argb_control_binding_get_value (GstControlBinding * _self, GstClockTime timestamp); static gboolean gst_argb_control_binding_get_value_array (GstControlBinding * _self, GstClockTime timestamp, GstClockTime interval, guint n_values, + gpointer values); +static gboolean gst_argb_control_binding_get_g_value_array (GstControlBinding * + _self, GstClockTime timestamp, GstClockTime interval, guint n_values, GValue * values); #define _do_init \ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "gstargbcontrolbinding", 0, \ "dynamic parameter control source attachment"); +#define gst_argb_control_binding_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstARGBControlBinding, gst_argb_control_binding, GST_TYPE_CONTROL_BINDING, _do_init); @@ -93,6 +97,8 @@ gst_argb_control_binding_class_init (GstARGBControlBindingClass * klass) control_binding_class->get_value = gst_argb_control_binding_get_value; control_binding_class->get_value_array = gst_argb_control_binding_get_value_array; + control_binding_class->get_g_value_array = + gst_argb_control_binding_get_g_value_array; properties[PROP_CS_A] = g_param_spec_object ("control-source-a", "ControlSource A", @@ -133,9 +139,8 @@ gst_argb_control_binding_constructor (GType type, guint n_construct_params, GstARGBControlBinding *self; self = - GST_ARGB_CONTROL_BINDING (G_OBJECT_CLASS - (gst_argb_control_binding_parent_class) - ->constructor (type, n_construct_params, construct_params)); + GST_ARGB_CONTROL_BINDING (G_OBJECT_CLASS (parent_class)->constructor + (type, n_construct_params, construct_params)); if (GST_CONTROL_BINDING_PSPEC (self)) { if (!(G_PARAM_SPEC_VALUE_TYPE (GST_CONTROL_BINDING_PSPEC (self)) == @@ -213,6 +218,8 @@ gst_argb_control_binding_dispose (GObject * object) gst_object_replace ((GstObject **) & self->cs_g, NULL); if (self->cs_b) gst_object_replace ((GstObject **) & self->cs_b, NULL); + + G_OBJECT_CLASS (parent_class)->dispose (object); } static void @@ -221,6 +228,8 @@ gst_argb_control_binding_finalize (GObject * object) GstARGBControlBinding *self = GST_ARGB_CONTROL_BINDING (object); g_value_unset (&self->cur_value); + + G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean @@ -312,6 +321,71 @@ gst_argb_control_binding_get_value (GstControlBinding * _self, static gboolean gst_argb_control_binding_get_value_array (GstControlBinding * _self, GstClockTime timestamp, GstClockTime interval, guint n_values, + gpointer values_) +{ + GstARGBControlBinding *self = GST_ARGB_CONTROL_BINDING (_self); + gint i; + gdouble *src_val_a = NULL, *src_val_r = NULL, *src_val_g = NULL, *src_val_b = + NULL; + guint *values = (guint *) values_; + gboolean ret = TRUE; + + g_return_val_if_fail (GST_IS_ARGB_CONTROL_BINDING (self), FALSE); + g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE); + g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (interval), FALSE); + g_return_val_if_fail (values, FALSE); + g_return_val_if_fail (GST_CONTROL_BINDING_PSPEC (self), FALSE); + + if (self->cs_a) { + src_val_a = g_new0 (gdouble, n_values); + ret &= gst_control_source_get_value_array (self->cs_a, timestamp, + interval, n_values, src_val_a); + } + if (self->cs_r) { + src_val_r = g_new0 (gdouble, n_values); + ret &= gst_control_source_get_value_array (self->cs_r, timestamp, + interval, n_values, src_val_r); + } + if (self->cs_g) { + src_val_g = g_new0 (gdouble, n_values); + ret &= gst_control_source_get_value_array (self->cs_g, timestamp, + interval, n_values, src_val_g); + } + if (self->cs_b) { + src_val_b = g_new0 (gdouble, n_values); + ret &= gst_control_source_get_value_array (self->cs_b, timestamp, + interval, n_values, src_val_b); + } + if (G_LIKELY (ret)) { + for (i = 0; i < n_values; i++) { + gdouble a = 1.0, r = 0.0, g = 0.0, b = 0.0; + if (src_val_a && !isnan (src_val_a[i])) + a = src_val_a[i]; + if (src_val_r && !isnan (src_val_r[i])) + r = src_val_r[i]; + if (src_val_g && !isnan (src_val_g[i])) + g = src_val_g[i]; + if (src_val_b && !isnan (src_val_b[i])) + b = src_val_b[i]; + values[i] = (((guint) (CLAMP (a, 0.0, 1.0) * 255)) << 24) | + (((guint) (CLAMP (r, 0.0, 1.0) * 255)) << 16) | + (((guint) (CLAMP (g, 0.0, 1.0) * 255)) << 8) | + ((guint) (CLAMP (b, 0.0, 1.0) * 255)); + } + } else { + GST_LOG ("failed to get control value for property %s at ts %" + GST_TIME_FORMAT, _self->name, GST_TIME_ARGS (timestamp)); + } + g_free (src_val_a); + g_free (src_val_r); + g_free (src_val_g); + g_free (src_val_b); + return ret; +} + +static gboolean +gst_argb_control_binding_get_g_value_array (GstControlBinding * _self, + GstClockTime timestamp, GstClockTime interval, guint n_values, GValue * values) { GstARGBControlBinding *self = GST_ARGB_CONTROL_BINDING (_self); |