GstCaps *caps = NULL;
GstBufferPool *pool = NULL;
gboolean need_pool;
- guint size = 0;
+ guint size = 0, n_allocators;
gst_query_parse_allocation (query, &caps, &need_pool);
if (!caps)
plugin->sinkpad_allocator);
if (!pool)
return FALSE;
+ }
- gst_query_add_allocation_param (query, plugin->sinkpad_allocator, NULL);
+ /* Set sinkpad allocator as the last allocation param.
+ *
+ * If there's none, set system's allocator first and VAAPI allocator
+ * second
+ */
+ n_allocators = gst_query_get_n_allocation_params (query);
+ if (n_allocators == 0) {
+ GstAllocator *allocator;
+
+ allocator = gst_allocator_find (GST_ALLOCATOR_SYSMEM);
+ gst_query_add_allocation_param (query, allocator, NULL);
+ gst_object_unref (allocator);
}
+ gst_query_add_allocation_param (query, plugin->sinkpad_allocator, NULL);
gst_query_add_allocation_pool (query, pool, size,
BUFFER_POOL_SINK_MIN_BUFFERS, 0);
GstCaps *caps = NULL;
GstBufferPool *pool;
GstVideoInfo vi;
- guint size, min, max, pool_options;
- gboolean update_pool = FALSE, update_allocator = FALSE;
+ guint i, size, min, max, pool_options, num_allocators;
+ gint index_allocator;
+ gboolean update_pool = FALSE;
#if (USE_GLX || USE_EGL)
guint idx;
#endif
goto error_invalid_caps;
gst_video_info_force_nv12_if_encoded (&vi);
- if (gst_query_get_n_allocation_params (query) > 0)
- update_allocator = TRUE;
+ index_allocator = -1;
+ num_allocators = gst_query_get_n_allocation_params (query);
+ for (i = 0; i < num_allocators; i++) {
+ GstAllocator *allocator = NULL;
+
+ gst_query_parse_nth_allocation_param (query, i, &allocator, NULL);
+ if (!allocator)
+ 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);
+ index_allocator = i;
+ if (plugin->srcpad_allocator)
+ gst_object_unref (plugin->srcpad_allocator);
+ plugin->srcpad_allocator = allocator;
+ break;
+ }
+ gst_object_unref (allocator);
+ }
if (gst_query_get_n_allocation_pools (query) > 0) {
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
else
gst_query_add_allocation_pool (query, pool, size, min, max);
- if (update_allocator)
- gst_query_set_nth_allocation_param (query, 0, plugin->srcpad_allocator,
- NULL);
- else
- gst_query_add_allocation_param (query, plugin->srcpad_allocator, NULL);
+ /* allocator might be updated by ensure_srcpad_allocator() */
+ if (plugin->srcpad_allocator) {
+ if (index_allocator > 0) {
+ gst_query_set_nth_allocation_param (query, index_allocator,
+ plugin->srcpad_allocator, NULL);
+ } else {
+ GST_DEBUG_OBJECT (plugin, "adding allocator in query %" GST_PTR_FORMAT,
+ plugin->srcpad_allocator);
+ gst_query_add_allocation_param (query, plugin->srcpad_allocator, NULL);
+ }
+ }
g_clear_object (&plugin->srcpad_buffer_pool);
plugin->srcpad_buffer_pool = pool;