From 8d93f8edb3906c377e8060e62bdcf27e8cca2ef3 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 25 Dec 2011 18:07:10 +0100 Subject: [PATCH] videopool: add support for custom allocators --- gst-libs/gst/video/gstvideopool.c | 38 ++++++++++++++++++++++++++++++- gst-libs/gst/video/gstvideopool.h | 7 ++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/gst-libs/gst/video/gstvideopool.c b/gst-libs/gst/video/gstvideopool.c index b3cc1e6d08..239cecb98e 100644 --- a/gst-libs/gst/video/gstvideopool.c +++ b/gst-libs/gst/video/gstvideopool.c @@ -138,6 +138,7 @@ gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align) /* bufferpool */ struct _GstVideoBufferPoolPrivate { + const GstAllocator *allocator; GstCaps *caps; GstVideoInfo info; GstVideoAlignment video_align; @@ -249,7 +250,9 @@ video_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, GST_DEBUG_OBJECT (pool, "alloc %u", info->size); - mem = gst_allocator_alloc (NULL, info->size + priv->prefix, priv->align); + mem = + gst_allocator_alloc (priv->allocator, info->size + priv->prefix, + priv->align); if (mem == NULL) goto no_memory; @@ -329,3 +332,36 @@ gst_video_buffer_pool_finalize (GObject * object) G_OBJECT_CLASS (gst_video_buffer_pool_parent_class)->finalize (object); } + +/** + * gst_video_buffer_pool_get_allocator: + * @pool: a #GstVideoBufferPool + * + * Get the allocator used by @pool to allocate the video memory. + * + * Returns: the allocator used for allocating video memory + */ +const GstAllocator * +gst_video_buffer_pool_get_allocator (GstVideoBufferPool * pool) +{ + g_return_val_if_fail (GST_IS_VIDEO_BUFFER_POOL (pool), NULL); + + return pool->priv->allocator; +} + +/** + * gst_video_buffer_pool_set_allocator: + * @pool: a #GstVideoBufferPool + * @allocator: a #GstAllocator + * + * Set the allocator used to allocate video memory in @pool. The allocator + * should only be changed by subclasses. + */ +void +gst_video_buffer_pool_set_allocator (GstVideoBufferPool * pool, + const GstAllocator * allocator) +{ + g_return_if_fail (GST_IS_VIDEO_BUFFER_POOL (pool)); + + pool->priv->allocator = allocator; +} diff --git a/gst-libs/gst/video/gstvideopool.h b/gst-libs/gst/video/gstvideopool.h index 74c4127e3e..73fa7422d6 100644 --- a/gst-libs/gst/video/gstvideopool.h +++ b/gst-libs/gst/video/gstvideopool.h @@ -93,10 +93,13 @@ struct _GstVideoBufferPoolClass GstBufferPoolClass parent_class; }; -GType gst_video_buffer_pool_get_type (void); +GType gst_video_buffer_pool_get_type (void); -GstBufferPool * gst_video_buffer_pool_new (void); +GstBufferPool * gst_video_buffer_pool_new (void); +const GstAllocator * gst_video_buffer_pool_get_allocator (GstVideoBufferPool *pool); +void gst_video_buffer_pool_set_allocator (GstVideoBufferPool *pool, + const GstAllocator *allocator); G_END_DECLS