1sources = [ 2 'gstplugin.cc', 3 'gstqtelement.cc', 4 'gstqsgtexture.cc', 5 'gstqtglutility.cc', 6 'gstqtoverlay.cc', 7 'gstqtsink.cc', 8 'gstqtsrc.cc', 9 'qtglrenderer.cc', 10 'qtitem.cc', 11 'qtwindow.cc', 12] 13 14moc_headers = [ 15 'qtitem.h', 16 'qtwindow.h', 17 'gstqsgtexture.h', 18 'qtglrenderer.h', 19] 20 21# Define a not-found dependency so this variable is always defined when we're 22# deciding whether to build the qt5 examples 23qt5qml_dep = dependency('', required: false) 24qt5_option = get_option('qt5') 25 26if qt5_option.disabled() 27 subdir_done() 28endif 29 30if not have_gstgl 31 if qt5_option.enabled() 32 error('qt5 qmlglsink plugin is enabled, but gstreamer-gl-1.0 was not found') 33 endif 34 subdir_done() 35endif 36 37if not add_languages('cpp', native: false, required: qt5_option) 38 subdir_done() 39endif 40 41qt5_mod = import('qt5') 42qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'], 43 required: qt5_option, static: host_machine.system() == 'ios') 44 45# On Linux, distros often have the Qt5 pkg-config files and moc in separate 46# packages, so the user may not have both installed. Check for moc and ensure 47# that it's installed. 48# We don't do this check on other OSes because they need to be able to simply 49# point the `QMAKE` env var to `qmake` to build against a particular Qt5. 50if host_system == 'linux' and not meson.is_cross_build() 51 moc = find_program('moc-qt5', 'moc', required : qt5_option) 52else 53 # We only check if `moc` was found, and then discard it, so we can fake it. 54 # This is also a good unit test of the fact that we *don't* use it. 55 moc = declare_dependency() 56endif 57 58if not qt5qml_dep.found() or not moc.found() 59 subdir_done() 60endif 61 62optional_deps = [] 63qt_defines = [] 64have_qpa_include = false 65have_qt_windowing = false 66 67# Look for the QPA platform native interface header 68qpa_header_path = join_paths(qt5qml_dep.version(), 'QtGui') 69qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h') 70if cxx.has_header(qpa_header, dependencies : qt5qml_dep) 71 qt_defines += '-DHAVE_QT_QPA_HEADER' 72 qt_defines += '-DQT_QPA_HEADER=' + '<@0@>'.format(qpa_header) 73 have_qpa_include = true 74 message('Found QtGui QPA header in ' + qpa_header_path) 75endif 76 77# Try to come up with all the platform/winsys combinations that will work 78 79if gst_gl_have_window_x11 and gst_gl_have_platform_glx 80 # FIXME: automagic 81 qt5x11extras = dependency('qt5', modules : ['X11Extras'], required : false) 82 if qt5x11extras.found() 83 optional_deps += [qt5x11extras, gstglx11_dep] 84 qt_defines += ['-DHAVE_QT_X11'] 85 have_qt_windowing = true 86 endif 87endif 88 89if gst_gl_have_platform_egl 90 # Embedded linux (e.g. i.MX6) with or without windowing support 91 qt_defines += ['-DHAVE_QT_EGLFS'] 92 optional_deps += gstglegl_dep 93 have_qt_windowing = true 94 if have_qpa_include 95 # Wayland windowing 96 if gst_gl_have_window_wayland 97 # FIXME: automagic 98 qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], required : false) 99 if qt5waylandextras.found() 100 optional_deps += [qt5waylandextras, gstglwayland_dep] 101 qt_defines += ['-DHAVE_QT_WAYLAND'] 102 have_qt_windowing = true 103 endif 104 endif 105 # Android windowing 106 if gst_gl_have_window_android 107 # FIXME: automagic 108 qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], required : false) 109 # for gl functions in QtGui/qopenglfunctions.h 110 # FIXME: automagic 111 glesv2_dep = cc.find_library('GLESv2', required : false) 112 if glesv2_dep.found() and qt5androidextras.found() 113 optional_deps += [qt5androidextras, glesv2_dep] 114 qt_defines += ['-DHAVE_QT_ANDROID'] 115 have_qt_windowing = true 116 # Needed for C++11 support in Cerbero. People building with Android 117 # in some other way need to add the necessary bits themselves. 118 optional_deps += dependency('gnustl', required : false) 119 endif 120 endif 121 endif 122endif 123 124if gst_gl_have_platform_wgl and gst_gl_have_window_win32 125 # for wglMakeCurrent() 126 # FIXME: automagic 127 opengl32_dep = cc.find_library('opengl32', required : false) 128 if opengl32_dep.found() 129 qt_defines += ['-DHAVE_QT_WIN32'] 130 optional_deps += opengl32_dep 131 have_qt_windowing = true 132 endif 133endif 134 135if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl 136 # FIXME: automagic 137 qt5macextras = dependency('qt5', modules : ['MacExtras'], required : false) 138 if qt5macextras.found() 139 qt_defines += ['-DHAVE_QT_MAC'] 140 optional_deps += qt5macextras 141 have_qt_windowing = true 142 endif 143endif 144 145if gst_gl_have_window_eagl and gst_gl_have_platform_eagl 146 if host_machine.system() == 'ios' 147 qt_defines += ['-DHAVE_QT_IOS'] 148 have_qt_windowing = true 149 endif 150endif 151 152if have_qt_windowing 153 # Build it! 154 moc_files = qt5_mod.preprocess(moc_headers : moc_headers) 155 gstqmlgl = library('gstqmlgl', sources, moc_files, 156 cpp_args : gst_plugins_good_args + qt_defines, 157 link_args : noseh_link_args, 158 include_directories: [configinc, libsinc], 159 dependencies : [glib_deps, gst_dep, gstvideo_dep, gstgl_dep, gstglproto_dep, qt5qml_dep, optional_deps], 160 override_options : ['cpp_std=c++11'], 161 install: true, 162 install_dir : plugins_install_dir) 163 pkgconfig.generate(gstqmlgl, install_dir : plugins_pkgconfig_install_dir) 164 plugins += [gstqmlgl] 165endif 166