mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-29 11:40:38 +00:00
a2d9584b27
Required to be able to generate coherent bindings for window system specific APIs due to limitations in gobject-introspection. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5020>
217 lines
7.8 KiB
Meson
217 lines
7.8 KiB
Meson
sources = [
|
|
'gstplugin.cc',
|
|
'gstqtelement.cc',
|
|
'gstqsgtexture.cc',
|
|
'gstqtglutility.cc',
|
|
'gstqtoverlay.cc',
|
|
'gstqtsink.cc',
|
|
'gstqtsrc.cc',
|
|
'qtglrenderer.cc',
|
|
'qtitem.cc',
|
|
'qtwindow.cc',
|
|
]
|
|
|
|
moc_headers = [
|
|
'qtitem.h',
|
|
'qtwindow.h',
|
|
'gstqsgtexture.h',
|
|
'qtglrenderer.h',
|
|
]
|
|
|
|
# Define a not-found dependency so this variable is always defined when we're
|
|
# deciding whether to build the qt5 examples
|
|
qt5qml_dep = dependency('', required: false)
|
|
qt5_option = get_option('qt5')
|
|
qt5_egl = get_option('qt-egl')
|
|
qt5_wayland = get_option('qt-wayland')
|
|
qt5_x11 = get_option('qt-x11')
|
|
qt5_method = get_option('qt-method')
|
|
|
|
if qt5_option.disabled()
|
|
subdir_done()
|
|
endif
|
|
|
|
if not have_gstgl
|
|
if qt5_option.enabled()
|
|
error('qt5 qmlglsink plugin is enabled, but gstreamer-gl-1.0 was not found')
|
|
endif
|
|
subdir_done()
|
|
endif
|
|
|
|
if not add_languages('cpp', native: false, required: qt5_option)
|
|
subdir_done()
|
|
endif
|
|
|
|
qt5_mod = import('qt5')
|
|
qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'],
|
|
method: qt5_method, required: qt5_option, static: host_system == 'ios')
|
|
|
|
# On Linux, distros often have the Qt5 pkg-config files and moc in separate
|
|
# packages, so the user may not have both installed. Check for moc and ensure
|
|
# that it's installed.
|
|
# We don't do this check on other OSes because they need to be able to simply
|
|
# point the `QMAKE` env var to `qmake` to build against a particular Qt5.
|
|
if host_system == 'linux' and not meson.is_cross_build()
|
|
moc = find_program('moc-qt5', 'moc', required : qt5_option)
|
|
else
|
|
# We only check if `moc` was found, and then discard it, so we can fake it.
|
|
# This is also a good unit test of the fact that we *don't* use it.
|
|
moc = declare_dependency()
|
|
endif
|
|
|
|
if not qt5qml_dep.found() or not moc.found()
|
|
subdir_done()
|
|
endif
|
|
|
|
optional_deps = []
|
|
qt_defines = []
|
|
have_qpa_include = false
|
|
have_qt_windowing = false
|
|
|
|
# Look for the QPA platform native interface header
|
|
qpa_header_path = join_paths(qt5qml_dep.version(), 'QtGui')
|
|
qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h')
|
|
need_qpa_include = qt5_option.enabled() and (host_system == 'android' or qt5_wayland.enabled())
|
|
if cxx.has_header(qpa_header, dependencies : qt5qml_dep, required: need_qpa_include)
|
|
qt_defines += '-DHAVE_QT_QPA_HEADER'
|
|
qt_defines += '-DQT_QPA_HEADER=' + '<@0@>'.format(qpa_header)
|
|
have_qpa_include = true
|
|
message('Found QtGui QPA header in ' + qpa_header_path)
|
|
endif
|
|
|
|
## Try to come up with all the platform/winsys combinations that will work
|
|
|
|
# X11 windowing
|
|
qt5_x11 = qt5_x11 \
|
|
.require(gstglx11_dep.found(), error_message: 'gstreamer-gl-x11-1.0 is required') \
|
|
.require(gst_gl_have_window_x11, error_message: 'x11 windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_glx, error_message: 'glx platform support in gstreamer-gl is required')
|
|
if qt5_x11.allowed()
|
|
qt5x11extras = dependency('qt5', modules : ['X11Extras'], method: qt5_method, required: qt5_x11)
|
|
if qt5x11extras.found()
|
|
optional_deps += [qt5x11extras, gstglx11_dep]
|
|
qt_defines += ['-DHAVE_QT_X11']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
|
|
# Wayland windowing
|
|
qt5_wayland = qt5_wayland \
|
|
.require(gstglwayland_dep.found(), error_message: 'gstreamer-gl-wayland-1.0 is required') \
|
|
.require(gst_gl_have_window_wayland, error_message: 'wayland windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required') \
|
|
.require(have_qpa_include, error_message: 'QPA platform native interface header is required')
|
|
if qt5_wayland.allowed()
|
|
qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], method: qt5_method, required: qt5_wayland)
|
|
if qt5waylandextras.found()
|
|
optional_deps += [qt5waylandextras, gstglwayland_dep]
|
|
qt_defines += ['-DHAVE_QT_WAYLAND']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
|
|
# EGL windowing for Embedded linux (e.g. i.MX6) with or without windowing
|
|
# support
|
|
qt5_egl = qt5_egl \
|
|
.require(host_system == 'linux') \
|
|
.require(gstglegl_dep.found(), error_message: 'gstreamer-gl-egl-1.0 is required') \
|
|
.require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required')
|
|
if qt5_egl.allowed()
|
|
qt_defines += ['-DHAVE_QT_EGLFS']
|
|
optional_deps += gstglegl_dep
|
|
have_qt_windowing = true
|
|
endif
|
|
|
|
# Android windowing
|
|
if host_system == 'android'
|
|
qt5_android = qt5_option \
|
|
.require(gst_gl_have_window_android, error_message: 'android windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required')
|
|
if gst_gl_have_window_android
|
|
qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], method: qt5_method, required : qt5_android)
|
|
# for gl functions in QtGui/qopenglfunctions.h
|
|
glesv2_dep = cc.find_library('GLESv2', required : qt5_android)
|
|
if glesv2_dep.found() and qt5androidextras.found()
|
|
optional_deps += [qt5androidextras, glesv2_dep]
|
|
qt_defines += ['-DHAVE_QT_ANDROID']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# Win32 windowing
|
|
if host_system == 'windows'
|
|
qt5_win32 = qt5_option \
|
|
.require(gst_gl_have_window_win32, error_message: 'win32 windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_wgl, error_message: 'wgl platform support in gstreamer-gl is required')
|
|
if qt5_win32.allowed()
|
|
# for wglMakeCurrent()
|
|
opengl32_dep = cc.find_library('opengl32', required : qt5_win32)
|
|
if opengl32_dep.found()
|
|
qt_defines += ['-DHAVE_QT_WIN32']
|
|
optional_deps += opengl32_dep
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# macOS windowing
|
|
if host_system == 'darwin'
|
|
qt5_macos = qt5_option \
|
|
.require(gst_gl_have_window_cocoa, error_message: 'cocoa windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_cgl, error_message: 'cgl platform support in gstreamer-gl is required')
|
|
if qt5_macos.allowed()
|
|
qt5macextras = dependency('qt5', modules : ['MacExtras'], method: qt5_method, required : qt5_macos)
|
|
if qt5macextras.found()
|
|
qt_defines += ['-DHAVE_QT_MAC']
|
|
optional_deps += qt5macextras
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# iOS windowing
|
|
if host_system == 'ios'
|
|
qt5_ios = qt5_option \
|
|
.require(gst_gl_have_window_eagl, error_message: 'eagl windowing support in gstreamer-gl is required') \
|
|
.require(gst_gl_have_platform_eagl, error_message: 'eagl platform support in gstreamer-gl is required')
|
|
if qt5_ios.allowed()
|
|
qt_defines += ['-DHAVE_QT_IOS']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
|
|
# EGL windowing for Vivante Framebuffer (e.g. i.MX6)
|
|
qt5_viv_fb = qt5_egl \
|
|
.require(host_system == 'linux') \
|
|
.require(gstglviv_fb_dep.found(), error_message: 'gstreamer-gl-viv_fb-1.0 is required') \
|
|
.require(gst_gl_have_platform_egl, error_message: 'egl platform support in gstreamer-gl is required')
|
|
if qt5_viv_fb.allowed()
|
|
qt_defines += ['-DHAVE_QT_VIV_FB']
|
|
optional_deps += gstglviv_fb_dep
|
|
have_qt_windowing = true
|
|
endif
|
|
|
|
if qt5_option.require(have_qt_windowing).allowed()
|
|
# rpath is needed to be able to load the plugin on macOS inside the devenv
|
|
qmlgl_kwargs = {}
|
|
if host_system == 'darwin'
|
|
fs = import('fs')
|
|
qt_bindir = fs.parent(find_program('qmake').full_path())
|
|
qt_libdir = fs.parent(qt_bindir) / 'lib'
|
|
qmlgl_kwargs += {'build_rpath': qt_libdir}
|
|
endif
|
|
|
|
# Build it!
|
|
moc_files = qt5_mod.preprocess(moc_headers : moc_headers)
|
|
gstqmlgl = library('gstqmlgl', sources, moc_files,
|
|
cpp_args : gst_plugins_good_args + qt_defines,
|
|
link_args : noseh_link_args,
|
|
include_directories: [configinc, libsinc],
|
|
dependencies : [gst_dep, gstvideo_dep, gstgl_dep, gstglproto_dep, qt5qml_dep, optional_deps],
|
|
override_options : ['cpp_std=c++11'],
|
|
kwargs: qmlgl_kwargs,
|
|
install: true,
|
|
install_dir : plugins_install_dir)
|
|
plugins += [gstqmlgl]
|
|
endif
|