From 98983e08ae1730871f1b6c11a30024c037e4cc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 8 Aug 2012 15:28:52 +0200 Subject: [PATCH] videoencoder: Always propose a video buffer pool when the subclass didn't provide one And also request 16-byte aligned buffers if the subclass didn't set anything else. --- gst-libs/gst/video/gstvideoencoder.c | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/gst-libs/gst/video/gstvideoencoder.c b/gst-libs/gst/video/gstvideoencoder.c index ba91c5aa5b..6addb3ce38 100644 --- a/gst-libs/gst/video/gstvideoencoder.c +++ b/gst-libs/gst/video/gstvideoencoder.c @@ -123,6 +123,7 @@ #include "gstvideoutils.h" #include +#include #include @@ -746,7 +747,57 @@ static gboolean gst_video_encoder_propose_allocation_default (GstVideoEncoder * encoder, GstQuery * query) { + GstCaps *caps; + GstVideoInfo info; + GstBufferPool *pool; + guint size; + + gst_query_parse_allocation (query, &caps, NULL); + + if (caps == NULL) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) + return FALSE; + + size = GST_VIDEO_INFO_SIZE (&info); + + if (gst_query_get_n_allocation_pools (query) == 0) { + GstStructure *structure; + GstAllocator *allocator = NULL; + GstAllocationParams params = { 0, 0, 0, 15, }; + + if (gst_query_get_n_allocation_params (query) > 0) + gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms); + else + gst_query_add_allocation_param (query, allocator, ¶ms); + + pool = gst_video_buffer_pool_new (); + + structure = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (structure, caps, size, 0, 0); + gst_buffer_pool_config_set_allocator (structure, allocator, ¶ms); + + if (allocator) + gst_object_unref (allocator); + + if (!gst_buffer_pool_set_config (pool, structure)) + goto config_failed; + + gst_query_add_allocation_pool (query, pool, size, 0, 0); + gst_object_unref (pool); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + } + return TRUE; + + /* ERRORS */ +config_failed: + { + GST_ERROR_OBJECT (encoder, "failed to set config"); + gst_object_unref (pool); + return FALSE; + } } static gboolean