mf_sources = [ 'gstmfaacdec.cpp', 'gstmfaacenc.cpp', 'gstmfaudiodecoder.cpp', 'gstmfaudioencoder.cpp', 'gstmfdevice.cpp', 'gstmfh264enc.cpp', 'gstmfh265enc.cpp', 'gstmfmp3dec.cpp', 'gstmfmp3enc.cpp', 'gstmfplatloader.cpp', 'gstmfsourceobject.cpp', 'gstmftransform.cpp', 'gstmfutils.cpp', 'gstmfvideobuffer.cpp', 'gstmfvideoencoder.cpp', 'gstmfvideosrc.cpp', 'gstmfvp9enc.cpp', 'plugin.cpp', ] 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 #include #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 #include #include #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, ) plugins += [gstmediafoundation]