diff options
Diffstat (limited to 'gst')
-rw-r--r-- | gst/gstbuffer.c | 2 | ||||
-rw-r--r-- | gst/gstbuffer.h | 6 | ||||
-rw-r--r-- | gst/gstbufferpool.c | 16 | ||||
-rw-r--r-- | gst/gstbufferpool.h | 1 |
4 files changed, 21 insertions, 4 deletions
diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index b8774a8e6..6cb270fdc 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -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); diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h index 02e8a8f25..0fad0b367 100644 --- a/gst/gstbuffer.h +++ b/gst/gstbuffer.h @@ -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; }; diff --git a/gst/gstbufferpool.c b/gst/gstbufferpool.c index 8ac4cb6ca..d4837129f 100644 --- a/gst/gstbufferpool.c +++ b/gst/gstbufferpool.c @@ -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); } diff --git a/gst/gstbufferpool.h b/gst/gstbufferpool.h index 48df0b80b..17f9e516b 100644 --- a/gst/gstbufferpool.h +++ b/gst/gstbufferpool.h @@ -32,7 +32,6 @@ G_BEGIN_DECLS -typedef struct _GstBufferPool GstBufferPool; typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate; typedef struct _GstBufferPoolClass GstBufferPoolClass; |