From 55f7f7d0eecc87e89312a59a04c52654955d7f61 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 30 Jan 2023 11:56:50 -0500 Subject: [PATCH 1/2] gst: Fix synchronization It does not make sense to sync and wait in the same context, that is just a no-op. The intention of this code clearly was to sync in the gst context, and wait in the gdk one. That also matches what the gtk sink implementation in gstreamer does. --- modules/media/gtkgstsink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c index 3c41af73f3..f9db6f6136 100644 --- a/modules/media/gtkgstsink.c +++ b/modules/media/gtkgstsink.c @@ -292,7 +292,7 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, sync_meta = gst_buffer_get_gl_sync_meta (buffer); if (sync_meta) { gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context); - gst_gl_sync_meta_wait (sync_meta, self->gst_context); + gst_gl_sync_meta_wait (sync_meta, self->gst_app_context); } texture = gdk_gl_texture_new (self->gdk_context, From 69eed999bb5225b824eecccb45852d5e63b0ec62 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 30 Jan 2023 15:00:53 -0500 Subject: [PATCH 2/2] gst: Rename a field for clarity gst_gdk_context is clearer than gst_app_context. Maybe --- modules/media/gtkgstsink.c | 28 ++++++++++++++-------------- modules/media/gtkgstsinkprivate.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c index f9db6f6136..182283de64 100644 --- a/modules/media/gtkgstsink.c +++ b/modules/media/gtkgstsink.c @@ -174,7 +174,7 @@ gtk_gst_sink_query (GstBaseSink *bsink, if (GST_QUERY_TYPE (query) == GST_QUERY_CONTEXT && self->gst_display != NULL && - gst_gl_handle_context_query (GST_ELEMENT (self), query, self->gst_display, self->gst_context, self->gst_app_context)) + gst_gl_handle_context_query (GST_ELEMENT (self), query, self->gst_display, self->gst_context, self->gst_gdk_context)) return TRUE; return GST_BASE_SINK_CLASS (gtk_gst_sink_parent_class)->query (bsink, query); @@ -292,7 +292,7 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, sync_meta = gst_buffer_get_gl_sync_meta (buffer); if (sync_meta) { gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context); - gst_gl_sync_meta_wait (sync_meta, self->gst_app_context); + gst_gl_sync_meta_wait (sync_meta, self->gst_gdk_context); } texture = gdk_gl_texture_new (self->gdk_context, @@ -464,7 +464,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) if (gl_handle) { - self->gst_app_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); + self->gst_gdk_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); } else { @@ -490,7 +490,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) wayland_display = gdk_wayland_display_get_wl_display (display); self->gst_display = GST_GL_DISPLAY (gst_gl_display_wayland_new_with_display (wayland_display)); - self->gst_app_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); + self->gst_gdk_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); } else { @@ -513,7 +513,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) if (gl_handle) { self->gst_display = gst_gl_display_new (); - self->gst_app_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); + self->gst_gdk_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); } else { @@ -569,7 +569,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) #endif gst_gl_display_filter_gl_api (self->gst_display, gl_api); - self->gst_app_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); + self->gst_gdk_context = gst_gl_context_new_wrapped (self->gst_display, gl_handle, platform, gl_api); } else { @@ -584,15 +584,15 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) return FALSE; } - g_assert (self->gst_app_context != NULL); + g_assert (self->gst_gdk_context != NULL); - gst_gl_context_activate (self->gst_app_context, TRUE); + gst_gl_context_activate (self->gst_gdk_context, TRUE); - if (!gst_gl_context_fill_info (self->gst_app_context, &error)) + if (!gst_gl_context_fill_info (self->gst_gdk_context, &error)) { GST_ERROR_OBJECT (self, "failed to retrieve GDK context info: %s", error->message); g_clear_error (&error); - g_clear_object (&self->gst_app_context); + g_clear_object (&self->gst_gdk_context); g_clear_object (&self->gst_display); HANDLE_EXTERNAL_WGL_MAKE_CURRENT (self->gdk_context); return FALSE; @@ -600,16 +600,16 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self) else { DEACTIVATE_WGL_CONTEXT (self->gdk_context); - gst_gl_context_activate (self->gst_app_context, FALSE); + gst_gl_context_activate (self->gst_gdk_context, FALSE); } - succeeded = gst_gl_display_create_context (self->gst_display, self->gst_app_context, &self->gst_context, &error); + succeeded = gst_gl_display_create_context (self->gst_display, self->gst_gdk_context, &self->gst_context, &error); if (!succeeded) { GST_ERROR_OBJECT (self, "Couldn't create GL context: %s", error->message); g_error_free (error); - g_clear_object (&self->gst_app_context); + g_clear_object (&self->gst_gdk_context); g_clear_object (&self->gst_display); } @@ -676,7 +676,7 @@ gtk_gst_sink_dispose (GObject *object) GtkGstSink *self = GTK_GST_SINK (object); g_clear_object (&self->paintable); - g_clear_object (&self->gst_app_context); + g_clear_object (&self->gst_gdk_context); g_clear_object (&self->gst_display); g_clear_object (&self->gdk_context); diff --git a/modules/media/gtkgstsinkprivate.h b/modules/media/gtkgstsinkprivate.h index 06e9f7f1b3..f81ac0ee2d 100644 --- a/modules/media/gtkgstsinkprivate.h +++ b/modules/media/gtkgstsinkprivate.h @@ -51,7 +51,7 @@ struct _GtkGstSink GtkGstPaintable * paintable; GdkGLContext * gdk_context; GstGLDisplay * gst_display; - GstGLContext * gst_app_context; + GstGLContext * gst_gdk_context; GstGLContext * gst_context; };