queue2: post error message when pausing task if so appropriate
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 6 Aug 2009 10:18:36 +0000 (12:18 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 29 Oct 2009 10:17:17 +0000 (11:17 +0100)
If a downstream element returns an error while upstream has already
put all data into queue2 (including EOS), upstream will no longer
chain into queue2, so it is up to queue2 to perform some
EOS handling / message posting in such cases.  See #589991.

gst/playback/gstqueue2.c

index 8ff5953..57eebc0 100644 (file)
@@ -1658,10 +1658,23 @@ gst_queue_loop (GstPad * pad)
   /* ERRORS */
 out_flushing:
   {
+    gboolean eos = queue->is_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));
     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;
   }
 }