diff --git a/ChangeLog b/ChangeLog index 393979bafd..941bdf7f16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-07-31 Wim Taymans + + * 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 * docs/design/part-element-transform.txt: diff --git a/plugins/elements/gstcapsfilter.c b/plugins/elements/gstcapsfilter.c index bae446122b..784f0ded80 100644 --- a/plugins/elements/gstcapsfilter.c +++ b/plugins/elements/gstcapsfilter.c @@ -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; - ret = gst_caps_intersect (caps, capsfilter->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); + + gst_caps_unref (filter_caps); return ret; }