<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
Hi,<br>
<br>
I think I'm at the end if what I can debug over email. In theory
everything should work and GStreamer has examples and elements that
do this exact process of sharing the OpenGL context between
GStreamer and the application/other GUI toolkits.<br>
<br>
Please look through the debug logs and any existing
applications/elements (qmlglsink, gtkglsink) that perform this
transformation from the application provided OpenGL context (e.g.
from Qt or Gtk).<br>
<br>
<div class="moz-cite-prefix">On 18/8/21 12:13 am, Lusine Hayrapetyan
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAO4TkMiu7UB57TMnV9TeQA+b70TO_ct=O2tqqUyVazcZ9frFmA@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">WRT <i>" retrieve the GStreamer created OpenGL
context from one of the downstream elements" </i>unfortunately
it's not our use case. <br>
</div>
</blockquote>
<br>
If it's not your case, you can also perform the necessary
GST_CONTEXT QUERY to retrieve the downstream OpenGL context from
GStreamer.<br>
<br>
<blockquote type="cite"
cite="mid:CAO4TkMiu7UB57TMnV9TeQA+b70TO_ct=O2tqqUyVazcZ9frFmA@mail.gmail.com">
<div dir="ltr">
<div>
<div>WRT " <i>If you are not also providing your wrapped
OpenGL in response to the 'need-context' message" </i>I'm
providing it, this is how I handle "need-context":</div>
<div>static void sync_bus_call (GstBus * bus, GstMessage *
msg, gpointer * data)<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>
g_print("-------------------------sync_bus_call
got GST_MESSAGE_NEED_CONTEXT--------------------\n");<br>
<br>
</div>
<div> 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>
g_print("-------------------------got
GST_GL_DISPLAY_CONTEXT_TYPE--------------------\n");<br>
context = gst_context_new
(GST_GL_DISPLAY_CONTEXT_TYPE, TRUE);</div>
<div><br>
</div>
<div> //
state->x_gst_display was created like
this: state->x_gst_display =
gst_gl_display_x11_new_with_display(state->xdisplay);<br>
gst_context_set_gl_display(context,
GST_GL_DISPLAY(state->x_gst_display));<br>
<br>
g_print("msg->src element is %s\n\n",
GST_ELEMENT_NAME(msg->src)); // This prints gldownload.<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>
g_print("-------------------------got
gst.gl.app_context--------------------\n");<br>
<br>
GstContext *context =
gst_context_new("gst.gl.app_context", TRUE);<br>
GstStructure *s =
gst_context_writable_structure (context);</div>
<div><br>
</div>
<div> //
state->gl_context is my wrapped context which was created
like this:</div>
<div> // state->gl_context
= gst_gl_context_new_wrapped (GST_GL_DISPLAY
(state->x_gst_display),<br>
//
(guintptr) state->context, GST_GL_PLATFORM_EGL,
GST_GL_API_GLES2);<br>
gst_structure_set (s, "context",
GST_TYPE_GL_CONTEXT, state->gl_context, NULL);<br>
<br>
g_print("msg->src element is %s\n",
GST_ELEMENT_NAME(msg->src)); // This prints gldownload.
<br>
gst_element_set_context(GST_ELEMENT(msg->src), context);<br>
}<br>
break;<br>
}<br>
</div>
</div>
</div>
</blockquote>
<br>
This looks correct from a cursory glance.<br>
<br>
<blockquote type="cite"
cite="mid:CAO4TkMiu7UB57TMnV9TeQA+b70TO_ct=O2tqqUyVazcZ9frFmA@mail.gmail.com">
<div dir="ltr">
<div>
<div>WRT: <i>"if you are creating another unwrapped OpenGL
context with gst_gl_display_create_context() then you have
notify GStreamer about this somehow"</i></div>
<div>I use the unwrapped gl context with <i>gst_gl_display_add_context
</i>and when I'm creating GstGLMemory, is there other places
I need to use it?<i> <br>
</i></div>
</div>
</div>
</blockquote>
<br>
No. That should be sufficient.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<blockquote type="cite"
cite="mid:CAO4TkMiu7UB57TMnV9TeQA+b70TO_ct=O2tqqUyVazcZ9frFmA@mail.gmail.com">
<div dir="ltr">
<div>
<div>Best Regards,</div>
<div>Lusine</div>
</div>
<div><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Tue, Aug 17, 2021 at 4:52
PM Matthew Waters <<a href="mailto:ystreet00@gmail.com"
moz-do-not-send="true">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,<br>
<br>
Ok. Now, if you are creating another unwrapped OpenGL
context with gst_gl_display_create_context() then you have
notify GStreamer about this somehow, or GStreamer will also
create it's own. If you are not also providing your wrapped
OpenGL in response to the 'need-context' message, then
GStreamer OpenGL is not linked with your application OpenGL
context.<br>
<br>
You should probably just retrieve the GStreamer created
OpenGL context from one of the downstream elements (the
'context' property on most OpenGL elements) and use that.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<div>On 17/8/21 1:53 am, Lusine Hayrapetyan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Got it! Thanks!<br>
Used <i>gst_gl_display_x11_new_with_display </i>instead of <i>gst_gl_display_egl_new_with_egl_display
</i>and the warning about " <i>Wrong display type" </i>is
fixed. I don't see any other warn/issue in the gl log
but my initial issue still exists 😿 - I create
GstGLMemory from texture_id and push the GstBuffer to
appsrc and see this errors:
<div><br>
<div>0:00:14.023472773 306156 0x55a56659d6a0 LOG
glbasememory
gstglbasememory.c:269:_map_data_gl: mapping mem
0x7f105c227d00 flags 20002<br>
0:00:14.023553671 306156 0x55a56659d6a0 DEBUG
gldebug
gstgldebug.c:319:_gst_gl_debug_callback:<glcontextegl0>
medium: GL other from API id:1, FBO incomplete:
color attachment incomplete [0]<br>
<br>
(testegl1:306156): GStreamer-CRITICAL **:
15:39:40.709: gst_debug_log_valist: assertion
'category != NULL' failed<br>
0:00:14.023741217 306156 0x55a56659d6a0 WARN
glbasetexture
gstglmemory.c:404:gst_gl_memory_read_pixels: Could
not create framebuffer to read pixels for memory
0x7f10d08992b0<br>
0:00:14.023776145 306156 0x55a56659d6a0 LOG
glbasememory
gstglbasememory.c:348:_unmap_data_gl: unmapping mem
0x7f105c227d00 flags 20002<br>
0:00:14.023800095 306156 0x55a56659d6a0 LOG
glbuffer gstglbuffer.c:305:_gl_buffer_unmap:
unmapping 0x7f105c227d00 id 1 size 360000<br>
0:00:14.024028993 306156 0x55a56659d6a0 LOG
glbasememory gstglbasememory.c:269:_map_data_gl:
mapping mem 0x7f10d08992b0 flags 10001<br>
0:00:14.024074629 306156 0x55a56659d6a0 LOG
glbasememory
gstglbasememory.c:227:gst_gl_base_memory_alloc_data:
0x7f10d08992b0 attempting allocation of data pointer
of size 360007<br>
0:00:14.024139538 306156 0x55a56659d6a0 DEBUG
glbasememory
gstglbasememory.c:236:gst_gl_base_memory_alloc_data:
0x7f10d08992b0 allocated data pointer alloc
0x7f10c05fa010, data 0x7f10c05fa010<br>
0:00:14.024169028 306156 0x55a56659d6a0 LOG
glbasememory gstglbasememory.c:269:_map_data_gl:
mapping mem 0x7f105c227d00 flags 20002<br>
0:00:14.024195194 306156 0x55a56659d6a0 LOG
glbasememory gstglbasememory.c:269:_map_data_gl:
mapping mem 0x7f105c227d00 flags 20002<br>
0:00:14.024217673 306156 0x55a56659d6a0 LOG
glbasememory gstglbasememory.c:278:_map_data_gl:
multiple map no 2 flags 20002 all flags 20002<br>
0:00:14.024263516 306156 0x55a56659d6a0 DEBUG
gldebug
gstgldebug.c:319:_gst_gl_debug_callback:<glcontextegl0>
medium: GL other from API id:1, FBO incomplete:
color attachment incomplete [0]<br>
</div>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Aug 16, 2021
at 6:55 PM Matthew Waters <<a
href="mailto:ystreet00@gmail.com" target="_blank"
moz-do-not-send="true">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> If you're running on linux, there is a native
display handle behind the EGLDIsplay. That native
display handle would be an X11 Display, or a wayland
wl_display (or maybe a mir display). OpenGL
resources cannot be shared unless this 'native'
display type is the same between all OpenGL uses.
Passing an EGLDisplay is not sufficient and will not
work.<br>
<br>
You need to pass the state->xdisplay using the
appropriate platform-specific
gst_gl_display_x11_new_with_display(). You cannot
use the EGLDisplay version here.<br>
<br>
Cheers<br>
-Matt<br>
<br>
<div>On 17/8/21 12:40 am, Lusine Hayrapetyan wrote:<br>
</div>
<blockquote type="cite">
<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" moz-do-not-send="true">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"
moz-do-not-send="true">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"
moz-do-not-send="true">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"
moz-do-not-send="true">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"
moz-do-not-send="true">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"
moz-do-not-send="true">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" moz-do-not-send="true">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" moz-do-not-send="true">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" moz-do-not-send="true">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>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</body>
</html>