multiqueue: handle UNEXPECTED flowreturn better
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 26 Jan 2010 11:43:09 +0000 (12:43 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 26 Jan 2010 16:07:31 +0000 (17:07 +0100)
When we receive an UNEXPECTED flowreturn from downstream, we must not shutdown
the pushing thread because upstream will at some point push an EOS that we still
need to push further downstream.

To achieve this, convert the UNEXPECTED return value to OK. Add a fixme so that
we implement the right logic to propagate the flowreturn upstream at some point.

Also clean up the unit test a little.

Fixes #608136

plugins/elements/gstmultiqueue.c
tests/check/elements/multiqueue.c

index 0b8439c..30f1165 100644 (file)
@@ -917,6 +917,13 @@ gst_single_queue_push_one (GstMultiQueue * mq, GstSingleQueue * sq,
       gst_pad_set_caps (sq->srcpad, caps);
 
     result = gst_pad_push (sq->srcpad, buffer);
+
+    if (result == GST_FLOW_UNEXPECTED) {
+      GST_LOG_OBJECT (mq, "got UNEXPECTED from downstream");
+      /* FIXME, dequeue items until we see EOS or NEWSEGMENT. If the queue is
+       * empty, set a flag so that we pass unexpected upstream. */
+      result = GST_FLOW_OK;
+    }
   } else if (GST_IS_EVENT (object)) {
     GstEvent *event;
 
index 1c7a418..c956d25 100644 (file)
@@ -479,13 +479,13 @@ run_output_order_test (gint n_linked)
 
   /* Wait while the buffers are processed */
   g_mutex_lock (mutex);
-  while (eos_seen < 5) {
+  while (eos_seen < NPADS) {
     g_cond_wait (cond, mutex);
   }
   g_mutex_unlock (mutex);
 
   /* Clean up */
-  for (i = 0; i < 5; i++) {
+  for (i = 0; i < NPADS; i++) {
     GstPad *mq_input = gst_pad_get_peer (inputpads[i]);
 
     gst_pad_unlink (inputpads[i], mq_input);