gboolean gst_vaapi_handle_context_query (GstQuery * query, GstVaapiDisplay * display) { const gchar *type = NULL; GstContext *context, *old_context; g_return_val_if_fail (query != NULL, FALSE); if (!display) return FALSE; if (!gst_query_parse_context_type (query, &type)) return FALSE; if (g_strcmp0 (type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME)) return FALSE; gst_query_parse_context (query, &old_context); if (old_context) { context = gst_context_copy (old_context); gst_vaapi_video_context_set_display (context, display); } else { context = gst_vaapi_video_context_new_with_display (display, FALSE); } gst_query_set_context (query, context); gst_context_unref (context); return TRUE; }
/* 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); }
gboolean gst_vaapi_handle_context_query (GstElement * element, GstQuery * query) { GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); const gchar *type = NULL; GstContext *context, *old_context; g_return_val_if_fail (query != NULL, FALSE); #if USE_GST_GL_HELPERS if (plugin->gl_display && plugin->gl_context && plugin->gl_other_context) { if (gst_gl_handle_context_query (element, query, (GstGLDisplay *) plugin->gl_display, (GstGLContext *) plugin->gl_context, (GstGLContext *) plugin->gl_other_context)) return TRUE; } #endif if (!plugin->display) return FALSE; if (!gst_query_parse_context_type (query, &type)) return FALSE; if (g_strcmp0 (type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME)) return FALSE; gst_query_parse_context (query, &old_context); if (old_context) { context = gst_context_copy (old_context); gst_vaapi_video_context_set_display (context, plugin->display); } else { context = gst_vaapi_video_context_new_with_display (plugin->display, FALSE); } gst_query_set_context (query, context); gst_context_unref (context); return TRUE; }
gboolean gst_vaapi_reply_to_query (GstQuery * query, GstVaapiDisplay * display) { const gchar *type = NULL; GstContext *context; if (GST_QUERY_TYPE (query) != GST_QUERY_CONTEXT) return FALSE; if (!display) return FALSE; if (!gst_query_parse_context_type (query, &type)) return FALSE; if (g_strcmp0 (type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME)) return FALSE; context = gst_vaapi_video_context_new_with_display (display, FALSE); gst_query_set_context (query, context); gst_context_unref (context); return TRUE; }