meson: add build files for the qml plugin
authorMatthew Waters <matthew@centricular.com>
Thu, 5 Apr 2018 06:05:12 +0000 (16:05 +1000)
committerMatthew Waters <matthew@centricular.com>
Sun, 15 Apr 2018 13:49:57 +0000 (23:49 +1000)
Tested on linux with X11/wayland and semi-tested on Windows.

Windows crashes on item destruction however this is better than nothing.

Fix up some win32 build issues on the way with mismatched {} and
G_STMT_{START,END}

12 files changed:
ext/meson.build
ext/qt/gstqtglutility.cc
ext/qt/meson.build [new file with mode: 0644]
tests/examples/meson.build
tests/examples/qt/meson.build [new file with mode: 0644]
tests/examples/qt/qmlsink/CMakeLists.txt
tests/examples/qt/qmlsink/meson.build [new file with mode: 0644]
tests/examples/qt/qmlsink/play.pro
tests/examples/qt/qmlsink/qmlsink.qrc [moved from tests/examples/qt/qmlsrc/qml.qrc with 100% similarity]
tests/examples/qt/qmlsrc/grabqml.pro
tests/examples/qt/qmlsrc/meson.build [new file with mode: 0644]
tests/examples/qt/qmlsrc/qmlsrc.qrc [moved from tests/examples/qt/qmlsink/qml.qrc with 100% similarity]

index 52eb4c7..dd1d316 100644 (file)
@@ -14,7 +14,7 @@ endif
 subdir('libpng')
 subdir('mpg123')
 subdir('raw1394')
-# FIXME: subdir('qt')
+subdir('qt')
 subdir('pulse')
 subdir('shout2')
 subdir('soup')
index cc84c83..82f4983 100644 (file)
@@ -48,6 +48,8 @@
 #endif
 #endif
 
+#include <gst/gl/gstglfuncs.h>
+
 #define GST_CAT_DEFAULT qt_gl_utils_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 
@@ -204,12 +206,12 @@ gst_qt_get_gl_wrapcontext (GstGLDisplay * display,
     GST_ERROR ("cannot wrap qt OpenGL context");
     return FALSE;
   }
+
   (void) platform;
   (void) gl_api;
   (void) gl_handle;
 
-  gst_gl_context_activate (*wrap_glcontext, TRUE);
+  gst_gl_context_activate(*wrap_glcontext, TRUE);
   if (!gst_gl_context_fill_info (*wrap_glcontext, &error)) {
     GST_ERROR ("failed to retrieve qt context info: %s", error->message);
     g_object_unref (*wrap_glcontext);
@@ -242,7 +244,7 @@ gst_qt_get_gl_wrapcontext (GstGLDisplay * display,
       wglMakeCurrent (device, 0);
       gst_object_unref (window);
       if (!gst_gl_context_create (*context, *wrap_glcontext, &error)) {
-        GST_ERROR ("%p failed to create shared GL context: %s", this, error->message);
+        GST_ERROR ("failed to create shared GL context: %s", error->message);
         g_object_unref (*context);
         *context = NULL;
         g_object_unref (*wrap_glcontext);
@@ -251,10 +253,10 @@ gst_qt_get_gl_wrapcontext (GstGLDisplay * display,
         return FALSE;
       }
       wglMakeCurrent (device, (HGLRC) gl_handle);
-    }
+    } G_STMT_END;
 #endif
     gst_gl_context_activate (*wrap_glcontext, FALSE);
-  } G_STMT_END;
+  }
 
   return TRUE;
 }
