#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:
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);
+
+}