mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
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:
parent
0a89debaf7
commit
a55bc30f81
4 changed files with 21 additions and 4 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue