mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 18:20:44 +00:00
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:
parent
849dfe82f1
commit
e2f8dc0aef
3 changed files with 9 additions and 2 deletions
|
@ -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 */
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue