diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 144c684b9f..63a56a30cb 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -2286,6 +2286,25 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent, if (GST_EVENT_IS_SERIALIZED (event)) { /* serialized events go in the queue */ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->sinkresult, out_flushing); + if (queue->srcresult != GST_FLOW_OK) { + /* Errors in sticky event pushing are no problem and ignored here + * as they will cause more meaningful errors during data flow. + * For EOS events, that are not followed by data flow, we still + * return FALSE here though and report an error. + */ + if (!GST_EVENT_IS_STICKY (event)) { + goto out_flow_error; + } else if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { + if (queue->srcresult == GST_FLOW_NOT_LINKED + || queue->srcresult < GST_FLOW_EOS) { + GST_ELEMENT_ERROR (queue, STREAM, FAILED, + (_("Internal data flow error.")), + ("streaming task paused, reason %s (%d)", + gst_flow_get_name (queue->srcresult), queue->srcresult)); + } + goto out_flow_error; + } + } /* refuse more events on EOS */ if (queue->is_eos) goto out_eos; @@ -2314,6 +2333,15 @@ out_eos: gst_event_unref (event); return FALSE; } +out_flow_error: + { + GST_LOG_OBJECT (queue, + "refusing event, we have a downstream flow error: %s", + gst_flow_get_name (queue->srcresult)); + GST_QUEUE2_MUTEX_UNLOCK (queue); + gst_event_unref (event); + return FALSE; + } } static gboolean