<div dir="ltr">Hi Mat,<div><br></div><div>My display is <b>EGLDisplay </b>type:<br><div> /* get an EGL display connection */<br></div><div><div> EGLNativeDisplayType nativeDisplay = state->xdisplay;<br></div><div> <b>state->display</b> = eglGetDisplay (nativeDisplay);<br></div> assert (state->display != EGL_NO_DISPLAY);</div><div><br></div><div>/* The I create an EGL rendering context with EGLDisplay */<br> state->context =<br> eglCreateContext (state->display, config, EGL_NO_CONTEXT, context_attributes);<br></div><div><br></div></div><div>/* Then I create GstGLDisplayEGL from EGLDisplay */</div><div>state->gst_display = gst_gl_display_egl_new_with_egl_display (state->display);<br></div><div><br></div><div>/* And create my wrapped context with GstGLDisplayEGL */</div><div> state->gl_context =<br> gst_gl_context_new_wrapped (GST_GL_DISPLAY (state->gst_display),<br> (guintptr) state->context, GST_GL_PLATFORM_EGL, GST_GL_API_GLES2);<br></div><div><br></div><div>/* Now I want to create a shared context from my wrapped context and again I pass GstGLDisplayEGL to it */</div><div>gst_gl_display_create_context(GST_GL_DISPLAY(state->gst_display), state->gl_context, &state->newContext, &error) )<br></div><div><br></div><div>And this function complains that it expects an x11 display instead of egl display. But I don't understand how I can pass x11 display because my context is created with egl display.</div><div>I'm not experienced in opengl es & egl, do I miss something?</div><div><br></div><div>Regards,</div><div>Lusine</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Aug 13, 2021 at 1:48 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>
<br>
<br>
<div>On 13/8/21 5:59 pm, Lusine Hayrapetyan
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">In gstglconfig.h I see the following:
<div><i>#define GST_GL_HAVE_WINDOW_X11 1<br>
</i></div>
<div><br>
</div>
<div>I've built the latest master on Ubuntu 20 and still see the
same message about x11 window and there is a new FIXME
message:<br>
0:00:03.382786440 252231 0x55e6075596a0 INFO
glwindow gstglwindow.c:295:gst_gl_window_new: creating a
window, user choice:x11<br>
0:00:03.382847275 252231 0x55e6075596a0 INFO
glwindow gstglwindow_x11.c:136:gst_gl_window_x11_new: Wrong
display type 32 for this window type 1<br>
</div>
</div>
</blockquote>
<br>
This is the problematic line. The display type (EGL) as returned by
gst_gl_display_get_type() does not match the window impl's
expectations (X11). If you are running under X11 and your
application is using X11 to connect to the display server, you need
to pass an X11 GstGLDisplay. Passing an EGLDisplay is not
sufficient and will not work. An appropriate EGLDIsplay will be
created internally.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div>0:00:03.382877455 252231 0x55e6075596a0 WARN
<font color="#ff0000"> glwindow
gstglwindow.c:340:gst_gl_window_new: Could not create
window. user specified x11, creating dummy window</font><br>
0:00:03.382998854 252231 0x55e6075596a0 DEBUG
gldisplay
gstgldisplay.c:694:gst_gl_display_create_window:<gldisplayegl0>
Adding window <gldummywindow0> (0x55e607797c50) to
internal list<br>
0:00:03.383024753 252231 0x55e6075596a0 DEBUG
glcontext
gstglcontext.c:963:gst_gl_context_set_window:<glcontextegl0>
window:<gldummywindow0><br>
0:00:03.383269595 252231 0x55e6077b5640 DEBUG
glcontext
gstglcontext.c:1223:gst_gl_context_create_thread:<glcontextegl0>
Creating thread<br>
0:00:03.383377039 252231 0x55e6077b5640 <font color="#ff0000">FIXME
glcontext
gstglcontext.c:2039:gst_gl_wrapped_context_get_config:<glwrappedcontext0>
wrapped context could not retrieve config. The application
may be missing a call to gst_gl_context_fill_info() or the
specific platform implemention is not implemented for
retrieving the config from a wrapped OpenGL context.</font><br>
0:00:03.383437907 252231 0x55e6077b5640 INFO
glcontext
gstglcontext.c:1315:gst_gl_context_create_thread:<glcontextegl0>
Attempting to create opengl context. user chosen api(s)
(gles2), compiled api support (opengl opengl3 gles2) display
api (gles2)<br>
0:00:03.383463315 252231 0x55e6077b5640 DEBUG
glcontext
gstglcontext_egl.c:863:gst_gl_context_egl_create_context:<glcontextegl0>
Creating EGL context<br>
</div>
<div><br>
</div>
<div>Regards,</div>
<div>Lusine</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Thu, Aug 12, 2021 at 11:18
AM 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> Yes, that is a critical error for X11. X11 would
require access to an X11 Display which must be provided by
your application in order share OpenGL resources. You may
also not have X11 support built and you would have to check
your build configuration for that. gstglconfig.h would
contain information on what libgstgl-1.0 was built with.<br>
<br>
It looks like it's picking a raw EGLDisplay instead. This
was potentially an issue in previous versions of GStreamer
that has been fixed in master by <a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1154" target="_blank">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1154</a>
and <a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1169" target="_blank">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1169</a>.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<div>On 12/8/21 1:50 am, Lusine Hayrapetyan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">For limiting to a particular OpenGL variant
I'm using the following environment variables, is it the
same?
<div><i> export GST_GL_WINDOW=x11<br>
export GST_GL_PLATFORM=egl<br>
export GST_GL_API=gles2</i><br>
</div>
<div><i><br>
</i></div>
<div>I've attached GST_DEBUG=gl*:7 output
(gl_output.txt).</div>
<div>I see the following messages in the output:<br>
<i>0:00:03.857084617 24438 0x55d59121d400 INFO
glwindow gstglwindow.c:278:gst_gl_window_new:
creating a window, user choice:x11<br>
0:00:03.857117499 24438 0x55d59121d400 INFO
glwindow
gstglwindow_x11.c:137:gst_gl_window_x11_new: Wrong
display type 32 for this window type 1<br>
0:00:03.857144332 24438 0x55d59121d400 WARN
glwindow gstglwindow.c:324:gst_gl_window_new:
Could not create window. user specified x11,
creating dummy window<br>
0:00:03.857277761 24438 0x55d59121d400 DEBUG
gldisplay
gstgldisplay.c:579:gst_gl_display_create_window:<gldisplayegl0>
Adding window <gldummywindow0>
(0x55d5913809d0) to internal list<br>
0:00:03.857311159 24438 0x55d59121d400 DEBUG
glcontext
gstglcontext.c:948:gst_gl_context_set_window:<glcontextegl0>
window:<gldummywindow0></i><br>
</div>
<div><i><br>
</i></div>
<div>Is this a critical issue? Can this cause a texture
reading issue?</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Tue, Aug 10, 2021
at 10:21 AM 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> Ah, if you want to limit to a particular OpenGL
variant, you need to also call
gst_gl_display_filter_gl_api() with that variant.<br>
<br>
GST_DEBUG=gl*:7 will output a whole bunch of
information about what is generated and tried in all
of this respect.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<div>On 9/8/21 12:58 am, Lusine Hayrapetyan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div dir="ltr">Hi Matthew,<br>
Seems the second approach fits to my use case-
I need to push textures which are created in
opengles & egl( it means not in gstreamer
context) to gstreamer.
<div>I've changed my code to use <code>gst_gl_display_create_context
& </code> <code><span>gst_gl_display_add_context
<font face="arial, sans-serif">but still
can't read textures in gstreamer,
gstreamer prudeces the following
errors after I push buffer to appsrc:</font></span></code></div>
<div><code>(testegl1:24602):
GStreamer-CRITICAL **: 13:02:55.568:
gst_debug_log_valist: assertion 'category
!= NULL' failed<br>
0:00:14.039444188 24602 0x5611bc356d90
WARN glbasetexture
gstglmemory.c:401:gst_gl_memory_read_pixels:
Could not create framebuffer to read
pixels for memory 0x7f8cf0017ac0<br>
0:00:14.039480909 24602 0x5611bc356d90
WARN glbasememory
gstglbasememory.c:585:gst_gl_base_memory_memcpy:
could not read map source memory
0x7f8cf0017ac0<br>
0:00:14.039505741 24602 0x5611bc356d90
WARN glmemory
gstglmemorypbo.c:592:_gl_mem_copy: Could
not copy GL Memory<br>
0:00:14.039779268 24602 0x5611bc4f14f0
ERROR videometa
gstvideometa.c:247:default_map: cannot map
memory range 0-1<br>
0:00:14.039846056 24602 0x5611bc4f14f0
ERROR default
video-frame.c:168:gst_video_frame_map_id:
failed to map video frame plane 0<br>
0:00:14.039891314 24602 0x5611bc4f14f0
WARN videofilter
gstvideofilter.c:297:gst_video_filter_transform:<videoconvert0>
warning: invalid video buffer received<span><font face="arial, sans-serif"><br>
</font></span></code></div>
<div><code><span><font face="arial,
sans-serif"><br>
</font></span></code></div>
<div><code><span><font face="arial,
sans-serif"><br>
</font></span></code></div>
<div><code><span><font face="arial,
sans-serif">This is how I implemented
it, did I misunderstand something? </font></span></code></div>
<div><code><span><font face="arial,
sans-serif"><br>
</font></span></code></div>
<div>I have rendering thread where I
initialize opengles context and create
wrapped and the new contexts.</div>
<div>//</div>
<div>// Description: Sets the display,
OpenGL|ES context and screen stuff</div>
<div>// Created GstGLContext s - wrapped
(gst_gl_context_new_wrapped) and new
context(gst_gl_display_create_context)</div>
<div>//</div>
<div>static void<br>
init_ogl (APP_STATE_T * state)<br>
</div>
<div>{</div>
<div>...</div>
/* get an EGL display connection */<br>
state->display = eglGetDisplay
(EGL_DEFAULT_DISPLAY);<br>
assert (state->display !=
EGL_NO_DISPLAY);<br>
/* initialize the EGL display connection */<br>
result = eglInitialize (state->display,
NULL, NULL);<br>
<div> assert (EGL_FALSE != result); </div>
<div><br>
</div>
<div>/* create an EGL rendering context */<br>
state->context =<br>
eglCreateContext (state->display,
config, EGL_NO_CONTEXT, context_attributes);<br>
assert (state->context !=
EGL_NO_CONTEXT);<br>
</div>
<div>//</div>
<div>// Initialize GStreamer related
resources.</div>
<div>//</div>
<div>state->gst_display =
gst_gl_display_egl_new_with_egl_display
(state->display);<br>
state->gl_context =<br>
gst_gl_context_new_wrapped
(GST_GL_DISPLAY (state->gst_display),<br>
(guintptr) state->context,
GST_GL_PLATFORM_EGL, GST_GL_API_GLES2);<br>
<br>
GError *error = NULL;<br>
if (
!gst_gl_display_create_context(GST_GL_DISPLAY(state->gst_display),
state->gl_context,
&state->newContext, &error) )<br>
g_print("Failed to create new
context\n");</div>
<div><br>
if (
!gst_gl_display_add_context(GST_GL_DISPLAY(state->gst_display),
state->newContext))<br>
g_print("Failed to add new context to
display\n");</div>
<div><br>
</div>
<div>} // init_ogl end.</div>
<div><br>
</div>
<div><br>
</div>
<div>static void<br>
sync_bus_call (GstBus * bus, GstMessage *
msg, gpointer * data)<br>
{<br>
<br>
APP_STATE_T *state = (APP_STATE_T *)data;<br>
switch (GST_MESSAGE_TYPE (msg))<br>
{<br>
case GST_MESSAGE_NEED_CONTEXT:<br>
{<br>
const gchar *context_type;<br>
gst_message_parse_context_type
(msg, &context_type);<br>
<br>
GstContext *context = NULL;<br>
if (g_strcmp0 (context_type,
GST_GL_DISPLAY_CONTEXT_TYPE) == 0)<br>
{<br>
GstGLDisplay * gl_display =
GST_GL_DISPLAY(state->gst_display);<br>
context = gst_context_new
(GST_GL_DISPLAY_CONTEXT_TYPE, TRUE);<br>
gst_context_set_gl_display(context,
gl_display);<br>
gst_element_set_context
(GST_ELEMENT(msg->src), context);<br>
}<br>
else if (g_strcmp0
(context_type, "gst.gl.app_context") == 0)<br>
{<br>
GstContext *context =
gst_context_new("gst.gl.app_context", TRUE);<br>
GstStructure *s =
gst_context_writable_structure (context);<br>
gst_structure_set (s,
"context", GST_TYPE_GL_CONTEXT,
state->gl_context, NULL);<br>
gst_element_set_context(GST_ELEMENT(msg->src),
context); <br>
}<br>
break;<br>
}<br>
default:<br>
break;<br>
}<br>
} // sync_bus_call end<br>
</div>
<div><br>
</div>
<div><br>
</div>
<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>
<div><i><br>
</i></div>
<div>static bool pushFrame(..., APP_STATE_T *
state)<br>
{<br>
// Wrap the texture into GstGLMemory<br>
GstVideoInfo vinfo;<br>
gst_video_info_set_format(&vinfo,
GST_VIDEO_FORMAT_RGBA,
state->screen_width,
state->screen_height);<br>
// Use state->newContext for
allocator.<br>
GstAllocator* allocator =
GST_ALLOCATOR(gst_gl_memory_allocator_get_default(state->newContext));<br>
GstGLVideoAllocationParams* params =
gst_gl_video_allocation_params_new_wrapped_texture(<br>
state->newContext, NULL,
&vinfo, 0, NULL,
GST_GL_TEXTURE_TARGET_2D, GST_GL_RGBA,
state->tex,<br>
NULL, 0);<br>
<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>
GstVideoMeta * vmeta =
gst_buffer_add_video_meta(buffer,
GST_VIDEO_FRAME_FLAG_NONE,
GST_VIDEO_FORMAT_RGBA,
state->screen_width,
state->screen_height);<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>
timestamp += GST_BUFFER_DURATION
(buffer);<br>
<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>
} // pushFrame end<br>
<br>
</div>
<div>Regards,</div>
<div>Lusine</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Fri, Aug
6, 2021 at 8:59 AM 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> Hi,<br>
<br>
<div>On 6/8/21 1:12 am, Lusine Hayrapetyan
wrote:<br>
</div>
<blockquote type="cite">
<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>
</blockquote>
<br>
You only need to retrieve or create a
non-wrapped GstGLContext and use that for
creating your textures that you are
pushing into GStreamer. You don't need to
use GStreamer's provided OpenGL context
for anything else. Everything else in
your sample remains the same. You may
need to add a GstGLSyncMeta on your
buffers you are pushing into GStreamer to
provide the necessary synchronisation
guarantees between the shared OpenGL
contexts (application and GStreamer). On
some platforms the window handle type and
format may be important however in general
on linux (X11/wayland) it doesn't really
matter.<br>
<br>
You must not attempt to use GStreamer's
OpenGL context as-is (using e.g.
eglMakeCurrent() or anything of the like)
from outside the GStreamer OpenGL context
thread (as provided by the
gst_gl_context_thread_add() API).<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div><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>
</blockquote>
<br>
Yes. other_context is the GstGLContext
that will be shared with the newly created
GstGLContext.<br>
<br>
Side note, GStreamer cannot use any
application-provided OpenGL context as-is
due to the overhead of dealing with all
the OpenGL state that may be changed
behind GStreamer's back. This is why the
OpenGL context sharing dance is required.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<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>
</blockquote>
<br>
</div>
</blockquote>
</div>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote></div>