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.
This commit is contained in:
Wim Taymans 2011-02-22 12:35:45 +01:00
parent 0a89debaf7
commit a55bc30f81
4 changed files with 21 additions and 4 deletions

View file

@ -123,6 +123,7 @@
#endif #endif
#include "gstbuffer.h" #include "gstbuffer.h"
#include "gstbufferpool.h"
#include "gstinfo.h" #include "gstinfo.h"
#include "gstutils.h" #include "gstutils.h"
#include "gstminiobject.h" #include "gstminiobject.h"
@ -290,6 +291,7 @@ static void
_gst_buffer_free (GstBuffer * buffer) _gst_buffer_free (GstBuffer * buffer)
{ {
GstMetaItem *walk, *next; GstMetaItem *walk, *next;
GstBufferPool *pool;
g_return_if_fail (buffer != NULL); g_return_if_fail (buffer != NULL);

View file

@ -30,10 +30,11 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstBuffer GstBuffer;
extern GType _gst_buffer_type; extern GType _gst_buffer_type;
typedef struct _GstBuffer GstBuffer;
typedef struct _GstBufferPool GstBufferPool;
/** /**
* GST_BUFFER_TRACE_NAME: * GST_BUFFER_TRACE_NAME:
* *
@ -284,6 +285,7 @@ struct _GstBuffer {
/* ABI Added */ /* ABI Added */
GFreeFunc free_func; GFreeFunc free_func;
GstBuffer *parent; GstBuffer *parent;
GstBufferPool *pool;
gpointer priv; gpointer priv;
}; };

View file

@ -633,8 +633,13 @@ gst_buffer_pool_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer,
else else
result = GST_FLOW_NOT_SUPPORTED; 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); dec_outstanding (pool);
}
return result; 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 (GST_IS_BUFFER_POOL (pool));
g_return_if_fail (buffer != NULL); 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); pclass = GST_BUFFER_POOL_GET_CLASS (pool);
if (G_LIKELY (pclass->release_buffer)) if (G_LIKELY (pclass->release_buffer))
pclass->release_buffer (pool, buffer); pclass->release_buffer (pool, buffer);
dec_outstanding (pool); dec_outstanding (pool);
/* decrease the refcount that the buffer had to us */
gst_object_unref (pool);
} }

View file

@ -32,7 +32,6 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstBufferPool GstBufferPool;
typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate; typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate;
typedef struct _GstBufferPoolClass GstBufferPoolClass; typedef struct _GstBufferPoolClass GstBufferPoolClass;