mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-29 18:48:44 +00:00
buffer: add api to get the current memory offset
Also return the offset in a GstMemory block with the get_sizes() method. This allows us to figure out how much prefix there is unused. Change the resize function so that a negative offset can be given. This would make it possible to resize the buffer so that the prefix becomes available. Add gst_buffer_get_sizes() to return the offset and maxsize as well as the size. Also change the buffer resize method so that we can specify a negative offset to remove prefix bytes.
This commit is contained in:
parent
21e0d113cf
commit
abf6293639
5 changed files with 76 additions and 35 deletions
|
@ -307,7 +307,7 @@ gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src,
|
||||||
/* copy and make regions of the memory */
|
/* copy and make regions of the memory */
|
||||||
for (i = 0; i < len && left > 0; i++) {
|
for (i = 0; i < len && left > 0; i++) {
|
||||||
mem = GST_BUFFER_MEM_PTR (src, i);
|
mem = GST_BUFFER_MEM_PTR (src, i);
|
||||||
bsize = gst_memory_get_sizes (mem, NULL);
|
bsize = gst_memory_get_sizes (mem, NULL, NULL);
|
||||||
|
|
||||||
if (bsize <= skip) {
|
if (bsize <= skip) {
|
||||||
/* don't copy buffer */
|
/* don't copy buffer */
|
||||||
|
@ -743,43 +743,71 @@ gst_buffer_remove_memory_range (GstBuffer * buffer, guint idx, guint length)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_buffer_get_size:
|
* gst_buffer_get_sizes:
|
||||||
* @buffer: a #GstBuffer.
|
* @buffer: a #GstBuffer.
|
||||||
|
* @offset: a pointer to the offset
|
||||||
|
* @maxsize: a pointer to the maxsize
|
||||||
*
|
*
|
||||||
* Get the total size of all memory blocks in @buffer.
|
* Get the total size of all memory blocks in @buffer.
|
||||||
*
|
*
|
||||||
|
* When not %NULL, @offset will contain the offset of the data in the first
|
||||||
|
* memory block in @buffer and @maxsize will contain the sum of the size
|
||||||
|
* and @offset and the amount of extra padding on the last memory block.
|
||||||
|
* @offset and @maxsize can be used to resize the buffer with
|
||||||
|
* gst_buffer_resize().
|
||||||
|
*
|
||||||
* Returns: the total size of the memory in @buffer.
|
* Returns: the total size of the memory in @buffer.
|
||||||
*/
|
*/
|
||||||
gsize
|
gsize
|
||||||
gst_buffer_get_size (GstBuffer * buffer)
|
gst_buffer_get_sizes (GstBuffer * buffer, gsize * offset, gsize * maxsize)
|
||||||
{
|
{
|
||||||
guint i, size, len;
|
guint i, len;
|
||||||
|
gsize extra, size, offs;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
|
g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
|
||||||
|
|
||||||
len = GST_BUFFER_MEM_LEN (buffer);
|
len = GST_BUFFER_MEM_LEN (buffer);
|
||||||
|
|
||||||
size = 0;
|
size = offs = extra = 0;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
size += gst_memory_get_sizes (GST_BUFFER_MEM_PTR (buffer, i), NULL);
|
gsize s, o, ms;
|
||||||
|
|
||||||
|
s = gst_memory_get_sizes (GST_BUFFER_MEM_PTR (buffer, i), &o, &ms);
|
||||||
|
|
||||||
|
/* add sizes */
|
||||||
|
size += s;
|
||||||
|
|
||||||
|
/* keep offset of first memory block */
|
||||||
|
if (i == 0)
|
||||||
|
offs = o;
|
||||||
|
/* this is the amount of extra bytes in this block, we only keep this for
|
||||||
|
* the last block */
|
||||||
|
else if (i + 1 == len)
|
||||||
|
extra = ms - (o + s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (offset)
|
||||||
|
*offset = offs;
|
||||||
|
if (maxsize)
|
||||||
|
*maxsize = offs + size + extra;
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_buffer_resize:
|
* gst_buffer_resize:
|
||||||
* @buffer: a #GstBuffer.
|
* @buffer: a #GstBuffer.
|
||||||
* @offset: the new offset
|
* @offset: the offset adjustement
|
||||||
* @size: the new size
|
* @size: the new size
|
||||||
*
|
*
|
||||||
* Set the total size of the buffer
|
* Set the total size of the buffer
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gst_buffer_resize (GstBuffer * buffer, gsize offset, gsize size)
|
gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size)
|
||||||
{
|
{
|
||||||
guint len;
|
guint len;
|
||||||
guint si, di;
|
guint si, di;
|
||||||
gsize bsize, bufsize;
|
gsize bsize, bufsize, bufoffs, bufmax;
|
||||||
GstMemory *mem;
|
GstMemory *mem;
|
||||||
|
|
||||||
GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSIZE_FORMAT "-%" G_GSIZE_FORMAT,
|
GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSIZE_FORMAT "-%" G_GSIZE_FORMAT,
|
||||||
|
@ -787,8 +815,10 @@ gst_buffer_resize (GstBuffer * buffer, gsize offset, gsize size)
|
||||||
|
|
||||||
g_return_if_fail (gst_buffer_is_writable (buffer));
|
g_return_if_fail (gst_buffer_is_writable (buffer));
|
||||||
|
|
||||||
bufsize = gst_buffer_get_size (buffer);
|
/* FIXME, handle negative offsets */
|
||||||
|
bufsize = gst_buffer_get_sizes (buffer, &bufoffs, &bufmax);
|
||||||
g_return_if_fail (bufsize >= offset);
|
g_return_if_fail (bufsize >= offset);
|
||||||
|
|
||||||
if (size == -1)
|
if (size == -1)
|
||||||
size = bufsize - offset;
|
size = bufsize - offset;
|
||||||
g_return_if_fail (bufsize >= offset + size);
|
g_return_if_fail (bufsize >= offset + size);
|
||||||
|
@ -798,27 +828,27 @@ gst_buffer_resize (GstBuffer * buffer, gsize offset, gsize size)
|
||||||
/* copy and trim */
|
/* copy and trim */
|
||||||
for (di = si = 0; si < len && size > 0; si++) {
|
for (di = si = 0; si < len && size > 0; si++) {
|
||||||
mem = GST_BUFFER_MEM_PTR (buffer, si);
|
mem = GST_BUFFER_MEM_PTR (buffer, si);
|
||||||
bsize = gst_memory_get_sizes (mem, NULL);
|
bsize = gst_memory_get_sizes (mem, NULL, NULL);
|
||||||
|
|
||||||
if (bsize <= offset) {
|
if (bsize <= offset) {
|
||||||
/* remove buffer */
|
/* remove buffer */
|
||||||
gst_memory_unref (mem);
|
gst_memory_unref (mem);
|
||||||
offset -= bsize;
|
offset -= bsize;
|
||||||
} else {
|
} else {
|
||||||
gsize tocopy;
|
gsize left;
|
||||||
|
|
||||||
tocopy = MIN (bsize - offset, size);
|
left = MIN (bsize - offset, size);
|
||||||
if (tocopy < bsize) {
|
if (left < bsize) {
|
||||||
/* we need to clip something */
|
/* we need to clip something */
|
||||||
if (GST_MEMORY_IS_WRITABLE (mem)) {
|
if (GST_MEMORY_IS_WRITABLE (mem)) {
|
||||||
gst_memory_resize (mem, offset, tocopy);
|
gst_memory_resize (mem, offset, left);
|
||||||
} else {
|
} else {
|
||||||
GstMemory *tmp;
|
GstMemory *tmp;
|
||||||
|
|
||||||
if (mem->flags & GST_MEMORY_FLAG_NO_SHARE)
|
if (mem->flags & GST_MEMORY_FLAG_NO_SHARE)
|
||||||
tmp = gst_memory_copy (mem, offset, tocopy);
|
tmp = gst_memory_copy (mem, offset, left);
|
||||||
else
|
else
|
||||||
tmp = gst_memory_share (mem, offset, tocopy);
|
tmp = gst_memory_share (mem, offset, left);
|
||||||
|
|
||||||
gst_memory_unref (mem);
|
gst_memory_unref (mem);
|
||||||
mem = tmp;
|
mem = tmp;
|
||||||
|
@ -826,7 +856,7 @@ gst_buffer_resize (GstBuffer * buffer, gsize offset, gsize size)
|
||||||
offset = 0;
|
offset = 0;
|
||||||
}
|
}
|
||||||
GST_BUFFER_MEM_PTR (buffer, di++) = mem;
|
GST_BUFFER_MEM_PTR (buffer, di++) = mem;
|
||||||
size -= tocopy;
|
size -= left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GST_BUFFER_MEM_LEN (buffer) = di;
|
GST_BUFFER_MEM_LEN (buffer) = di;
|
||||||
|
|
|
@ -254,9 +254,16 @@ gint gst_buffer_memcmp (GstBuffer *buffer, gsize offset,
|
||||||
void gst_buffer_memset (GstBuffer *buffer, gsize offset,
|
void gst_buffer_memset (GstBuffer *buffer, gsize offset,
|
||||||
guint8 val, gsize size);
|
guint8 val, gsize size);
|
||||||
|
|
||||||
gsize gst_buffer_get_size (GstBuffer *buffer);
|
gsize gst_buffer_get_sizes (GstBuffer *buffer, gsize *offset, gsize *maxsize);
|
||||||
void gst_buffer_resize (GstBuffer *buffer, gsize offset, gsize size);
|
void gst_buffer_resize (GstBuffer *buffer, gssize offset, gsize size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_buffer_get_size:
|
||||||
|
* @b: a #GstBuffer.
|
||||||
|
*
|
||||||
|
* Get the size of @b.
|
||||||
|
*/
|
||||||
|
#define gst_buffer_get_size(b) gst_buffer_get_sizes ((b), NULL, NULL)
|
||||||
/**
|
/**
|
||||||
* gst_buffer_set_size:
|
* gst_buffer_set_size:
|
||||||
* @b: a #GstBuffer.
|
* @b: a #GstBuffer.
|
||||||
|
|
|
@ -176,8 +176,10 @@ _default_mem_alloc (const GstAllocator * allocator, gsize maxsize, gsize align)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gsize
|
static gsize
|
||||||
_default_mem_get_sizes (GstMemoryDefault * mem, gsize * maxsize)
|
_default_mem_get_sizes (GstMemoryDefault * mem, gsize * offset, gsize * maxsize)
|
||||||
{
|
{
|
||||||
|
if (offset)
|
||||||
|
*offset = mem->offset;
|
||||||
if (maxsize)
|
if (maxsize)
|
||||||
*maxsize = mem->maxsize;
|
*maxsize = mem->maxsize;
|
||||||
|
|
||||||
|
@ -185,7 +187,7 @@ _default_mem_get_sizes (GstMemoryDefault * mem, gsize * maxsize)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_default_mem_resize (GstMemoryDefault * mem, gsize offset, gsize size)
|
_default_mem_resize (GstMemoryDefault * mem, gssize offset, gsize size)
|
||||||
{
|
{
|
||||||
g_return_if_fail (size + mem->offset + offset <= mem->maxsize);
|
g_return_if_fail (size + mem->offset + offset <= mem->maxsize);
|
||||||
|
|
||||||
|
@ -399,18 +401,19 @@ gst_memory_unref (GstMemory * mem)
|
||||||
/**
|
/**
|
||||||
* gst_memory_get_sizes:
|
* gst_memory_get_sizes:
|
||||||
* @mem: a #GstMemory
|
* @mem: a #GstMemory
|
||||||
|
* @offset: pointer to offset
|
||||||
* @maxsize: pointer to maxsize
|
* @maxsize: pointer to maxsize
|
||||||
*
|
*
|
||||||
* Get the current @size and @maxsize of @mem.
|
* Get the current @size, @offset and @maxsize of @mem.
|
||||||
*
|
*
|
||||||
* Returns: the current sizes of @mem
|
* Returns: the current sizes of @mem
|
||||||
*/
|
*/
|
||||||
gsize
|
gsize
|
||||||
gst_memory_get_sizes (GstMemory * mem, gsize * maxsize)
|
gst_memory_get_sizes (GstMemory * mem, gsize * offset, gsize * maxsize)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (mem != NULL, 0);
|
g_return_val_if_fail (mem != NULL, 0);
|
||||||
|
|
||||||
return mem->allocator->info.get_sizes (mem, maxsize);
|
return mem->allocator->info.get_sizes (mem, offset, maxsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -423,7 +426,7 @@ gst_memory_get_sizes (GstMemory * mem, gsize * maxsize)
|
||||||
* less than the maxsize of @mem.
|
* less than the maxsize of @mem.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gst_memory_resize (GstMemory * mem, gsize offset, gsize size)
|
gst_memory_resize (GstMemory * mem, gssize offset, gsize size)
|
||||||
{
|
{
|
||||||
g_return_if_fail (mem != NULL);
|
g_return_if_fail (mem != NULL);
|
||||||
g_return_if_fail (GST_MEMORY_IS_WRITABLE (mem));
|
g_return_if_fail (GST_MEMORY_IS_WRITABLE (mem));
|
||||||
|
|
|
@ -127,27 +127,28 @@ typedef GstMemory * (*GstMemoryAllocFunction) (const GstAllocator *allocator,
|
||||||
/**
|
/**
|
||||||
* GstMemoryGetSizesFunction:
|
* GstMemoryGetSizesFunction:
|
||||||
* @mem: a #GstMemory
|
* @mem: a #GstMemory
|
||||||
|
* @offset: result pointer for offset
|
||||||
* @maxsize: result pointer for maxsize
|
* @maxsize: result pointer for maxsize
|
||||||
*
|
*
|
||||||
* Retrieve the size and maxsize of @mem.
|
* Retrieve the size, offset and maxsize of @mem.
|
||||||
*
|
*
|
||||||
* Returns: the size of @mem and the maximum allocated size in @maxsize.
|
* Returns: the size of @mem, the offset and the maximum allocated size in @maxsize.
|
||||||
*/
|
*/
|
||||||
typedef gsize (*GstMemoryGetSizesFunction) (GstMemory *mem, gsize *maxsize);
|
typedef gsize (*GstMemoryGetSizesFunction) (GstMemory *mem, gsize *offset, gsize *maxsize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstMemoryResizeFunction:
|
* GstMemoryResizeFunction:
|
||||||
* @mem: a #GstMemory
|
* @mem: a #GstMemory
|
||||||
* @offset: the new offset
|
* @offset: the offset adjustement
|
||||||
* @size: the new size
|
* @size: the new size
|
||||||
*
|
*
|
||||||
* Adjust the size and offset of @mem. @offset bytes will be skipped from the
|
* Adjust the size and offset of @mem. @offset bytes will be adjusted from the
|
||||||
* current first byte in @mem as retrieved with gst_memory_map() and the new
|
* current first byte in @mem as retrieved with gst_memory_map() and the new
|
||||||
* size will be set to @size.
|
* size will be set to @size.
|
||||||
*
|
*
|
||||||
* @size can be set to -1, which will only adjust the offset.
|
* @size can be set to -1, which will only adjust the offset.
|
||||||
*/
|
*/
|
||||||
typedef void (*GstMemoryResizeFunction) (GstMemory *mem, gsize offset, gsize size);
|
typedef void (*GstMemoryResizeFunction) (GstMemory *mem, gssize offset, gsize size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstMemoryMapFunction:
|
* GstMemoryMapFunction:
|
||||||
|
@ -283,8 +284,8 @@ GstMemory * gst_memory_ref (GstMemory *mem);
|
||||||
void gst_memory_unref (GstMemory *mem);
|
void gst_memory_unref (GstMemory *mem);
|
||||||
|
|
||||||
/* getting/setting memory properties */
|
/* getting/setting memory properties */
|
||||||
gsize gst_memory_get_sizes (GstMemory *mem, gsize *maxsize);
|
gsize gst_memory_get_sizes (GstMemory *mem, gsize *offset, gsize *maxsize);
|
||||||
void gst_memory_resize (GstMemory *mem, gsize offset, gsize size);
|
void gst_memory_resize (GstMemory *mem, gssize offset, gsize size);
|
||||||
|
|
||||||
/* retrieving data */
|
/* retrieving data */
|
||||||
gpointer gst_memory_map (GstMemory *mem, gsize *size, gsize *maxsize,
|
gpointer gst_memory_map (GstMemory *mem, gsize *size, gsize *maxsize,
|
||||||
|
|
|
@ -102,7 +102,7 @@ EXPORTS
|
||||||
gst_buffer_fill
|
gst_buffer_fill
|
||||||
gst_buffer_flag_get_type
|
gst_buffer_flag_get_type
|
||||||
gst_buffer_get_meta
|
gst_buffer_get_meta
|
||||||
gst_buffer_get_size
|
gst_buffer_get_sizes
|
||||||
gst_buffer_is_span_fast
|
gst_buffer_is_span_fast
|
||||||
gst_buffer_iterate_meta
|
gst_buffer_iterate_meta
|
||||||
gst_buffer_join
|
gst_buffer_join
|
||||||
|
|
Loading…
Reference in a new issue