mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-04 14:38:48 +00:00
93be699ab2
The qt5 and qt6 plugins will now correctly error out if you enable the option, and you can also now explicitly ensure that wayland, x11, eglfs support is actually functional by enabling the options. It was too easy to build non-functional support for these. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4537>
151 lines
5 KiB
Meson
151 lines
5 KiB
Meson
sources = [
|
|
'gstplugin.cc',
|
|
'gstqt6element.cc',
|
|
'gstqsg6glnode.cc',
|
|
'gstqt6glutility.cc',
|
|
'gstqml6glsink.cc',
|
|
'gstqml6glsrc.cc',
|
|
'gstqml6gloverlay.cc',
|
|
'qt6glitem.cc',
|
|
'qt6glwindow.cc',
|
|
'qt6glrenderer.cc',
|
|
]
|
|
|
|
moc_headers = [
|
|
'qt6glitem.h',
|
|
'gstqsg6glnode.h',
|
|
'qt6glwindow.h',
|
|
'qt6glrenderer.h',
|
|
]
|
|
|
|
qt6qml_dep = dependency('', required: false)
|
|
qt6_option = get_option('qt6')
|
|
qt6_egl = get_option('qt-egl')
|
|
qt6_wayland = get_option('qt-wayland')
|
|
qt6_x11 = get_option('qt-x11')
|
|
qt6_method = get_option('qt-method')
|
|
|
|
if qt6_option.disabled()
|
|
subdir_done()
|
|
endif
|
|
|
|
if not have_gstgl
|
|
if qt6_option.enabled()
|
|
error('qt6 qmlglsink plugin is enabled, but gstreamer-gl-1.0 was not found')
|
|
endif
|
|
subdir_done()
|
|
endif
|
|
|
|
if not add_languages('cpp', native: false, required: qt6_option)
|
|
subdir_done()
|
|
endif
|
|
|
|
qt6_mod = import('qt6')
|
|
if not qt6_mod.has_tools()
|
|
if qt6_option.enabled()
|
|
error('qt6 qmlglsink plugin is enabled, but qt specific tools were not found')
|
|
endif
|
|
subdir_done()
|
|
endif
|
|
|
|
qt6qml_dep = dependency('qt6', modules : ['Core', 'Gui', 'Qml', 'Quick'],
|
|
method: qt6_method, required: qt6_option, static: host_system == 'ios')
|
|
if not qt6qml_dep.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(qt6qml_dep.version(), 'QtGui')
|
|
qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h')
|
|
need_qpa_include = qt6_option.enabled() and (host_system == 'android' or qt6_wayland.enabled())
|
|
if cxx.has_header(qpa_header, dependencies : qt6qml_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
|
|
qt6_x11 = qt6_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 qt6_x11.allowed()
|
|
qt_defines += ['-DHAVE_QT_X11']
|
|
have_qt_windowing = true
|
|
endif
|
|
|
|
# Wayland windowing
|
|
qt6_wayland = qt6_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 qt6_wayland.allowed()
|
|
qt6waylandextras = dependency('qt6', modules : ['WaylandClient'], method: qt6_method, required: qt6_wayland)
|
|
if qt6waylandextras.found()
|
|
optional_deps += [qt6waylandextras, 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
|
|
qt6_egl = qt6_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 qt6_egl.allowed()
|
|
qt_defines += ['-DHAVE_QT_EGLFS']
|
|
optional_deps += gstglegl_dep
|
|
have_qt_windowing = true
|
|
endif
|
|
|
|
# TODO: Android windowing
|
|
|
|
# TODO: Win32 windowing
|
|
|
|
# macOS windowing
|
|
if host_system == 'darwin'
|
|
qt6_macos = qt6_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 qt6_macos.allowed()
|
|
qt_defines += ['-DHAVE_QT_MAC']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
|
|
# iOS windowing
|
|
if host_system == 'ios'
|
|
qt6_ios = qt6_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 qt6_ios.allowed()
|
|
qt_defines += ['-DHAVE_QT_IOS']
|
|
have_qt_windowing = true
|
|
endif
|
|
endif
|
|
|
|
if qt6_option.require(have_qt_windowing).allowed()
|
|
# Build it!
|
|
moc_files = qt6_mod.preprocess(moc_headers : moc_headers)
|
|
gstqml6gl = library('gstqml6', 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, qt6qml_dep, optional_deps],
|
|
override_options : ['cpp_std=c++17'],
|
|
install: true,
|
|
install_dir : plugins_install_dir)
|
|
pkgconfig.generate(gstqml6gl, install_dir : plugins_pkgconfig_install_dir)
|
|
plugins += [gstqml6gl]
|
|
endif
|