media: support OpenGL-based video playback on macOS
authorChristian Hergert <christian@hergert.me>
Thu, 17 Feb 2022 05:27:10 +0000 (21:27 -0800)
committerChristian Hergert <christian@hergert.me>
Thu, 17 Feb 2022 05:31:20 +0000 (21:31 -0800)
If we have GStreamer on macOS we likely have support for CGL to get an
OpenGL context we can use. This provides the missing pieces to get
accelerated video playback in gtk4-widget-factory working.

modules/media/gtkgstsink.c

index c2708da148f666b693ab90d3b0748d87a761e942..529952fffc32691f781c2fa63b88524c36e877d8 100644 (file)
 #include <gst/gl/egl/gstgldisplay_egl.h>
 #endif
 
+#ifdef GDK_WINDOWING_MACOS
+#include <gdk/macos/gdkmacos.h>
+#endif
+
 #include <gst/gl/gstglfuncs.h>
 
 enum {
@@ -497,6 +501,29 @@ gtk_gst_sink_initialize_gl (GtkGstSink *self)
     }
   else
 #endif
+#if defined(GST_GL_HAVE_PLATFORM_CGL) && defined(GDK_WINDOWING_MACOS)
+  if (GDK_IS_MACOS_DISPLAY (display))
+    {
+      platform = GST_GL_PLATFORM_CGL;
+
+      GST_DEBUG_OBJECT (self, "got CGL on macOS!");
+
+      gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL);
+      gl_handle = gst_gl_context_get_current_gl_context (platform);
+
+      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);
+        }
+      else
+        {
+          GST_ERROR_OBJECT (self, "Failed to get handle from GdkGLContext, not using macOS CGL");
+          return FALSE;
+        }
+    }
+  else
+#endif
 #if GST_GL_HAVE_WINDOW_WIN32 && (GST_GL_HAVE_PLATFORM_WGL || GST_GL_HAVE_PLATFORM_EGL) && defined (GDK_WINDOWING_WIN32)
   if (GDK_IS_WIN32_DISPLAY (display))
     {