GlImageSink Callback Issue
Edward Anon
blakat360 at gmail.com
Mon Aug 2 12:23:20 UTC 2021
Could you expand on 1 and 2?
This rendering code works with my single threaded application.
Is the problem with 1 the fact that the vertices are allocated inside a
function (ie on the stack)?
I have no idea what you mean by 2. Apologies for being a noob.
Re 3, does this mean gstreamer creates a separate OpenGL context? Is there
a new context made for every element? Do some elements share contexts?
Thanks
On Mon, Aug 2, 2021 at 3:40 AM Matthew Waters <ystreet00 at gmail.com> wrote:
> Take a look at
>
>
> https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglfilter.c#L1165
> .
>
> I can notice a couple of things wrong:
> 1. Vertex glBufferData call is taking the address of an array that should
> not be taken.
> 2. No retrieval of the vertex attribute locations (GPU driver decides
> these)
> 3. You may not be creating the VAO in the correct thread? VAO's are not
> OpenGL shareable resource across OpenGL contexts.
>
> Cheers
> -Matt
>
> On 2/8/21 5:47 am, Edward Anon via gstreamer-devel wrote:
>
> My client takes a camera feed over RTP. I want to render an overlay onto
> it using opengl. Hence, I want to use GlImageSink in my application as it
> provides me with the next frame already in a texture. I want to blit the
> already rendered overlay onto the texture prior to rendering.
>
> As a first step I am writing a simple draw callback which should just
> render the texture to the screen. I am basing my callback on the cube
> example in the gst-plugins-base source.
>
> ```
>
> gboolean drawCallback (GstElement * gl_sink, GstGLContext *context, GstSample * sample, gpointer data) {
> assert(gl_sink); assert(context); assert(sample); assert(not data); GstVideoFrame v_frame; GstVideoInfo v_info; GstBuffer *buf = gst_sample_get_buffer (sample); GstCaps *caps = gst_sample_get_caps (sample); gst_video_info_from_caps (&v_info, caps); if (!gst_video_frame_map (&v_frame, &v_info, buf, (GstMapFlags) (GST_MAP_READ | GST_MAP_GL))) {
> g_warning ("Failed to map the video buffer"); return TRUE; }
>
> GLuint texture_id = *(guint *) v_frame.data[0]; Texture t; t.from(texture_id, Texture::TextureType::COLOUR); t.render(); return true;}
>
> ```
>
> However, I get the following error: ```gldebug
> gstgldebug.c:306:_gst_gl_debug_callback:<glcontextglx0> high: GL error from
> API id:1, GL_INVALID_OPERATION in glDrawArrays```.
>
> The render code is as follows:
> ```
>
> if (texture_type != UNINITIALISED) {
> switch (texture_type) {
> case COLOUR:
> colour_shader.use(); break;
>
> // other texture type setup
>
> default:
> throw std::runtime_error("Unsupported texture type"); }
>
> glBindVertexArray(quadVAO); glDisable(GL_DEPTH_TEST); glBindTexture(GL_TEXTURE_2D, opengl_texture); glDrawArrays(GL_TRIANGLES, 0, 6); glBindTexture(GL_TEXTURE_2D, 0); glEnable(GL_DEPTH_TEST);}
>
> ```
> Shaders, VAO and VBO set up as follows:
> ```
>
> glGenVertexArrays(1, &quadVAO); glBindVertexArray(quadVAO); glGenBuffers(1, &quadVBO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)nullptr); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)(2 * sizeof(float))); constexpr float quadVertices[] = {
> // positions // texCoords 1.0f, -1.0f, 0, 1, // top left 1.0f, 1.0f, 0, 0, // bottom left -1.0f, 1.0f, 1, 0, // bottom right 1.0f, -1.0f, 0, 1, // top left -1.0f, 1.0f, 1, 0, // bottom right -1.0f, -1.0f, 1, 1 // top right }; glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW); glBindVertexArray(0); colour_shader = Shader(shaderRoot + "quadFromTexture.vs", shaderRoot + "colourTexture.fs");
>
> // setup other shaders
>
> ```
>
> What am I doing wrong?
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210802/68ee929d/attachment.htm>
More information about the gstreamer-devel
mailing list