[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