From: Matthias Clasen Date: Tue, 25 Apr 2023 09:44:21 +0000 (+0200) Subject: gstreamer: Defer the sync X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~354^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b9a7e5fa8580d59b3b2eac195c75d1b9617425b2;p=gtk4.git gstreamer: Defer the sync Don't sync right when we receive the buffer, pass it along with the texture to be executed later in the renderer. --- diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c index f0a15390f7..aee5cc452a 100644 --- a/modules/media/gtkgstsink.c +++ b/modules/media/gtkgstsink.c @@ -290,18 +290,21 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, GdkGLTextureBuilder *builder; sync_meta = gst_buffer_get_gl_sync_meta (buffer); - if (sync_meta) { + if (sync_meta) gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context); - gst_gl_context_activate (self->gst_gdk_context, TRUE); - gst_gl_sync_meta_wait (sync_meta, self->gst_gdk_context); - gst_gl_context_activate (self->gst_gdk_context, FALSE); - } + /* Note: using the gdk_context here is a (harmless) lie, + * since the texture really originates in the gst_context. + * But that is not a GdkGLContext. It is harmless, because + * we are never using the texture in the gdk_context, so we + * never make the (erroneous) decision to ignore the sync. + */ builder = gdk_gl_texture_builder_new (); gdk_gl_texture_builder_set_context (builder, self->gdk_context); gdk_gl_texture_builder_set_id (builder, *(guint *) frame->data[0]); gdk_gl_texture_builder_set_width (builder, frame->info.width); gdk_gl_texture_builder_set_height (builder, frame->info.height); + gdk_gl_texture_builder_set_sync (builder, sync_meta ? sync_meta->data : NULL); texture = gdk_gl_texture_builder_build (builder, (GDestroyNotify) video_frame_free,