From 296397a8b132c801c88ce4d51541c7093d63e6b0 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Mon, 4 May 2015 23:42:36 +1000 Subject: [PATCH] glimagesink: handle the local_context query so that upstream elements can get the GL context from glimagesink --- ext/gl/gstglimagesink.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index a7de89fc30..674e30d5ef 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -597,12 +597,40 @@ gst_glimage_sink_query (GstBaseSink * bsink, GstQuery * query) switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONTEXT: { - gboolean ret = - gst_gl_handle_context_query ((GstElement *) glimage_sink, query, + const gchar *context_type; + GstContext *context, *old_context; + + res = gst_gl_handle_context_query ((GstElement *) glimage_sink, query, &glimage_sink->display, &glimage_sink->other_context); if (glimage_sink->display) gst_gl_display_filter_gl_api (glimage_sink->display, SUPPORTED_GL_APIS); - return ret; + + gst_query_parse_context_type (query, &context_type); + + if (g_strcmp0 (context_type, "gst.gl.local_context") == 0) { + GstStructure *s; + + gst_query_parse_context (query, &old_context); + + if (old_context) + context = gst_context_copy (old_context); + else + context = gst_context_new ("gst.gl.local_context", FALSE); + + s = gst_context_writable_structure (context); + gst_structure_set (s, "context", GST_GL_TYPE_CONTEXT, + glimage_sink->context, NULL); + gst_query_set_context (query, context); + gst_context_unref (context); + + res = glimage_sink->context != NULL; + } + GST_LOG_OBJECT (glimage_sink, "context query of type %s %i", context_type, + res); + + if (res) + return res; + break; } case GST_QUERY_DRAIN: {