don't lock when min-threshold and max-size conflict.
authorArnout Vandecappelle <arnout@mind.be>
Thu, 11 Jun 2009 13:00:52 +0000 (15:00 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 15 Jun 2009 17:06:12 +0000 (19:06 +0200)
When min-threshold is set on a queue, it is possible that one of
the minima remains unsatisfied while one of the maxima is already
reached. Therefore, always consider the queue non-empty if it is full.

Fixes #585433.

plugins/elements/gstqueue.c

index f0040fd..be16c0c 100644 (file)
@@ -825,13 +825,16 @@ out_eos:
 static gboolean
 gst_queue_is_empty (GstQueue * queue)
 {
+  /* 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->queue->length == 0 ||
-      (queue->min_threshold.buffers > 0 &&
-          queue->cur_level.buffers < queue->min_threshold.buffers) ||
-      (queue->min_threshold.bytes > 0 &&
-          queue->cur_level.bytes < queue->min_threshold.bytes) ||
-      (queue->min_threshold.time > 0 &&
-          queue->cur_level.time < queue->min_threshold.time));
+      ((queue->min_threshold.buffers > 0 &&
+              queue->cur_level.buffers < queue->min_threshold.buffers) ||
+          (queue->min_threshold.bytes > 0 &&
+              queue->cur_level.bytes < queue->min_threshold.bytes) ||
+          (queue->min_threshold.time > 0 &&
+              queue->cur_level.time < queue->min_threshold.time)) &&
+      !gst_queue_is_filled (queue));
 }
 
 static gboolean