diff --git a/ext/qt/meson.build b/ext/qt/meson.build
new file mode 100644 (file)
index 0000000..754dc5a
--- /dev/null
@@ -0,0 +1,123 @@
+sources = [
+  'gstplugin.cc',
+  'gstqsgtexture.cc',
+  'gstqtglutility.cc',
+  'gstqtsink.cc',
+  'gstqtsrc.cc',
+  'qtitem.cc',
+  'qtwindow.cc',
+]
+
+moc_headers = [
+  'qtitem.h',
+  'qtwindow.h',
+  'gstqsgtexture.h',
+]
+
+if have_cxx and build_gstgl
+  qt5_mod = import('qt5')
+  qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'], required: false)
+
+  # FIXME Add a way to get that information out of the qt5 module
+  moc = find_program('moc-qt5', required : false)
+  if qt5qml_dep.found() and moc.found()
+    optional_deps = []
+    qt_defines = []
+    have_qpa_include = false
+    have_qt_windowing = false
+
+    # Attempt to find the QPA header either through pkg-config (preferred) or qmake
+    # This semi-matches what meson does internally with the qt5 module
+    # FIXME Add a way to get some of this information out of the qt5 module
+    if not have_qpa_include
+      qt5core_dep = dependency('Qt5Core', required: false)
+      if qt5core_dep.found() and qt5core_dep.type_name() == 'pkgconfig'
+        qt_version = qt5core_dep.version()
+        qt_include_dir = qt5core_dep.get_pkgconfig_variable('includedir')
+        qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
+        if cxx.has_header('qpa/qplatformnativeinterface.h',
+                dependencies : qt5core_dep,
+                args : '-I' + qpa_include_path)
+          qt_defines += '-DHAVE_QT_QPA_HEADER'
+          qt_defines += '-I' + qpa_include_path
+          have_qpa_include = true
+          message('Found QPA header using pkg-config')
+        endif
+      endif
+    endif
+    if not have_qpa_include
+      qmake = find_program('qmake')
+      if qmake.found()
+        qt_version = run_command(qmake, '-query', 'QT_VERSION').stdout().strip()
+        qt_include_dir = run_command(qmake, '-query', 'QT_INSTALL_HEADERS').stdout().strip()
+        qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
+        if cxx.has_header('qpa/qplatformnativeinterface.h',
+                args : '-I' + qpa_include_path)
+          qt_defines += '-DHAVE_QT_QPA_HEADER'
+          qt_defines += '-I' + qpa_include_path
+          have_qpa_include = true
+          message('Found QPA header using qmake')
+        endif
+      endif
+    endif
+
+    # Try to come up with all the platform/winsys combinations that will work
+
+    if gst_gl_have_window_x11 and gst_gl_have_platform_glx
+      qt5x11extras = dependency('qt5', modules : ['X11Extras'], required : false)
+      if qt5x11extras.found()
+        optional_deps += qt5x11extras
+        qt_defines += ['-DHAVE_QT_X11']
+        have_qt_windowing = true
+      endif
+    endif
+
+    if gst_gl_have_platform_egl
+      if have_qpa_include
+        if gst_gl_have_window_wayland
+          qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], required : false)
+          if qt5waylandextras.found()
+            optional_deps += qt5waylandextras
+            qt_defines += ['-DHAVE_QT_WAYLAND']
+            have_qt_windowing = true
+          endif
+        endif
+        if gst_gl_have_window_android
+          # FIXME: untested
+          qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], required : false)
+          if qt5androidextras.found()
+            optional_deps += qt5androidextras
+            # also uses the HAVE_QT_EGLFS define below
+            have_qt_windowing = true
+          endif
+        endif
+      endif
+      qt_defines += ['-DHAVE_QT_EGLFS']
+      have_qt_windowing = true
+    endif
+
+    if gst_gl_have_platform_wgl and gst_gl_have_window_win32
+         # for wglMakeCurrent()
+      opengl32_dep = cc.find_library('opengl32', required : false)
+      if opengl32_dep.found()
+        qt_defines += ['-DHAVE_QT_WIN32']
+               optional_deps += opengl32_dep
+        have_qt_windowing = true
+         endif
+    endif
+
+    # FIXME: OSX/iOS definitions
+
+    if have_qt_windowing
+      # Build it!
+      moc_files = qt5_mod.preprocess(moc_headers : moc_headers)
+      library('gstqmlgl', sources, moc_files,
+        cpp_args : gst_plugins_good_args + qt_defines,
+        link_args : noseh_link_args,
+        include_directories: [configinc, libsinc],
+        dependencies : [glib_deps, gst_dep, gstvideo_dep, gstgl_dep, qt5qml_dep, optional_deps],
+        install: true,
+        install_dir : plugins_install_dir)
+    endif
+  endif
+endif
index 19f9a0d..d96ca32 100644 (file)
@@ -2,7 +2,7 @@ subdir('audiofx')
 subdir('cairo')
 #FIXME: subdir('gtk')
 subdir('level')
