summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2017-06-09 15:02:08 +0200
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2017-06-12 18:41:14 +0200
commit60158c3d6bcf24c89ffa61b2678e91cf17dac359 (patch)
tree81082b617e9437d5865e8d8d837c257de897e272 /gst
parent7a20692364b67809e2a77769fe591557f445c170 (diff)
vaapivideobufferpool: refactor set_config()
Refactor the set_config() virtual method considering a cleaner approach to allocator instanciation, if it it not set or if it is not valid for the pool. https://bugzilla.gnome.org/show_bug.cgi?id=783599
Diffstat (limited to 'gst')
-rw-r--r--gst/vaapi/gstvaapivideobufferpool.c110
1 files changed, 66 insertions, 44 deletions
diff --git a/gst/vaapi/gstvaapivideobufferpool.c b/gst/vaapi/gstvaapivideobufferpool.c
index c1c4fba1..a2eae836 100644
--- a/gst/vaapi/gstvaapivideobufferpool.c
+++ b/gst/vaapi/gstvaapivideobufferpool.c
@@ -142,6 +142,7 @@ gst_vaapi_video_buffer_pool_set_config (GstBufferPool * pool,
GstAllocator *allocator;
gboolean ret, updated = FALSE;
guint size, min_buffers, max_buffers;
+ guint surface_alloc_flags;
GST_DEBUG_OBJECT (pool, "config %" GST_PTR_FORMAT, config);
@@ -158,62 +159,83 @@ gst_vaapi_video_buffer_pool_set_config (GstBufferPool * pool,
if (!gst_buffer_pool_config_get_allocator (config, &allocator, NULL))
goto error_invalid_allocator;
- if (gst_video_info_changed (&priv->allocation_vinfo, &new_allocation_vinfo))
- gst_object_replace ((GstObject **) & priv->allocator, NULL);
- priv->allocation_vinfo = new_allocation_vinfo;
+ /* it is a valid allocator? */
+ if (allocator
+ && (g_strcmp0 (allocator->mem_type, GST_VAAPI_VIDEO_MEMORY_NAME) != 0
+ && g_strcmp0 (allocator->mem_type,
+ GST_VAAPI_DMABUF_ALLOCATOR_NAME) != 0))
+ allocator = NULL;
- {
- guint surface_alloc_flags;
- gboolean vinfo_changed = FALSE;
-
- if (allocator) {
- allocator_vinfo =
- gst_allocator_get_vaapi_video_info (allocator, &surface_alloc_flags);
- vinfo_changed =
- gst_video_info_changed (allocator_vinfo, &new_allocation_vinfo);
- }
+ /* get the allocator properties */
+ if (allocator) {
+ priv->use_dmabuf_memory = gst_vaapi_is_dmabuf_allocator (allocator);
+ negotiated_vinfo =
+ gst_allocator_get_vaapi_negotiated_video_info (allocator);
+ allocator_vinfo =
+ gst_allocator_get_vaapi_video_info (allocator, &surface_alloc_flags);
+ } else {
+ priv->use_dmabuf_memory = FALSE;
+ negotiated_vinfo = NULL;
+ allocator_vinfo = NULL;
+ surface_alloc_flags = 0;
+ }
- if (vinfo_changed && allocator && priv->use_dmabuf_memory) {
+ /* reset or update the allocator if video resolution changed */
+ if (gst_video_info_changed (&priv->allocation_vinfo, &new_allocation_vinfo)
+ || gst_video_info_changed (allocator_vinfo, &new_allocation_vinfo)) {
+ gst_object_replace ((GstObject **) & priv->allocator, NULL);
+
+ if (allocator && priv->use_dmabuf_memory) {
gst_allocator_set_vaapi_video_info (allocator, &new_allocation_vinfo,
surface_alloc_flags);
- } else if (!priv->use_dmabuf_memory && (vinfo_changed || !allocator)) {
- negotiated_vinfo =
- gst_allocator_get_vaapi_negotiated_video_info (allocator);
-
- /* let's destroy the other allocator and create a new one */
- allocator = gst_vaapi_video_allocator_new (priv->display,
- &new_allocation_vinfo, surface_alloc_flags, 0);
- if (negotiated_vinfo) {
- gst_allocator_set_vaapi_negotiated_video_info (allocator,
- negotiated_vinfo);
- }
- gst_buffer_pool_config_set_allocator (config, allocator, NULL);
- gst_object_unref (allocator);
+ } else {
+ allocator = NULL;
}
}
+ priv->allocation_vinfo = new_allocation_vinfo;
if (!gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META))
goto error_no_vaapi_video_meta_option;
- /* not our allocator, not our buffers */
- if (allocator) {
- priv->use_dmabuf_memory = gst_vaapi_is_dmabuf_allocator (allocator);
- if (priv->use_dmabuf_memory ||
- g_strcmp0 (allocator->mem_type, GST_VAAPI_VIDEO_MEMORY_NAME) == 0) {
- if (priv->allocator)
- gst_object_unref (priv->allocator);
- if ((priv->allocator = allocator))
- gst_object_ref (allocator);
- negotiated_vinfo =
- gst_allocator_get_vaapi_negotiated_video_info (priv->allocator);
- priv->vmeta_vinfo = (negotiated_vinfo) ?
- *negotiated_vinfo : priv->allocation_vinfo;
+ /* create a new allocator if needed */
+ if (!allocator) {
+ if (priv->use_dmabuf_memory) {
+ allocator = gst_vaapi_dmabuf_allocator_new (priv->display,
+ &new_allocation_vinfo, /* FIXME: */ 0, GST_PAD_SRC);
+ } else {
+ allocator = gst_vaapi_video_allocator_new (priv->display,
+ &new_allocation_vinfo, surface_alloc_flags, 0);
+ }
+
+ if (!allocator)
+ goto error_no_allocator;
+
+ if (negotiated_vinfo) {
+ gst_allocator_set_vaapi_negotiated_video_info (allocator,
+ negotiated_vinfo);
}
+
+ GST_INFO_OBJECT (pool, "created new allocator %" GST_PTR_FORMAT, allocator);
+ gst_buffer_pool_config_set_allocator (config, allocator, NULL);
+ gst_object_unref (allocator);
+ }
+
+ /* use the allocator and set the video info for the vmeta */
+ if (allocator) {
+ if (priv->allocator)
+ gst_object_unref (priv->allocator);
+ if ((priv->allocator = allocator))
+ gst_object_ref (allocator);
+
+ negotiated_vinfo =
+ gst_allocator_get_vaapi_negotiated_video_info (priv->allocator);
+ priv->vmeta_vinfo = (negotiated_vinfo) ?
+ *negotiated_vinfo : priv->allocation_vinfo;
+
if (GST_VIDEO_INFO_SIZE (&priv->vmeta_vinfo) != size) {
gst_buffer_pool_config_set_params (config, caps,
- GST_VIDEO_INFO_SIZE (&priv->vmeta_vinfo), min_buffers,
- max_buffers);
+ GST_VIDEO_INFO_SIZE (&priv->vmeta_vinfo), min_buffers, max_buffers);
}
}
if (!priv->allocator)
@@ -221,9 +243,9 @@ gst_vaapi_video_buffer_pool_set_config (GstBufferPool * pool,
priv->options = 0;
if (gst_buffer_pool_config_has_option (config,
- GST_BUFFER_POOL_OPTION_VIDEO_META))
+ GST_BUFFER_POOL_OPTION_VIDEO_META)) {
priv->options |= GST_VAAPI_VIDEO_BUFFER_POOL_OPTION_VIDEO_META;
- else {
+ } else {
gint i;
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&priv->allocation_vinfo); i++) {
if (GST_VIDEO_INFO_PLANE_OFFSET (&priv->allocation_vinfo, i) !=