<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
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 class="moz-cite-prefix">On 17/8/21 1:53 am, Lusine Hayrapetyan
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAO4TkMidNXvKJP-tv-k4hqyR2+Km+=quO=vSoY3EDD-igMwRAg@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<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"
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>
</body>
</html>