c796610dd2fc337cd89da723c3eb560103dfc6bd
diff --git a/gst/gaudieffects/gstburn.c b/gst/gaudieffects/gstburn.c
index c99433b..bf81076 100644
--- a/gst/gaudieffects/gstburn.c
+++ b/gst/gaudieffects/gstburn.c
@@ -205,6 +205,7 @@ gst_burn_get_property (GObject * object, guint prop_id,
 {
   GstBurn *filter = GST_BURN (object);
 
+  GST_OBJECT_LOCK (filter);
   switch (prop_id) {
     case PROP_SILENT:
       g_value_set_boolean (value, filter->silent);
@@ -216,6 +217,7 @@ gst_burn_get_property (GObject * object, guint prop_id,
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
+  GST_OBJECT_UNLOCK (filter);
 }
 
 /* GstElement vmethod implementations */
@@ -227,12 +229,16 @@ gst_burn_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
 {
   GstBurn *filter = GST_BURN (btrans);
   GstStructure *structure;
-  gboolean ret = TRUE;
+  gboolean ret = FALSE;
 
   structure = gst_caps_get_structure (incaps, 0);
 
-  ret &= gst_structure_get_int (structure, "width", &filter->width);
-  ret &= gst_structure_get_int (structure, "height", &filter->height);
+  GST_OBJECT_LOCK (filter);
+  if (gst_structure_get_int (structure, "width", &filter->width) &&
+      gst_structure_get_int (structure, "height", &filter->height)) {
+    ret = TRUE;
+  }
+  GST_OBJECT_UNLOCK (filter);
 
   return ret;
 }
@@ -246,9 +252,25 @@ gst_burn_transform (GstBaseTransform * btrans,
   gint video_size, adjustment;
   guint32 *src = (guint32 *) GST_BUFFER_DATA (in_buf);
   guint32 *dest = (guint32 *) GST_BUFFER_DATA (out_buf);
+  GstClockTime timestamp;
+  gint64 stream_time;
 
   video_size = filter->width * filter->height;
+
+  /* GstController: update the properties */
+  timestamp = GST_BUFFER_TIMESTAMP (in_buf);
+  stream_time =
+      gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp);
+
+  GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (timestamp));
+
+  if (GST_CLOCK_TIME_IS_VALID (stream_time))
+    gst_object_sync_values (G_OBJECT (filter), stream_time);
+
+  GST_OBJECT_LOCK (filter);
   adjustment = filter->adjustment;
+  GST_OBJECT_UNLOCK (filter);
 
   transform (src, dest, video_size, adjustment);
 
diff --git a/gst/gaudieffects/gstchromium.c b/gst/gaudieffects/gstchromium.c
index ab387ad..94d3b15 100644
--- a/gst/gaudieffects/gstchromium.c
+++ b/gst/gaudieffects/gstchromium.c
@@ -61,14 +61,14 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
 #include <math.h>
+#include <gst/gst.h>
+#include <gst/controller/gstcontroller.h>
 
 #include "gstplugin.h"
 #include "gstchromium.h"
 
 #include <gst/video/video.h>
-#include <gst/controller/gstcontroller.h>
 
 GST_DEBUG_CATEGORY_STATIC (gst_chromium_debug);
 #define GST_CAT_DEFAULT gst_chromium_debug
@@ -188,7 +188,7 @@ gst_chromium_class_init (GstChromiumClass * klass)
   trans_class->transform = GST_DEBUG_FUNCPTR (gst_chromium_transform);
 }
 
-/* Initialize the new element,
+/* Initialize the element,
  * instantiate pads and add them to element,
  * set pad calback functions, and
  * initialize instance structure.
@@ -225,6 +225,7 @@ gst_chromium_set_property (GObject * object, guint prop_id,
   }
 }
 
+
 static void
 gst_chromium_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec)
@@ -258,12 +259,16 @@ gst_chromium_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
 {
   GstChromium *filter = GST_CHROMIUM (btrans);
   GstStructure *structure;
-  gboolean ret = TRUE;
+  gboolean ret = FALSE;
 
   structure = gst_caps_get_structure (incaps, 0);
 
-  ret &= gst_structure_get_int (structure, "width", &filter->width);
-  ret &= gst_structure_get_int (structure, "height", &filter->height);
+  GST_OBJECT_LOCK (filter);
+  if (gst_structure_get_int (structure, "width", &filter->width) &&
+      gst_structure_get_int (structure, "height", &filter->height)) {
+    ret = TRUE;
+  }
+  GST_OBJECT_UNLOCK (filter);
 
   return ret;
 }
@@ -274,12 +279,30 @@ gst_chromium_transform (GstBaseTransform * btrans,
     GstBuffer * in_buf, GstBuffer * out_buf)
 {
   GstChromium *filter = GST_CHROMIUM (btrans);
-  gint video_size;
+  gint video_size, edge_a, edge_b;
   guint32 *src = (guint32 *) GST_BUFFER_DATA (in_buf);
   guint32 *dest = (guint32 *) GST_BUFFER_DATA (out_buf);
+  GstClockTime timestamp;
+  gint64 stream_time;
+
+  /* GstController: update the properties */
+  timestamp = GST_BUFFER_TIMESTAMP (in_buf);
+  stream_time =
+      gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp);
+
+  GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (timestamp));
+
+  if (GST_CLOCK_TIME_IS_VALID (stream_time))
+    gst_object_sync_values (G_OBJECT (filter), stream_time);
+
+  GST_OBJECT_LOCK (filter);
+  edge_a = filter->edge_a;
+  edge_b = filter->edge_b;
+  GST_OBJECT_UNLOCK (filter);
 
   video_size = filter->width * filter->height;
