multiqueue: post 100% buffering if single queue is not linked
authorThiago Santos <ts.santos@sisa.samsung.com>
Mon, 18 Nov 2013 13:46:00 +0000 (10:46 -0300)
committerThiago Santos <ts.santos@sisa.samsung.com>
Fri, 20 Dec 2013 04:10:47 +0000 (01:10 -0300)
This makes buffering stop in case a stream switch happens. This is
important for adaptive streams that can disable not-linked streams
to avoid consuming the network bandwidth.

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

plugins/elements/gstmultiqueue.c

index 6474ca5..0d976c0 100644 (file)
@@ -836,7 +836,7 @@ update_buffering (GstMultiQueue * mq, GstSingleQueue * sq)
       size.bytes, sq->max_size.bytes, sq->cur_time, sq->max_size.time);
 
   /* get bytes and time percentages and take the max */
-  if (sq->is_eos) {
+  if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED) {
     percent = 100;
   } else {
     percent = 0;
@@ -1197,6 +1197,7 @@ gst_multi_queue_loop (GstPad * pad)
   GstFlowReturn result;
   GstClockTime next_time;
   gboolean is_buffer;
+  gboolean do_update_buffering = FALSE;
 
   sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
   mq = sq->mqueue;
@@ -1348,6 +1349,7 @@ gst_multi_queue_loop (GstPad * pad)
         sq->id);
 
     compute_high_id (mq);
+    do_update_buffering = TRUE;
 
     /* maybe no-one is waiting */
     if (mq->numwaiting > 0) {
@@ -1369,6 +1371,10 @@ gst_multi_queue_loop (GstPad * pad)
     sq->pushed = TRUE;
   sq->srcresult = result;
   sq->last_oldid = newid;
+
+  if (do_update_buffering)
+    update_buffering (mq, sq);
+
   GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
 
   if (result != GST_FLOW_OK && result != GST_FLOW_NOT_LINKED