Index: gstreamer/plugins/elements/gstqueue.c =================================================================== RCS file: /usr/local/cvs/linux/libs/gstreamer/gstreamer/plugins/elements/gstqueue.c,v retrieving revision 1.1.1.6 diff -u -r1.1.1.6 gstqueue.c --- gstreamer/plugins/elements/gstqueue.c 15 Mar 2007 12:35:44 -0000 1.1.1.6 +++ gstreamer/plugins/elements/gstqueue.c 23 Apr 2007 11:43:48 -0000 @@ -644,6 +644,8 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer) { GstQueue *queue; + GList *tmp; + GstMiniObject *prev = NULL; queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); @@ -677,6 +679,7 @@ * unref that and "fix up" the GQueue object... */ GList *item; GstMiniObject *leak = NULL; + GList *tmp; if (!gst_queue_is_filled (queue)) { /* Queue was emptied while we sent out the signal, so no need to drop */ @@ -709,6 +712,20 @@ queue->cur_level.buffers--; if (GST_BUFFER_DURATION (leak) != GST_CLOCK_TIME_NONE) queue->cur_level.time -= GST_BUFFER_DURATION (leak); + else { + GstMiniObject *next = NULL; + + for (tmp = g_queue_peek_head_link (queue->queue); tmp; + tmp = tmp->next) { + if (GST_IS_BUFFER (tmp->data)) { + next = tmp->data; + break; + } + } + if (next) + queue->cur_level.time -= + GST_BUFFER_TIMESTAMP (next) - GST_BUFFER_TIMESTAMP (leak); + } gst_buffer_unref (leak); break; @@ -749,11 +766,27 @@ g_queue_push_tail (queue->queue, buffer); + /* compensate for missing duration in last buffer */ + for (tmp = g_queue_peek_tail_link (queue->queue)->prev; tmp; + tmp = tmp ->prev) { + if (GST_IS_BUFFER (tmp->data)) { + prev = tmp->data; + break; + } + } + if (prev && GST_BUFFER_DURATION (prev) == GST_CLOCK_TIME_NONE) { + queue->cur_level.time += + GST_BUFFER_TIMESTAMP (buffer) - GST_BUFFER_TIMESTAMP (prev); + } + /* add buffer to the statistics */ queue->cur_level.buffers++; queue->cur_level.bytes += GST_BUFFER_SIZE (buffer); if (GST_BUFFER_DURATION (buffer) != GST_CLOCK_TIME_NONE) queue->cur_level.time += GST_BUFFER_DURATION (buffer); + else + GST_DEBUG_OBJECT (queue, + "no duration in buffer, time level update postponed"); STATUS (queue, pad, "+ level"); @@ -805,6 +838,20 @@ queue->cur_level.bytes -= GST_BUFFER_SIZE (data); if (GST_BUFFER_DURATION (data) != GST_CLOCK_TIME_NONE) queue->cur_level.time -= GST_BUFFER_DURATION (data); + else { + GList *tmp; + GstMiniObject *next = NULL; + + for (tmp = g_queue_peek_head_link (queue->queue); tmp; tmp = tmp->next) { + if (GST_IS_BUFFER (tmp->data)) { + next = tmp->data; + break; + } + } + if (next) + queue->cur_level.time -= + GST_BUFFER_TIMESTAMP (next) - GST_BUFFER_TIMESTAMP (data); + } GST_QUEUE_MUTEX_UNLOCK (queue); result = gst_pad_push (queue->srcpad, GST_BUFFER (data));