diff --git a/ChangeLog b/ChangeLog index 8ab1b943f0..d0b8c34c0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-11-09 Wim Taymans + + * libs/gst/base/gstbasesink.c: (gst_base_sink_set_last_buffer): + Don't hold the object lock when unreffing a buffer because it could + cause a deadlock when the finalize function wants to grab the object + lock too. Fixes #495133. + 2007-11-09 Wim Taymans * gst/gstsegment.c: (gst_segment_set_newsegment_full), diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 07d57a3bd4..3986832c51 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -834,9 +834,18 @@ gst_base_sink_get_last_buffer (GstBaseSink * sink) static void gst_base_sink_set_last_buffer (GstBaseSink * sink, GstBuffer * buffer) { + GstBuffer *old; + + if (buffer) + gst_buffer_ref (buffer); + GST_OBJECT_LOCK (sink); - gst_buffer_replace (&sink->priv->last_buffer, buffer); + old = sink->priv->last_buffer; + sink->priv->last_buffer = buffer; GST_OBJECT_UNLOCK (sink); + + if (old) + gst_buffer_unref (old); } /**