push opengl texture to gstreamer pipeline

Lusine Hayrapetyan lusinehayrapetyan1992 at gmail.com
Wed Aug 4 15:04:02 UTC 2021


Hi Folks,
I'm struggling with the following issue and can't understand what I'm doing
wrong.
I need to pass opengl texture to the gstreamer pipeline.
I have a rendering thread where I create opengl texture, the following
objects created in this thread:
*EGLDisplay display;*
*EGLContext context;*

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.
http://ystreet00.blogspot.com/2015/09/gstreamer-16-and-opengl-contexts.html

GstGLDisplayEGL and GstGLContext are created in this way:

*GstGLDisplayEGL* gst_display = gst_gl_display_egl_new_with_egl_display
(display);*


*GstGLContext *gl_context =      gst_gl_context_new_wrapped (GST_GL_DISPLAY
(gst_display),      (guintptr) context, GST_GL_PLATFORM_EGL,
GST_GL_API_GLES2);*

The first element of my pipeline is appsrc:
*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 use need-data callback to create a buffer from texture_id and and push it
in the appsrc:
*g_signal_connect (state->appsrc, "need-data", G_CALLBACK (* pushFrame *),
state);*

*bool pushFrame()*








*{     // Wrap the texture into GstGLMemory    GstVideoInfo vinfo;
gst_video_info_set_format(&vinfo, GST_VIDEO_FORMAT_RGBA, 300, 300);
GstAllocator* allocator =
GST_ALLOCATOR(gst_gl_memory_allocator_get_default(gl_context));
GstGLVideoAllocationParams* params =
gst_gl_video_allocation_params_new_wrapped_texture(
 state->gl_context, NULL, &vinfo, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
GST_GL_RGBA, * texture_id






























*,      NULL, 0);    // The following line produces an error!!!
GstGLMemory* glMemory = GST_GL_MEMORY_CAST(gst_gl_base_memory_alloc(
GST_GL_BASE_MEMORY_ALLOCATOR_CAST(allocator), (GstGLAllocationParams*)
params));    gst_gl_allocation_params_free((GstGLAllocationParams
*)params);    gst_object_unref(allocator);    // Attach GstGLMemory object
into buffer, timestamp the buffer and push it downstream    GstBuffer*
buffer = gst_buffer_new();    gst_buffer_append_memory(buffer,
GST_MEMORY_CAST(glMemory));    // Put timestamps into buffer
GST_BUFFER_PTS (buffer) = timestamp;    GST_BUFFER_DURATION (buffer) =
gst_util_uint64_scale_int (1, GST_SECOND, 2);    timestamp +=
GST_BUFFER_DURATION (buffer);    GstFlowReturn ret;
g_signal_emit_by_name(state->appsrc, "push-buffer", buffer, &ret);    if
(ret != GST_FLOW_OK)    {        // Something wrong, stop pushing.
g_printerr("Something went wrong: Pushing buffer into appsrc is
stopped.\n");        return false;    }    return true;}*

pushFrame produces the following error:
gst_gl_context_thread_add: assertion 'context->priv->active_thread ==
g_thread_self ()' failIed

What am I doing wrong or how can push gpu texture to gstreamer?

Thanks,
Lusine
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210804/d48ff2a7/attachment.htm>


More information about the gstreamer-devel mailing list