diff options
author | Víctor Manuel Jáquez Leal <vjaquez@igalia.com> | 2018-02-15 19:28:33 +0100 |
---|---|---|
committer | Víctor Manuel Jáquez Leal <vjaquez@igalia.com> | 2018-02-20 10:57:12 -0600 |
commit | f0fd2aeb0469fa15bd2932aedf3e682004107890 (patch) | |
tree | 127c224f79ae72d946d152c2cff42baa7704cfb5 | |
parent | bcc480b70e18eb5c1768aad5a8c28c2bfb9526a6 (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.c | 17 | ||||
-rw-r--r-- | gst/vaapi/gstvaapipluginbase.h | 2 |
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, ¶ms); 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 |