mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
adapter: reuse more data in _peek()
Optimize _peek() some more by reusing already assembled data when we can.
This commit is contained in:
parent
961e2029db
commit
a144882871
1 changed files with 23 additions and 7 deletions
|
@ -392,6 +392,8 @@ gst_adapter_peek (GstAdapter * adapter, guint size)
|
||||||
{
|
{
|
||||||
GstBuffer *cur;
|
GstBuffer *cur;
|
||||||
guint skip;
|
guint skip;
|
||||||
|
guint toreuse, tocopy;
|
||||||
|
guint8 *data;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
|
g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
|
||||||
g_return_val_if_fail (size > 0, NULL);
|
g_return_val_if_fail (size > 0, NULL);
|
||||||
|
@ -421,21 +423,35 @@ gst_adapter_peek (GstAdapter * adapter, guint size)
|
||||||
return GST_BUFFER_DATA (cur) + skip;
|
return GST_BUFFER_DATA (cur) + skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see how much data we can reuse from the assembled memory and how much
|
||||||
|
* we need to copy */
|
||||||
|
toreuse = adapter->assembled_len;
|
||||||
|
tocopy = size - toreuse;
|
||||||
|
|
||||||
/* Gonna need to copy stuff out */
|
/* Gonna need to copy stuff out */
|
||||||
if (G_UNLIKELY (adapter->assembled_size < size)) {
|
if (G_UNLIKELY (adapter->assembled_size < size)) {
|
||||||
adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE;
|
adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE;
|
||||||
GST_DEBUG_OBJECT (adapter, "resizing internal buffer to %u",
|
GST_DEBUG_OBJECT (adapter, "resizing internal buffer to %u",
|
||||||
adapter->assembled_size);
|
adapter->assembled_size);
|
||||||
|
if (toreuse == 0) {
|
||||||
|
GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "alloc new buffer");
|
||||||
/* no g_realloc to avoid a memcpy that is not desired here since we are
|
/* no g_realloc to avoid a memcpy that is not desired here since we are
|
||||||
* going to copy new data into the area below */
|
* not going to reuse any data here */
|
||||||
g_free (adapter->assembled_data);
|
g_free (adapter->assembled_data);
|
||||||
adapter->assembled_data = g_malloc (adapter->assembled_size);
|
adapter->assembled_data = g_malloc (adapter->assembled_size);
|
||||||
|
} else {
|
||||||
|
/* we are going to reuse all data, realloc then */
|
||||||
|
GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "reusing %u bytes", toreuse);
|
||||||
|
adapter->assembled_data =
|
||||||
|
g_realloc (adapter->assembled_data, adapter->assembled_size);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy remaining %u bytes from adapter",
|
||||||
|
tocopy);
|
||||||
|
data = adapter->assembled_data;
|
||||||
|
copy_into_unchecked (adapter, data + toreuse, skip + toreuse, tocopy);
|
||||||
adapter->assembled_len = size;
|
adapter->assembled_len = size;
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy data from adapter");
|
|
||||||
copy_into_unchecked (adapter, adapter->assembled_data, skip, size);
|
|
||||||
|
|
||||||
return adapter->assembled_data;
|
return adapter->assembled_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue