buffer: move implementation details in private struct
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 29 Mar 2011 09:31:30 +0000 (11:31 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 29 Mar 2011 09:31:30 +0000 (11:31 +0200)
gst/gstbuffer.c
gst/gstbuffer.h

index 0023f34..35209a2 100644 (file)
@@ -139,6 +139,17 @@ struct _GstMetaItem
   GstMeta meta;
 };
 
+#define GST_BUFFER_MEMORY(b)  (((GstBufferImpl *)(b))->memory)
+#define GST_BUFFER_META(b)    (((GstBufferImpl *)(b))->item)
+
+typedef struct
+{
+  GstBuffer buffer;
+
+  GPtrArray *memory;
+  GstMetaItem *item;
+} GstBufferImpl;
+
 #define ITEM_SIZE(info) ((info)->size + sizeof (GstMetaItem))
 
 /* buffer alignment in bytes
@@ -238,8 +249,8 @@ gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src,
   }
 
   if (flags & GST_BUFFER_COPY_MEMORY) {
-    GPtrArray *sarr = (GPtrArray *) src->memory;
-    GPtrArray *darr = (GPtrArray *) dest->memory;
+    GPtrArray *sarr = GST_BUFFER_MEMORY (src);
+    GPtrArray *darr = GST_BUFFER_MEMORY (dest);
     GstMemory *mem;
     gsize left, len, i, bsize;
 
@@ -270,12 +281,12 @@ gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src,
     }
   }
 
-  for (walk = src->priv; walk; walk = walk->next) {
+  for (walk = GST_BUFFER_META (src); walk; walk = walk->next) {
     GstMeta *meta = &walk->meta;
     const GstMetaInfo *info = meta->info;
 
     if (info->copy_func)
-      info->copy_func (dest, meta, (GstBuffer *) src, offset, size);
+      info->copy_func (dest, meta, src, offset, size);
   }
 }
 
@@ -323,7 +334,7 @@ _gst_buffer_free (GstBuffer * buffer)
   gst_caps_replace (&GST_BUFFER_CAPS (buffer), NULL);
 
   /* free metadata */
-  for (walk = buffer->priv; walk; walk = next) {
+  for (walk = GST_BUFFER_META (buffer); walk; walk = next) {
     GstMeta *meta = &walk->meta;
     const GstMetaInfo *info = meta->info;
 
@@ -337,20 +348,22 @@ _gst_buffer_free (GstBuffer * buffer)
   }
 
   /* free our data, unrefs the memory too */
-  g_ptr_array_free (buffer->memory, TRUE);
+  g_ptr_array_free (GST_BUFFER_MEMORY (buffer), TRUE);
 
   g_slice_free1 (GST_MINI_OBJECT_SIZE (buffer), buffer);
 }
 
 static void
-gst_buffer_init (GstBuffer * buffer, gsize size)
+gst_buffer_init (GstBufferImpl * buffer, gsize size)
 {
   gst_mini_object_init (GST_MINI_OBJECT_CAST (buffer), _gst_buffer_type, size);
 
-  buffer->mini_object.copy = (GstMiniObjectCopyFunction) _gst_buffer_copy;
-  buffer->mini_object.dispose =
+  buffer->buffer.mini_object.copy =
+      (GstMiniObjectCopyFunction) _gst_buffer_copy;
+  buffer->buffer.mini_object.dispose =
       (GstMiniObjectDisposeFunction) _gst_buffer_dispose;
-  buffer->mini_object.free = (GstMiniObjectFreeFunction) _gst_buffer_free;
+  buffer->buffer.mini_object.free =
+      (GstMiniObjectFreeFunction) _gst_buffer_free;
 
   GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
   GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
@@ -358,7 +371,7 @@ gst_buffer_init (GstBuffer * buffer, gsize size)
   GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
 
   /* FIXME, do more efficient with array in the buffer memory itself */
-  buffer->memory =
+  GST_BUFFER_MEMORY (buffer) =
       g_ptr_array_new_with_free_func ((GDestroyNotify) gst_memory_unref);
 }
 
