buffer: Find initial memory block without unnecessary mapping

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9354>
This commit is contained in:
Doug Nazar 2025-06-30 02:14:59 -04:00 committed by GStreamer Marge Bot
parent 4e7df779df
commit 160205b483

View File

@ -1932,6 +1932,26 @@ gst_buffer_unmap (GstBuffer * buffer, GstMapInfo * info)
_gst_buffer_map_info_clear ((GstBufferMapInfo *) info); _gst_buffer_map_info_clear ((GstBufferMapInfo *) info);
} }
static gsize
_find_mapping (GstBuffer * buffer, gsize * offset)
{
gsize i, len;
len = GST_BUFFER_MEM_LEN (buffer);
for (i = 0; i < len; i++) {
gsize size = GST_BUFFER_MEM_PTR (buffer, i)->size;
if (size > *offset) {
/* we have enough */
break;
}
/* offset past buffer, skip */
*offset -= size;
}
return i;
}
/** /**
* gst_buffer_fill: * gst_buffer_fill:
* @buffer: a #GstBuffer. * @buffer: a #GstBuffer.
@ -1961,24 +1981,22 @@ gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
len = GST_BUFFER_MEM_LEN (buffer); len = GST_BUFFER_MEM_LEN (buffer);
left = size; left = size;
i = 0;
for (i = 0; i < len && left > 0; i++) { if (offset)
i = _find_mapping (buffer, &offset);
for (; i < len && left > 0; i++) {
GstMapInfo info; GstMapInfo info;
gsize tocopy; gsize tocopy;
GstMemory *mem; GstMemory *mem;
mem = _get_mapped (buffer, i, &info, GST_MAP_WRITE); mem = _get_mapped (buffer, i, &info, GST_MAP_WRITE);
if (info.size > offset) { tocopy = MIN (info.size - offset, left);
/* we have enough */ memcpy ((guint8 *) info.data + offset, ptr, tocopy);
tocopy = MIN (info.size - offset, left); left -= tocopy;
memcpy ((guint8 *) info.data + offset, ptr, tocopy); ptr += tocopy;
left -= tocopy; offset = 0;
ptr += tocopy;
offset = 0;
} else {
/* offset past buffer, skip */
offset -= info.size;
}
gst_memory_unmap (mem, &info); gst_memory_unmap (mem, &info);
} }
return size - left; return size - left;
@ -2012,24 +2030,22 @@ gst_buffer_extract (GstBuffer * buffer, gsize offset, gpointer dest, gsize size)
len = GST_BUFFER_MEM_LEN (buffer); len = GST_BUFFER_MEM_LEN (buffer);
left = size; left = size;
i = 0;
for (i = 0; i < len && left > 0; i++) { if (offset)
i = _find_mapping (buffer, &offset);
for (; i < len && left > 0; i++) {
GstMapInfo info; GstMapInfo info;
gsize tocopy; gsize tocopy;
GstMemory *mem; GstMemory *mem;
mem = _get_mapped (buffer, i, &info, GST_MAP_READ); mem = _get_mapped (buffer, i, &info, GST_MAP_READ);
if (info.size > offset) { tocopy = MIN (info.size - offset, left);
/* we have enough */ memcpy (ptr, (guint8 *) info.data + offset, tocopy);
tocopy = MIN (info.size - offset, left); left -= tocopy;
memcpy (ptr, (guint8 *) info.data + offset, tocopy); ptr += tocopy;
left -= tocopy; offset = 0;
ptr += tocopy;
offset = 0;
} else {
/* offset past buffer, skip */
offset -= info.size;
}
gst_memory_unmap (mem, &info); gst_memory_unmap (mem, &info);
} }
return size - left; return size - left;
@ -2065,6 +2081,10 @@ gst_buffer_memcmp (GstBuffer * buffer, gsize offset, gconstpointer mem,
return -1; return -1;
len = GST_BUFFER_MEM_LEN (buffer); len = GST_BUFFER_MEM_LEN (buffer);
i = 0;
if (offset)
i = _find_mapping (buffer, &offset);
for (i = 0; i < len && size > 0 && res == 0; i++) { for (i = 0; i < len && size > 0 && res == 0; i++) {
GstMapInfo info; GstMapInfo info;
@ -2072,17 +2092,11 @@ gst_buffer_memcmp (GstBuffer * buffer, gsize offset, gconstpointer mem,
GstMemory *mem; GstMemory *mem;
mem = _get_mapped (buffer, i, &info, GST_MAP_READ); mem = _get_mapped (buffer, i, &info, GST_MAP_READ);
if (info.size > offset) { tocmp = MIN (info.size - offset, size);
/* we have enough */ res = memcmp (ptr, (guint8 *) info.data + offset, tocmp);
tocmp = MIN (info.size - offset, size); size -= tocmp;
res = memcmp (ptr, (guint8 *) info.data + offset, tocmp); ptr += tocmp;
size -= tocmp; offset = 0;
ptr += tocmp;
offset = 0;
} else {
/* offset past buffer, skip */
offset -= info.size;
}
gst_memory_unmap (mem, &info); gst_memory_unmap (mem, &info);
} }
return res; return res;
@ -2114,6 +2128,10 @@ gst_buffer_memset (GstBuffer * buffer, gsize offset, guint8 val, gsize size)
len = GST_BUFFER_MEM_LEN (buffer); len = GST_BUFFER_MEM_LEN (buffer);
left = size; left = size;
i = 0;
if (offset)
i = _find_mapping (buffer, &offset);
for (i = 0; i < len && left > 0; i++) { for (i = 0; i < len && left > 0; i++) {
GstMapInfo info; GstMapInfo info;
@ -2121,16 +2139,10 @@ gst_buffer_memset (GstBuffer * buffer, gsize offset, guint8 val, gsize size)
GstMemory *mem; GstMemory *mem;
mem = _get_mapped (buffer, i, &info, GST_MAP_WRITE); mem = _get_mapped (buffer, i, &info, GST_MAP_WRITE);
if (info.size > offset) { toset = MIN (info.size - offset, left);
/* we have enough */ memset ((guint8 *) info.data + offset, val, toset);
toset = MIN (info.size - offset, left); left -= toset;
memset ((guint8 *) info.data + offset, val, toset); offset = 0;
left -= toset;
offset = 0;
} else {
/* offset past buffer, skip */
offset -= info.size;
}
gst_memory_unmap (mem, &info); gst_memory_unmap (mem, &info);
} }
return size - left; return size - left;