Commit d47398de authored by Matthew Waters's avatar Matthew Waters 🐨

qt: add support for building/running on android

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
parent 5f8a587d
...@@ -20,6 +20,7 @@ libgstqtsink_la_SOURCES = \ ...@@ -20,6 +20,7 @@ libgstqtsink_la_SOURCES = \
qtitem.cc \ qtitem.cc \
gstqtsink.cc \ gstqtsink.cc \
gstqtsink.h \ gstqtsink.h \
gstqtgl.h \
gstplugin.cc gstplugin.cc
libgstqtsink_la_CXXFLAGS = \ libgstqtsink_la_CXXFLAGS = \
......
...@@ -22,11 +22,13 @@ ...@@ -22,11 +22,13 @@
#define __GST_QSG_TEXTURE_H__ #define __GST_QSG_TEXTURE_H__
#include <gst/gst.h> #include <gst/gst.h>
#include <QSGTexture>
#include <QOpenGLFunctions>
#include <gst/video/video.h> #include <gst/video/video.h>
#include <gst/gl/gl.h> #include <gst/gl/gl.h>
#include "gstqtgl.h"
#include <QSGTexture>
#include <QOpenGLFunctions>
class GstQSGTexture : public QSGTexture, protected QOpenGLFunctions class GstQSGTexture : public QSGTexture, protected QOpenGLFunctions
{ {
Q_OBJECT Q_OBJECT
......
/*
* 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) */
...@@ -25,11 +25,12 @@ ...@@ -25,11 +25,12 @@
#include <stdio.h> #include <stdio.h>
#include <gst/video/video.h> #include <gst/video/video.h>
#include "qtitem.h"
#include "gstqsgtexture.h"
#include <QGuiApplication> #include <QGuiApplication>
#include <QQuickWindow> #include <QQuickWindow>
#include <QSGSimpleTextureNode> #include <QSGSimpleTextureNode>
#include "qtitem.h"
#include "gstqsgtexture.h"
#if GST_GL_HAVE_WINDOW_X11 && GST_GL_HAVE_PLATFORM_GLX && defined (HAVE_QT_X11) #if GST_GL_HAVE_WINDOW_X11 && GST_GL_HAVE_PLATFORM_GLX && defined (HAVE_QT_X11)
#include <QX11Info> #include <QX11Info>
...@@ -41,6 +42,11 @@ ...@@ -41,6 +42,11 @@
#include <gst/gl/wayland/gstgldisplay_wayland.h> #include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif #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 * SECTION:gtkgstglwidget
* @short_description: a #GtkGLArea that renders GStreamer video #GstBuffers * @short_description: a #GtkGLArea that renders GStreamer video #GstBuffers
...@@ -116,6 +122,10 @@ QtGLVideoItem::QtGLVideoItem() ...@@ -116,6 +122,10 @@ QtGLVideoItem::QtGLVideoItem()
this->priv->display = (GstGLDisplay *) this->priv->display = (GstGLDisplay *)
gst_gl_display_x11_new_with_display (QX11Info::display ()); gst_gl_display_x11_new_with_display (QX11Info::display ());
#endif #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) if (!this->priv->display)
this->priv->display = gst_gl_display_new (); this->priv->display = gst_gl_display_new ();
...@@ -284,6 +294,17 @@ QtGLVideoItem::onSceneGraphInitialized () ...@@ -284,6 +294,17 @@ QtGLVideoItem::onSceneGraphInitialized ()
platform, gl_api); platform, gl_api);
} }
#endif #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) platform;
(void) gl_api; (void) gl_api;
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/gl/gl.h> #include <gst/gl/gl.h>
#include "gstqtgl.h"
#include <QQuickItem> #include <QQuickItem>
#include <QOpenGLContext> #include <QOpenGLContext>
#include <QOpenGLFunctions> #include <QOpenGLFunctions>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment