multiqueue: Ignore time when determining whether sparse stream limits have been reached
authorMatej Knopp <matej.knopp@gmail.com>
Fri, 29 Apr 2016 12:55:02 +0000 (14:55 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 29 Apr 2016 13:09:23 +0000 (16:09 +0300)
Basically, sq->max_size.visible is never increased for sparse streams in
overruncb when empty queue has been found;

If the queue is sparse it just skip the entire logic determining whether
max_size.visible should be increased, deadlocking the demuxer.

What should be done instead is that when determining if limits have been
reached, to ignore time for sparse streams, as the buffer may be far in the
future.

https://bugzilla.gnome.org/show_bug.cgi?id=765736

plugins/elements/gstmultiqueue.c

index 172b525c69bce7d2b87205ae365121f34d957b60..aa8fd269a569ec2b4e35e5edce68189c7abd33ba 100644 (file)
@@ -2449,9 +2449,10 @@ single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq)
 
   GST_MULTI_QUEUE_MUTEX_LOCK (mq);
 
-  /* check if we reached the hard time/bytes limits */
-  if (sq->is_eos || sq->is_sparse || IS_FILLED (sq, bytes, size.bytes) ||
-      IS_FILLED (sq, time, sq->cur_time)) {
+  /* check if we reached the hard time/bytes limits;
+     time limit is only taken into account for non-sparse streams */
+  if (sq->is_eos || IS_FILLED (sq, bytes, size.bytes) ||
+      (!sq->is_sparse && IS_FILLED (sq, time, sq->cur_time))) {
     goto done;
   }