multiqueue: prevent buffering forever with playbin
authorThiago Santos <ts.santos@sisa.samsung.com>
Wed, 15 Jan 2014 03:12:26 +0000 (00:12 -0300)
committerThiago Santos <ts.santos@sisa.samsung.com>
Wed, 15 Jan 2014 12:51:35 +0000 (09:51 -0300)
When prerolling/buffering, multiqueue has its buffers limit set
to 0, this means it can take an infinite amount of buffers.

When prerolling/buffering finishes, its limit is set back to 5, but
only if the current level is lower than 5. It should (almost) never be
and this will cause prerolling/buffering to need to wait to reach the
hard bytes and time limits, which are much higher.

This can lead to a very long startup time. This patch fixes this
by setting the single queues to the max(current, new_value) instead
of simply ignoring the new value and letting it as infinite(0)

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

plugins/elements/gstmultiqueue.c

index 5b3b5f2..434902f 100644 (file)
@@ -508,8 +508,11 @@ gst_multi_queue_set_property (GObject * object, guint prop_id,
         gst_data_queue_get_level (q->queue, &size);
 
         /* do not reduce max size below current level if the single queue has grown because of empty queue */
-        if (new_size >= size.visible && size.visible <= mq->max_size.visible)
+        if (new_size == 0) {
           q->max_size.visible = new_size;
+        } else {
+          q->max_size.visible = MAX (new_size, size.visible);
+        }
         tmp = g_list_next (tmp);
       };