-  transform (src, dest, video_size, filter->edge_a, filter->edge_b);
+  transform (src, dest, video_size, edge_a, edge_b);
 
   return GST_FLOW_OK;
 }
@@ -290,8 +313,8 @@ gboolean
 gst_chromium_plugin_init (GstPlugin * chromium)
 {
   /* debug category for fltering log messages */
-  GST_DEBUG_CATEGORY_INIT (gst_chromium_debug, "chromium",
-      0, "Template chromium");
+  GST_DEBUG_CATEGORY_INIT (gst_chromium_debug, "chromium", 0,
+      "Template chromium");
 
   return gst_element_register (chromium, "chromium", GST_RANK_NONE,
       GST_TYPE_CHROMIUM);
diff --git a/gst/gaudieffects/gstchromium.h b/gst/gaudieffects/gstchromium.h
index 6629250..10385eb 100644
--- a/gst/gaudieffects/gstchromium.h
+++ b/gst/gaudieffects/gstchromium.h
@@ -47,39 +47,28 @@
 #define __GST_CHROMIUM_H__
 
 #include <gst/gst.h>
-
+#include <gst/video/video.h>
 #include <gst/video/gstvideofilter.h>
 
 G_BEGIN_DECLS
 
-/* #defines don't like whitespacey bits */
-#define GST_TYPE_CHROMIUM \
-  (gst_chromium_get_type())
+#define GST_TYPE_CHROMIUM (gst_chromium_get_type())
 #define GST_CHROMIUM(obj) \
   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CHROMIUM,GstChromium))
-#define GST_CHROMIUM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CHROMIUM,GstChromiumClass))
-#define GST_IS_CHROMIUM(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CHROMIUM))
-#define GST_IS_CHROMIUM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CHROMIUM))
 
-typedef struct _GstChromium      GstChromium;
-typedef struct _GstChromiumClass GstChromiumClass;
+typedef struct GstChromium      GstChromium;
+typedef struct GstChromiumClass GstChromiumClass;
 
-struct _GstChromium
+struct GstChromium
 {
   GstVideoFilter videofilter;
-
-  /* < private > */
-
   gint width, height;
 
   gint edge_a, edge_b;
   gboolean silent;
 };
 
-struct _GstChromiumClass
+struct GstChromiumClass
 {
   GstVideoFilterClass parent_class;
 };
@@ -88,4 +77,4 @@ GType gst_chromium_get_type (void);
 
 G_END_DECLS
 
-#endif /* __GST_CHROMIUM_H__ */
+#endif
diff --git a/gst/gaudieffects/gstexclusion.c b/gst/gaudieffects/gstexclusion.c
index dafdc1f..2ae9412 100644
--- a/gst/gaudieffects/gstexclusion.c
+++ b/gst/gaudieffects/gstexclusion.c
@@ -222,7 +222,6 @@ gst_exclusion_get_property (GObject * object, guint prop_id,
 }
 
 /* GstElement vmethod implementations */
-
 /* Handle the link with other elements. */
 static gboolean
 gst_exclusion_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
@@ -230,11 +229,15 @@ gst_exclusion_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
 {
   GstExclusion *filter = GST_EXCLUSION (btrans);
   GstStructure *structure;
-  gboolean ret = TRUE;
+  gboolean ret = FALSE;
 
+  GST_OBJECT_LOCK (filter);
   structure = gst_caps_get_structure (incaps, 0);
-  ret &= gst_structure_get_int (structure, "width", &filter->width);
-  ret &= gst_structure_get_int (structure, "height", &filter->height);
+  if (gst_structure_get_int (structure, "width", &filter->width) &&
+      gst_structure_get_int (structure, "height", &filter->height)) {
+    ret = TRUE;
+  }
+  GST_OBJECT_UNLOCK (filter);
 
   return ret;
 }
