ximagesrc: Add missing return value to Buffer dispose function

Depending ont he build, the method could return FALSE, hence never
free the buffers, or already TRUE and lead to a crash:

Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=733695
This commit is contained in:
Nicolas Dufresne 2014-07-24 15:28:09 -04:00 committed by Nicolas Dufresne
parent b8b5704445
commit c82052e723
3 changed files with 11 additions and 5 deletions

View File

@ -85,10 +85,12 @@ static GstCaps *gst_ximage_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc); static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc);
/* Called when a buffer is returned from the pipeline */ /* Called when a buffer is returned from the pipeline */
static void static gboolean
gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstBuffer * ximage) gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstBuffer * ximage)
{ {
GstMetaXImage *meta = GST_META_XIMAGE_GET (ximage); GstMetaXImage *meta = GST_META_XIMAGE_GET (ximage);
/* True will make dispose free the buffer, while false will keep it */
gboolean ret = TRUE;
/* If our geometry changed we can't reuse that image. */ /* If our geometry changed we can't reuse that image. */
if ((meta->width != ximagesrc->width) || (meta->height != ximagesrc->height)) { if ((meta->width != ximagesrc->width) || (meta->height != ximagesrc->height)) {
@ -107,7 +109,10 @@ gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstBuffer * ximage)
GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */ GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */
ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage); ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage);
g_mutex_unlock (&ximagesrc->pool_lock); g_mutex_unlock (&ximagesrc->pool_lock);
ret = FALSE;
} }
return ret;
} }
static Window static Window

View File

@ -314,11 +314,12 @@ ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext)
GST_DEBUG ("set xcontext PAR to %d/%d\n", xcontext->par_n, xcontext->par_d); GST_DEBUG ("set xcontext PAR to %d/%d\n", xcontext->par_n, xcontext->par_d);
} }
static void static gboolean
gst_ximagesrc_buffer_dispose (GstBuffer * ximage) gst_ximagesrc_buffer_dispose (GstBuffer * ximage)
{ {
GstElement *parent; GstElement *parent;
GstMetaXImage *meta; GstMetaXImage *meta;
gboolean ret = TRUE;
g_return_if_fail (ximage != NULL); g_return_if_fail (ximage != NULL);
@ -331,10 +332,10 @@ gst_ximagesrc_buffer_dispose (GstBuffer * ximage)
} }
if (meta->return_func) if (meta->return_func)
meta->return_func (parent, ximage); ret = meta->return_func (parent, ximage);
beach: beach:
return; return ret;
} }
void void

View File

@ -134,7 +134,7 @@ void ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext);
/* custom ximagesrc buffer, copied from ximagesink */ /* custom ximagesrc buffer, copied from ximagesink */
/* BufferReturnFunc is called when a buffer is finalised */ /* BufferReturnFunc is called when a buffer is finalised */
typedef void (*BufferReturnFunc) (GstElement *parent, GstBuffer *buf); typedef gboolean (*BufferReturnFunc) (GstElement *parent, GstBuffer *buf);
/** /**
* GstMetaXImage: * GstMetaXImage: