[0.11] gstreamer: buffer: implemet trim and set_size
Edward Hervey
bilboed at kemper.freedesktop.org
Wed Mar 30 12:33:35 PDT 2011
Module: gstreamer
Branch: 0.11
Commit: 9ff103b3a5bcdbe2077bd90f39a3523559530d53
URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=9ff103b3a5bcdbe2077bd90f39a3523559530d53
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date: Mon Mar 28 16:40:24 2011 +0200
buffer: implemet trim and set_size
---
gst/gstbuffer.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c
index 0e8f7ec..52add64 100644
--- a/gst/gstbuffer.c
+++ b/gst/gstbuffer.c
@@ -578,6 +578,62 @@ gst_buffer_get_size (GstBuffer * buffer)
}
/**
+ * gst_buffer_trim:
+ * @buffer: a #GstBuffer.
+ * @offset: the new offset
+ * @size: the new size
+ *
+ * Set the total size of the buffer
+ */
+void
+gst_buffer_trim (GstBuffer * buffer, gsize offset, gsize size)
+{
+ GPtrArray *arr;
+ guint len;
+ guint si, di;
+ gsize bsize;
+ GstMemory *mem;
+
+ g_return_if_fail (gst_buffer_is_writable (buffer));
+
+ arr = (GPtrArray *) buffer->memory;
+ len = arr->len;
+ si = di = 0;
+
+ /* copy and trim */
+ while (size > 0) {
+ mem = g_ptr_array_index (arr, si);
+ bsize = gst_memory_get_sizes (mem, NULL);
+
+ if (bsize <= offset) {
+ /* remove buffer */
+ gst_memory_unref (mem);
+ offset -= bsize;
+ } else {
+ gsize tocopy;
+
+ tocopy = MIN (bsize - offset, size);
+ if (tocopy < bsize) {
+ /* we need to clip something */
+ if (GST_MEMORY_IS_WRITABLE (mem)) {
+ gst_memory_trim (mem, offset, tocopy);
+ } else {
+ GstMemory *tmp;
+ tmp = gst_memory_sub (mem, offset, tocopy);
+ gst_memory_unref (mem);
+ mem = tmp;
+ }
+ }
+ g_ptr_array_index (arr, di) = mem;
+ size -= tocopy;
+ di++;
+ }
+ si++;
+ }
+ g_ptr_array_set_size (arr, di);
+}
+
+/**
* gst_buffer_set_size:
* @buffer: a #GstBuffer.
* @size: the new size
@@ -587,8 +643,7 @@ gst_buffer_get_size (GstBuffer * buffer)
void
gst_buffer_set_size (GstBuffer * buffer, gsize size)
{
- /* FIXME */
- g_warning ("gst_buffer_set_size not imlpemented");
+ gst_buffer_trim (buffer, 0, size);
}
/**
@@ -651,6 +706,8 @@ gst_buffer_map (GstBuffer * buffer, gsize * size, gsize * maxsize,
data = gst_memory_map (mem, size, maxsize, flags);
} else {
data = NULL;
+ if (size)
+ *size = 0;
}
return data;
More information about the gstreamer-commits
mailing list