All pastes #454064 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-04-23 11:48 UTC
rendered paste body
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));