vkbufferpool: add support for video encoded buffers

Add support for non video raw  buffers to allocate memory
such as in encoded content scenario.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5645>
This commit is contained in:
Stéphane Cerveau 2023-11-21 12:47:38 +01:00 committed by Víctor Manuel Jáquez Leal
parent c6a5437e0d
commit 15b719d7f6

View file

@ -110,12 +110,12 @@ gst_vulkan_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
{ {
GstVulkanBufferPool *vk_pool = GST_VULKAN_BUFFER_POOL_CAST (pool); GstVulkanBufferPool *vk_pool = GST_VULKAN_BUFFER_POOL_CAST (pool);
GstVulkanBufferPoolPrivate *priv = GET_PRIV (vk_pool); GstVulkanBufferPoolPrivate *priv = GET_PRIV (vk_pool);
guint min_buffers, max_buffers; guint min_buffers, max_buffers, size;
GstCaps *caps = NULL; GstCaps *caps = NULL;
gboolean ret = TRUE; gboolean ret = TRUE;
guint i; guint i;
if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers, if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers,
&max_buffers)) &max_buffers))
goto wrong_config; goto wrong_config;
@ -135,19 +135,24 @@ gst_vulkan_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
&priv->usage, &priv->mem_props); &priv->usage, &priv->mem_props);
/* get the size of the buffer to allocate */ /* get the size of the buffer to allocate */
priv->v_info.size = 0; if (GST_VIDEO_INFO_FORMAT (&priv->v_info) != GST_VIDEO_FORMAT_ENCODED) {
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&priv->v_info); i++) { priv->v_info.size = 0;
priv->alloc_sizes[i] = GST_VIDEO_INFO_COMP_HEIGHT (&priv->v_info, i) * for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&priv->v_info); i++) {
GST_VIDEO_INFO_PLANE_STRIDE (&priv->v_info, i); priv->alloc_sizes[i] = GST_VIDEO_INFO_COMP_HEIGHT (&priv->v_info, i) *
priv->v_info.offset[i] = priv->v_info.size; GST_VIDEO_INFO_PLANE_STRIDE (&priv->v_info, i);
priv->v_info.size += priv->alloc_sizes[i]; priv->v_info.offset[i] = priv->v_info.size;
priv->v_info.size += priv->alloc_sizes[i];
}
priv->add_videometa = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_set_params (config, caps,
priv->v_info.size, min_buffers, max_buffers);
} else {
priv->alloc_sizes[0] = size;
} }
priv->add_videometa = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_set_params (config, caps,
priv->v_info.size, min_buffers, max_buffers);
return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret; return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret;
/* ERRORS */ /* ERRORS */
@ -176,32 +181,38 @@ gst_vulkan_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
{ {
GstVulkanBufferPool *vk_pool = GST_VULKAN_BUFFER_POOL_CAST (pool); GstVulkanBufferPool *vk_pool = GST_VULKAN_BUFFER_POOL_CAST (pool);
GstVulkanBufferPoolPrivate *priv = GET_PRIV (vk_pool); GstVulkanBufferPoolPrivate *priv = GET_PRIV (vk_pool);
GstMemory *mem;
GstBuffer *buf; GstBuffer *buf;
guint i; guint i, num_planes;
if (!(buf = gst_buffer_new ())) { if (!(buf = gst_buffer_new ())) {
goto no_buffer; goto no_buffer;
} }
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&priv->v_info); i++) { if (GST_VIDEO_INFO_FORMAT (&priv->v_info) != GST_VIDEO_FORMAT_ENCODED)
GstMemory *mem; num_planes = GST_VIDEO_INFO_N_PLANES (&priv->v_info);
else
num_planes = 1;
mem = gst_vulkan_buffer_memory_alloc (vk_pool->device, priv->alloc_sizes[i], for (i = 0; i < num_planes; i++) {
mem =
gst_vulkan_buffer_memory_alloc (vk_pool->device, priv->alloc_sizes[i],
priv->usage, priv->mem_props); priv->usage, priv->mem_props);
if (!mem) { if (!mem) {
gst_buffer_unref (buf); gst_buffer_unref (buf);
goto mem_create_failed; goto mem_create_failed;
} }
gst_buffer_append_memory (buf, mem); gst_buffer_append_memory (buf, mem);
} }
gst_buffer_add_video_meta_full (buf, 0, if (GST_VIDEO_INFO_FORMAT (&priv->v_info) != GST_VIDEO_FORMAT_ENCODED) {
GST_VIDEO_INFO_FORMAT (&priv->v_info), gst_buffer_add_video_meta_full (buf, 0,
GST_VIDEO_INFO_WIDTH (&priv->v_info), GST_VIDEO_INFO_FORMAT (&priv->v_info),
GST_VIDEO_INFO_HEIGHT (&priv->v_info), GST_VIDEO_INFO_WIDTH (&priv->v_info),
GST_VIDEO_INFO_N_PLANES (&priv->v_info), priv->v_info.offset, GST_VIDEO_INFO_HEIGHT (&priv->v_info),
priv->v_info.stride); GST_VIDEO_INFO_N_PLANES (&priv->v_info), priv->v_info.offset,
priv->v_info.stride);
}
*buffer = buf; *buffer = buf;