diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 548d99ac52..ab725b5099 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -1096,6 +1096,8 @@ perform_seek_to_offset (GstQueue2 * queue, guint64 offset) GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); + /* until we receive the FLUSH_STOP from this seek, we skip data */ + queue->seeking = TRUE; res = gst_pad_push_event (queue->sinkpad, event); GST_QUEUE2_MUTEX_LOCK (queue); @@ -2181,6 +2183,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstEvent * event) queue->sinkresult = GST_FLOW_OK; queue->is_eos = FALSE; queue->unexpected = FALSE; + queue->seeking = FALSE; /* reset rate counters */ reset_rate_timer (queue); gst_pad_start_task (queue->srcpad, (GstTaskFunction) gst_queue2_loop, @@ -2307,6 +2310,10 @@ gst_queue2_chain_buffer_or_buffer_list (GstQueue2 * queue, if (queue->unexpected) goto out_unexpected; + /* while we didn't receive the newsegment, we're seeking and we skip data */ + if (queue->seeking) + goto out_seeking; + if (!gst_queue2_wait_free_space (queue)) goto out_flushing; @@ -2336,6 +2343,14 @@ out_eos: return GST_FLOW_UNEXPECTED; } +out_seeking: + { + GST_CAT_LOG_OBJECT (queue_dataflow, queue, "exit because we are seeking"); + GST_QUEUE2_MUTEX_UNLOCK (queue); + gst_mini_object_unref (item); + + return GST_FLOW_OK; + } out_unexpected: { GST_CAT_LOG_OBJECT (queue_dataflow, queue, diff --git a/plugins/elements/gstqueue2.h b/plugins/elements/gstqueue2.h index 02a38f264a..3698344e26 100644 --- a/plugins/elements/gstqueue2.h +++ b/plugins/elements/gstqueue2.h @@ -143,6 +143,7 @@ struct _GstQueue2 * because we can't save it on the file */ gboolean segment_event_received; GstEvent *starting_segment; + gboolean seeking; guint64 ring_buffer_max_size; guint8 * ring_buffer;