wpevideosrc: Fix frame stuttering in GL rendering path

Make sure the EGLImage we're rendering to the GL memory stays alive long enough,
until the the GL memory has been destroyed.

This change fixes tearing and black flashes artefacts that were happening
because the EGLImage was sometimes destroyed before the sink actually rendered
the associated texture.

Fixes #889

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1354>
This commit is contained in:
Philippe Normand 2021-11-16 12:56:38 +00:00 committed by GStreamer Marge Bot
parent 053dd564a1
commit a6fd767025

View file

@ -215,6 +215,16 @@ gst_wpe_video_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
return ret;
}
static GQuark
_egl_image_quark (void)
{
static GQuark quark = 0;
if (!quark)
quark = g_quark_from_static_string ("GstWPEEGLImage");
return quark;
}
static gboolean
gst_wpe_video_src_fill_memory (GstGLBaseSrc * bsrc, GstGLMemory * memory)
{
@ -240,6 +250,11 @@ gst_wpe_video_src_fill_memory (GstGLBaseSrc * bsrc, GstGLMemory * memory)
return TRUE;
}
// The EGLImage is implicitely associated with the memory we're filling, so we
// need to ensure their life cycles are tied.
gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (memory), _egl_image_quark (),
gst_egl_image_ref (locked_image), (GDestroyNotify) gst_egl_image_unref);
gl->ActiveTexture (GL_TEXTURE0 + memory->plane);
gl->BindTexture (GL_TEXTURE_2D, tex_id);
gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,