From d23d6cd998d0af5d385cf6bc7fda569f7f0ed68f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 27 Jan 2010 23:39:14 +0000 Subject: [PATCH] dataurisrc: must release the object lock before using GST_ELEMENT_ERROR --- plugins/elements/gstdataurisrc.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/elements/gstdataurisrc.c b/plugins/elements/gstdataurisrc.c index b00059f..da91390 100644 --- a/plugins/elements/gstdataurisrc.c +++ b/plugins/elements/gstdataurisrc.c @@ -234,19 +234,31 @@ gst_data_uri_src_create (GstBaseSrc * basesrc, guint64 offset, guint size, GstFlowReturn ret; GST_OBJECT_LOCK (src); - if (!src->buffer) { - ret = GST_FLOW_NOT_NEGOTIATED; - GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), (NULL)); - } else if (offset + size > GST_BUFFER_SIZE (src->buffer)) { + + if (!src->buffer) + goto no_buffer; + + /* This is only correct because GstBaseSrc already clips size for us to be no + * larger than the max. available size if a segment at the end is requested */ + if (offset + size > GST_BUFFER_SIZE (src->buffer)) { ret = GST_FLOW_UNEXPECTED; } else { ret = GST_FLOW_OK; *buf = gst_buffer_create_sub (src->buffer, offset, size); gst_buffer_set_caps (*buf, GST_BUFFER_CAPS (src->buffer)); } + GST_OBJECT_UNLOCK (src); return ret; + +/* ERRORS */ +no_buffer: + { + GST_OBJECT_UNLOCK (src); + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), (NULL)); + return GST_FLOW_NOT_NEGOTIATED; + } } static gboolean -- 2.7.4