plugins: *queue* elements: Handle STREAM_START in EOS situation

When queue-like elements are in "EOS" situation (received GST_FLOW_EOS
from downstream or EOS was pushed), they drain buffers/events that
wouldn't be processed anyway and let through events that might
modify the EOS situation.

Previously only GST_EVENT_EOS and GST_EVENT_SEGMENT events were let
through, but we also need to allow GST_EVENT_STREAM_START to go
through since it resets the EOS state of pads since 1.6

https://bugzilla.gnome.org/show_bug.cgi?id=786034
This commit is contained in:
Edward Hervey 2017-08-09 10:51:39 +02:00 committed by Edward Hervey
parent 849dfe82f1
commit e2f8dc0aef
3 changed files with 9 additions and 2 deletions

View file

@ -1631,6 +1631,11 @@ gst_single_queue_push_one (GstMultiQueue * mq, GstSingleQueue * sq,
if (G_UNLIKELY (*allow_drop)) if (G_UNLIKELY (*allow_drop))
*allow_drop = FALSE; *allow_drop = FALSE;
break; break;
case GST_EVENT_STREAM_START:
result = GST_FLOW_OK;
if (G_UNLIKELY (*allow_drop))
*allow_drop = FALSE;
break;
case GST_EVENT_SEGMENT: case GST_EVENT_SEGMENT:
apply_segment (mq, sq, event, &sq->src_segment); apply_segment (mq, sq, event, &sq->src_segment);
/* Applying the segment may have made the queue non-full again, unblock it if needed */ /* Applying the segment may have made the queue non-full again, unblock it if needed */

View file

@ -1400,7 +1400,8 @@ next:
GstEvent *event = GST_EVENT_CAST (data); GstEvent *event = GST_EVENT_CAST (data);
GstEventType type = GST_EVENT_TYPE (event); GstEventType type = GST_EVENT_TYPE (event);
if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT) { if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT
|| type == GST_EVENT_STREAM_START) {
/* we found a pushable item in the queue, push it out */ /* we found a pushable item in the queue, push it out */
GST_CAT_LOG_OBJECT (queue_dataflow, queue, GST_CAT_LOG_OBJECT (queue_dataflow, queue,
"pushing pushable event %s after EOS", "pushing pushable event %s after EOS",

View file

@ -2859,7 +2859,8 @@ gst_queue2_dequeue_on_eos (GstQueue2 * queue, GstQueue2ItemType * item_type)
GstEvent *event = GST_EVENT_CAST (data); GstEvent *event = GST_EVENT_CAST (data);
GstEventType type = GST_EVENT_TYPE (event); GstEventType type = GST_EVENT_TYPE (event);
if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT) { if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT
|| type == GST_EVENT_STREAM_START) {
/* we found a pushable item in the queue, push it out */ /* we found a pushable item in the queue, push it out */
GST_CAT_LOG_OBJECT (queue_dataflow, queue, GST_CAT_LOG_OBJECT (queue_dataflow, queue,
"pushing pushable event %s after EOS", GST_EVENT_TYPE_NAME (event)); "pushing pushable event %s after EOS", GST_EVENT_TYPE_NAME (event));