From 921392eee7c0427f35d5dee7c640c343e9438b9e Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Sun, 17 Jun 2001 13:55:55 +0000 Subject: [PATCH] added a default bufferpool factory function. it reuses existing instances of bufferpool if requests are made for exis... Original commit message from CVS: added a default bufferpool factory function. it reuses existing instances of bufferpool if requests are made for existing buffer sizes --- gst/gst.c | 1 + gst/gstbufferpool.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ gst/gstbufferpool.h | 3 ++ 3 files changed, 77 insertions(+) diff --git a/gst/gst.c b/gst/gst.c index 95bb856f92..9fee7e9178 100644 --- a/gst/gst.c +++ b/gst/gst.c @@ -84,6 +84,7 @@ gst_init (int *argc, char **argv[]) _gst_caps_initialize (); _gst_plugin_initialize (); _gst_buffer_initialize (); + _gst_buffer_pool_initialize (); /* register some standard builtin types */ gst_elementfactory_new ("bin", gst_bin_get_type (), &gst_bin_details); diff --git a/gst/gstbufferpool.c b/gst/gstbufferpool.c index 828baeafe4..78d294b468 100644 --- a/gst/gstbufferpool.c +++ b/gst/gstbufferpool.c @@ -25,6 +25,18 @@ #include "gstbuffer.h" +static GMutex *default_pool_lock; +static GHashTable *_default_pools; + +static GstBuffer* gst_buffer_pool_default_create (GstBufferPool *pool, gpointer user_data); +static void gst_buffer_pool_default_destroy (GstBufferPool *pool, GstBuffer *buffer, gpointer user_data); + +void +_gst_buffer_pool_initialize (void) +{ + _default_pools = g_hash_table_new(NULL,NULL); + default_pool_lock = g_mutex_new (); +} /** * gst_buffer_pool_new: @@ -138,3 +150,64 @@ gst_buffer_pool_destroy_buffer (GstBufferPool *pool, pool->destroy_buffer (pool, buffer, pool->new_user_data); } + +GstBufferPool* +gst_buffer_pool_get_default (guint buffer_size, guint pool_size) +{ + GstBufferPool *pool; + GMemChunk *data_chunk; + guint real_buffer_size; + + // check for an existing GstBufferPool with the same buffer_size + // (we won't worry about the pool_size) + if ((pool = (GstBufferPool*)g_hash_table_lookup(_default_pools,GINT_TO_POINTER(buffer_size)))){ + return pool; + } + + // g_print("new buffer pool bytes:%d size:%d\n", buffer_size, pool_size); + + // round up to the nearest 32 bytes for cache-line and other efficiencies + real_buffer_size = ((buffer_size-1 / 32) + 1) * 32; + + data_chunk = g_mem_chunk_new ("GstBufferPoolDefault", real_buffer_size, + real_buffer_size * pool_size, G_ALLOC_AND_FREE); + + pool = gst_buffer_pool_new(); + gst_buffer_pool_set_create_function (pool, gst_buffer_pool_default_create, data_chunk); + gst_buffer_pool_set_destroy_function (pool, gst_buffer_pool_default_destroy, data_chunk); + + g_hash_table_insert(_default_pools,GINT_TO_POINTER(buffer_size),pool); + return pool; +} + +static GstBuffer* +gst_buffer_pool_default_create (GstBufferPool *pool, gpointer user_data) +{ + GMemChunk *data_chunk = (GMemChunk*)user_data; + GstBuffer *buffer; + + buffer = gst_buffer_new(); + GST_BUFFER_FLAG_SET(buffer,GST_BUFFER_DONTFREE); + buffer->pool = pool; + + g_mutex_lock (default_pool_lock); + GST_BUFFER_DATA(buffer) = g_mem_chunk_alloc(data_chunk); + g_mutex_unlock (default_pool_lock); + + return buffer; +} + +static void +gst_buffer_pool_default_destroy (GstBufferPool *pool, GstBuffer *buffer, gpointer user_data) +{ + GMemChunk *data_chunk = (GMemChunk*)user_data; + gpointer data = GST_BUFFER_DATA(buffer); + + g_mutex_lock (default_pool_lock); + g_mem_chunk_free (data_chunk,data); + g_mutex_unlock (default_pool_lock); + + buffer->pool = NULL; + gst_buffer_destroy (buffer); + +} diff --git a/gst/gstbufferpool.h b/gst/gstbufferpool.h index 9f52b52cc2..0fdf1001a0 100644 --- a/gst/gstbufferpool.h +++ b/gst/gstbufferpool.h @@ -67,6 +67,9 @@ void gst_buffer_pool_set_destroy_function (GstBufferPool *pool, /* destroying the buffer pool */ void gst_buffer_pool_destroy (GstBufferPool *pool); +/* a default buffer pool implementation */ +GstBufferPool* gst_buffer_pool_get_default (guint buffer_size, guint pool_size); + #ifdef __cplusplus } #endif /* __cplusplus */