<div dir="ltr">Dear Matt,<br>Thank you very much for your response. It helped me to understand that using 'wrapped' OpenGL context is a wrong direction to go :) <div><br><i>WRT Suggestion 1:</i><div>Do I understand correctly that I need to get local context from gstreamer and pass it to opengl rendering thread? (I have a rendering thread where I set OpenGL|ES context and screen stuff).</div><div>GstGLContext* mContext = nullptr;<br></div><div>g_object_get(state->gldownload, "context", &mContext, NULL);<br></div><div>guintptr handle;<br>handle = gst_gl_context_get_gl_context(mContext); // is this correct?<br>state->context = (EGLContext)handle; // state->context is EGLContext type;<br></div><div>And then use state->context in OpenGL|ES?</div></div><div>Do I need to get and pass window and display from gstreamer to my rendering thread as well?</div><div>Although my use scenario is different from this one - I need to pass context from OpenGL to Gstreamer.</div><div><br><i>WRT Suggestion 2:</i><br></div><div>gst_gl_display_create_context accepts <i>other_context </i>argument, should the <i>other_context </i>be the 'wrapped' context?</div><div><br></div><div>Best Regards,</div><div>Lusine</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 5, 2021 at 12:39 PM Matthew Waters <<a href="mailto:ystreet00@gmail.com" target="_blank">ystreet00@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
So, I think you almost have the correct sequence.<br>
<br>
Response inline.<br>
<br>
<div>On 5/8/21 1:04 am, Lusine Hayrapetyan
via gstreamer-devel wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi Folks,
<div>I'm struggling with the following issue and can't
understand what I'm doing wrong.</div>
<div>I need to pass opengl texture to the gstreamer pipeline.</div>
<div>I have a rendering thread where I create opengl texture,
the following objects created in this thread:</div>
<div><i>EGLDisplay display;</i></div>
<div><i>EGLContext context;</i><br>
</div>
<div><i><br>
</i></div>
<div>I create gstreamer pipeline in the main thread and as
described in the following article sharing an X11 display and
GstGLContext with the bus callback.</div>
<div><a href="http://ystreet00.blogspot.com/2015/09/gstreamer-16-and-opengl-contexts.html" target="_blank">http://ystreet00.blogspot.com/2015/09/gstreamer-16-and-opengl-contexts.html</a><br>
</div>
<div><br>
</div>
<div>GstGLDisplayEGL and GstGLContext are created in this way:</div>
<div><i>GstGLDisplayEGL* gst_display =
gst_gl_display_egl_new_with_egl_display (display);<br>
</i></div>
<div><i>GstGLContext *gl_context =<br>
gst_gl_context_new_wrapped (GST_GL_DISPLAY
(gst_display),<br>
(guintptr) context, GST_GL_PLATFORM_EGL,
GST_GL_API_GLES2);</i><br>
</div>
<div><br>
</div>
<div>The first element of my pipeline is appsrc:</div>
<div><i>appsrc stream-type=0 emit-signals=1 format=3
caps=video/x-raw(memory:GLMemory), width=300, height=300,
framerate=(fraction)20/1, format=(string)RGBA ! gldownload !
...</i><br>
</div>
<div><br>
</div>
<div>I use need-data callback to create a buffer from texture_id
and and push it in the appsrc:</div>
<div><i>g_signal_connect (state->appsrc, "need-data",
G_CALLBACK (</i>
pushFrame <i>), state);</i></div>
<div><i><br>
</i></div>
<div><i>bool pushFrame()</i><br>
</div>
<div><i>{<br>
// Wrap the texture into GstGLMemory<br>
GstVideoInfo vinfo;<br>
gst_video_info_set_format(&vinfo,
GST_VIDEO_FORMAT_RGBA, 300, 300);<br>
<br>
GstAllocator* allocator =
GST_ALLOCATOR(gst_gl_memory_allocator_get_default(gl_context));<br>
<br>
GstGLVideoAllocationParams* params =
gst_gl_video_allocation_params_new_wrapped_texture(<br>
state->gl_context, NULL, &vinfo, 0, NULL,
GST_GL_TEXTURE_TARGET_2D, GST_GL_RGBA, </i>
texture_id <i>,<br>
NULL, 0);<br>
</i></div>
</div>
</blockquote>
<br>
The use of state->gl_context is probably your OpenGL context that
has been wrapped from the application. This 'wrapped' OpenGL
context has some limitations, one being that GStreamer cannot
actually do a complete gst_gl_context_thread_add where the request
is marshalled to an OpenGL-specific thread. This is what that
critical is complaining about effectively.<br>
<br>
To do this properly, you would need to do one of two things:<br>
1. Retrieve the OpenGL context from the downstream gldownload
element using either the 'context' property or using an appropriate
GST_CONTEXT QUERY or the helper gst_gl_query_local_gl_context().<br>
2. Create your own GStreamer OpenGL context and add it to the
GstGLDisplay using something like: <a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbasefilter.c#L550-565" target="_blank">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbasefilter.c#L550-565</a>.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div><i><br>
// The following line produces an error!!!<br>
GstGLMemory* glMemory =
GST_GL_MEMORY_CAST(gst_gl_base_memory_alloc(<br>
GST_GL_BASE_MEMORY_ALLOCATOR_CAST(allocator),
(GstGLAllocationParams*) params));<br>
<br>
gst_gl_allocation_params_free((GstGLAllocationParams
*)params);<br>
gst_object_unref(allocator);<br>
<br>
// Attach GstGLMemory object into buffer, timestamp the
buffer and push it downstream<br>
GstBuffer* buffer = gst_buffer_new();<br>
gst_buffer_append_memory(buffer,
GST_MEMORY_CAST(glMemory));<br>
<br>
// Put timestamps into buffer<br>
GST_BUFFER_PTS (buffer) = timestamp;<br>
GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int
(1, GST_SECOND, 2);<br>
<br>
timestamp += GST_BUFFER_DURATION (buffer);<br>
GstFlowReturn ret;<br>
g_signal_emit_by_name(state->appsrc, "push-buffer",
buffer, &ret);<br>
<br>
if (ret != GST_FLOW_OK)<br>
{<br>
// Something wrong, stop pushing.<br>
g_printerr("Something went wrong: Pushing buffer
into appsrc is stopped.\n");<br>
return false;<br>
}<br>
<br>
return true;<br>
}<br>
</i></div>
<div><br>
</div>
<div>pushFrame produces the following error:</div>
<div><font color="#ff0000">gst_gl_context_thread_add: assertion
'context->priv->active_thread == g_thread_self ()'
failIed<br>
</font></div>
<div><font color="#ff0000"><br>
</font></div>
<div><font color="#000000">What am I doing wrong or how can push
gpu texture to gstreamer?</font></div>
<div><font color="#000000"><br>
</font></div>
<div><font color="#000000">Thanks,</font></div>
<div><font color="#000000">Lusine</font></div>
<div><font color="#000000"><br>
</font></div>
</div>
</blockquote>
<br>
</div>
</blockquote></div>