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)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 26 Dec 2013 07:59:58 +0000 (08:59 +0100)
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 6bd123937ce0557198fb1363eb3a8310f2d9185e..266fead88522baffa1aadf3fffc8db525d06c885 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