diff --git a/ChangeLog b/ChangeLog index 79f4c55824..007453b0a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-01-22 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy), + (gst_xvimagesink_buffer_alloc): Playbin keeps some ref to some + frames. We might get a frame destroyed after changing state to + NULL, adding a safety check on xcontext. + 2006-01-22 Tim-Philipp Müller * gst-libs/gst/interfaces/xoverlay.c: diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index 0e3b7790db..f0be51c3f0 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -485,6 +485,11 @@ gst_ximagesink_ximage_destroy (GstXImageSink * ximagesink, ximagesink->cur_image = NULL; } + /* We might have some buffers destroyed after changing state to NULL */ + if (!ximagesink->xcontext) { + goto beach; + } + g_mutex_lock (ximagesink->x_lock); #ifdef HAVE_XSHM @@ -511,6 +516,7 @@ gst_ximagesink_ximage_destroy (GstXImageSink * ximagesink, g_mutex_unlock (ximagesink->x_lock); +beach: if (ximage->ximagesink) { /* Release the ref to our sink */ ximage->ximagesink = NULL; diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 85d52ad736..b884849cd0 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -223,6 +223,11 @@ gst_xvimage_buffer_destroy (GstXvImageBuffer * xvimage) if (xvimagesink->cur_image == xvimage) xvimagesink->cur_image = NULL; + /* We might have some buffers destroyed after changing state to NULL */ + if (xvimagesink->xcontext) { + goto beach; + } + g_mutex_lock (xvimagesink->x_lock); #ifdef HAVE_XSHM @@ -251,6 +256,7 @@ gst_xvimage_buffer_destroy (GstXvImageBuffer * xvimage) g_mutex_unlock (xvimagesink->x_lock); +beach: xvimage->xvimagesink = NULL; gst_object_unref (xvimagesink);