Streaming an opengl texture over a network

Matthew Waters ystreet00 at gmail.com
Wed Jun 16 00:42:43 UTC 2021


The best resource for most of this kind of thing are the OpenGL elements 
themselves.

The important thing here is that you need is to be creating a 
GstGLMemory (which is an OpenGL texture) to push GstBuffer's into a 
GSstreamer pipeline using e.g. appsrc.  If you want to be reusing 
textures, then you would need to be using a GstGLBufferPool as well.  
For wrapping and external texture into a GstGLMemory, you need to create 
a GstGLVideoAllocationParams using 
gst_gl_video_allocation_params_new_wrapped_gl_handle() and then either 
using gst_gl_base_memory_alloc() or gst_gl_memory_setup_buffer().  See 
e.g. 
https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbufferpool.c#L281 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbufferpool.c#L281> 
and GstGLBufferPool's creation of priv->gl_params.  You can also create 
other types of GL textures such as EGLImage-backed resources if you 
match the allocator and the allocation params.  e.g. see 
https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglupload.c#L1334 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglupload.c#L1334>, 
https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglupload.c#L677 
<https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglupload.c#L677> 
or some of the other instances of 
gst_gl_video_allocation_params_new_wrapped_gl_handle().

Cheers
-Matt

On 16/6/21 6:45 am, Edward Anon via gstreamer-devel wrote:
> Hi yu,
>
> I am doing some real-time computation on multiple synced video streams.
>
> I am currently using OpenGL compute shaders to do this. Hence, the 
> current frame of each stream is bound to a texture and passed to the 
> shader. The shader also needs access to some extra information between 
> invocations so I need to swap textures in and out between calls.  I 
> want to stream the output of this shader to another machine which will 
> load that information into an OpenGL texture and render it to the 
> screen. I can't stream directly to the screen as I am using OpenGL to 
> render a rudimentary GUI on top of this. I'm open to alternative 
> solutions on this end of the pipeline. However, for other projects, I 
> will need to stream into a texture and use that later so I thought it 
> would be a good thing to learn now.
>
> I've looked at the GStreamer docs for GstGLShader and I'm not sure how 
> I would set something like that up. There don't seem to be any signals 
> to change the bound textures between invocations. Also, I'm a total 
> noob with GStreamer so this would be my first foray into the OpenGL 
> plugin. Do you have anything closer to a user guide than the quick 
> reference the docs and gst-inspect provide? I have a lot more 
> questions and don't want to waste your time.
>
> If the above is not possible I can modify my code so that the shader 
> does not need to change the textures it has bound between invocations.
>
> Thanks
>
> On Tue, 15 Jun 2021, 20:43 Yu You, <youyu.youyu at gmail.com 
> <mailto:youyu.youyu at gmail.com>> wrote:
>
>     It is not clear what you are trying to do exactly. But you can use
>     glshader for GLSL shadering and then use the same memory type (no
>     need to gldownload etc.) to HW  encoder like NVEnc (AVC or HEVC);
>     and then packtize the encoded byte stream using corresponding RTP
>     pays.
>
>     Regards,
>
>     Yu
>
>     On Mon, 14 Jun 2021, 15:40 Edward Anon via gstreamer-devel,
>     <gstreamer-devel at lists.freedesktop.org
>     <mailto:gstreamer-devel at lists.freedesktop.org>> wrote:
>
>         Hi all,
>
>         I want to stream an OpenGL texture over a network.
>
>         I'm struggling with getting the texture into a GStreamer
>         pipeline. I've seen other users resort to using appsink and
>         appsrc elements, but I want to keep the texture in the GPU and
>         do encoding and decoding there.
>
>         I've looked at the website and the source (in gst-plugins-base
>         for the OpenGL plugin documentation. However, there seems to
>         be no documentation beyond pads and signals, making it very
>         difficult to learn how to use the plugin.
>
>         Any pointers to relevant docs/resources would be much
>         appreciated, and working code would be too good to be true ;)
>
>         Thanks!
>         _______________________________________________
>         gstreamer-devel mailing list
>         gstreamer-devel at lists.freedesktop.org
>         <mailto:gstreamer-devel at lists.freedesktop.org>
>         https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>         <https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel>
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210616/0b647e54/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210616/0b647e54/attachment-0001.sig>


More information about the gstreamer-devel mailing list