qt: add support for building/running on android
authorMatthew Waters <matthew@centricular.com>
Wed, 2 Sep 2015 13:45:07 +0000 (23:45 +1000)
committerMatthew Waters <matthew@centricular.com>
Mon, 28 Sep 2015 06:47:00 +0000 (16:47 +1000)
Including:
- Necessary configure checks
- Necessary compile time platform checks
- Necessary runtime qt android platform detection
- Escaping GLsync definition with Qt's GLES2 implementation

https://bugzilla.gnome.org/show_bug.cgi?id=754466

ext/qt/Makefile.am
ext/qt/gstqsgtexture.h
ext/qt/gstqtgl.h [new file with mode: 0644]
ext/qt/qtitem.cc
ext/qt/qtitem.h

index 053a83f..064e8d1 100644 (file)
@@ -20,6 +20,7 @@ libgstqtsink_la_SOURCES = \
        qtitem.cc \
        gstqtsink.cc \
        gstqtsink.h \
+       gstqtgl.h \
        gstplugin.cc
 
 libgstqtsink_la_CXXFLAGS = \
index bf8f03f..7b7d1fe 100644 (file)
 #define __GST_QSG_TEXTURE_H__
 
 #include <gst/gst.h>
-#include <QSGTexture>
-#include <QOpenGLFunctions>
 #include <gst/video/video.h>
 #include <gst/gl/gl.h>
 
+#include "gstqtgl.h"
+#include <QSGTexture>
+#include <QOpenGLFunctions>
+
 class GstQSGTexture : public QSGTexture, protected QOpenGLFunctions
 {
     Q_OBJECT
diff --git a/ext/qt/gstqtgl.h b/ext/qt/gstqtgl.h
new file mode 100644 (file)
index 0000000..673ef22
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* qt uses the same trick as us to typedef GLsync on gles2 but to a different
+ * type which confuses the preprocessor.  As it's never actually used by qt
+ * public headers, define it to something else to avoid redefinition
+ * warnings/errors */
+
+#include <gst/gl/gstglconfig.h>
+#include <QtCore/qglobal.h>
+
+#if defined(QT_OPENGL_ES_2) && GST_GL_HAVE_WINDOW_ANDROID
+#define GLsync gst_qt_GLsync
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#undef GLsync
+#endif /* defined(QT_OPENGL_ES_2) */
index 7c53979..fe56a57 100644 (file)
 #include <stdio.h>
 
 #include <gst/video/video.h>
+#include "qtitem.h"
+#include "gstqsgtexture.h"
+
 #include <QGuiApplication>
 #include <QQuickWindow>
 #include <QSGSimpleTextureNode>
-#include "qtitem.h"
-#include "gstqsgtexture.h"
 
 #if GST_GL_HAVE_WINDOW_X11 && GST_GL_HAVE_PLATFORM_GLX && defined (HAVE_QT_X11)
 #include <QX11Info>
 #include <gst/gl/wayland/gstgldisplay_wayland.h>
 #endif
 
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+#include <gst/gl/egl/gstgldisplay_egl.h>
+#include <gst/gl/egl/gstglcontext_egl.h>
+#endif
+
 /**
  * SECTION:gtkgstglwidget
  * @short_description: a #GtkGLArea that renders GStreamer video #GstBuffers
@@ -116,6 +122,10 @@ QtGLVideoItem::QtGLVideoItem()
     this->priv->display = (GstGLDisplay *)
         gst_gl_display_x11_new_with_display (QX11Info::display ());
 #endif
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+  if (QString::fromUtf8 ("android") == app->platformName())
+    this->priv->display = (GstGLDisplay *) gst_gl_display_egl_new ();
+#endif
 
   if (!this->priv->display)
     this->priv->display = gst_gl_display_new ();
@@ -284,6 +294,17 @@ QtGLVideoItem::onSceneGraphInitialized ()
           platform, gl_api);
   }
 #endif
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+  if (GST_IS_GL_DISPLAY_EGL (this->priv->display)) {
+    platform = GST_GL_PLATFORM_EGL;
+    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)
+      this->priv->other_context =
+          gst_gl_context_new_wrapped (this->priv->display, gl_handle,
+          platform, gl_api);
+  }
+#endif
 
   (void) platform;
   (void) gl_api;
index afd2869..b6260cd 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <gst/gst.h>
 #include <gst/gl/gl.h>
+
+#include "gstqtgl.h"
 #include <QQuickItem>
 #include <QOpenGLContext>
 #include <QOpenGLFunctions>