queue2: Avoid re-checking many times whether an item is a buffer
authorEdward Hervey <bilboed@bilboed.com>
Tue, 19 Oct 2010 15:45:16 +0000 (17:45 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 2 Dec 2010 18:04:56 +0000 (19:04 +0100)
Avoids calling 6 times gst_buffer_get_type() for every item coming
through queue2

plugins/elements/gstqueue2.c

index 6ffd63e..92cc484 100644 (file)
@@ -1792,9 +1792,9 @@ handle_error:
 
 /* enqueue an item an update the level stats */
 static void
-gst_queue2_locked_enqueue (GstQueue2 * queue, gpointer item)
+gst_queue2_locked_enqueue (GstQueue2 * queue, gpointer item, gboolean isbuffer)
 {
-  if (GST_IS_BUFFER (item)) {
+  if (isbuffer) {
     GstBuffer *buffer;
     guint size;
 
@@ -1888,7 +1888,7 @@ unexpected_event:
 
 /* dequeue an item from the queue and update level stats */
 static GstMiniObject *
-gst_queue2_locked_dequeue (GstQueue2 * queue)
+gst_queue2_locked_dequeue (GstQueue2 * queue, gboolean * is_buffer)
 {
   GstMiniObject *item;
 
@@ -1906,6 +1906,7 @@ gst_queue2_locked_dequeue (GstQueue2 * queue)
 
     buffer = GST_BUFFER_CAST (item);
     size = GST_BUFFER_SIZE (buffer);
+    *is_buffer = TRUE;
 
     GST_CAT_LOG_OBJECT (queue_dataflow, queue,
         "retrieved buffer %p from queue", buffer);
@@ -2034,7 +2035,7 @@ gst_queue2_handle_sink_event (GstPad * pad, GstEvent * event)
         /* refuse more events on EOS */
         if (queue->is_eos)
           goto out_eos;
-        gst_queue2_locked_enqueue (queue, event);
+        gst_queue2_locked_enqueue (queue, event, FALSE);
         GST_QUEUE2_MUTEX_UNLOCK (queue);
       } else {
         /* non-serialized events are passed upstream. */
@@ -2149,7 +2150,7 @@ gst_queue2_chain (GstPad * pad, GstBuffer * buffer)
     goto out_flushing;
 
   /* put buffer in queue now */
-  gst_queue2_locked_enqueue (queue, buffer);
+  gst_queue2_locked_enqueue (queue, buffer, TRUE);
   GST_QUEUE2_MUTEX_UNLOCK (queue);
 
   return GST_FLOW_OK;
@@ -2192,15 +2193,16 @@ gst_queue2_push_one (GstQueue2 * queue)
 {
   GstFlowReturn result = GST_FLOW_OK;
   GstMiniObject *data;
+  gboolean is_buffer = FALSE;
 
-  data = gst_queue2_locked_dequeue (queue);
+  data = gst_queue2_locked_dequeue (queue, &is_buffer);
   if (data == NULL)
     goto no_item;
 
 next:
   GST_QUEUE2_MUTEX_UNLOCK (queue);
 
-  if (GST_IS_BUFFER (data)) {
+  if (is_buffer) {
     GstBuffer *buffer;
     GstCaps *caps;
 
@@ -2224,8 +2226,8 @@ next:
        * queue we can push, we set a flag to make the sinkpad refuse more
        * buffers with an UNEXPECTED return value until we receive something
        * pushable again or we get flushed. */
-      while ((data = gst_queue2_locked_dequeue (queue))) {
-        if (GST_IS_BUFFER (data)) {
+      while ((data = gst_queue2_locked_dequeue (queue, &is_buffer))) {
+        if (is_buffer) {
           GST_CAT_LOG_OBJECT (queue_dataflow, queue,
               "dropping UNEXPECTED buffer %p", data);
           gst_buffer_unref (GST_BUFFER_CAST (data));