plugins/queue: Use previous knowledge of data type to avoid typecheck.

We know whether we have a buffer or an event, use that instead of going
trough the expensive GLib typecheck.

The overall instruction fetch reduction introduced by this commit and the
2 previous commits:
* receiving a buffer (_chain) by 20%
* popping a buffer (_loop) by 14%

Numbers acquired through callgrind passing 100000 buffers through queue.
This commit is contained in:
Edward Hervey 2009-09-28 15:41:52 +02:00
parent 9be7fdc857
commit d28a3e7435

View file

@ -655,10 +655,10 @@ gst_queue_locked_flush (GstQueue * queue)
} }
/* enqueue an item an update the level stats, with QUEUE_LOCK */ /* enqueue an item an update the level stats, with QUEUE_LOCK */
static void static inline void
gst_queue_locked_enqueue (GstQueue * queue, gpointer item) gst_queue_locked_enqueue (GstQueue * queue, gpointer item, gboolean isbuffer)
{ {
if (GST_IS_BUFFER (item)) { if (isbuffer) {
GstBuffer *buffer = GST_BUFFER_CAST (item); GstBuffer *buffer = GST_BUFFER_CAST (item);
/* add buffer to the statistics */ /* add buffer to the statistics */
@ -674,7 +674,7 @@ gst_queue_locked_enqueue (GstQueue * queue, gpointer item)
* See #482147 */ * See #482147 */
/* if (queue->cur_level.buffers == 1) */ /* if (queue->cur_level.buffers == 1) */
/* apply_buffer (queue, buffer, &queue->src_segment, FALSE); */ /* apply_buffer (queue, buffer, &queue->src_segment, FALSE); */
} else if (GST_IS_EVENT (item)) { } else {
GstEvent *event = GST_EVENT_CAST (item); GstEvent *event = GST_EVENT_CAST (item);
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
@ -695,11 +695,6 @@ gst_queue_locked_enqueue (GstQueue * queue, gpointer item)
default: default:
break; break;
} }
} else {
g_warning ("Unexpected item %p added in queue %s (refcounting problem?)",
item, GST_OBJECT_NAME (queue));
/* we can't really unref since we don't know what it is */
item = NULL;
} }
if (item) if (item)
@ -822,7 +817,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
/* refuse more events on EOS */ /* refuse more events on EOS */
if (queue->eos) if (queue->eos)
goto out_eos; goto out_eos;
gst_queue_locked_enqueue (queue, event); gst_queue_locked_enqueue (queue, event, FALSE);
GST_QUEUE_MUTEX_UNLOCK (queue); GST_QUEUE_MUTEX_UNLOCK (queue);
} else { } else {
/* non-serialized events are passed upstream. */ /* non-serialized events are passed upstream. */
@ -986,7 +981,7 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer)
} }
/* put buffer in queue now */ /* put buffer in queue now */
gst_queue_locked_enqueue (queue, buffer); gst_queue_locked_enqueue (queue, buffer, TRUE);
GST_QUEUE_MUTEX_UNLOCK (queue); GST_QUEUE_MUTEX_UNLOCK (queue);
return GST_FLOW_OK; return GST_FLOW_OK;