diff --git a/configure.ac b/configure.ac index 40cdd47000..c8d3f810b0 100644 --- a/configure.ac +++ b/configure.ac @@ -2680,6 +2680,25 @@ AG_GST_CHECK_FEATURE(QT, [Qt elements], qt, [ HAVE_QT_WINDOWING="yes" ], [AC_MSG_NOTICE([Could not find Qt Wayland integration])]) fi + if test "x$GST_GL_HAVE_WINDOW_ANDROID" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then + PKG_CHECK_MODULES(QT_ANDROID, Qt5AndroidExtras, [ + # c++ on android requires a standard library and there are multiple + # choices. cerbero provides a pkg-config file the describes a choice + # so try to use that. Outside cerbero one has to pass these flags + # manually for the library one is using + PKG_CHECK_MODULES(GNUSTL, gnustl, [ + QT_CFLAGS="$QT_CFLAGS $GNUSTL_CFLAGS" + QT_LIBS="$QT_CFLAGS $GNUSTL_LIBS" + ], [ + AC_MSG_NOTICE([Could not find Standard C++ library])]) + + AC_DEFINE([HAVE_QT_ANDROID], [], + [Define if Qt Android integration is installed]) + QT_CFLAGS="$QT_CFLAGS $QT_ANDROID_CFLAGS" + QT_LIBS="$QT_LIBS $QT_ANDROID_LIBS" + HAVE_QT_WINDOWING="yes" + ], [AC_MSG_NOTICE([Could not find Qt Android integration])]) + fi if test "x$HAVE_QT_WINDOWING" = "xno"; then AC_MSG_WARN([Could not find any Qt Windowing integration]) HAVE_QT="no" diff --git a/ext/qt/Makefile.am b/ext/qt/Makefile.am index 053a83fdde..064e8d13f7 100644 --- a/ext/qt/Makefile.am +++ b/ext/qt/Makefile.am @@ -20,6 +20,7 @@ libgstqtsink_la_SOURCES = \ qtitem.cc \ gstqtsink.cc \ gstqtsink.h \ + gstqtgl.h \ gstplugin.cc libgstqtsink_la_CXXFLAGS = \ diff --git a/ext/qt/gstqsgtexture.h b/ext/qt/gstqsgtexture.h index bf8f03f4ec..7b7d1fef64 100644 --- a/ext/qt/gstqsgtexture.h +++ b/ext/qt/gstqsgtexture.h @@ -22,11 +22,13 @@ #define __GST_QSG_TEXTURE_H__ #include -#include -#include #include #include +#include "gstqtgl.h" +#include +#include + class GstQSGTexture : public QSGTexture, protected QOpenGLFunctions { Q_OBJECT diff --git a/ext/qt/gstqtgl.h b/ext/qt/gstqtgl.h new file mode 100644 index 0000000000..673ef22a0f --- /dev/null +++ b/ext/qt/gstqtgl.h @@ -0,0 +1,34 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters + * + * 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 +#include + +#if defined(QT_OPENGL_ES_2) && GST_GL_HAVE_WINDOW_ANDROID +#define GLsync gst_qt_GLsync +#include +#include +#undef GLsync +#endif /* defined(QT_OPENGL_ES_2) */ diff --git a/ext/qt/qtitem.cc b/ext/qt/qtitem.cc index 7c53979138..fe56a57581 100644 --- a/ext/qt/qtitem.cc +++ b/ext/qt/qtitem.cc @@ -25,11 +25,12 @@ #include #include +#include "qtitem.h" +#include "gstqsgtexture.h" + #include #include #include -#include "qtitem.h" -#include "gstqsgtexture.h" #if GST_GL_HAVE_WINDOW_X11 && GST_GL_HAVE_PLATFORM_GLX && defined (HAVE_QT_X11) #include @@ -41,6 +42,11 @@ #include #endif +#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID) +#include +#include +#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; diff --git a/ext/qt/qtitem.h b/ext/qt/qtitem.h index afd2869d82..b6260cd16e 100644 --- a/ext/qt/qtitem.h +++ b/ext/qt/qtitem.h @@ -23,6 +23,8 @@ #include #include + +#include "gstqtgl.h" #include #include #include