-#FIXME: subdir('qt')
+subdir('qt')
 subdir('rtp')
 subdir('rtsp')
 subdir('shapewipe')
diff --git a/tests/examples/qt/meson.build b/tests/examples/qt/meson.build
new file mode 100644 (file)
index 0000000..3fa08cf
--- /dev/null
@@ -0,0 +1,2 @@
+subdir('qmlsink')
+subdir('qmlsrc')
index 02b0e11..6005f66 100644 (file)
@@ -14,7 +14,7 @@ find_package(Qt5Qml REQUIRED)
 find_package(Qt5Quick REQUIRED)
 
 set (SRC_LIST main.cpp)
-qt5_add_resources(RESOURCES qml.qrc)
+qt5_add_resources(RESOURCES qmlsink.qrc)
 link_directories(${GSTREAMER_LIBRARY_DIRS})
 include_directories (${GSTREAMER_INCLUDE_DIRS})
 add_executable(qml-example ${SRC_LIST} ${RESOURCES})
diff --git a/tests/examples/qt/qmlsink/meson.build b/tests/examples/qt/qmlsink/meson.build
new file mode 100644 (file)
index 0000000..d1f3f4d
--- /dev/null
@@ -0,0 +1,19 @@
+sources = [
+  'main.cpp',
+]
+
+if have_cxx and build_gstgl and gstgl_dep.found()
+  qt5_mod = import('qt5')
+  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'], required: false)
+
+  # FIXME Add a way to get that information out of the qt5 module
+  moc = find_program('moc-qt5', required : false)
+  if qt5qml_deps.found() and moc.found()
+    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsink.qrc')
+    executable('qmlsink', sources, qt_preprocessed,
+        dependencies : [gst_dep, qt5qml_deps],
+        c_args : gst_plugins_good_args,
+        include_directories : [configinc],
+        install: false)
+  endif
+endif
index 374e402..9ecaf87 100644 (file)
@@ -14,7 +14,7 @@ INCLUDEPATH += ../lib
 
 SOURCES += main.cpp
 
-RESOURCES += qml.qrc
+RESOURCES += qmlsink.qrc
 
 # Additional import path used to resolve QML modules in Qt Creator's code model
 QML_IMPORT_PATH =
index 374e402..9c97c67 100644 (file)
@@ -14,7 +14,7 @@ INCLUDEPATH += ../lib
 
 SOURCES += main.cpp
 
-RESOURCES += qml.qrc
+RESOURCES += qmlsrc.qrc
 
 # Additional import path used to resolve QML modules in Qt Creator's code model
 QML_IMPORT_PATH =
diff --git a/tests/examples/qt/qmlsrc/meson.build b/tests/examples/qt/qmlsrc/meson.build
new file mode 100644 (file)
index 0000000..df7f94f
--- /dev/null
@@ -0,0 +1,19 @@
+sources = [
+  'main.cpp',
+]
+
+if have_cxx and build_gstgl and gstgl_dep.found()
+  qt5_mod = import('qt5')
+  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'], required: false)
+
+  # FIXME Add a way to get that information out of the qt5 module
+  moc = find_program('moc-qt5', required : false)
+  if qt5qml_deps.found() and moc.found()
+    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsrc.qrc')
+    executable('qmlsrc', sources, qt_preprocessed,
+        dependencies : [gst_dep, qt5qml_deps],
+        c_args : gst_plugins_good_args,
+        include_directories : [configinc],
+        install: false)
+  endif
+endif