queue2: Avoid re-checking many times whether an item is a buffer

Avoids calling 6 times gst_buffer_get_type() for every item coming
through queue2
This commit is contained in:
Edward Hervey 2010-10-19 17:45:16 +02:00
parent 080c965f4f
commit 66bba2a49e

View file

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