mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
buffer: make get_sizes and _resize with ranges
Make the _get_sizes and _resize methods work on a range of memory to make them more powerfull.
This commit is contained in:
parent
1e37964202
commit
8428d3e295
3 changed files with 49 additions and 29 deletions
|
@ -969,42 +969,51 @@ gst_buffer_find_memory (GstBuffer * buffer, gsize offset, gsize size,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_buffer_get_sizes:
|
* gst_buffer_get_sizes_range:
|
||||||
* @buffer: a #GstBuffer.
|
* @buffer: a #GstBuffer.
|
||||||
|
* @idx: an index
|
||||||
|
* @length: a length
|
||||||
* @offset: a pointer to the offset
|
* @offset: a pointer to the offset
|
||||||
* @maxsize: a pointer to the maxsize
|
* @maxsize: a pointer to the maxsize
|
||||||
*
|
*
|
||||||
* Get the total size of all memory blocks in @buffer.
|
* Get the total size of @length memory blocks stating from @idx in @buffer.
|
||||||
*
|
*
|
||||||
* When not %NULL, @offset will contain the offset of the data in the first
|
* When not %NULL, @offset will contain the offset of the data in the
|
||||||
* memory block in @buffer and @maxsize will contain the sum of the size
|
* memory block in @buffer at @idx and @maxsize will contain the sum of the size
|
||||||
* and @offset and the amount of extra padding on the last memory block.
|
* and @offset and the amount of extra padding on the memory block at @idx +
|
||||||
* @offset and @maxsize can be used to resize the buffer with
|
* @length -1.
|
||||||
* gst_buffer_resize().
|
* @offset and @maxsize can be used to resize the buffer memory blocks with
|
||||||
|
* gst_buffer_resize_range().
|
||||||
*
|
*
|
||||||
* Returns: the total size of the memory in @buffer.
|
* Returns: total size @length memory blocks starting at @idx in @buffer.
|
||||||
*/
|
*/
|
||||||
gsize
|
gsize
|
||||||
gst_buffer_get_sizes (GstBuffer * buffer, gsize * offset, gsize * maxsize)
|
gst_buffer_get_sizes_range (GstBuffer * buffer, guint idx, gint length,
|
||||||
|
gsize * offset, gsize * maxsize)
|
||||||
{
|
{
|
||||||
guint len;
|
guint len;
|
||||||
gsize size;
|
gsize size;
|
||||||
GstMemory *mem;
|
GstMemory *mem;
|
||||||
|
|
||||||
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);
|
||||||
|
g_return_val_if_fail (len == 0 || (length == -1 && idx < len)
|
||||||
|
|| (length + idx <= len), 0);
|
||||||
|
|
||||||
if (G_LIKELY (len == 1)) {
|
if (length == -1)
|
||||||
|
length = len - idx;
|
||||||
|
|
||||||
|
if (G_LIKELY (length == 1)) {
|
||||||
/* common case */
|
/* common case */
|
||||||
mem = GST_BUFFER_MEM_PTR (buffer, 0);
|
mem = GST_BUFFER_MEM_PTR (buffer, idx);
|
||||||
size = gst_memory_get_sizes (mem, offset, maxsize);
|
size = gst_memory_get_sizes (mem, offset, maxsize);
|
||||||
} else {
|
} else {
|
||||||
guint i;
|
guint i, end;
|
||||||
gsize extra, offs;
|
gsize extra, offs;
|
||||||
|
|
||||||
|
end = idx + length;
|
||||||
size = offs = extra = 0;
|
size = offs = extra = 0;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = idx; i < end; i++) {
|
||||||
gsize s, o, ms;
|
gsize s, o, ms;
|
||||||
|
|
||||||
mem = GST_BUFFER_MEM_PTR (buffer, i);
|
mem = GST_BUFFER_MEM_PTR (buffer, i);
|
||||||
|
@ -1032,25 +1041,33 @@ gst_buffer_get_sizes (GstBuffer * buffer, gsize * offset, gsize * maxsize)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_buffer_resize:
|
* gst_buffer_resize_range:
|
||||||
* @buffer: a #GstBuffer.
|
* @buffer: a #GstBuffer.
|
||||||
|
* @idx: an index
|
||||||
|
* @length: a length
|
||||||
* @offset: the offset adjustement
|
* @offset: the offset adjustement
|
||||||
* @size: the new size or -1 to just adjust the offset
|
* @size: the new size or -1 to just adjust the offset
|
||||||
*
|
*
|
||||||
* Set the total size of the buffer
|
* Set the total size of the @length memory blocks starting at @idx in
|
||||||
|
* @buffer
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gst_buffer_resize (GstBuffer * buffer, gssize offset, gssize size)
|
gst_buffer_resize_range (GstBuffer * buffer, guint idx, gint length,
|
||||||
|
gssize offset, gssize size)
|
||||||
{
|
{
|
||||||
guint len;
|
guint i, len, end;
|
||||||
guint i;
|
|
||||||
gsize bsize, bufsize, bufoffs, bufmax;
|
gsize bsize, bufsize, bufoffs, bufmax;
|
||||||
GstMemory *mem;
|
GstMemory *mem;
|
||||||
|
|
||||||
g_return_if_fail (gst_buffer_is_writable (buffer));
|
g_return_if_fail (gst_buffer_is_writable (buffer));
|
||||||
g_return_if_fail (size >= -1);
|
g_return_if_fail (size >= -1);
|
||||||
|
len = GST_BUFFER_MEM_LEN (buffer);
|
||||||
|
g_return_if_fail ((length == -1 && idx < len) || (length + idx <= len));
|
||||||
|
|
||||||
bufsize = gst_buffer_get_sizes (buffer, &bufoffs, &bufmax);
|
if (length == -1)
|
||||||
|
length = len - idx;
|
||||||
|
|
||||||
|
bufsize = gst_buffer_get_sizes_range (buffer, idx, length, &bufoffs, &bufmax);
|
||||||
|
|
||||||
GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSSIZE_FORMAT "-%" G_GSSIZE_FORMAT
|
GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSSIZE_FORMAT "-%" G_GSSIZE_FORMAT
|
||||||
" size:%" G_GSIZE_FORMAT " offs:%" G_GSIZE_FORMAT " max:%"
|
" size:%" G_GSIZE_FORMAT " offs:%" G_GSIZE_FORMAT " max:%"
|
||||||
|
@ -1070,10 +1087,9 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gssize size)
|
||||||
if (offset == 0 && size == bufsize)
|
if (offset == 0 && size == bufsize)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
len = GST_BUFFER_MEM_LEN (buffer);
|
end = idx + length;
|
||||||
|
|
||||||
/* copy and trim */
|
/* copy and trim */
|
||||||
for (i = 0; i < len; i++) {
|
for (i = idx; i < end; i++) {
|
||||||
gsize left, noffs;
|
gsize left, noffs;
|
||||||
|
|
||||||
mem = GST_BUFFER_MEM_PTR (buffer, i);
|
mem = GST_BUFFER_MEM_PTR (buffer, i);
|
||||||
|
@ -1081,7 +1097,7 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gssize size)
|
||||||
|
|
||||||
noffs = 0;
|
noffs = 0;
|
||||||
/* last buffer always gets resized to the remaining size */
|
/* last buffer always gets resized to the remaining size */
|
||||||
if (i + 1 == len)
|
if (i + 1 == end)
|
||||||
left = size;
|
left = size;
|
||||||
/* shrink buffers before the offset */
|
/* shrink buffers before the offset */
|
||||||
else if ((gssize) bsize <= offset) {
|
else if ((gssize) bsize <= offset) {
|
||||||
|
|
|
@ -301,16 +301,20 @@ gint gst_buffer_memcmp (GstBuffer *buffer, gsize offset,
|
||||||
gsize gst_buffer_memset (GstBuffer *buffer, gsize offset,
|
gsize gst_buffer_memset (GstBuffer *buffer, gsize offset,
|
||||||
guint8 val, gsize size);
|
guint8 val, gsize size);
|
||||||
|
|
||||||
gsize gst_buffer_get_sizes (GstBuffer *buffer, gsize *offset, gsize *maxsize);
|
gsize gst_buffer_get_sizes_range (GstBuffer *buffer, guint idx, gint length,
|
||||||
void gst_buffer_resize (GstBuffer *buffer, gssize offset, gssize size);
|
gsize *offset, gsize *maxsize);
|
||||||
|
void gst_buffer_resize_range (GstBuffer *buffer, guint idx, gint length,
|
||||||
|
gssize offset, gssize size);
|
||||||
|
|
||||||
|
#define gst_buffer_get_sizes(b,of,ms) gst_buffer_get_sizes_range ((b), 0, -1, (of), (ms))
|
||||||
/**
|
/**
|
||||||
* gst_buffer_get_size:
|
* gst_buffer_get_size:
|
||||||
* @b: a #GstBuffer.
|
* @b: a #GstBuffer.
|
||||||
*
|
*
|
||||||
* Get the size of @b.
|
* Get the size of @b.
|
||||||
*/
|
*/
|
||||||
#define gst_buffer_get_size(b) gst_buffer_get_sizes ((b), NULL, NULL)
|
#define gst_buffer_get_size(b) gst_buffer_get_sizes_range ((b), 0, -1, NULL, NULL)
|
||||||
|
#define gst_buffer_resize(b,of,s) gst_buffer_resize_range ((b), 0, -1, (of), (s))
|
||||||
/**
|
/**
|
||||||
* gst_buffer_set_size:
|
* gst_buffer_set_size:
|
||||||
* @b: a #GstBuffer.
|
* @b: a #GstBuffer.
|
||||||
|
|
|
@ -101,7 +101,7 @@ EXPORTS
|
||||||
gst_buffer_foreach_meta
|
gst_buffer_foreach_meta
|
||||||
gst_buffer_get_memory_range
|
gst_buffer_get_memory_range
|
||||||
gst_buffer_get_meta
|
gst_buffer_get_meta
|
||||||
gst_buffer_get_sizes
|
gst_buffer_get_sizes_range
|
||||||
gst_buffer_get_type
|
gst_buffer_get_type
|
||||||
gst_buffer_insert_memory
|
gst_buffer_insert_memory
|
||||||
gst_buffer_iterate_meta
|
gst_buffer_iterate_meta
|
||||||
|
@ -144,7 +144,7 @@ EXPORTS
|
||||||
gst_buffer_remove_memory_range
|
gst_buffer_remove_memory_range
|
||||||
gst_buffer_remove_meta
|
gst_buffer_remove_meta
|
||||||
gst_buffer_replace_memory_range
|
gst_buffer_replace_memory_range
|
||||||
gst_buffer_resize
|
gst_buffer_resize_range
|
||||||
gst_buffer_unmap
|
gst_buffer_unmap
|
||||||
gst_buffering_mode_get_type
|
gst_buffering_mode_get_type
|
||||||
gst_bus_add_signal_watch
|
gst_bus_add_signal_watch
|
||||||
|
|
Loading…
Reference in a new issue