multiqueue: never consider a queue that is not waiting
authorMathieu Duponchelle <mathieu@centricular.com>
Thu, 9 Sep 2021 18:25:25 +0000 (20:25 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 13 Sep 2021 14:16:06 +0000 (14:16 +0000)
.. when computing the high id.

After a flush for instance, sq->srcresult is reset to OK,
yet it doesn't make sense to pick a non-existing position
id as the high id when a queue doesn't contain any items
in that situation either.

It is in any case completely OK to let the not-linked stream
get consumed without throttling at this stage, as any
first packet arriving on other single queues will get assigned
a higher position id.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/885>

plugins/elements/gstmultiqueue.c

index e6231c3..eaaa4b4 100644 (file)
@@ -2976,14 +2976,14 @@ compute_high_id (GstMultiQueue * mq)
     GST_LOG_OBJECT (mq, "inspecting sq:%d , nextid:%d, oldid:%d, srcresult:%s",
         sq->id, sq->nextid, sq->oldid, gst_flow_get_name (sq->srcresult));
 
-    if (sq->srcresult == GST_FLOW_NOT_LINKED) {
-      /* No need to consider queues which are not waiting */
-      if (sq->nextid == 0) {
-        GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
-        gst_object_unref (srcpad);
-        continue;
-      }
+    /* No need to consider queues which are not waiting */
+    if (sq->nextid == 0) {
+      GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
+      gst_object_unref (srcpad);
+      continue;
+    }
 
+    if (sq->srcresult == GST_FLOW_NOT_LINKED) {
       if (sq->nextid < lowest)
         lowest = sq->nextid;
     } else if (!GST_PAD_IS_EOS (srcpad) && sq->srcresult != GST_FLOW_EOS) {