buffer: Find initial memory block without unnecessary mapping
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9354>
This commit is contained in:
parent
4e7df779df
commit
160205b483
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user