@@ -245,12 +248,29 @@ gst_exclusion_transform (GstBaseTransform * btrans,
     GstBuffer * in_buf, GstBuffer * out_buf)
 {
   GstExclusion *filter = GST_EXCLUSION (btrans);
-  gint video_size;
+  gint video_size, factor;
   guint32 *src = (guint32 *) GST_BUFFER_DATA (in_buf);
   guint32 *dest = (guint32 *) GST_BUFFER_DATA (out_buf);
+  GstClockTime timestamp;
+  gint64 stream_time;
+
+  /* GstController: update the properties */
+  timestamp = GST_BUFFER_TIMESTAMP (in_buf);
+  stream_time =
+      gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp);
+
+  GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (timestamp));
+
+  if (GST_CLOCK_TIME_IS_VALID (stream_time))
+    gst_object_sync_values (G_OBJECT (filter), stream_time);
+
+  GST_OBJECT_LOCK (filter);
+  factor = filter->factor;
+  GST_OBJECT_UNLOCK (filter);
 
   video_size = filter->width * filter->height;
-  transform (src, dest, video_size, filter->factor);
+  transform (src, dest, video_size, factor);
 
   return GST_FLOW_OK;
 }
diff --git a/gst/gaudieffects/gstsolarize.c b/gst/gaudieffects/gstsolarize.c
index de7336d..292bacd 100644
--- a/gst/gaudieffects/gstsolarize.c
+++ b/gst/gaudieffects/gstsolarize.c
@@ -228,6 +228,7 @@ gst_solarize_get_property (GObject * object, guint prop_id,
 {
   GstSolarize *filter = GST_SOLARIZE (object);
 
+  GST_OBJECT_LOCK (filter);
   switch (prop_id) {
     case PROP_SILENT:
       g_value_set_boolean (value, filter->silent);
@@ -245,6 +246,7 @@ gst_solarize_get_property (GObject * object, guint prop_id,
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
+  GST_OBJECT_UNLOCK (filter);
 }
 
 /* GstElement vmethod implementations */
@@ -256,11 +258,15 @@ gst_solarize_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
 {
   GstSolarize *filter = GST_SOLARIZE (btrans);
   GstStructure *structure;
-  gboolean ret = TRUE;
+  gboolean ret = FALSE;
 
+  GST_OBJECT_LOCK (filter);
   structure = gst_caps_get_structure (incaps, 0);
-  ret &= gst_structure_get_int (structure, "width", &filter->width);
-  ret &= gst_structure_get_int (structure, "height", &filter->height);
+  if (gst_structure_get_int (structure, "width", &filter->width) &&
+      gst_structure_get_int (structure, "height", &filter->height)) {
+    ret = TRUE;
+  }
+  GST_OBJECT_UNLOCK (filter);
 
   return ret;
 }
@@ -271,13 +277,31 @@ gst_solarize_transform (GstBaseTransform * btrans,
     GstBuffer * in_buf, GstBuffer * out_buf)
 {
   GstSolarize *filter = GST_SOLARIZE (btrans);
-  gint video_size;
+  gint video_size, threshold, start, end;
   guint32 *src = (guint32 *) GST_BUFFER_DATA (in_buf);
   guint32 *dest = (guint32 *) GST_BUFFER_DATA (out_buf);
+  GstClockTime timestamp;
+  gint64 stream_time;
+
+  /* GstController: update the properties */
+  timestamp = GST_BUFFER_TIMESTAMP (in_buf);
+  stream_time =
+      gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp);
+
+  GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (timestamp));
+
+  if (GST_CLOCK_TIME_IS_VALID (stream_time))
+    gst_object_sync_values (G_OBJECT (filter), stream_time);
+
+  GST_OBJECT_LOCK (filter);
+  threshold = filter->threshold;
+  start = filter->start;
+  end = filter->end;
+  GST_OBJECT_UNLOCK (filter);
 
   video_size = filter->width * filter->height;
-  transform (src, dest, video_size, filter->threshold, filter->start,
-      filter->end);
+  transform (src, dest, video_size, threshold, start, end);
 
   return GST_FLOW_OK;
 }
@@ -347,6 +371,7 @@ transform (guint32 * src, guint32 * dest, gint video_area,
     color[1] = (in >> 8) & 0xff;
     color[2] = (in) & 0xff;
 
+
     /* Loop through colors. */
     for (c = 0; c < 3; c++) {
       param = color[c];
