From: Wim Taymans Date: Sun, 9 Jun 2002 12:13:30 +0000 (+0000) Subject: Whan the buffer is filled, the buffer is kept and added to the queue when there is... X-Git-Tag: BRANCH-RELEASE-0_4_0-ROOT~67 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3ab6d4c0e2e530330ebb3e960ae7b53b3ccb28c3;p=platform%2Fupstream%2Fgstreamer.git Whan the buffer is filled, the buffer is kept and added to the queue when there is room again. Don't do this after a ... Original commit message from CVS: Whan the buffer is filled, the buffer is kept and added to the queue when there is room again. Don't do this after a flush. --- diff --git a/gst/gstqueue.c b/gst/gstqueue.c index c0fcfb9..e9d6127 100644 --- a/gst/gstqueue.c +++ b/gst/gstqueue.c @@ -230,6 +230,8 @@ gst_queue_init (GstQueue *queue) queue->size_time = 1000000000LL; /* 1sec */ queue->may_deadlock = TRUE; queue->block_timeout = -1; + queue->interrupt = FALSE; + queue->flush = FALSE; queue->qlock = g_mutex_new (); queue->reader = FALSE; @@ -287,6 +289,8 @@ gst_queue_locked_flush (GstQueue *queue) queue->queue = NULL; queue->level_buffers = 0; queue->timeval = NULL; + /* make sure any pending buffers to be added are flushed too */ + queue->flush = TRUE; } static void @@ -317,6 +321,9 @@ restart: g_mutex_lock (queue->qlock); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locked t:%ld", pthread_self ()); + /* assume don't need to flush this buffer when the queue is filled */ + queue->flush = FALSE; + if (GST_IS_EVENT (buf)) { switch (GST_EVENT_TYPE (buf)) { case GST_EVENT_FLUSH: @@ -379,12 +386,18 @@ restart: while (queue->level_buffers == queue->size_buffers) { /* if there's a pending state change for this queue or its manager, switch */ /* back to iterator so bottom half of state change executes */ - //while (GST_STATE_PENDING (queue) != GST_STATE_VOID_PENDING) { if (queue->interrupt) { GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!"); g_mutex_unlock (queue->qlock); if (gst_scheduler_interrupt (GST_RPAD_SCHED (queue->sinkpad), GST_ELEMENT (queue))) return; + /* if we got here bacause we were unlocked after a flush, we don't need + * to add the buffer to the queue again */ + if (queue->flush) { + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush"); + return; + } + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt"); goto restart; } if (GST_STATE (queue) != GST_STATE_PLAYING) { @@ -580,8 +593,9 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event) gst_queue_locked_flush (queue); break; case GST_EVENT_SEEK: - if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) + if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) { gst_queue_locked_flush (queue); + } default: break; } diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index c0fcfb9..e9d6127 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -230,6 +230,8 @@ gst_queue_init (GstQueue *queue) queue->size_time = 1000000000LL; /* 1sec */ queue->may_deadlock = TRUE; queue->block_timeout = -1; + queue->interrupt = FALSE; + queue->flush = FALSE; queue->qlock = g_mutex_new (); queue->reader = FALSE; @@ -287,6 +289,8 @@ gst_queue_locked_flush (GstQueue *queue) queue->queue = NULL; queue->level_buffers = 0; queue->timeval = NULL; + /* make sure any pending buffers to be added are flushed too */ + queue->flush = TRUE; } static void @@ -317,6 +321,9 @@ restart: g_mutex_lock (queue->qlock); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locked t:%ld", pthread_self ()); + /* assume don't need to flush this buffer when the queue is filled */ + queue->flush = FALSE; + if (GST_IS_EVENT (buf)) { switch (GST_EVENT_TYPE (buf)) { case GST_EVENT_FLUSH: @@ -379,12 +386,18 @@ restart: while (queue->level_buffers == queue->size_buffers) { /* if there's a pending state change for this queue or its manager, switch */ /* back to iterator so bottom half of state change executes */ - //while (GST_STATE_PENDING (queue) != GST_STATE_VOID_PENDING) { if (queue->interrupt) { GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!"); g_mutex_unlock (queue->qlock); if (gst_scheduler_interrupt (GST_RPAD_SCHED (queue->sinkpad), GST_ELEMENT (queue))) return; + /* if we got here bacause we were unlocked after a flush, we don't need + * to add the buffer to the queue again */ + if (queue->flush) { + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush"); + return; + } + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt"); goto restart; } if (GST_STATE (queue) != GST_STATE_PLAYING) { @@ -580,8 +593,9 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event) gst_queue_locked_flush (queue); break; case GST_EVENT_SEEK: - if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) + if (GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH) { gst_queue_locked_flush (queue); + } default: break; }