VAAPI + meta:GstVideoGLTextureUploadMeta
Christophe Lafolet
christophe.lafolet at laposte.net
Sat Jan 23 14:31:55 PST 2016
Hello Vector
thanks for your examples that help me to solve my SIGSEGV : I was trying
to retrieve a unusefull byte buffer by calling map/unmap on the
GstBuffer, seems strange this SIGSEGV ....
but others problems are still present :
- in file gstvaapivideometa_texture.c ( method
gst_buffer_add_texture_upload_meta()), the code below is not compatible
with the gst_buffer_add_video_gl_texture_upload_meta api :
the method need a /|GstVideoGLTextureType[4] |/|(because a memcpy is
made on the 4 elements) and only a|/||//|/|GstVideoGLTextureType|/[1]
|/|is given|/|
|/meta = gst_buffer_add_video_gl_texture_upload_meta (buffer,
GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL,
1, &meta_texture->texture_type, gst_vaapi_texture_upload,
meta_texture, (GBoxedCopyFunc) meta_texture_copy,
(GBoxedFreeFunc) meta_texture_free);
- in file gstvideometa.c (method
gst_buffer_add_video_gl_texture_upload_meta()),
memcpy (meta->texture_type, texture_type, sizeof
(texture_type[0]) * 4);
when there is only one texture (major case), it seems the caller need to
feel the /|GstVideoGLTextureType[4]|/ with a "invalid" value to be
defined (GST_VIDEO_GL_TEXTURE_TYPE_INVALID for example)
GstVideoGLTextureType texture_type[4] =
{meta_texture->texture_type,
GST_VIDEO_GL_TEXTURE_TYPE_INVALID,
GST_VIDEO_GL_TEXTURE_TYPE_INVALID,
GST_VIDEO_GL_TEXTURE_TYPE_INVALID};
- in gst_vaapi_texture_glx_new_wrapped(), a default gl_api seems to be
searched once by calling the method gl_get_current_api() before
reception of the query allocation containing my "gst.gl.GstGLContext"
in my case, the GL version is "4.5.0 NVIDIA 358.16",
GL_CONTEXT_PROFILE_MASK = 0 (seems to be a bug on nvidia card) : the
method gl_get_current_api() can't decode the version and return
GST_VAAPI_GL_API_NONE !!
my gl_api (GL_API_OPENGL) contained in the GLContext (in the query
allocation) is never read, nor the environment variable GST_GL_API,
........................................
to continue, I modify gl_get_current_api() to return GST_VAAPI_GL_API_OPENGL
- the last problems is
vaapi gstvaapiutils_glx.c:986:gl_unbind_pixmap_object: failed to
release pixmap ??
christophe
Le 18/01/2016 11:32, Víctor M. Jáquez L. a écrit :
> Hi Christophe
>
> On 01/17/16 at 11:32am, Christophe Lafolet wrote:
>> Hello,
>>
>> I've troubles with VAAPI and OpenGL :)
>>
>> I'm developping a Java OpenGL application with dynamic streams and use
>> DecodeBin + AppSink to be notified of buffer reception.
>>
>>
>> No problem when I disable VAAPI plugin selection and do texture upload
>> myself.
>>
>> Now I want to use hardware decoding
>>
>> It's not clear to me which API should I use to shared openGL context with
>> VAAPI
>>
>> - in this post :
>> http://ystreet00.blogspot.com.au/2015/09/gstreamer-16-and-opengl-contexts.html
>> the new way should be to set a context on GST_MESSAGE_NEED_CONTEXT reception
>> but the VAAPI plugin seems only verify that the given context contains a
>> VAAPI display and delegate to element_class->set_context() but this callback
>> is unset for VaapiDecode so no context is saved
>> Question : why do I need to add a VAAPI display in this context ? DecodeBin
>> is a black box for me and I'm surprised to specify a VAAPI display.
> The virtual method call to parent class is a requirement for gstreamer 1.7:
> https://bugzilla.gnome.org/show_bug.cgi?id=757598#c2
>
> But you are using GStreamer 1.6, that's why that method is not resolved by the
> GstElement class.
>
> gstvaapidecode negotiates the GstGLContext in the allocation query because it
> needs to know which type of display backend to use in the
> GstVideoGLTextureUploadMeta callbacks (GLX or EGL). But it doesn't hold the
> context. The meta callbacks are going to be called in the rendering context.
>
> But that's a good catch: perhaps vaapidecode should request for a GstGLContext
> through the GstContext mechanism to know earlier the used display backend, and
> to avoid the propose_allocation() function in the appsink. Nonetheless, that will
> not solve your problem.
>
> The mechanism explained in Matthew's blog post is when you use glimagesink as
> a substitute of appsink, using its signal 'client-draw', where you will get a
> GstBuffer with a texture to render.
>
> This mechanism is used (experimentally) in WebKitGTK+:
>
> https://github.com/WebKit/webkit/blob/master/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp#L727
>
>
>> - the old way seems to use allocation query :
>> AppSink do not provide configurable "signal" to add callback to handle
>> allocation query : I update the AppSink.propose_allocation field directly
>> from Java with my callback and it works ... yes
>> So, I add GstVideoGLTextureUploadMeta to the allocation query :
>> "gst.gl.GstGLContext" with a gl_context build with
>> gst_gl_context_new_wrapped(), VAAPI detects my parameters
>> (GST_GL_PLATFORM_GLX, GST_GL_API_OPENGL)
>> but a SIGSEGV is generated later.
>> I receive samples containing no raw data (OK), a VideoGLTextureUploadMeta
>> with one texture (OK) but can't upload
> That's the way it should work.
>
> The meta callbacks should be called under the application gl context and they
> will upload the buffer into the texture:
>
> GstVideoGLTextureUploadMeta* meta;
> if ((meta = gst_buffer_get_video_gl_texture_upload_meta(buffer))) {
> if (meta->n_textures == 1) { // BRGx & BGRA formats use only one texture.
> guint ids[4] = { texture.id(), 0, 0, 0 };
> if (gst_video_gl_texture_upload_meta_upload(meta, ids))
> return;
> }
> }
>
> Which vaapi backend are you using? Some how I guess that is the vdpau one.
>
> Can you open a bug with the back trace?
>
>> Is there a example to use VAAPI + meta:GstVideoGLTextureUploadMeta ?
> the element gstglupload does a good job
>
> http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/tree/gst-libs/gst/gl/gstglupload.c
>
>>
>> My config :
>> Linux + X11 + GLX
>> gstreamer 1.6.2-1
>> gstreamer-vaapi 0.7.0
>> gstopengl not used.
>
> vmjl
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20160123/2076fa92/attachment.html>
More information about the gstreamer-devel
mailing list