<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>