diff --git a/libs/gst/controller/gstdirectcontrolbinding.c b/libs/gst/controller/gstdirectcontrolbinding.c
index 9c2e626..a65f09d 100644
--- a/libs/gst/controller/gstdirectcontrolbinding.c
+++ b/libs/gst/controller/gstdirectcontrolbinding.c
@@ -38,6 +38,7 @@
 #define GST_CAT_DEFAULT control_binding_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 
+
 static GObject *gst_direct_control_binding_constructor (GType type,
     guint n_construct_params, GObjectConstructParam * construct_params);
 static void gst_direct_control_binding_set_property (GObject * object,
@@ -70,6 +71,7 @@ enum
 {
   PROP_0,
   PROP_CS,
+  PROP_ABSOLUTE,
   PROP_LAST
 };
 
@@ -97,9 +99,23 @@ convert_value_to_##type (GstDirectControlBinding *self, gdouble s, gpointer d_)
   \
   s = CLAMP (s, 0.0, 1.0); \
   *d = (g##type) ROUNDING_OP (pspec->minimum * (1-s)) + (g##type) ROUNDING_OP (pspec->maximum * s); \
+} \
+\
+static void \
+abs_convert_g_value_to_##type (GstDirectControlBinding *self, gdouble s, GValue *d) \
+{ \
+  g##type v; \
+  v = (g##type) ROUNDING_OP (s); \
+  g_value_set_##type (d, v); \
+} \
+\
+static void \
+abs_convert_value_to_##type (GstDirectControlBinding *self, gdouble s, gpointer d_) \
+{ \
+  g##type *d = (g##type *)d_; \
+  *d = (g##type) ROUNDING_OP (s); \
 }
 
-
 DEFINE_CONVERT (int, Int, INT, rint);
 DEFINE_CONVERT (uint, UInt, UINT, rint);
 DEFINE_CONVERT (long, Long, LONG, rint);
@@ -180,6 +196,12 @@ gst_direct_control_binding_class_init (GstDirectControlBindingClass * klass)
       GST_TYPE_CONTROL_SOURCE,
       G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
 
+  properties[PROP_ABSOLUTE] =
+      g_param_spec_boolean ("absolute", "Absolute",
+      "Whether the control values are absolute",
+      FALSE,
+      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (gobject_class, PROP_LAST, properties);
 }
 
@@ -209,46 +231,43 @@ gst_direct_control_binding_constructor (GType type, guint n_construct_params,
     GST_DEBUG ("  using type %s", g_type_name (base));
 
     /* select mapping function */
+
+#define SET_CONVERT_FUNCTION(type) \
+    if (self->want_absolute) { \
+        self->convert_g_value = abs_convert_g_value_to_##type; \
+        self->convert_value = abs_convert_value_to_##type; \
+    } \
+    else { \
+        self->convert_g_value = convert_g_value_to_##type; \
+        self->convert_value = convert_value_to_##type; \
+    } \
+    self->byte_size = sizeof (g##type);
+
+
     switch (base) {
       case G_TYPE_INT:
-        self->convert_g_value = convert_g_value_to_int;
-        self->convert_value = convert_value_to_int;
-        self->byte_size = sizeof (gint);
+        SET_CONVERT_FUNCTION (int);
         break;
       case G_TYPE_UINT:
-        self->convert_g_value = convert_g_value_to_uint;
-        self->convert_value = convert_value_to_uint;
-        self->byte_size = sizeof (guint);
+        SET_CONVERT_FUNCTION (uint);
         break;
       case G_TYPE_LONG:
-        self->convert_g_value = convert_g_value_to_long;
-        self->convert_value = convert_value_to_long;
-        self->byte_size = sizeof (glong);
+        SET_CONVERT_FUNCTION (long);
         break;
       case G_TYPE_ULONG:
-        self->convert_g_value = convert_g_value_to_ulong;
-        self->convert_value = convert_value_to_ulong;
-        self->byte_size = sizeof (gulong);
+        SET_CONVERT_FUNCTION (ulong);
         break;
       case G_TYPE_INT64:
-        self->convert_g_value = convert_g_value_to_int64;
-        self->convert_value = convert_value_to_int64;
-        self->byte_size = sizeof (gint64);
+        SET_CONVERT_FUNCTION (int64);
         break;
       case G_TYPE_UINT64:
-        self->convert_g_value = convert_g_value_to_uint64;
-        self->convert_value = convert_value_to_uint64;
-        self->byte_size = sizeof (guint64);
+        SET_CONVERT_FUNCTION (uint64);
         break;
       case G_TYPE_FLOAT:
-        self->convert_g_value = convert_g_value_to_float;
-        self->convert_value = convert_value_to_float;
-        self->byte_size = sizeof (gfloat);
+        SET_CONVERT_FUNCTION (float);
         break;
       case G_TYPE_DOUBLE:
-        self->convert_g_value = convert_g_value_to_double;
-        self->convert_value = convert_value_to_double;
-        self->byte_size = sizeof (gdouble);
+        SET_CONVERT_FUNCTION (double);
         break;
       case G_TYPE_BOOLEAN:
         self->convert_g_value = convert_g_value_to_boolean;
@@ -280,6 +299,9 @@ gst_direct_control_binding_set_property (GObject * object, guint prop_id,
     case PROP_CS:
       self->cs = g_value_dup_object (value);
       break;
+    case PROP_ABSOLUTE:
+      self->want_absolute = g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -296,6 +318,9 @@ gst_direct_control_binding_get_property (GObject * object, guint prop_id,
     case PROP_CS:
       g_value_set_object (value, self->cs);
       break;
+    case PROP_ABSOLUTE:
+      g_value_set_boolean (value, self->want_absolute);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -493,3 +518,23 @@ gst_direct_control_binding_new (GstObject * object, const gchar * property_name,
   return (GstControlBinding *) g_object_new (GST_TYPE_DIRECT_CONTROL_BINDING,
       "object", object, "name", property_name, "control-source", cs, NULL);
 }
+
+/**
+ * gst_absolute_direct_control_binding_new:
+ * @object: the object of the property
+ * @property_name: the property-name to attach the control source
+ * @cs: the control source
+ *
+ * Create a new control-binding that attaches the #GstControlSource to the
+ * #GObject property.
+ *
+ * Returns: (transfer floating): the new #GstDirectControlBinding
+ */
+GstControlBinding *
+gst_absolute_direct_control_binding_new (GstObject * object,
+    const gchar * property_name, GstControlSource * cs)
+{
+  return (GstControlBinding *) g_object_new (GST_TYPE_DIRECT_CONTROL_BINDING,
+      "object", object, "name", property_name, "control-source", cs, "absolute",
+      TRUE, NULL);
+}
diff --git a/libs/gst/controller/gstdirectcontrolbinding.h b/libs/gst/controller/gstdirectcontrolbinding.h
index 597e5b0..12d4db9 100644
--- a/libs/gst/controller/gstdirectcontrolbinding.h
+++ b/libs/gst/controller/gstdirectcontrolbinding.h
@@ -30,7 +30,6 @@
 #include <gst/gstcontrolsource.h>
 
 G_BEGIN_DECLS
-
 #define GST_TYPE_DIRECT_CONTROL_BINDING \
   (gst_direct_control_binding_get_type())
 #define GST_DIRECT_CONTROL_BINDING(obj) \
@@ -43,7 +42,6 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECT_CONTROL_BINDING))
 #define GST_DIRECT_CONTROL_BINDING_GET_CLASS(obj) \
   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CONTOL_SOURCE, GstDirectControlBindingClass))
-
 typedef struct _GstDirectControlBinding GstDirectControlBinding;
 typedef struct _GstDirectControlBindingClass GstDirectControlBindingClass;
 
@@ -55,7 +53,8 @@ typedef struct _GstDirectControlBindingClass GstDirectControlBindingClass;
  *
  * Function to map a control-value to the target plain data type.
  */
-typedef void (* GstDirectControlBindingConvertValue) (GstDirectControlBinding *self, gdouble src_value, gpointer dest_value);
+typedef void (*GstDirectControlBindingConvertValue) (GstDirectControlBinding *
+    self, gdouble src_value, gpointer dest_value);
 
 /**
  * GstDirectControlBindingConvertGValue:
@@ -65,7 +64,8 @@ typedef void (* GstDirectControlBindingConvertValue) (GstDirectControlBinding *s
  *
  * Function to map a control-value to the target GValue.
  */
-typedef void (* GstDirectControlBindingConvertGValue) (GstDirectControlBinding *self, gdouble src_value, GValue *dest_value);
+typedef void (*GstDirectControlBindingConvertGValue) (GstDirectControlBinding *
+    self, gdouble src_value, GValue * dest_value);
 
 /**
  * GstDirectControlBinding:
@@ -73,14 +73,16 @@ typedef void (* GstDirectControlBindingConvertGValue) (GstDirectControlBinding *
  *
  * The instance structure of #GstDirectControlBinding.
  */
-struct _GstDirectControlBinding {
+struct _GstDirectControlBinding
+{
   GstControlBinding parent;
-  
-  /*< private >*/
-  GstControlSource *cs;    /* GstControlSource for this property */
+
+  /*< private > */
+  GstControlSource *cs;         /* GstControlSource for this property */
   GValue cur_value;
   gdouble last_value;
   gint byte_size;
+  gboolean want_absolute;
 
   GstDirectControlBindingConvertValue convert_value;
   GstDirectControlBindingConvertGValue convert_g_value;
@@ -100,7 +102,7 @@ struct _GstDirectControlBindingClass
 {
   GstControlBindingClass parent_class;
 
-  /*< private >*/
+  /*< private > */
   gpointer _gst_reserved[GST_PADDING];
 };
 
@@ -108,8 +110,10 @@ GType gst_direct_control_binding_get_type (void);
 
 /* Functions */
 
-GstControlBinding * gst_direct_control_binding_new (GstObject * object, const gchar * property_name,
-                                                    GstControlSource * cs);
-G_END_DECLS
+GstControlBinding *gst_direct_control_binding_new (GstObject * object,
+    const gchar * property_name, GstControlSource * cs);
 
+GstControlBinding *gst_absolute_direct_control_binding_new (GstObject * object,
+    const gchar * property_name, GstControlSource * cs);
+G_END_DECLS
 #endif /* __GST_DIRECT_CONTROL_BINDING_H__ */
