gboolean gst_vulkan_device_run_context_query (GstElement * element, GstVulkanDevice ** device) { GstQuery *query; g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); g_return_val_if_fail (device != NULL, FALSE); if (*device && GST_IS_VULKAN_DEVICE (*device)) return TRUE; if ((query = gst_vulkan_local_context_query (element, GST_VULKAN_DEVICE_CONTEXT_TYPE_STR, FALSE))) { GstContext *context; gst_query_parse_context (query, &context); if (context) gst_context_get_vulkan_device (context, device); } GST_DEBUG_OBJECT (element, "found device %p", *device); gst_query_unref (query); if (*device) return TRUE; return FALSE; }
void gst_vulkan_global_context_query (GstElement * element, const gchar * context_type) { GstQuery *query; GstMessage *msg; if ((query = gst_vulkan_local_context_query (element, context_type, TRUE))) { gst_query_unref (query); return; } /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with * the required context type and afterwards check if a * usable context was set now as in 1). The message could * be handled by the parent bins of the element and the * application. */ GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting need context message"); msg = gst_message_new_need_context (GST_OBJECT_CAST (element), context_type); gst_element_post_message (element, msg); /* * Whomever responds to the need-context message performs a * GstElement::set_context() with the required context in which the element * is required to update the display_ptr or call gst_vulkan_handle_set_context(). */ }