Commit a55bc30f authored by Wim Taymans's avatar Wim Taymans

buffer: add pool to buffer structure

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.
parent 0a89deba
......@@ -123,6 +123,7 @@
#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);
......
......@@ -30,10 +30,11 @@
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;
};
......
......@@ -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);
}
......@@ -32,7 +32,6 @@
G_BEGIN_DECLS
typedef struct _GstBufferPool GstBufferPool;
typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate;
typedef struct _GstBufferPoolClass GstBufferPoolClass;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment