GstQuery * gst_vulkan_local_context_query (GstElement * element, const gchar * context_type, gboolean set_context) { GstQuery *query; GstContext *ctxt; _init_context_debug (); /* 2a) Query downstream with GST_QUERY_CONTEXT for the context and * check if downstream already has a context of the specific type * 2b) Query upstream as above. */ query = gst_query_new_context (context_type); if (gst_vulkan_run_query (element, query, GST_PAD_SRC)) { gst_query_parse_context (query, &ctxt); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "found context (%p) in downstream query", ctxt); if (set_context) gst_element_set_context (element, ctxt); } else if (gst_vulkan_run_query (element, query, GST_PAD_SINK)) { gst_query_parse_context (query, &ctxt); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "found context (%p) in upstream query", ctxt); if (set_context) gst_element_set_context (element, ctxt); } else { gst_query_unref (query); query = NULL; } return query; }
/* * @element: (transfer none): * @context: (transfer full): */ static void _vk_context_propagate (GstElement * element, GstContext * context) { GstMessage *msg; _init_context_debug (); gst_element_set_context (element, context); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting have context (%" GST_PTR_FORMAT ") message", context); msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); gst_element_post_message (GST_ELEMENT_CAST (element), msg); }
static gboolean context_pad_query (const GValue * item, GValue * value, gpointer user_data) { GstPad *const pad = g_value_get_object (item); GstQuery *const query = user_data; if (gst_pad_peer_query (pad, query)) { g_value_set_boolean (value, TRUE); return FALSE; } _init_context_debug (); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "context pad peer query failed"); return TRUE; }
static void _gst_context_query (GstElement * element, const gchar * display_type) { GstQuery *query; GstContext *ctxt; _init_context_debug (); /* 2a) Query downstream with GST_QUERY_CONTEXT for the context and * check if downstream already has a context of the specific type * 2b) Query upstream as above. */ query = gst_query_new_context (display_type); if (gst_gl_run_query (element, query, GST_PAD_SRC)) { gst_query_parse_context (query, &ctxt); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "found context (%p) in downstream query", ctxt); gst_element_set_context (element, ctxt); } else if (gst_gl_run_query (element, query, GST_PAD_SINK)) { gst_query_parse_context (query, &ctxt); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "found context (%p) in upstream query", ctxt); gst_element_set_context (element, ctxt); } else { /* 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. */ GstMessage *msg; GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting need context message"); msg = gst_message_new_need_context (GST_OBJECT_CAST (element), display_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_gl_handle_set_context(). */ gst_query_unref (query); }
/* 5) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT message on the bus. */ void gst_vaapi_video_context_propagate (GstElement * element, GstVaapiDisplay * display) { GstContext *context; GstMessage *msg; context = gst_vaapi_video_context_new_with_display (display, FALSE); gst_element_set_context (element, context); _init_context_debug (); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting `have-context' (%p) message with display (%p)", context, display); msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); gst_element_post_message (GST_ELEMENT_CAST (element), msg); }
static void _gst_context_query (GstElement * element, const gchar * context_type) { GstQuery *query; GstMessage *msg; _init_context_debug (); /* 2) Query downstream with GST_QUERY_CONTEXT for the context and check if downstream already has a context of the specific type */ /* 3) Query upstream with GST_QUERY_CONTEXT for the context and check if upstream already has a context of the specific type */ query = gst_query_new_context (context_type); if (_gst_context_get_from_query (element, query, GST_PAD_SRC)) goto found; if (_gst_context_get_from_query (element, query, GST_PAD_SINK)) goto found; /* 4) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with the required context types and afterwards check if an 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 */ found: gst_query_unref (query); }
/* 4) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT * message. */ static void gst_gl_display_context_propagate (GstElement * element, GstGLDisplay * display) { GstContext *context; GstMessage *msg; if (!display) { GST_ERROR_OBJECT (element, "Could not get GL display connection"); return; } _init_context_debug (); context = gst_context_new (GST_GL_DISPLAY_CONTEXT_TYPE, TRUE); gst_context_set_gl_display (context, display); gst_element_set_context (element, context); GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting have context (%p) message with display (%p)", context, display); msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); gst_element_post_message (GST_ELEMENT_CAST (element), msg); }