From ff998f24dbba934abd6402dafbe809cdf9dea466 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 6 Aug 2009 12:18:36 +0200 Subject: [PATCH] queue2: post error message when pausing task if so appropriate 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 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gst/playback/gstqueue2.c b/gst/playback/gstqueue2.c index 8ff5953021..57eebc0c6a 100644 --- a/gst/playback/gstqueue2.c +++ b/gst/playback/gstqueue2.c @@ -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; } }