From 0caa41e1737285176f584f80cffb3c0e219f9ba6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 17 Feb 2011 16:46:51 +0100 Subject: [PATCH] bufferpool: use GstStructure to configure the pool Use a GstStructure to provide the pool with the right configuration. Also provide some helper methods to configure such a structure. don't pass the config in alloc_buffer, pool implementation will already have parsed it during set_config. Update defs --- gst/gstbufferpool.c | 141 +++++++++++++++++++++++++++++++++++------- gst/gstbufferpool.h | 52 ++++++---------- win32/common/libgstreamer.def | 2 + 3 files changed, 141 insertions(+), 54 deletions(-) diff --git a/gst/gstbufferpool.c b/gst/gstbufferpool.c index 6874ff2..5d50629 100644 --- a/gst/gstbufferpool.c +++ b/gst/gstbufferpool.c @@ -38,6 +38,20 @@ #include "gstbufferpool.h" + +#define GST_BUFFER_POOL_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BUFFER_POOL, GstBufferPoolPrivate)) + +struct _GstBufferPoolPrivate +{ + guint min_buffers; + guint max_buffers; + guint size; + guint prefix; + guint postfix; + guint align; +}; + enum { /* add more above */ @@ -50,10 +64,9 @@ G_DEFINE_TYPE (GstBufferPool, gst_buffer_pool, GST_TYPE_OBJECT); static void default_set_flushing (GstBufferPool * pool, gboolean flushing); static gboolean default_set_config (GstBufferPool * pool, - GstBufferPoolConfig * config); + GstStructure * config); static GstFlowReturn default_alloc_buffer (GstBufferPool * pool, - GstBuffer ** buffer, GstBufferPoolConfig * config, - GstBufferPoolParams * params); + GstBuffer ** buffer, GstBufferPoolParams * params); static GstFlowReturn default_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer, GstBufferPoolParams * params); static void default_free_buffer (GstBufferPool * pool, GstBuffer * buffer); @@ -77,7 +90,14 @@ gst_buffer_pool_class_init (GstBufferPoolClass * klass) static void gst_buffer_pool_init (GstBufferPool * pool) { - pool->config.align = 1; + pool->priv = GST_BUFFER_POOL_GET_PRIVATE (pool); + + pool->config = gst_structure_new ("GstBufferPoolConfig", + "size", G_TYPE_UINT, 0, + "min-buffers", G_TYPE_UINT, 0, + "max-buffers", G_TYPE_UINT, 0, + "prefix", G_TYPE_UINT, 0, + "postfix", G_TYPE_UINT, 0, "align", G_TYPE_UINT, 1, NULL); pool->poll = gst_poll_new_timer (); pool->queue = gst_atomic_queue_new (10); default_set_flushing (pool, TRUE); @@ -161,19 +181,24 @@ gst_buffer_pool_set_flushing (GstBufferPool * pool, gboolean flushing) } static gboolean -default_set_config (GstBufferPool * pool, GstBufferPoolConfig * config) +default_set_config (GstBufferPool * pool, GstStructure * config) { guint i; GstBufferPoolClass *pclass; + GstBufferPoolPrivate *priv = pool->priv; pclass = GST_BUFFER_POOL_GET_CLASS (pool); + /* parse the config and keep around */ + gst_buffer_pool_config_get (config, &priv->size, &priv->min_buffers, + &priv->max_buffers, &priv->prefix, &priv->postfix, &priv->align); + /* we need to prealloc buffers */ - for (i = config->min_buffers; i > 0; i--) { + for (i = priv->min_buffers; i > 0; i--) { GstBuffer *buffer; if (G_LIKELY (pclass->alloc_buffer)) { - if (!pclass->alloc_buffer (pool, &buffer, config, NULL)) + if (!pclass->alloc_buffer (pool, &buffer, NULL)) return FALSE; } else return FALSE; @@ -189,15 +214,19 @@ default_set_config (GstBufferPool * pool, GstBufferPoolConfig * config) /** * gst_buffer_pool_set_config: * @pool: a #GstBufferPool - * @config: a #GstBufferPoolConfig + * @config: a #GstStructure * * Set the configuration of the pool. The pool must be flushing or else this * function will do nothing and return FALSE. * + * @condfig is a #GstStructure that contains the configuration parameters for + * the pool. A default and mandatory set of parameters can be configured with + * gst_buffer_pool_config_set(). + * * Returns: TRUE when the configuration could be set. */ gboolean -gst_buffer_pool_set_config (GstBufferPool * pool, GstBufferPoolConfig * config) +gst_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) { gboolean result; GstBufferPoolClass *pclass; @@ -216,8 +245,11 @@ gst_buffer_pool_set_config (GstBufferPool * pool, GstBufferPoolConfig * config) else result = FALSE; - if (result) - pool->config = *config; + if (result) { + if (pool->config) + gst_structure_free (pool->config); + pool->config = config; + } return result; } @@ -225,34 +257,92 @@ gst_buffer_pool_set_config (GstBufferPool * pool, GstBufferPoolConfig * config) /** * gst_buffer_pool_get_config: * @pool: a #GstBufferPool - * @config: a #GstBufferPoolConfig * - * Get the current configuration of the pool. + * Get the current configuration of the pool. This configuration is read-only, + * use gst_structure_copy() to make a writable copy. + */ +const GstStructure * +gst_buffer_pool_get_config (GstBufferPool * pool) +{ + g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), NULL); + + return pool->config; +} + + +/** + * gst_buffer_pool_config_set: + * @pool: a #GstBufferPool + * @size: the size of each buffer, not including pre and post fix + * @min_buffers: the minimum amount of buffers to allocate. + * @max_buffers: the maximum amount of buffers to allocate or 0 for unlimited. + * @prefix: prefix each buffer with this many bytes + * @postfix: postfix each buffer with this many bytes + * @align: alignment of the buffer data. + * + * Configure @config with the given parameters. */ void -gst_buffer_pool_get_config (GstBufferPool * pool, GstBufferPoolConfig * config) +gst_buffer_pool_config_set (GstStructure * config, guint size, + guint min_buffers, guint max_buffers, guint prefix, guint postfix, + guint align) +{ + g_return_if_fail (config != NULL); + + gst_structure_set (config, + "size", G_TYPE_UINT, size, + "min-buffers", G_TYPE_UINT, min_buffers, + "max-buffers", G_TYPE_UINT, max_buffers, + "prefix", G_TYPE_UINT, prefix, + "postfix", G_TYPE_UINT, postfix, "align", G_TYPE_UINT, align, NULL); +} + +/** + * gst_buffer_pool_config_get: + * @pool: a #GstBufferPool + * @size: the size of each buffer, not including pre and post fix + * @min_buffers: the minimum amount of buffers to allocate. + * @max_buffers: the maximum amount of buffers to allocate or 0 for unlimited. + * @prefix: prefix each buffer with this many bytes + * @postfix: postfix each buffer with this many bytes + * @align: alignment of the buffer data. + * + * Get the configuration values from @config. + */ +gboolean +gst_buffer_pool_config_get (GstStructure * config, guint * size, + guint * min_buffers, guint * max_buffers, guint * prefix, guint * postfix, + guint * align) { - *config = pool->config; + g_return_val_if_fail (config != NULL, FALSE); + + return gst_structure_get (config, + "size", G_TYPE_UINT, size, + "min-buffers", G_TYPE_UINT, min_buffers, + "max-buffers", G_TYPE_UINT, max_buffers, + "prefix", G_TYPE_UINT, prefix, + "postfix", G_TYPE_UINT, postfix, "align", G_TYPE_UINT, align, NULL); } static GstFlowReturn default_alloc_buffer (GstBufferPool * pool, GstBuffer ** buffer, - GstBufferPoolConfig * config, GstBufferPoolParams * params) + GstBufferPoolParams * params) { guint size, align; + GstBufferPoolPrivate *priv = pool->priv; *buffer = gst_buffer_new (); - align = config->align - 1; - size = config->prefix + config->postfix + config->size + align; + align = priv->align - 1; + size = priv->prefix + priv->postfix + priv->size + align; if (size > 0) { guint8 *memptr; memptr = g_malloc (size); GST_BUFFER_MALLOCDATA (*buffer) = memptr; memptr = (guint8 *) ((guintptr) (memptr + align) & ~align); - GST_BUFFER_DATA (*buffer) = memptr + config->prefix; - GST_BUFFER_SIZE (*buffer) = config->size; + GST_BUFFER_DATA (*buffer) = memptr + priv->prefix; + GST_BUFFER_SIZE (*buffer) = priv->size; } return GST_FLOW_OK; @@ -264,6 +354,7 @@ default_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer, { GstFlowReturn result; GstBufferPoolClass *pclass; + GstBufferPoolPrivate *priv = pool->priv; pclass = GST_BUFFER_POOL_GET_CLASS (pool); @@ -281,10 +372,10 @@ default_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer, } /* no buffer */ - if (pool->config.max_buffers == 0) { + if (priv->max_buffers == 0) { /* no max_buffers, we allocate some more */ if (G_LIKELY (pclass->alloc_buffer)) - result = pclass->alloc_buffer (pool, buffer, &pool->config, params); + result = pclass->alloc_buffer (pool, buffer, params); else result = GST_FLOW_NOT_SUPPORTED; break; @@ -323,6 +414,9 @@ gst_buffer_pool_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer, GstBufferPoolClass *pclass; GstFlowReturn result; + g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), GST_FLOW_ERROR); + g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR); + pclass = GST_BUFFER_POOL_GET_CLASS (pool); if (G_LIKELY (pclass->acquire_buffer)) @@ -369,6 +463,9 @@ gst_buffer_pool_release_buffer (GstBufferPool * pool, GstBuffer * buffer) { GstBufferPoolClass *pclass; + g_return_if_fail (GST_IS_BUFFER_POOL (pool)); + g_return_if_fail (buffer != NULL); + pclass = GST_BUFFER_POOL_GET_CLASS (pool); if (G_LIKELY (pclass->release_buffer)) diff --git a/gst/gstbufferpool.h b/gst/gstbufferpool.h index 429af6d..76d5010 100644 --- a/gst/gstbufferpool.h +++ b/gst/gstbufferpool.h @@ -33,6 +33,7 @@ G_BEGIN_DECLS typedef struct _GstBufferPool GstBufferPool; +typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate; typedef struct _GstBufferPoolClass GstBufferPoolClass; /** @@ -85,28 +86,6 @@ typedef struct _GstBufferPoolParams { } GstBufferPoolParams; /** - * GstBufferPoolAlloc: - * @min_buffers: the minimum amount of buffers to allocate. - * @max_buffers: the maximum amount of buffers to allocate or 0 for unlimited. - * @size: the size of each buffer, not including pre and post fix - * @prefix: prefix each buffer with this many bytes - * @postfix: postfix each buffer with this many bytes - * @align: alignment of the buffer data. - * - * Properties for controlling the allocation of buffers. Buffer memory will be - * allocated with the given alignment and the returned buffers will have their - * data pointer set to this memory + prefix. - */ -typedef struct _GstBufferPoolConfig { - guint min_buffers; - guint max_buffers; - guint size; - guint prefix; - guint postfix; - guint align; -} GstBufferPoolConfig; - -/** * GstBufferPool: * @mini_object: the parent structure * @@ -121,7 +100,9 @@ struct _GstBufferPool { GstAtomicQueue *queue; GstPoll *poll; - GstBufferPoolConfig config; + GstStructure *config; + + GstBufferPoolPrivate *priv; gpointer _gst_reserved[GST_PADDING]; }; @@ -131,12 +112,11 @@ struct _GstBufferPoolClass { /* vmethods */ void (*set_flushing) (GstBufferPool *pool, gboolean flushing); - gboolean (*set_config) (GstBufferPool *pool, GstBufferPoolConfig *config); + gboolean (*set_config) (GstBufferPool *pool, GstStructure *config); GstFlowReturn (*acquire_buffer) (GstBufferPool *pool, GstBuffer **buffer, GstBufferPoolParams *params); GstFlowReturn (*alloc_buffer) (GstBufferPool *pool, GstBuffer **buffer, - GstBufferPoolConfig *config, GstBufferPoolParams *params); void (*release_buffer) (GstBufferPool *pool, GstBuffer *buffer); void (*free_buffer) (GstBufferPool *pool, GstBuffer *buffer); @@ -147,18 +127,26 @@ struct _GstBufferPoolClass { GType gst_buffer_pool_get_type (void); /* allocation */ -GstBufferPool * gst_buffer_pool_new (void); - +GstBufferPool * gst_buffer_pool_new (void); /* state management */ -void gst_buffer_pool_set_flushing (GstBufferPool *pool, gboolean flushing); +void gst_buffer_pool_set_flushing (GstBufferPool *pool, gboolean flushing); + +gboolean gst_buffer_pool_set_config (GstBufferPool *pool, GstStructure *config); +const GstStructure * gst_buffer_pool_get_config (GstBufferPool *pool); -gboolean gst_buffer_pool_set_config (GstBufferPool *pool, GstBufferPoolConfig *config); -void gst_buffer_pool_get_config (GstBufferPool *pool, GstBufferPoolConfig *config); +/* helpers for configuring the config structure */ +void gst_buffer_pool_config_set (GstStructure *config, guint size, + guint min_buffers, guint max_buffers, + guint prefix, guint postfix, guint align); +gboolean gst_buffer_pool_config_get (GstStructure *config, guint *size, + guint *min_buffers, guint *max_buffers, + guint *prefix, guint *postfix, guint *align); /* buffer management */ -GstFlowReturn gst_buffer_pool_acquire_buffer (GstBufferPool *pool, GstBuffer **buffer, GstBufferPoolParams *params); -void gst_buffer_pool_release_buffer (GstBufferPool *pool, GstBuffer *buffer); +GstFlowReturn gst_buffer_pool_acquire_buffer (GstBufferPool *pool, GstBuffer **buffer, + GstBufferPoolParams *params); +void gst_buffer_pool_release_buffer (GstBufferPool *pool, GstBuffer *buffer); G_END_DECLS diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index adcb65c..515c2cf 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -125,6 +125,8 @@ EXPORTS gst_buffer_new_and_alloc gst_buffer_remove_meta gst_buffer_pool_acquire_buffer + gst_buffer_pool_config_get + gst_buffer_pool_config_set gst_buffer_pool_flags_get_type gst_buffer_pool_get_config gst_buffer_pool_get_type -- 2.7.4