queue: post error message when pausing task
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 6 Aug 2009 11:29:29 +0000 (13:29 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 6 Aug 2009 11:42:25 +0000 (13:42 +0200)
If downstream returns error and upstream has already delivered
everything (including EOS) and will no longer be around to find
out that we paused (and why), post error message.  Fixes #589991.

plugins/elements/gstqueue.c

index 20380af..4200605 100644 (file)
@@ -1159,11 +1159,24 @@ gst_queue_loop (GstPad * pad)
   /* ERRORS */
 out_flushing:
   {
+    gboolean eos = queue->eos;
+    GstFlowReturn ret = queue->srcresult;
+
     gst_pad_pause_task (queue->srcpad);
     GST_CAT_LOG_OBJECT (queue_dataflow, queue,
-        "pause task, reason:  %s", gst_flow_get_name (queue->srcresult));
+        "pause task, reason:  %s", gst_flow_get_name (ret));
     GST_QUEUE_SIGNAL_DEL (queue);
     GST_QUEUE_MUTEX_UNLOCK (queue);
+    /* let app know about us giving up if upstream is not expected to do so */
+    /* UNEXPECTED is already taken care of elsewhere */
+    if (eos && (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) &&
+        (ret != GST_FLOW_UNEXPECTED)) {
+      GST_ELEMENT_ERROR (queue, STREAM, FAILED,
+          (_("Internal data flow error.")),
+          ("streaming task paused, reason %s (%d)",
+              gst_flow_get_name (ret), ret));
+      gst_pad_push_event (queue->srcpad, gst_event_new_eos ());
+    }
     return;
   }
 }