@@ -374,14 +387,14 @@ gst_buffer_init (GstBuffer * buffer, gsize size)
 GstBuffer *
 gst_buffer_new (void)
 {
-  GstBuffer *newbuf;
+  GstBufferImpl *newbuf;
 
-  newbuf = g_slice_new0 (GstBuffer);
+  newbuf = g_slice_new0 (GstBufferImpl);
   GST_CAT_LOG (GST_CAT_BUFFER, "new %p", newbuf);
 
-  gst_buffer_init (newbuf, sizeof (GstBuffer));
+  gst_buffer_init (newbuf, sizeof (GstBufferImpl));
 
-  return newbuf;
+  return GST_BUFFER_CAST (newbuf);
 }
 
 /**
@@ -441,13 +454,9 @@ no_memory:
 guint
 gst_buffer_n_memory (GstBuffer * buffer)
 {
-  GPtrArray *arr;
-
   g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
 
-  arr = (GPtrArray *) buffer->memory;
-
-  return arr->len;
+  return GST_BUFFER_MEMORY (buffer)->len;
 }
 
 /**
@@ -461,14 +470,11 @@ gst_buffer_n_memory (GstBuffer * buffer)
 void
 gst_buffer_take_memory (GstBuffer * buffer, GstMemory * mem)
 {
-  GPtrArray *arr;
-
   g_return_if_fail (GST_IS_BUFFER (buffer));
   g_return_if_fail (gst_buffer_is_writable (buffer));
   g_return_if_fail (mem != NULL);
 
-  arr = (GPtrArray *) buffer->memory;
-  g_ptr_array_add (arr, mem);
+  g_ptr_array_add (GST_BUFFER_MEMORY (buffer), mem);
 }
 
 /**
@@ -489,7 +495,7 @@ gst_buffer_peek_memory (GstBuffer * buffer, guint idx)
   GPtrArray *arr;
 
   g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
-  arr = (GPtrArray *) buffer->memory;
+  arr = GST_BUFFER_MEMORY (buffer);
   g_return_val_if_fail (idx < arr->len, NULL);
 
   mem = g_ptr_array_index (arr, idx);
@@ -514,7 +520,7 @@ gst_buffer_remove_memory_range (GstBuffer * buffer, guint idx, guint length)
 
   g_return_if_fail (GST_IS_BUFFER (buffer));
   g_return_if_fail (gst_buffer_is_writable (buffer));
-  arr = (GPtrArray *) buffer->memory;
+  arr = GST_BUFFER_MEMORY (buffer);
   if (length == -1) {
     g_return_if_fail (idx < arr->len);
     length = arr->len - idx;
@@ -533,11 +539,12 @@ gst_buffer_remove_memory_range (GstBuffer * buffer, guint idx, guint length)
 gsize
 gst_buffer_get_size (GstBuffer * buffer)
 {
-  GPtrArray *arr = (GPtrArray *) buffer->memory;
+  GPtrArray *arr;
   guint i, size, len;
 
   g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
 
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   size = 0;
@@ -569,7 +576,7 @@ gst_buffer_trim (GstBuffer * buffer, gsize offset, gsize size)
 
   g_return_if_fail (gst_buffer_is_writable (buffer));
 
-  arr = (GPtrArray *) buffer->memory;
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   /* copy and trim */
@@ -637,7 +644,7 @@ gst_buffer_map (GstBuffer * buffer, gsize * size, gsize * maxsize,
 
   g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
 
-  arr = (GPtrArray *) buffer->memory;
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   if (G_UNLIKELY ((flags & GST_MAP_WRITE) && !gst_buffer_is_writable (buffer)))
@@ -697,7 +704,7 @@ gst_buffer_unmap (GstBuffer * buffer, gpointer data, gsize size)
 
   g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
 
-  arr = (GPtrArray *) buffer->memory;
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   if (G_LIKELY (len == 1)) {
@@ -724,10 +731,15 @@ void
 gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
     gsize size)
 {
-  GPtrArray *arr = (GPtrArray *) buffer->memory;
+  GPtrArray *arr;
   gsize i, len;
   const guint8 *ptr = src;
 
+  g_return_if_fail (GST_IS_BUFFER (buffer));
+  g_return_if_fail (gst_buffer_is_writable (buffer));
+  g_return_if_fail (src != NULL);
+
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   for (i = 0; i < len && size > 0; i++) {
@@ -765,10 +777,14 @@ gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
 void
 gst_buffer_extract (GstBuffer * buffer, gsize offset, gpointer dest, gsize size)
 {
-  GPtrArray *arr = (GPtrArray *) buffer->memory;
+  GPtrArray *arr;
   gsize i, len;
   guint8 *ptr = dest;
 
+  g_return_if_fail (GST_IS_BUFFER (buffer));
+  g_return_if_fail (dest != NULL);
+
+  arr = GST_BUFFER_MEMORY (buffer);
   len = arr->len;
 
   for (i = 0; i < len && size > 0; i++) {
@@ -911,12 +927,13 @@ gst_buffer_is_span_fast (GstBuffer * buf1, GstBuffer * buf2)
 {
   GPtrArray *arr1, *arr2;
 
-  g_return_val_if_fail (buf1 != NULL && buf2 != NULL, FALSE);
+  g_return_val_if_fail (GST_IS_BUFFER (buf1), FALSE);
+  g_return_val_if_fail (GST_IS_BUFFER (buf2), FALSE);
   g_return_val_if_fail (buf1->mini_object.refcount > 0, FALSE);
   g_return_val_if_fail (buf2->mini_object.refcount > 0, FALSE);
 
-  arr1 = (GPtrArray *) buf1->memory;
-  arr2 = (GPtrArray *) buf2->memory;
+  arr1 = GST_BUFFER_MEMORY (buf1);
+  arr2 = GST_BUFFER_MEMORY (buf2);
 
   return gst_memory_is_span ((GstMemory **) arr1->pdata, arr1->len,
       (GstMemory **) arr2->pdata, arr2->len, NULL, NULL);
@@ -952,7 +969,8 @@ gst_buffer_span (GstBuffer * buf1, gsize offset, GstBuffer * buf2, gsize len)
   GPtrArray *arr1, *arr2;
   GstMemory *mem;
 
-  g_return_val_if_fail (buf1 != NULL && buf2 != NULL, NULL);
+  g_return_val_if_fail (GST_IS_BUFFER (buf1), NULL);
+  g_return_val_if_fail (GST_IS_BUFFER (buf2), NULL);
   g_return_val_if_fail (buf1->mini_object.refcount > 0, NULL);
   g_return_val_if_fail (buf2->mini_object.refcount > 0, NULL);
   g_return_val_if_fail (len > 0, NULL);
@@ -961,8 +979,8 @@ gst_buffer_span (GstBuffer * buf1, gsize offset, GstBuffer * buf2, gsize len)
 
   newbuf = gst_buffer_new ();
 
-  arr1 = (GPtrArray *) buf1->memory;
-  arr2 = (GPtrArray *) buf2->memory;
+  arr1 = GST_BUFFER_MEMORY (buf1);
+  arr2 = GST_BUFFER_MEMORY (buf2);
 
   mem = gst_memory_span ((GstMemory **) arr1->pdata, arr1->len, offset,
       (GstMemory **) arr2->pdata, arr2->len, len);
@@ -1017,7 +1035,7 @@ gst_buffer_get_meta (GstBuffer * buffer, const GstMetaInfo * info)
   g_return_val_if_fail (info != NULL, NULL);
 
   /* find GstMeta of the requested API */
-  for (item = buffer->priv; item; item = item->next) {
+  for (item = GST_BUFFER_META (buffer); item; item = item->next) {
     GstMeta *meta = &item->meta;
     if (meta->info->api == info->api) {
       result = meta;
@@ -1063,8 +1081,8 @@ gst_buffer_add_meta (GstBuffer * buffer, const GstMetaInfo * info,
       goto init_failed;
 
   /* and add to the list of metadata */
-  item->next = buffer->priv;
-  buffer->priv = item;
+  item->next = GST_BUFFER_META (buffer);
+  GST_BUFFER_META (buffer) = item;
 
   return result;
 
@@ -1094,15 +1112,15 @@ gst_buffer_remove_meta (GstBuffer * buffer, GstMeta * meta)
   g_return_val_if_fail (meta != NULL, FALSE);
 
   /* find the metadata and delete */
-  prev = buffer->priv;
+  prev = GST_BUFFER_META (buffer);
   for (walk = prev; walk; walk = walk->next) {
     GstMeta *m = &walk->meta;
     if (m == meta) {
       const GstMetaInfo *info = meta->info;
 
       /* remove from list */
-      if (buffer->priv == walk)
-        buffer->priv = walk->next;
+      if (GST_BUFFER_META (buffer) == walk)
+        GST_BUFFER_META (buffer) = walk->next;
       else
         prev->next = walk->next;
       /* call free_func if any */
@@ -1141,7 +1159,7 @@ gst_buffer_iterate_meta (GstBuffer * buffer, gpointer * state)
   meta = (GstMetaItem **) state;
   if (*meta == NULL)
     /* state NULL, move to first item */
-    *meta = buffer->priv;
+    *meta = GST_BUFFER_META (buffer);
   else
     /* state !NULL, move to next item in list */
     *meta = (*meta)->next;
index a92f8fe..8fb56d6 100644 (file)
@@ -264,6 +264,7 @@ struct _GstBuffer {
   GstMiniObject          mini_object;
 
   /*< public >*/ /* with COW */
+  GstBufferPool         *pool;
 
   /* timestamp */
   GstClockTime           timestamp;
@@ -275,12 +276,6 @@ struct _GstBuffer {
   /* media specific offset */
   guint64                offset;
   guint64                offset_end;
-
-  /* pointer to memory blocks */
-  gpointer               memory;
-
-  GstBufferPool         *pool;
-  gpointer               priv;
 };
 
 /* allocation */