summaryrefslogtreecommitdiff
path: root/modules/media/gtkgstsink.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/media/gtkgstsink.c')
-rw-r--r--modules/media/gtkgstsink.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c
index 8775ec54f4..72183278ba 100644
--- a/modules/media/gtkgstsink.c
+++ b/modules/media/gtkgstsink.c
@@ -417,7 +417,7 @@ check_win32_gst_gl_api (GdkGLContext *ctx,
#define REACTIVATE_WGL_CONTEXT(ctx)
#endif
-static void
+static gboolean
gtk_gst_sink_initialize_gl (GtkGstSink *self)
{
GdkDisplay *display;
@@ -425,6 +425,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
GstGLPlatform platform = GST_GL_PLATFORM_NONE;
GstGLAPI gl_api = GST_GL_API_NONE;
guintptr gl_handle = 0;
+ gboolean succeeded = FALSE;
display = gdk_gl_context_get_display (self->gdk_context);
@@ -465,7 +466,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
else
{
GST_ERROR_OBJECT (self, "Failed to get handle from GdkGLContext");
- return;
+ return FALSE;
}
}
else
@@ -491,7 +492,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
else
{
GST_ERROR_OBJECT (self, "Failed to get handle from GdkGLContext, not using Wayland EGL");
- return;
+ return FALSE;
}
}
else
@@ -522,10 +523,12 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
#ifdef HAVE_GST_GL_DISPLAY_NEW_WITH_TYPE
self->gst_display = gst_gl_display_new_with_type (GST_GL_DISPLAY_TYPE_WIN32);
#else
+#if GST_GL_HAVE_PLATFORM_EGL
g_message ("If media fails to play, set the envvar `GST_DEBUG=1`, and if GstGL context creation fails");
g_message ("due to \"Couldn't create GL context: Cannot share context with non-EGL context\",");
g_message ("set in the environment `GST_GL_PLATFORM=wgl` and `GST_GL_WINDOW=win32`,");
g_message ("and restart the GTK application");
+#endif
self->gst_display = gst_gl_display_new ();
#endif
@@ -545,14 +548,14 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
else
{
GST_ERROR_OBJECT (self, "Failed to get handle from GdkGLContext, not using %s", gl_type);
- return;
+ return FALSE;
}
}
else
#endif
{
GST_INFO_OBJECT (self, "Unsupported GDK display %s for GL", G_OBJECT_TYPE_NAME (display));
- return;
+ return FALSE;
}
g_assert (self->gst_app_context != NULL);
@@ -565,8 +568,8 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
g_clear_error (&error);
g_clear_object (&self->gst_app_context);
g_clear_object (&self->gst_display);
- HANDLE_EXTERNAL_WGL_MAKE_CURRENT (self->gdk_context);;
- return;
+ HANDLE_EXTERNAL_WGL_MAKE_CURRENT (self->gdk_context);
+ return FALSE;
}
else
{
@@ -574,7 +577,9 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
gst_gl_context_activate (self->gst_app_context, FALSE);
}
- if (!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_app_context, &self->gst_context, &error);
+
+ if (!succeeded)
{
GST_ERROR_OBJECT (self, "Couldn't create GL context: %s", error->message);
g_error_free (error);
@@ -584,6 +589,7 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
HANDLE_EXTERNAL_WGL_MAKE_CURRENT (self->gdk_context);
REACTIVATE_WGL_CONTEXT (self->gdk_context);
+ return succeeded;
}
static void
@@ -605,8 +611,8 @@ gtk_gst_sink_set_property (GObject *object,
case PROP_GL_CONTEXT:
self->gdk_context = g_value_dup_object (value);
- if (self->gdk_context != NULL)
- gtk_gst_sink_initialize_gl (self);
+ if (self->gdk_context != NULL && !gtk_gst_sink_initialize_gl (self))
+ g_clear_object (&self->gdk_context);
break;
default:
@@ -628,6 +634,9 @@ gtk_gst_sink_get_property (GObject *object,
case PROP_PAINTABLE:
g_value_set_object (value, self->paintable);
break;
+ case PROP_GL_CONTEXT:
+ g_value_set_object (value, self->gdk_context);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -690,7 +699,7 @@ gtk_gst_sink_class_init (GtkGstSinkClass * klass)
P_("gl-context"),
P_("GL context to use for rendering"),
GDK_TYPE_GL_CONTEXT,
- G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties);