From af73f3fc02a6eb698da3933ea7bd607b2b157772 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 9 Jul 2012 15:37:28 +0200 Subject: [PATCH] queue: Fix handling of min-threshold and serialized queries Only consider the queue empty if the minimum thresholds are not reached and data is at the queue head. Otherwise we would block forever on serialized queries. This also makes sending of serialized events, like caps, happen faster and potentially improves negotiation performance. Fixes bug #679458. --- plugins/elements/gstqueue.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index e116aa2..52475f9 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -821,9 +821,19 @@ out_flushing: static gboolean gst_queue_is_empty (GstQueue * queue) { + GstMiniObject *head; + if (queue->queue->length == 0) return TRUE; + /* Only consider the queue empty if the minimum thresholds + * are not reached and data is at the queue head. Otherwise + * we would block forever on serialized queries. + */ + head = queue->queue->array[queue->queue->head]; + if (!GST_IS_BUFFER (head) && !GST_IS_BUFFER_LIST (head)) + return FALSE; + /* It is possible that a max size is reached before all min thresholds are. * Therefore, only consider it empty if it is not filled. */ return ((queue->min_threshold.buffers > 0 && -- 2.7.4