plugins/elements/gstcapsfilter.c: Make setting the caps more threadsafe.
authorWim Taymans <wim.taymans@gmail.com>
Thu, 31 Jul 2008 09:55:14 +0000 (09:55 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 31 Jul 2008 09:55:14 +0000 (09:55 +0000)
Original commit message from CVS:
* plugins/elements/gstcapsfilter.c: (gst_capsfilter_set_property),
(gst_capsfilter_get_property), (gst_capsfilter_transform_caps):
Make setting the caps more threadsafe.

ChangeLog
plugins/elements/gstcapsfilter.c

index 393979b..941bdf7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2008-07-31  Wim Taymans  <wim.taymans@collabora.co.uk>
 
+       * plugins/elements/gstcapsfilter.c: (gst_capsfilter_set_property),
+       (gst_capsfilter_get_property), (gst_capsfilter_transform_caps):
+       Make setting the caps more threadsafe.
+
+2008-07-31  Wim Taymans  <wim.taymans@collabora.co.uk>
+
        * docs/design/part-element-transform.txt:
        Update docs.
 
index bae4461..784f0de 100644 (file)
@@ -143,8 +143,11 @@ gst_capsfilter_set_property (GObject * object, guint prop_id,
         gst_caps_ref (new_caps);
       }
 
+      GST_OBJECT_LOCK (capsfilter);
       old_caps = capsfilter->filter_caps;
       capsfilter->filter_caps = new_caps;
+      GST_OBJECT_UNLOCK (capsfilter);
+
       gst_caps_unref (old_caps);
 
       GST_DEBUG_OBJECT (capsfilter, "set new caps %" GST_PTR_FORMAT, new_caps);
@@ -168,7 +171,9 @@ gst_capsfilter_get_property (GObject * object, guint prop_id, GValue * value,
 
   switch (prop_id) {
     case PROP_FILTER_CAPS:
+      GST_OBJECT_LOCK (capsfilter);
       gst_value_set_caps (value, capsfilter->filter_caps);
+      GST_OBJECT_UNLOCK (capsfilter);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -191,9 +196,17 @@ gst_capsfilter_transform_caps (GstBaseTransform * base,
     GstPadDirection direction, GstCaps * caps)
 {
   GstCapsFilter *capsfilter = GST_CAPSFILTER (base);
-  GstCaps *ret;
+  GstCaps *ret, *filter_caps;
+
+  GST_OBJECT_LOCK (capsfilter);
+  filter_caps = gst_caps_ref (capsfilter->filter_caps);
+  GST_OBJECT_UNLOCK (capsfilter);
+
+  ret = gst_caps_intersect (caps, filter_caps);
+  GST_DEBUG_OBJECT (capsfilter, "filter:    %" GST_PTR_FORMAT, filter_caps);
+  GST_DEBUG_OBJECT (capsfilter, "intersect: %" GST_PTR_FORMAT, ret);
 
-  ret = gst_caps_intersect (caps, capsfilter->filter_caps);
+  gst_caps_unref (filter_caps);
 
   return ret;
 }