rendered paste bodyIndex: 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));