gstreamer/subprojects/gst-plugins-bad/sys/mediafoundation/meson.build
Seungha Yang 8b6c3e030b mediafoundation: Fix for UWP build
We don't support D3D11 interop for UWP because some APIs
(specifically MFTEnum2) are desktop application only.
However, the code for symbol loading is commonly used by both UWP and WIN32.
Just link GModule unconditionally which is UWP compatible, and simply don't
try to load any library/symbol dynamically when D3D11 interop is unavailable.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1216>
2021-10-21 05:11:40 +00:00

172 lines
4.9 KiB
Meson

mf_sources = [
'plugin.c',
'gstmfutils.cpp',
'gstmftransform.cpp',
'gstmfvideoenc.cpp',
'gstmfh264enc.cpp',
'gstmfh265enc.cpp',
'gstmfvp9enc.cpp',
'gstmfvideosrc.c',
'gstmfsourceobject.c',
'gstmfdevice.c',
'gstmfaudioenc.cpp',
'gstmfaacenc.cpp',
'gstmfmp3enc.cpp',
'gstmfvideobuffer.cpp',
'gstmfplatloader.c',
]
mf_desktop_sources = [
'gstmfsourcereader.cpp',
'gstwin32devicewatcher.cpp',
]
mf_app_sources = [
'gstmfcapturewinrt.cpp',
'mediacapturewrapper.cpp',
]
mf_header_deps = [
'mfidl.h',
'mfapi.h',
'mfreadwrite.h',
'mferror.h',
'strmif.h',
'mfobjects.h',
'codecapi.h',
]
winapi_desktop = false
winapi_app = false
have_capture_engine = false
have_mf_d3d11 = false
mf_lib_deps = []
mf_config = configuration_data()
extra_c_args = ['-DCOBJMACROS']
extra_cpp_args = []
mf_option = get_option('mediafoundation')
if host_system != 'windows' or mf_option.disabled()
subdir_done()
endif
if cc.get_id() != 'msvc'
if mf_option.enabled()
error('mediafoundation plugin can only be built with MSVC')
endif
subdir_done()
endif
mf_lib = cc.find_library('mf', required : mf_option)
mfplat_lib = cc.find_library('mfplat', required : mf_option)
mfreadwrite_lib = cc.find_library('mfreadwrite', required : mf_option)
mfuuid_lib = cc.find_library('mfuuid', required : mf_option)
strmiids_lib = cc.find_library('strmiids', required : mf_option)
ole32_dep = cc.find_library('ole32', required : mf_option)
runtimeobject_lib = cc.find_library('runtimeobject', required : false)
have_mf_lib = mf_lib.found() and mfplat_lib.found() and mfreadwrite_lib.found() and mfuuid_lib.found() and strmiids_lib.found() and ole32_dep.found()
if not have_mf_lib
if mf_option.enabled()
error('The mediafoundation plugin was enabled explicitly, but required libraries were not found.')
endif
subdir_done()
endif
mf_lib_deps += [mf_lib, mfplat_lib, mfreadwrite_lib, mfuuid_lib, strmiids_lib, ole32_dep]
have_mf_header = true
foreach h: mf_header_deps
if have_mf_header
have_mf_header = cc.has_header(h)
endif
endforeach
if not have_mf_header
if mf_option.enabled()
error('The mediafoundation plugin was enabled explicitly, but required headers were not found.')
endif
subdir_done()
endif
winapi_desktop = cxx.compiles('''#include <winapifamily.h>
#include <wrl.h>
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#error "not win32"
#endif''',
dependencies: mf_lib_deps,
name: 'building for Win32')
if runtimeobject_lib.found()
winapi_app = cxx.compiles('''#include <winapifamily.h>
#include <windows.applicationmodel.core.h>
#include <wrl.h>
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#error "not winrt"
#endif
#ifndef WINVER
#error "unknown minimum supported OS version"
#endif
#if (WINVER < 0x0A00)
#error "Windows 10 API is not guaranteed"
#endif''',
dependencies: [mf_lib_deps, runtimeobject_lib],
name: 'building for WinRT')
endif
if not winapi_desktop and not winapi_app
error('Neither Desktop partition nor App partition')
endif
if winapi_app
if not gstwinrt_dep.found()
if mf_option.enabled()
error('The mediafoundation plugin was enabled explicitly, but GstWinRt library is unavailable')
else
subdir_done()
endif
endif
mf_sources += mf_app_sources
mf_lib_deps += [runtimeobject_lib, gstwinrt_dep]
endif
if winapi_desktop
mf_sources += mf_desktop_sources
# We need d3d11_4.h header for querying "ExtendedNV12SharedTextureSupported"
# Since MFTEnum2 is desktop only we don't support d3d11 interop for UWP build
# And because MFTEnum2 is Windows 10 API, we will load MFTEnum2 symbol
# by using g_module_open() so that keep supporting old OS versions
if gstd3d11_dep.found() and cc.has_header('d3d11_4.h') and cc.has_header('d3d10.h')
have_mf_d3d11 = true
mf_lib_deps += [gstd3d11_dep]
extra_c_args += ['-DGST_USE_UNSTABLE_API']
extra_cpp_args += ['-DGST_USE_UNSTABLE_API']
message ('Enable D3D11 interop for MediaFoundation plugin')
endif
endif
mf_config.set10('GST_MF_WINAPI_APP', winapi_app)
mf_config.set10('GST_MF_WINAPI_DESKTOP', winapi_desktop)
mf_config.set10('GST_MF_HAVE_D3D11', have_mf_d3d11)
configure_file(
output: 'gstmfconfig.h',
configuration: mf_config,
)
# Work around for Windows SDK header issue
# https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-160#windows-header-issues
extra_cpp_args += cxx.get_supported_arguments(['/Zc:twoPhase-'])
gstmediafoundation = library('gstmediafoundation',
mf_sources,
c_args : gst_plugins_bad_args + extra_c_args,
cpp_args : gst_plugins_bad_args + extra_cpp_args,
include_directories : [configinc],
dependencies : [gstbase_dep, gstvideo_dep, gstaudio_dep, gstpbutils_dep, gmodule_dep] + mf_lib_deps,
install : true,
install_dir : plugins_install_dir,
)
pkgconfig.generate(gstmediafoundation, install_dir : plugins_pkgconfig_install_dir)
plugins += [gstmediafoundation]