summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2018-02-15 19:28:33 +0100
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2018-02-20 10:57:12 -0600
commitf0fd2aeb0469fa15bd2932aedf3e682004107890 (patch)
tree127c224f79ae72d946d152c2cff42baa7704cfb5
parentbcc480b70e18eb5c1768aad5a8c28c2bfb9526a6 (diff)
plugins: store the first downstream allocator if available
The allocator will be required if we need to allocate a buffer to store the frame with the expected strides. https://bugzilla.gnome.org/show_bug.cgi?id=785054
-rw-r--r--gst/vaapi/gstvaapipluginbase.c17
-rw-r--r--gst/vaapi/gstvaapipluginbase.h2
2 files changed, 18 insertions, 1 deletions
diff --git a/gst/vaapi/gstvaapipluginbase.c b/gst/vaapi/gstvaapipluginbase.c
index 7bc7178dad..0183579cf1 100644
--- a/gst/vaapi/gstvaapipluginbase.c
+++ b/gst/vaapi/gstvaapipluginbase.c
@@ -327,6 +327,7 @@ gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin)
g_clear_object (&plugin->sinkpad_allocator);
g_clear_object (&plugin->srcpad_allocator);
+ g_clear_object (&plugin->other_srcpad_allocator);
gst_caps_replace (&plugin->srcpad_caps, NULL);
gst_video_info_init (&plugin->srcpad_info);
@@ -929,10 +930,24 @@ gst_vaapi_plugin_base_decide_allocation (GstVaapiPluginBase * plugin,
num_allocators = gst_query_get_n_allocation_params (query);
for (i = 0; i < num_allocators; i++) {
GstAllocator *allocator = NULL;
+ GstAllocationParams params;
- gst_query_parse_nth_allocation_param (query, i, &allocator, NULL);
+ gst_query_parse_nth_allocation_param (query, i, &allocator, &params);
if (!allocator)
continue;
+
+ /* Let's keep the the first allocator if it is not VA-API. It
+ * might be used if it is required to copy the output frame to a
+ * new buffer */
+ if (i == 0
+ && g_strcmp0 (allocator->mem_type, GST_VAAPI_VIDEO_MEMORY_NAME) != 0) {
+ if (plugin->other_srcpad_allocator)
+ gst_object_unref (plugin->other_srcpad_allocator);
+ plugin->other_srcpad_allocator = allocator;
+ plugin->other_allocator_params = params;
+ continue;
+ }
+
if (g_strcmp0 (allocator->mem_type, GST_VAAPI_VIDEO_MEMORY_NAME) == 0) {
GST_DEBUG_OBJECT (plugin, "found vaapi allocator in query %"
GST_PTR_FORMAT, allocator);
diff --git a/gst/vaapi/gstvaapipluginbase.h b/gst/vaapi/gstvaapipluginbase.h
index f08548260f..81b5f4eddb 100644
--- a/gst/vaapi/gstvaapipluginbase.h
+++ b/gst/vaapi/gstvaapipluginbase.h
@@ -147,6 +147,8 @@ struct _GstVaapiPluginBase
gboolean srcpad_can_dmabuf;
gboolean enable_direct_rendering;
+ GstAllocator *other_srcpad_allocator;
+ GstAllocationParams other_allocator_params;
};
struct _GstVaapiPluginBaseClass