buffer: add pool to buffer structure
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 22 Feb 2011 11:35:45 +0000 (12:35 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 2 Mar 2011 10:33:24 +0000 (11:33 +0100)
Keep a pointer to the bufferpool. Release the buffer to the pool when
finalizing. Make sure the pool sets itself as the pool member of buffers that it
sends out.

gst/gstbuffer.c
gst/gstbuffer.h
gst/gstbufferpool.c
gst/gstbufferpool.h

index b8774a8..6cb270f 100644 (file)
 #endif
 
 #include "gstbuffer.h"
+#include "gstbufferpool.h"
 #include "gstinfo.h"
 #include "gstutils.h"
 #include "gstminiobject.h"
@@ -290,6 +291,7 @@ static void
 _gst_buffer_free (GstBuffer * buffer)
 {
   GstMetaItem *walk, *next;
+  GstBufferPool *pool;
 
   g_return_if_fail (buffer != NULL);
 
index 02e8a8f..0fad0b3 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef struct _GstBuffer GstBuffer;
-
 extern GType _gst_buffer_type;
 
+typedef struct _GstBuffer GstBuffer;
+typedef struct _GstBufferPool GstBufferPool;
+
 /**
  * GST_BUFFER_TRACE_NAME:
  *
@@ -284,6 +285,7 @@ struct _GstBuffer {
   /* ABI Added */
   GFreeFunc              free_func;
   GstBuffer             *parent;
+  GstBufferPool         *pool;
   gpointer               priv;
 };
 
index 8ac4cb6..d483712 100644 (file)
@@ -633,8 +633,13 @@ gst_buffer_pool_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer,
   else
     result = GST_FLOW_NOT_SUPPORTED;
 
-  if (G_UNLIKELY (result != GST_FLOW_OK))
+  if (G_LIKELY (result == GST_FLOW_OK)) {
+    /* all buffers from the pool point to the pool and have the refcount of the
+     * pool incremented */
+    (*buffer)->pool = gst_object_ref (pool);
+  } else {
     dec_outstanding (pool);
+  }
 
   return result;
 }
@@ -666,10 +671,19 @@ gst_buffer_pool_release_buffer (GstBufferPool * pool, GstBuffer * buffer)
   g_return_if_fail (GST_IS_BUFFER_POOL (pool));
   g_return_if_fail (buffer != NULL);
 
+  /* check that the buffer is ours, all buffers returned to the pool have the
+   * pool member set to NULL and the pool refcount decreased */
+  if (!g_atomic_pointer_compare_and_exchange ((gpointer *) & buffer->pool, pool,
+          NULL))
+    return;
+
   pclass = GST_BUFFER_POOL_GET_CLASS (pool);
 
   if (G_LIKELY (pclass->release_buffer))
     pclass->release_buffer (pool, buffer);
 
   dec_outstanding (pool);
+
+  /* decrease the refcount that the buffer had to us */
+  gst_object_unref (pool);
 }
index 48df0b8..17f9e51 100644 (file)
@@ -32,7 +32,6 @@
 
 G_BEGIN_DECLS
 
-typedef struct _GstBufferPool GstBufferPool;
 typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate;
 typedef struct _GstBufferPoolClass GstBufferPoolClass;