2021-11-07 19:28:16 +00:00
|
|
|
project('mpv',
|
|
|
|
'c',
|
|
|
|
license: ['GPL2+', 'LGPL2.1+'],
|
|
|
|
version: files('./VERSION'),
|
2022-01-08 18:03:30 +00:00
|
|
|
meson_version: '>=0.60.3',
|
2021-11-07 19:28:16 +00:00
|
|
|
default_options: [
|
|
|
|
'buildtype=debugoptimized',
|
|
|
|
'b_lundef=false',
|
|
|
|
'c_std=c11',
|
|
|
|
'warning_level=1',
|
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
build_root = meson.project_build_root()
|
|
|
|
source_root = meson.project_source_root()
|
|
|
|
python = find_program('python3')
|
|
|
|
|
2022-08-12 18:02:41 +00:00
|
|
|
# ffmpeg
|
|
|
|
libavcodec = dependency('libavcodec', version: '>= 58.12.100')
|
|
|
|
libavfilter = dependency('libavfilter', version: '>= 7.14.100')
|
|
|
|
libavformat = dependency('libavformat', version: '>= 58.9.100')
|
|
|
|
libavutil = dependency('libavutil', version: '>= 56.12.100')
|
|
|
|
libswresample = dependency('libswresample', version: '>= 3.0.100')
|
|
|
|
libswscale = dependency('libswscale', version: '>= 5.0.101')
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
libass = dependency('libass', version: '>= 0.12.2')
|
|
|
|
pthreads = dependency('threads')
|
|
|
|
|
2022-06-15 22:06:56 +00:00
|
|
|
# the dependency order of libass -> ffmpeg is necessary due to
|
|
|
|
# static linking symbol resolution between fontconfig and MinGW
|
|
|
|
dependencies = [libass,
|
2022-08-12 18:02:41 +00:00
|
|
|
libavcodec,
|
|
|
|
libavfilter,
|
|
|
|
libavformat,
|
|
|
|
libavutil,
|
|
|
|
libswresample,
|
|
|
|
libswscale,
|
2021-11-07 19:28:16 +00:00
|
|
|
pthreads]
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
# Keeps track of all enabled/disabled features
|
|
|
|
features = {
|
|
|
|
'debug': get_option('debug'),
|
|
|
|
'ffmpeg': true,
|
|
|
|
'gpl': get_option('gpl'),
|
|
|
|
'jpegxl': libavformat.version().version_compare('>= 59.27.100'),
|
|
|
|
'libass': true,
|
|
|
|
'threads': true,
|
|
|
|
}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
# generic sources
|
|
|
|
sources = files(
|
|
|
|
## Audio
|
|
|
|
'audio/aframe.c',
|
|
|
|
'audio/chmap.c',
|
|
|
|
'audio/chmap_sel.c',
|
|
|
|
'audio/decode/ad_lavc.c',
|
|
|
|
'audio/decode/ad_spdif.c',
|
|
|
|
'audio/filter/af_drop.c',
|
|
|
|
'audio/filter/af_format.c',
|
|
|
|
'audio/filter/af_lavcac3enc.c',
|
|
|
|
'audio/filter/af_scaletempo.c',
|
|
|
|
'audio/filter/af_scaletempo2.c',
|
|
|
|
'audio/filter/af_scaletempo2_internals.c',
|
|
|
|
'audio/fmt-conversion.c',
|
|
|
|
'audio/format.c',
|
|
|
|
'audio/out/ao.c',
|
|
|
|
'audio/out/ao_lavc.c',
|
|
|
|
'audio/out/ao_null.c',
|
|
|
|
'audio/out/ao_pcm.c',
|
|
|
|
'audio/out/buffer.c',
|
|
|
|
|
|
|
|
## Core
|
|
|
|
'common/av_common.c',
|
|
|
|
'common/av_log.c',
|
|
|
|
'common/codecs.c',
|
|
|
|
'common/common.c',
|
|
|
|
'common/encode_lavc.c',
|
|
|
|
'common/msg.c',
|
|
|
|
'common/playlist.c',
|
|
|
|
'common/recorder.c',
|
|
|
|
'common/stats.c',
|
|
|
|
'common/tags.c',
|
|
|
|
'common/version.c',
|
|
|
|
|
|
|
|
## Demuxers
|
|
|
|
'demux/codec_tags.c',
|
|
|
|
'demux/cue.c',
|
|
|
|
'demux/cache.c',
|
|
|
|
'demux/demux.c',
|
|
|
|
'demux/demux_cue.c',
|
|
|
|
'demux/demux_disc.c',
|
|
|
|
'demux/demux_edl.c',
|
|
|
|
'demux/demux_lavf.c',
|
|
|
|
'demux/demux_mf.c',
|
|
|
|
'demux/demux_mkv.c',
|
|
|
|
'demux/demux_mkv_timeline.c',
|
|
|
|
'demux/demux_null.c',
|
|
|
|
'demux/demux_playlist.c',
|
|
|
|
'demux/demux_raw.c',
|
|
|
|
'demux/demux_timeline.c',
|
|
|
|
'demux/ebml.c',
|
|
|
|
'demux/packet.c',
|
|
|
|
'demux/timeline.c',
|
|
|
|
|
|
|
|
## Filters
|
|
|
|
'filters/f_async_queue.c',
|
|
|
|
'filters/f_autoconvert.c',
|
|
|
|
'filters/f_auto_filters.c',
|
|
|
|
'filters/f_decoder_wrapper.c',
|
|
|
|
'filters/f_demux_in.c',
|
|
|
|
'filters/f_hwtransfer.c',
|
|
|
|
'filters/f_lavfi.c',
|
|
|
|
'filters/f_output_chain.c',
|
|
|
|
'filters/f_swresample.c',
|
|
|
|
'filters/f_swscale.c',
|
|
|
|
'filters/f_utils.c',
|
|
|
|
'filters/filter.c',
|
|
|
|
'filters/frame.c',
|
|
|
|
'filters/user_filters.c',
|
|
|
|
|
|
|
|
## Input
|
|
|
|
'input/cmd.c',
|
|
|
|
'input/event.c',
|
|
|
|
'input/input.c',
|
|
|
|
'input/ipc.c',
|
|
|
|
'input/keycodes.c',
|
|
|
|
|
|
|
|
## Misc
|
|
|
|
'misc/bstr.c',
|
|
|
|
'misc/charset_conv.c',
|
|
|
|
'misc/dispatch.c',
|
|
|
|
'misc/json.c',
|
|
|
|
'misc/natural_sort.c',
|
|
|
|
'misc/node.c',
|
2022-08-15 01:28:54 +00:00
|
|
|
'misc/random.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'misc/rendezvous.c',
|
|
|
|
'misc/thread_pool.c',
|
|
|
|
'misc/thread_tools.c',
|
|
|
|
|
|
|
|
## Options
|
|
|
|
'options/m_config_core.c',
|
|
|
|
'options/m_config_frontend.c',
|
|
|
|
'options/m_option.c',
|
|
|
|
'options/m_property.c',
|
|
|
|
'options/options.c',
|
|
|
|
'options/parse_commandline.c',
|
|
|
|
'options/parse_configfile.c',
|
|
|
|
'options/path.c',
|
|
|
|
|
|
|
|
## Player
|
|
|
|
'player/audio.c',
|
|
|
|
'player/client.c',
|
|
|
|
'player/command.c',
|
|
|
|
'player/configfiles.c',
|
|
|
|
'player/external_files.c',
|
|
|
|
'player/loadfile.c',
|
|
|
|
'player/main.c',
|
|
|
|
'player/misc.c',
|
|
|
|
'player/osd.c',
|
|
|
|
'player/playloop.c',
|
|
|
|
'player/screenshot.c',
|
|
|
|
'player/scripting.c',
|
|
|
|
'player/sub.c',
|
|
|
|
'player/video.c',
|
|
|
|
|
|
|
|
## Streams
|
|
|
|
'stream/cookies.c',
|
|
|
|
'stream/stream.c',
|
|
|
|
'stream/stream_avdevice.c',
|
|
|
|
'stream/stream_cb.c',
|
|
|
|
'stream/stream_concat.c',
|
|
|
|
'stream/stream_edl.c',
|
|
|
|
'stream/stream_file.c',
|
|
|
|
'stream/stream_lavf.c',
|
|
|
|
'stream/stream_memory.c',
|
|
|
|
'stream/stream_mf.c',
|
|
|
|
'stream/stream_null.c',
|
|
|
|
'stream/stream_slice.c',
|
|
|
|
|
|
|
|
## Subtitles
|
|
|
|
'sub/ass_mp.c',
|
|
|
|
'sub/dec_sub.c',
|
|
|
|
'sub/draw_bmp.c',
|
|
|
|
'sub/filter_sdh.c',
|
|
|
|
'sub/img_convert.c',
|
|
|
|
'sub/lavc_conv.c',
|
|
|
|
'sub/osd.c',
|
|
|
|
'sub/osd_libass.c',
|
|
|
|
'sub/sd_ass.c',
|
|
|
|
'sub/sd_lavc.c',
|
|
|
|
|
|
|
|
## Video
|
|
|
|
'video/csputils.c',
|
|
|
|
'video/decode/vd_lavc.c',
|
|
|
|
'video/filter/refqueue.c',
|
|
|
|
'video/filter/vf_format.c',
|
|
|
|
'video/filter/vf_sub.c',
|
|
|
|
'video/fmt-conversion.c',
|
|
|
|
'video/hwdec.c',
|
|
|
|
'video/image_loader.c',
|
|
|
|
'video/image_writer.c',
|
|
|
|
'video/img_format.c',
|
|
|
|
'video/mp_image.c',
|
|
|
|
'video/mp_image_pool.c',
|
|
|
|
'video/out/aspect.c',
|
|
|
|
'video/out/bitmap_packer.c',
|
|
|
|
'video/out/dither.c',
|
|
|
|
'video/out/dr_helper.c',
|
|
|
|
'video/out/filter_kernels.c',
|
|
|
|
'video/out/gpu/context.c',
|
|
|
|
'video/out/gpu/error_diffusion.c',
|
|
|
|
'video/out/gpu/hwdec.c',
|
|
|
|
'video/out/gpu/lcms.c',
|
|
|
|
'video/out/gpu/libmpv_gpu.c',
|
|
|
|
'video/out/gpu/osd.c',
|
|
|
|
'video/out/gpu/ra.c',
|
|
|
|
'video/out/gpu/shader_cache.c',
|
|
|
|
'video/out/gpu/spirv.c',
|
|
|
|
'video/out/gpu/user_shaders.c',
|
|
|
|
'video/out/gpu/utils.c',
|
|
|
|
'video/out/gpu/video.c',
|
|
|
|
'video/out/gpu/video_shaders.c',
|
|
|
|
'video/out/libmpv_sw.c',
|
|
|
|
'video/out/vo.c',
|
|
|
|
'video/out/vo_gpu.c',
|
|
|
|
'video/out/vo_image.c',
|
|
|
|
'video/out/vo_lavc.c',
|
|
|
|
'video/out/vo_libmpv.c',
|
|
|
|
'video/out/vo_null.c',
|
|
|
|
'video/out/vo_tct.c',
|
|
|
|
'video/out/win_state.c',
|
|
|
|
'video/repack.c',
|
|
|
|
'video/sws_utils.c',
|
|
|
|
|
|
|
|
## osdep
|
|
|
|
'osdep/io.c',
|
|
|
|
'osdep/semaphore_osx.c',
|
|
|
|
'osdep/subprocess.c',
|
|
|
|
'osdep/threads.c',
|
|
|
|
'osdep/timer.c',
|
|
|
|
|
|
|
|
## tree_allocator
|
|
|
|
'ta/ta.c',
|
|
|
|
'ta/ta_talloc.c',
|
|
|
|
'ta/ta_utils.c'
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# compiler stuff
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
|
|
|
|
flags = ['-D_ISOC99_SOURCE', '-D_GNU_SOURCE',
|
|
|
|
'-D_FILE_OFFSET_BITS=64']
|
|
|
|
link_flags = []
|
|
|
|
|
|
|
|
test_flags = ['-Werror=implicit-function-declaration',
|
|
|
|
'-Wno-error=deprecated-declarations',
|
|
|
|
'-Wno-error=unused-function',
|
|
|
|
'-Wempty-body',
|
|
|
|
'-Wdisabled-optimization',
|
|
|
|
'-Wstrict-prototypes',
|
|
|
|
'-Wno-format-zero-length',
|
|
|
|
'-Wno-redundant-decls',
|
|
|
|
'-Wvla',
|
|
|
|
'-Wno-format-truncation',
|
|
|
|
'-Wimplicit-fallthrough',
|
|
|
|
'-fno-math-errno']
|
|
|
|
|
|
|
|
flags += cc.get_supported_arguments(test_flags)
|
|
|
|
|
2021-11-15 00:34:51 +00:00
|
|
|
if cc.has_multi_arguments('-Wformat', '-Werror=format-security')
|
|
|
|
flags += '-Werror=format-security'
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
if cc.get_id() == 'gcc'
|
|
|
|
gcc_flags = ['-Wundef', '-Wmissing-prototypes', '-Wshadow',
|
|
|
|
'-Wno-switch', '-Wparentheses', '-Wpointer-arith',
|
|
|
|
'-Wno-pointer-sign',
|
|
|
|
# GCC bug 66425
|
|
|
|
'-Wno-unused-result']
|
|
|
|
flags += gcc_flags
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.get_id() == 'clang'
|
2021-11-15 17:24:06 +00:00
|
|
|
clang_flags = ['-Wno-logical-op-parentheses', '-Wno-switch',
|
|
|
|
'-Wno-tautological-compare', '-Wno-pointer-sign',
|
2021-11-07 19:28:16 +00:00
|
|
|
'-Wno-tautological-constant-out-of-range-compare']
|
|
|
|
flags += clang_flags
|
|
|
|
endif
|
|
|
|
|
|
|
|
darwin = host_machine.system() == 'darwin'
|
|
|
|
win32 = host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
|
2022-08-13 00:25:50 +00:00
|
|
|
posix = not win32
|
|
|
|
features += {'posix': posix}
|
|
|
|
features += {'dos-paths': win32, 'win32': win32}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
mswin_flags = ['-D_WIN32_WINNT=0x0602', '-DUNICODE', '-DCOBJMACROS',
|
|
|
|
'-DINITGUID', '-U__STRICT_ANSI__']
|
|
|
|
|
|
|
|
if host_machine.system() == 'windows'
|
|
|
|
flags += [mswin_flags, '-D__USE_MINGW_ANSI_STDIO=1']
|
|
|
|
endif
|
|
|
|
|
|
|
|
if host_machine.system() == 'cygwin'
|
|
|
|
flags += [mswin_flags, '-mwin32']
|
|
|
|
endif
|
|
|
|
|
|
|
|
noexecstack = false
|
|
|
|
if cc.has_link_argument('-Wl,-z,noexecstack')
|
|
|
|
link_flags += '-Wl,-z,noexecstack'
|
|
|
|
noexecstack = true
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_link_argument('-Wl,--nxcompat,--no-seh,--dynamicbase')
|
|
|
|
link_flags += '-Wl,--nxcompat,--no-seh,--dynamicbase'
|
|
|
|
noexecstack = true
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'noexecstack': noexecstack}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'build-date': get_option('build-date')}
|
2022-08-16 16:41:52 +00:00
|
|
|
if not features['build-date']
|
2021-11-07 19:28:16 +00:00
|
|
|
flags += '-DNO_BUILD_TIMESTAMPS'
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'ta-leak-report': get_option('ta-leak-report')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-10-29 03:01:25 +00:00
|
|
|
libdl_dep = cc.find_library('dl', required: false)
|
2022-11-20 18:04:04 +00:00
|
|
|
features += {'libdl': cc.has_function('dlopen', dependencies: libdl_dep, prefix: '#include <dlfcn.h>')}
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['libdl']
|
2022-01-29 08:48:06 +00:00
|
|
|
dependencies += libdl_dep
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
cplugins = get_option('cplugins').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['libdl'] and not win32 and cc.has_link_argument('-rdynamic'),
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'cplugins not supported by the os or compiler!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'cplugins': cplugins.allowed()}
|
|
|
|
if features['cplugins']
|
2021-11-07 19:28:16 +00:00
|
|
|
link_flags += '-rdynamic'
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'tests': get_option('tests')}
|
|
|
|
if features['tests']
|
2021-11-26 14:29:02 +00:00
|
|
|
sources += files('test/chmap.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'test/gl_video.c',
|
|
|
|
'test/img_format.c',
|
|
|
|
'test/json.c',
|
|
|
|
'test/linked_list.c',
|
|
|
|
'test/paths.c',
|
|
|
|
'test/scale_sws.c',
|
|
|
|
'test/scale_test.c',
|
|
|
|
'test/tests.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 17:44:51 +00:00
|
|
|
# Note: this include is only used for windows pthreads and
|
|
|
|
# must be accompanied immediately by the following flags.
|
|
|
|
# This currently works because these are the last flags set
|
|
|
|
# in the build for windows. Adding any new flags after this
|
|
|
|
# will probably break something.
|
2021-11-07 19:28:16 +00:00
|
|
|
includedir = []
|
|
|
|
win32_pthreads = get_option('win32-internal-pthreads').require(
|
|
|
|
win32 and not posix,
|
|
|
|
error_message: 'the os is not win32!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'win32-internal-pthreads': win32_pthreads.allowed()}
|
|
|
|
if features['win32-internal-pthreads']
|
2021-11-07 19:28:16 +00:00
|
|
|
flags += ['-isystem', '-I', '-DIN_WINPTHREAD']
|
|
|
|
# Note: Adding this include causes POSIX_TIMERS to be defined for
|
|
|
|
# unclear reasons (some confusion with <pthread.h> probably).
|
|
|
|
# Hack around it by using HAVE_WIN32_INTERNAL_PTHREADS.
|
|
|
|
includedir += include_directories('osdep/win32/include')
|
|
|
|
sources += files('osdep/win32/pthread.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
pthread_debug = get_option('pthread-debug').require(
|
|
|
|
win32_pthreads.disabled(),
|
|
|
|
error_message: 'win32-internal-pthreads was found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'pthread-debug': pthread_debug.allowed()}
|
|
|
|
if features['pthread-debug']
|
2021-11-07 19:28:16 +00:00
|
|
|
flags += '-DMP_PTHREAD_DEBUG'
|
|
|
|
endif
|
|
|
|
|
|
|
|
add_project_arguments(flags, language: 'c')
|
|
|
|
add_project_link_arguments(link_flags, language: ['c', 'objc'])
|
|
|
|
|
|
|
|
|
|
|
|
# osdep
|
|
|
|
cocoa = dependency('appleframeworks', modules: ['Cocoa', 'IOKit', 'QuartzCore'],
|
|
|
|
required: get_option('cocoa'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'cocoa': cocoa.found()}
|
|
|
|
if features['cocoa']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += cocoa
|
|
|
|
sources += files('osdep/macosx_application.m',
|
|
|
|
'osdep/macosx_events.m',
|
|
|
|
'osdep/macosx_menubar.m',
|
|
|
|
'osdep/main-fn-cocoa.c',
|
|
|
|
'osdep/path-macosx.m',
|
|
|
|
'video/out/cocoa_common.m',
|
|
|
|
'video/out/cocoa/events_view.m',
|
|
|
|
'video/out/cocoa/video_view.m',
|
|
|
|
'video/out/cocoa/window.m')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if posix
|
|
|
|
sources += files('input/ipc-unix.c',
|
|
|
|
'osdep/path-unix.c',
|
|
|
|
'osdep/polldev.c',
|
|
|
|
'osdep/subprocess-posix.c',
|
|
|
|
'osdep/terminal-unix.c',
|
|
|
|
'sub/filter_regex.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if posix and not features['cocoa']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('osdep/main-fn-unix.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if darwin
|
|
|
|
sources += files('osdep/timer-darwin.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if posix and not darwin
|
|
|
|
sources += files('osdep/timer-linux.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
cd_devices = {
|
|
|
|
'windows': 'D:',
|
|
|
|
'cygwin': 'D:',
|
|
|
|
'darwin': '/dev/disk1',
|
|
|
|
'freebsd': '/dev/cd0',
|
|
|
|
'openbsd': '/dev/rcd0c',
|
|
|
|
'linux': '/dev/sr0',
|
|
|
|
}
|
|
|
|
if host_machine.system() in cd_devices
|
|
|
|
cd_device = cd_devices[host_machine.system()]
|
|
|
|
else
|
|
|
|
cd_device = '/dev/cdrom'
|
|
|
|
endif
|
|
|
|
|
|
|
|
dvd_devices = {
|
|
|
|
'windows': 'D:',
|
|
|
|
'cygwin': 'D:',
|
|
|
|
'darwin': '/dev/diskN',
|
|
|
|
'freebsd': '/dev/cd0',
|
|
|
|
'openbsd': '/dev/rcd0c',
|
|
|
|
'linux': '/dev/sr0',
|
|
|
|
}
|
|
|
|
if host_machine.system() in cd_devices
|
|
|
|
dvd_device = dvd_devices[host_machine.system()]
|
|
|
|
else
|
|
|
|
dvd_device = '/dev/dvd'
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'android': host_machine.system() == 'android'}
|
|
|
|
if features['android']
|
2021-11-15 17:24:06 +00:00
|
|
|
dependencies += cc.find_library('android')
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('audio/out/ao_audiotrack.c',
|
2021-11-15 17:24:06 +00:00
|
|
|
'misc/jni.c',
|
|
|
|
'osdep/android/strnlen.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'video/out/android_common.c',
|
|
|
|
'video/out/vo_mediacodec_embed.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
uwp_opt = get_option('uwp').require(
|
|
|
|
not get_option('cplayer'),
|
|
|
|
error_message: 'cplayer is not false!',
|
|
|
|
)
|
|
|
|
uwp = cc.find_library('windowsapp', required: uwp_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'uwp': uwp.found()}
|
|
|
|
if features['uwp']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += uwp
|
|
|
|
sources += files('osdep/path-uwp.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'win32-executable': win32 and get_option('cplayer')}
|
2021-11-07 19:28:16 +00:00
|
|
|
if win32
|
|
|
|
sources += files('osdep/timer-win2.c',
|
|
|
|
'osdep/w32_keyboard.c',
|
|
|
|
'osdep/windows_utils.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'win32-desktop': win32 and not uwp.found()}
|
|
|
|
if features['win32-desktop']
|
2021-11-07 19:28:16 +00:00
|
|
|
win32_desktop_libs = [cc.find_library('avrt'),
|
|
|
|
cc.find_library('dwmapi'),
|
|
|
|
cc.find_library('gdi32'),
|
|
|
|
cc.find_library('ole32'),
|
|
|
|
cc.find_library('uuid'),
|
|
|
|
cc.find_library('version'),
|
|
|
|
cc.find_library('winmm')]
|
|
|
|
dependencies += win32_desktop_libs
|
|
|
|
sources += files('input/ipc-win.c',
|
|
|
|
'osdep/main-fn-win.c',
|
|
|
|
'osdep/path-win.c',
|
|
|
|
'osdep/subprocess-win.c',
|
|
|
|
'osdep/terminal-win.c',
|
|
|
|
'video/out/w32_common.c',
|
|
|
|
'video/out/win32/displayconfig.c',
|
|
|
|
'video/out/win32/droptarget.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if not posix and not features['win32-desktop']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('input/ipc-dummy.c',
|
|
|
|
'osdep/subprocess-dummy.c',
|
|
|
|
'osdep/terminal-dummy.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'glob-posix': cc.has_function('glob', prefix: '#include <glob.h>')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'glob-win32': win32 and not posix}
|
|
|
|
if features['glob-win32']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('osdep/glob-win.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'glob': features['glob-posix'] or features['glob-win32']}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'vt.h': cc.has_header_symbol('sys/vt.h', 'VT_GETMODE')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'consio.h': not features['vt.h'] and cc.has_header_symbol('sys/consio.h', 'VT_GETMODE')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
fragments = join_paths(source_root, 'waftools', 'fragments')
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'glibc-thread-name': cc.compiles(files(join_paths(fragments, 'glibc_thread_name.c')),
|
|
|
|
name: 'glibc-thread-name check') and posix}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'osx-thread-name': false}
|
|
|
|
if not features['glibc-thread-name']
|
|
|
|
features += {'osx-thread-name': cc.compiles(files(join_paths(fragments, 'osx_thread_name.c')),
|
|
|
|
name: 'osx-thread-name check')}
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'bsd-thread-name': false}
|
|
|
|
if not features['osx-thread-name'] and not features['glibc-thread-name']
|
|
|
|
features += {'bsd-thread-name': cc.compiles(files(join_paths(fragments, 'bsd_thread_name.c')),
|
|
|
|
name: 'bsd-thread-name check')}
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'bsd-fstatfs': cc.has_function('fstatfs', prefix: '#include <sys/mount.h>\n#include <sys/param.h>')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'linux-fstatfs': cc.has_function('fstatfs', prefix: '#include <sys/vfs.h>')}
|
2022-08-13 00:25:50 +00:00
|
|
|
|
|
|
|
vector = get_option('vector').require(
|
|
|
|
cc.compiles(files(join_paths(fragments, 'vector.c')), name: 'vector check'),
|
|
|
|
error_message: 'the compiler does not support gcc vectors!',
|
|
|
|
)
|
|
|
|
features += {'vector': vector.allowed()}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
# various file generations
|
|
|
|
tools_directory = join_paths(source_root, 'TOOLS')
|
|
|
|
file2string = find_program(join_paths(tools_directory, 'file2string.py'))
|
|
|
|
matroska = find_program(join_paths(tools_directory, 'matroska.py'))
|
|
|
|
version_py = find_program(join_paths(source_root, 'version.py'))
|
|
|
|
|
|
|
|
subdir('generated')
|
|
|
|
subdir(join_paths('generated', 'etc'))
|
|
|
|
subdir(join_paths('generated', 'sub'))
|
|
|
|
|
|
|
|
if darwin
|
|
|
|
subdir(join_paths('generated', 'TOOLS', 'osxbundle', 'mpv.app', 'Contents', 'Resources'))
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# misc dependencies
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'av-channel-layout': libavutil.version().version_compare('>= 57.24.100')}
|
|
|
|
if features['av-channel-layout']
|
2022-06-01 20:50:49 +00:00
|
|
|
sources += files('audio/chmap_avchannel.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
cdda_opt = get_option('cdda').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
|
|
|
cdda = dependency('libcdio_paranoia', required: cdda_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'cdda': cdda.found()}
|
|
|
|
if features['cdda']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += cdda
|
|
|
|
sources += files('stream/stream_cdda.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
dvbin = get_option('dvbin').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'dvbin': dvbin.allowed()}
|
|
|
|
if features['dvbin']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('stream/dvb_tune.c',
|
|
|
|
'stream/stream_dvb.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
dvdnav_opt = get_option('dvdnav').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
|
|
|
dvdnav = dependency('dvdnav', version: '>= 4.2.0', required: dvdnav_opt)
|
|
|
|
dvdread = dependency('dvdread', version: '>= 4.1.0', required: dvdnav_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'dvdnav': dvdnav.found() and dvdread.found()}
|
|
|
|
if features['dvdnav']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += [dvdnav, dvdread]
|
|
|
|
sources += files('stream/stream_dvdnav.c')
|
|
|
|
endif
|
|
|
|
|
2022-01-08 18:03:30 +00:00
|
|
|
iconv = dependency('iconv', required: get_option('iconv'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'iconv': iconv.found()}
|
|
|
|
if features['iconv']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += iconv
|
|
|
|
endif
|
|
|
|
|
|
|
|
javascript = dependency('mujs', version: '>= 1.0.0', required: get_option('javascript'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'javascript': javascript.found()}
|
|
|
|
if features['javascript']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += javascript
|
|
|
|
sources += files('player/javascript.c',
|
|
|
|
'sub/filter_jsre.c')
|
|
|
|
subdir(join_paths('generated', 'player', 'javascript'))
|
|
|
|
endif
|
|
|
|
|
|
|
|
lcms2 = dependency('lcms2', version: '>= 2.6', required: get_option('lcms2'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'lcms2': lcms2.found()}
|
|
|
|
if features['lcms2']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += lcms2
|
|
|
|
endif
|
|
|
|
|
|
|
|
libarchive = dependency('libarchive', version: '>= 3.4.0', required: get_option('libarchive'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libarchive': libarchive.found()}
|
|
|
|
if features['libarchive']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += libarchive
|
|
|
|
sources += files('demux/demux_libarchive.c',
|
|
|
|
'stream/stream_libarchive.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
libavdevice = dependency('libavdevice', version: '>= 57.0.0', required: get_option('libavdevice'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libavdevice': libavdevice.found()}
|
|
|
|
if features['libavdevice']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += libavdevice
|
|
|
|
endif
|
|
|
|
|
|
|
|
libbluray = dependency('libbluray', version: '>= 0.3.0', required: get_option('libbluray'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libbluray': libbluray.found()}
|
|
|
|
if features['libbluray']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += libbluray
|
|
|
|
sources += files('stream/stream_bluray.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
libm = cc.find_library('m', required: false)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libm': libm.found()}
|
|
|
|
if features['libm']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += libm
|
|
|
|
endif
|
|
|
|
|
|
|
|
librt = cc.find_library('rt', required: false)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'librt': librt.found()}
|
|
|
|
if features['librt']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += librt
|
|
|
|
endif
|
|
|
|
|
2022-08-12 18:02:41 +00:00
|
|
|
lua = dependency('', required: false)
|
2021-11-07 19:28:16 +00:00
|
|
|
lua_opt = get_option('lua')
|
|
|
|
if lua_opt != 'disabled'
|
2021-11-15 00:39:25 +00:00
|
|
|
lua_version = [['lua', ['>=5.1.0', '<5.3.0']], # generic lua.pc
|
|
|
|
['lua52', '>= 5.2.0'],
|
2021-11-07 19:28:16 +00:00
|
|
|
['lua5.2', '>= 5.2.0'],
|
|
|
|
['lua-5.2', '>= 5.2.0'],
|
|
|
|
['luajit', '>= 2.0.0'],
|
|
|
|
['lua51', '>= 5.1.0'],
|
|
|
|
['lua5.1', '>= 5.1.0'],
|
|
|
|
['lua-5.1', '>= 5.1.0']]
|
|
|
|
foreach version : lua_version
|
|
|
|
if lua_opt == 'auto' or lua_opt == 'enabled'
|
2022-08-12 18:02:41 +00:00
|
|
|
lua = dependency(version[0], version: version[1], required: false)
|
|
|
|
if lua.found()
|
2021-11-07 19:28:16 +00:00
|
|
|
break
|
|
|
|
endif
|
|
|
|
elif lua_opt == version[0]
|
2022-08-12 18:02:41 +00:00
|
|
|
lua = dependency(version[0], version: version[1])
|
|
|
|
if lua.found()
|
2021-11-07 19:28:16 +00:00
|
|
|
break
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'lua': lua.found()}
|
|
|
|
lua_version = lua.name()
|
|
|
|
if features['lua']
|
2022-08-12 18:02:41 +00:00
|
|
|
dependencies += lua
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('player/lua.c')
|
|
|
|
subdir(join_paths('generated', 'player', 'lua'))
|
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
if not features['lua'] and lua_opt == 'enabled'
|
2021-11-07 19:28:16 +00:00
|
|
|
error('lua enabled but no suitable lua version could be found!')
|
|
|
|
endif
|
|
|
|
|
|
|
|
rubberband = dependency('rubberband', version: '>= 1.8.0', required: get_option('rubberband'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'rubberband': rubberband.found()}
|
|
|
|
features += {'rubberband-3': rubberband.version().version_compare('>= 3.0.0')}
|
|
|
|
if features['rubberband']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += rubberband
|
|
|
|
sources += files('audio/filter/af_rubberband.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
sdl2 = dependency('sdl2', required: get_option('sdl2'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sdl2': sdl2.found()}
|
|
|
|
if features['sdl2']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += sdl2
|
|
|
|
endif
|
|
|
|
|
|
|
|
sdl2_gamepad = get_option('sdl2-gamepad').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['sdl2'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'sdl2 was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sdl2-gamepad': sdl2_gamepad.allowed()}
|
|
|
|
if features['sdl2-gamepad']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('input/sdl_gamepad.c')
|
|
|
|
endif
|
|
|
|
|
2022-11-21 02:37:12 +00:00
|
|
|
stdatomic_dep = cc.find_library('atomic', required: false)
|
|
|
|
features += {'stdatomic': cc.has_header_symbol('stdatomic.h', 'atomic_int', dependencies: stdatomic_dep,
|
|
|
|
required: get_option('stdatomic'))}
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['stdatomic']
|
2022-11-21 02:37:12 +00:00
|
|
|
dependencies += stdatomic_dep
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2021-11-15 00:43:34 +00:00
|
|
|
uchardet_opt = get_option('uchardet').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['iconv'],
|
2021-11-15 00:43:34 +00:00
|
|
|
error_message: 'iconv was not found!',
|
|
|
|
)
|
|
|
|
uchardet = dependency('uchardet', required: uchardet_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'uchardet': uchardet.found()}
|
|
|
|
if features['uchardet']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += uchardet
|
|
|
|
endif
|
|
|
|
|
|
|
|
vapoursynth = dependency('vapoursynth', version: '>= 24', required: get_option('vapoursynth'))
|
|
|
|
vapoursynth_script = dependency('vapoursynth-script', version: '>= 23',
|
|
|
|
required: get_option('vapoursynth'))
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'vapoursynth': vapoursynth.found() and vapoursynth_script.found()}
|
|
|
|
if features['vapoursynth']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += [vapoursynth, vapoursynth_script]
|
|
|
|
sources += files('video/filter/vf_vapoursynth.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
zimg = dependency('zimg', version: '>= 2.9', required: get_option('zimg'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'zimg': zimg.found()}
|
|
|
|
if features['zimg']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += zimg
|
|
|
|
sources += files('video/filter/vf_fingerprint.c',
|
|
|
|
'video/zimg.c')
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['tests']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('test/repack.c',
|
|
|
|
'test/scale_zimg.c')
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
zlib = dependency('zlib', required: get_option('zlib'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'zlib': zlib.found()}
|
|
|
|
if features['zlib']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += zlib
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# audio output dependencies
|
|
|
|
alsa = dependency('alsa', version: '>= 1.0.18', required: get_option('alsa'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'alsa': alsa.found()}
|
|
|
|
if features['alsa']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += alsa
|
|
|
|
sources += files('audio/out/ao_alsa.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
audiounit = {
|
|
|
|
'deps': dependency('appleframeworks', modules: ['Foundation', 'AudioToolbox'],
|
|
|
|
required: get_option('audiounit')),
|
|
|
|
'symbol': cc.has_header_symbol('AudioToolbox/AudioToolbox.h', 'kAudioUnitSubType_RemoteIO',
|
|
|
|
required: get_option('audiounit')),
|
|
|
|
}
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'audiounit': audiounit['deps'].found() and audiounit['symbol']}
|
|
|
|
if features['audiounit']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += audiounit['deps']
|
|
|
|
sources += files('audio/out/ao_audiounit.m')
|
|
|
|
endif
|
|
|
|
|
2022-05-12 15:12:31 +00:00
|
|
|
coreaudio = dependency('appleframeworks', modules: ['CoreFoundation', 'CoreAudio',
|
2021-11-07 19:28:16 +00:00
|
|
|
'AudioUnit', 'AudioToolbox'], required: get_option('coreaudio'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'coreaudio': coreaudio.found()}
|
|
|
|
if features['coreaudio']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += coreaudio
|
|
|
|
sources += files('audio/out/ao_coreaudio.c',
|
|
|
|
'audio/out/ao_coreaudio_exclusive.c',
|
|
|
|
'audio/out/ao_coreaudio_properties.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['audiounit'] or features['coreaudio']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('audio/out/ao_coreaudio_chmap.c',
|
|
|
|
'audio/out/ao_coreaudio_utils.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
jack_opt = get_option('jack').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
|
|
|
jack = dependency('jack', required: jack_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'jack': jack.found()}
|
|
|
|
if features['jack']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += jack
|
|
|
|
sources += files('audio/out/ao_jack.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
openal = dependency('openal', version: '>= 1.13', required: get_option('openal'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'openal': openal.found()}
|
|
|
|
if features['openal']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += openal
|
|
|
|
sources += files('audio/out/ao_openal.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
opensles = cc.find_library('OpenSLES', required: get_option('opensles'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'opensles': opensles.found()}
|
|
|
|
if features['opensles']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += opensles
|
|
|
|
sources += files('audio/out/ao_opensles.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
oss_opt = get_option('oss-audio').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'oss-audio': cc.has_header_symbol('sys/soundcard.h', 'SNDCTL_DSP_SETPLAYVOL',
|
|
|
|
required: oss_opt)}
|
|
|
|
if features['oss-audio']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('audio/out/ao_oss.c')
|
|
|
|
endif
|
|
|
|
|
2022-10-26 13:45:53 +00:00
|
|
|
pipewire = dependency('libpipewire-0.3', version: '>= 0.3.19', required: get_option('pipewire'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'pipewire': pipewire.found()}
|
|
|
|
if features['pipewire']
|
2022-01-06 20:54:21 +00:00
|
|
|
dependencies += pipewire
|
|
|
|
sources += files('audio/out/ao_pipewire.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
pulse = dependency('libpulse', version: '>= 1.0', required: get_option('pulse'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'pulse': pulse.found()}
|
|
|
|
if features['pulse']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += pulse
|
|
|
|
sources += files('audio/out/ao_pulse.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
sdl2_audio = get_option('sdl2-audio').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['sdl2'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'sdl2 was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sdl2-audio': sdl2_audio.allowed()}
|
|
|
|
if features['sdl2-audio']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('audio/out/ao_sdl.c')
|
|
|
|
endif
|
|
|
|
|
2022-01-11 16:23:52 +00:00
|
|
|
sndio = dependency('sndio', required: get_option('sndio'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sndio': sndio.found()}
|
|
|
|
if features['sndio']
|
2022-01-11 16:23:52 +00:00
|
|
|
dependencies += sndio
|
|
|
|
sources += files('audio/out/ao_sndio.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
wasapi = cc.has_header_symbol('audioclient.h', 'IAudioClient', required: get_option('wasapi'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'wasapi': wasapi}
|
|
|
|
if features['wasapi']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('audio/out/ao_wasapi.c',
|
|
|
|
'audio/out/ao_wasapi_changenotify.c',
|
|
|
|
'audio/out/ao_wasapi_utils.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# video output dependencies
|
|
|
|
caca_opt = get_option('caca').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
|
|
|
caca = dependency('caca', version: '>= 0.99.beta18', required: caca_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'caca': caca.found()}
|
|
|
|
if features['caca']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += caca
|
|
|
|
sources += files('video/out/vo_caca.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
direct3d_opt = get_option('direct3d').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
get_option('gpl') and features['win32-desktop'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'the build is not GPL or this is not a win32 desktop!',
|
|
|
|
)
|
|
|
|
direct3d = cc.check_header('d3d9.h', required: direct3d_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'direct3d': direct3d}
|
|
|
|
if features['direct3d']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vo_direct3d.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
drm = dependency('libdrm', version: '>= 2.4.75', required: get_option('drm'))
|
|
|
|
features += {'drm': drm.found() and (features['vt.h'] or features['consio.h'])}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['drm']
|
2022-08-14 22:36:08 +00:00
|
|
|
dependencies += drm
|
hwdec/drmprime: add drmprime hwdec-interop
In the confusing landscape of hardware video decoding APIs, we have had
a long standing support gap for the v4l2 based APIs implemented for the
various SoCs from Rockship, Amlogic, Allwinner, etc. While VAAPI is the
defacto default for desktop GPUs, the developers who work on these SoCs
(who are not the vendors!) have preferred to implement kernel APIs
rather than maintain a userspace driver as VAAPI would require.
While there are two v4l2 APIs (m2m and requests), and multiple forks of
ffmpeg where support for those APIs languishes without reaching
upstream, we can at least say that these APIs export frames as DRMPrime
dmabufs, and that they use the ffmpeg drm hwcontext.
With those two constants, it is possible for us to write a
hwdec-interop without worrying about the mess underneath - for the most
part.
Accordingly, this change implements a hwdec-interop for any decoder
that produces frames as DRMPrime dmabufs. The bulk of the heavy
lifting is done by the dmabuf interop code we already had from
supporting vaapi, and which I refactored for reusability in a previous
set of changes.
When we combine that with the fact that we can't probe for supported
formats, the new code in this change is pretty simple.
This change also includes the hwcontext_fns that are required for us to
be able to configure the hwcontext used by `hwdec=drm-copy`. This is
technically unrelated, but it seemed a good time to fill this gap.
From a testing perspective, I have directly tested on a RockPRO64,
while others have tested with different flavours of Rockchip and on
Amlogic, providing m2m coverage.
I have some other SoCs that I need to spin up to test with, but I don't
expect big surprises, and when we inevitably need to account for new
special cases down the line, we can do so - we won't be able to support
every possible configuration blindly.
2022-07-31 20:47:23 +00:00
|
|
|
sources += files('video/drmprime.c',
|
|
|
|
'video/out/drm_atomic.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'video/out/drm_common.c',
|
|
|
|
'video/out/drm_prime.c',
|
hwdec/drmprime: add drmprime hwdec-interop
In the confusing landscape of hardware video decoding APIs, we have had
a long standing support gap for the v4l2 based APIs implemented for the
various SoCs from Rockship, Amlogic, Allwinner, etc. While VAAPI is the
defacto default for desktop GPUs, the developers who work on these SoCs
(who are not the vendors!) have preferred to implement kernel APIs
rather than maintain a userspace driver as VAAPI would require.
While there are two v4l2 APIs (m2m and requests), and multiple forks of
ffmpeg where support for those APIs languishes without reaching
upstream, we can at least say that these APIs export frames as DRMPrime
dmabufs, and that they use the ffmpeg drm hwcontext.
With those two constants, it is possible for us to write a
hwdec-interop without worrying about the mess underneath - for the most
part.
Accordingly, this change implements a hwdec-interop for any decoder
that produces frames as DRMPrime dmabufs. The bulk of the heavy
lifting is done by the dmabuf interop code we already had from
supporting vaapi, and which I refactored for reusability in a previous
set of changes.
When we combine that with the fact that we can't probe for supported
formats, the new code in this change is pretty simple.
This change also includes the hwcontext_fns that are required for us to
be able to configure the hwcontext used by `hwdec=drm-copy`. This is
technically unrelated, but it seemed a good time to fill this gap.
From a testing perspective, I have directly tested on a RockPRO64,
while others have tested with different flavours of Rockchip and on
Amlogic, providing m2m coverage.
I have some other SoCs that I need to spin up to test with, but I don't
expect big surprises, and when we inevitably need to account for new
special cases down the line, we can do so - we won't be able to support
every possible configuration blindly.
2022-07-31 20:47:23 +00:00
|
|
|
'video/out/hwdec/hwdec_drmprime.c',
|
2022-08-27 16:53:31 +00:00
|
|
|
'video/out/hwdec/hwdec_drmprime_overlay.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'video/out/vo_drm.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-11 12:40:15 +00:00
|
|
|
# This can be removed roughly when Debian 12 is released.
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'drm-is-kms': features['drm'] and drm.version().version_compare('>= 2.4.105')}
|
2022-08-11 12:40:15 +00:00
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
gbm = dependency('gbm', version: '>=17.1.0', required: get_option('gbm'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gbm': gbm.found()}
|
|
|
|
if features['gbm']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += gbm
|
|
|
|
endif
|
|
|
|
|
|
|
|
jpeg = dependency('libjpeg', required: get_option('jpeg'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'jpeg': jpeg.found()}
|
|
|
|
if features['jpeg']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += jpeg
|
|
|
|
endif
|
|
|
|
|
2022-01-11 12:28:40 +00:00
|
|
|
libplacebo = dependency('libplacebo', version: '>=4.157.0', required: get_option('libplacebo'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libplacebo': libplacebo.found()}
|
|
|
|
features += {'libplacebo-next': false}
|
|
|
|
if features['libplacebo']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += libplacebo
|
|
|
|
sources += files('video/out/placebo/ra_pl.c',
|
|
|
|
'video/out/placebo/utils.c')
|
|
|
|
pl_api_ver = libplacebo.version().split('.')[1]
|
2022-04-09 21:58:59 +00:00
|
|
|
if pl_api_ver.version_compare('>=202')
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'libplacebo-next': true}
|
2022-04-09 21:58:59 +00:00
|
|
|
message('libplacebo v4.202+ found! Enabling vo_gpu_next.')
|
2021-11-20 19:59:37 +00:00
|
|
|
sources += files('video/out/vo_gpu_next.c',
|
|
|
|
'video/out/gpu_next/context.c')
|
2021-11-15 00:43:34 +00:00
|
|
|
else
|
2022-04-09 21:58:59 +00:00
|
|
|
message('libplacebo v4.202+ not found! Disabling vo_gpu_next.')
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
sdl2_video = get_option('sdl2-video').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['sdl2'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'sdl2 was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sdl2-video': sdl2_video.allowed()}
|
|
|
|
if features['sdl2-video']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vo_sdl.c')
|
|
|
|
endif
|
|
|
|
|
2021-12-19 17:41:34 +00:00
|
|
|
shaderc = dependency('shaderc', required: get_option('shaderc'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'shaderc': shaderc.found()}
|
|
|
|
if features['shaderc']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += shaderc
|
|
|
|
sources += files('video/out/gpu/spirv_shaderc.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
sixel = dependency('libsixel', version: '>= 1.5', required: get_option('sixel'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'sixel': sixel.found()}
|
|
|
|
if features['sixel']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += sixel
|
|
|
|
sources += files('video/out/vo_sixel.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
spirv_cross = dependency('spirv-cross-c-shared', required: get_option('spirv-cross'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'spirv-cross': spirv_cross.found()}
|
|
|
|
if features['spirv-cross']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += spirv_cross
|
|
|
|
endif
|
|
|
|
|
|
|
|
d3d11 = get_option('d3d11').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['win32-desktop'] and features['shaderc'] and features['spirv-cross'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'Either is not a win32 desktop or shaderc nor spirv-cross were found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'d3d11': d3d11.allowed()}
|
|
|
|
if features['d3d11']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/d3d11/context.c',
|
|
|
|
'video/out/d3d11/ra_d3d11.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
wayland = {
|
|
|
|
'deps': [dependency('wayland-client', version: '>= 1.15.0', required: get_option('wayland')),
|
|
|
|
dependency('wayland-cursor', version: '>= 1.15.0', required: get_option('wayland')),
|
2022-01-29 18:07:35 +00:00
|
|
|
dependency('wayland-protocols', version: '>= 1.15', required: get_option('wayland')),
|
2021-11-07 19:28:16 +00:00
|
|
|
dependency('xkbcommon', version: '>= 0.3.0', required: get_option('wayland'))],
|
|
|
|
'header': cc.check_header('linux/input-event-codes.h', required: get_option('wayland')),
|
|
|
|
'scanner': find_program('wayland-scanner', required: get_option('wayland')),
|
|
|
|
}
|
2022-08-13 00:25:50 +00:00
|
|
|
wayland_deps = true
|
2021-11-07 19:28:16 +00:00
|
|
|
foreach dep: wayland['deps']
|
|
|
|
if not dep.found()
|
2022-08-13 00:25:50 +00:00
|
|
|
wayland_deps = false
|
2021-11-07 19:28:16 +00:00
|
|
|
break
|
|
|
|
endif
|
|
|
|
endforeach
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'wayland': wayland_deps and wayland['header'] and wayland['scanner'].found()}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['wayland']
|
2021-11-07 19:28:16 +00:00
|
|
|
subdir(join_paths('generated', 'wayland'))
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'memfd_create': false}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['wayland']
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'memfd_create': cc.has_function('memfd_create',
|
|
|
|
prefix: '#define _GNU_SOURCE\n#include <sys/mman.h>')}
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['wayland'] and features['memfd_create']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vo_wlshm.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
x11_opt = get_option('x11').require(
|
|
|
|
get_option('gpl'),
|
|
|
|
error_message: 'the build is not GPL!',
|
|
|
|
)
|
|
|
|
x11 = {
|
|
|
|
'deps': [dependency('x11', version: '>= 1.0.0', required: x11_opt),
|
|
|
|
dependency('xscrnsaver', version: '>= 1.0.0', required: x11_opt),
|
|
|
|
dependency('xext', version: '>= 1.0.0', required: x11_opt),
|
|
|
|
dependency('xinerama', version: '>= 1.0.0', required: x11_opt),
|
x11: support xorg present extension
This builds off of present_sync which was introduced in a previous
commit to support xorg's present extension in all of the X11 backends
(sans vdpau) in mpv. It turns out there is an Xpresent library that
integrates the xorg present extention with Xlib (which barely anyone
seems to use), so this can be added without too much trouble. The
workflow is to first setup the event by telling Xorg we would like to
receive PresentCompleteNotify (there are others in the extension but
this is the only one we really care about). After that, just call
XPresentNotifyMSC after every buffer swap with a target_msc of 0. Xorg
then returns the last presentation through its usual event loop and we
go ahead and use that information to update mpv's values for vsync
timing purposes. One theoretical weakness of this approach is that the
present event is put on the same queue as the rest of the XEvents. It
would be nicer for it be placed somewhere else so we could just wait
on that queue without having to deal with other possible events in
there. In theory, xcb could do that with special events, but it doesn't
really matter in practice.
Unsurprisingly, this doesn't work on NVIDIA. Well NVIDIA does actually
receive presentation events, but for whatever the calculations used make
timings worse which defeats the purpose. This works perfectly fine on
Mesa however. Utilizing the previous commit that detects Xrandr
providers, we can enable this mechanism for users that have both Mesa
and not NVIDIA (to avoid messing up anyone that has a switchable
graphics system or such). Patches welcome if anyone figures out how to
fix this on NVIDIA.
Unlike the EGL/GLX sync extensions, the present extension works with any
graphics API (good for vulkan since its timing extension has been in
development hell). NVIDIA also happens to have zero support for the
EGL/GLX sync extensions, so we can just remove it with no loss. Only
Xorg ever used it and other backends already have their own present
methods. vo_vdpau VO is a special case that has its own fancying timing
code in its flip_page. This presumably works well, and I have no way of
testing it so just leave it as it is.
2022-06-10 16:49:38 +00:00
|
|
|
dependency('xpresent', version: '>= 1.0.0', required: x11_opt),
|
2021-11-07 19:28:16 +00:00
|
|
|
dependency('xrandr', version: '>= 1.2.0', required: x11_opt)],
|
|
|
|
}
|
2022-08-13 00:25:50 +00:00
|
|
|
x11_deps = true
|
2021-11-07 19:28:16 +00:00
|
|
|
foreach dep: x11['deps']
|
|
|
|
if not dep.found()
|
2022-08-13 00:25:50 +00:00
|
|
|
x11_deps = false
|
2021-11-07 19:28:16 +00:00
|
|
|
break
|
|
|
|
endif
|
|
|
|
endforeach
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'x11': x11_deps}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['x11']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += x11['deps']
|
|
|
|
sources += files('video/out/vo_x11.c',
|
|
|
|
'video/out/x11_common.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-15 14:04:18 +00:00
|
|
|
xv_opt = get_option('xv').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
features['x11'],
|
2021-11-15 14:04:18 +00:00
|
|
|
error_message: 'x11 could not be found!',
|
|
|
|
)
|
|
|
|
xv = dependency('xv', required: xv_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'xv': xv.found()}
|
|
|
|
if features['xv']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += xv
|
|
|
|
sources += files('video/out/vo_xv.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['wayland'] or features['x11']
|
2022-06-10 16:49:28 +00:00
|
|
|
sources += ('video/out/present_sync.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
# OpenGL feature checking
|
2022-08-13 00:25:50 +00:00
|
|
|
gl_allowed = get_option('gl').allowed()
|
2022-08-15 16:30:11 +00:00
|
|
|
features += {'gl': false}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
GL = dependency('', required: false)
|
|
|
|
if darwin
|
|
|
|
GL = dependency('appleframeworks', modules: 'OpenGL', required: get_option('gl-cocoa'))
|
2022-08-14 22:36:08 +00:00
|
|
|
elif features['win32-desktop']
|
2021-11-07 19:28:16 +00:00
|
|
|
GL = dependency('GL', required: get_option('gl-win32'))
|
2022-08-13 00:25:50 +00:00
|
|
|
elif features['x11']
|
2021-11-07 19:28:16 +00:00
|
|
|
GL = dependency('GL', required: get_option('gl-x11'))
|
|
|
|
endif
|
|
|
|
|
|
|
|
gl_cocoa = get_option('gl-cocoa').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['cocoa'] and GL.found() and gl_allowed,
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'cocoa and GL were not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gl-cocoa': gl_cocoa.allowed()}
|
|
|
|
if features['gl-cocoa']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += GL
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_cocoa.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
gl_win32 = get_option('gl-win32').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
GL.found() and gl_allowed and features['win32-desktop'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'GL and win32 desktop were not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gl-win32': gl_win32.allowed()}
|
|
|
|
if features['gl-win32']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += GL
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_win.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
gl_x11 = get_option('gl-x11').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
GL.found() and gl_allowed and features['x11'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'GL and x11 were not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gl-x11': gl_x11.allowed()}
|
|
|
|
if features['gl-x11']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += GL
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_glx.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-15 00:43:34 +00:00
|
|
|
gl_dxinterop_d3d = gl_win32.allowed() and \
|
|
|
|
cc.has_header_symbol('GL/wglext.h', 'WGL_ACCESS_READ_ONLY_NV',
|
2021-11-07 19:28:16 +00:00
|
|
|
prefix: '#include <GL/gl.h>')
|
2022-08-14 22:36:08 +00:00
|
|
|
gl_dxinterop_gl = features['gl-win32'] and cc.has_header_symbol('d3d9.h', 'IDirect3D9Ex')
|
2021-11-07 19:28:16 +00:00
|
|
|
gl_dxinterop = get_option('gl-dxinterop').require(
|
|
|
|
gl_dxinterop_d3d and gl_dxinterop_gl and gl_win32.allowed(),
|
|
|
|
error_message: 'gl-dxinterop could not be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gl-dxinterop': gl_dxinterop.allowed()}
|
|
|
|
if features['gl-dxinterop']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_dxinterop.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
egl_angle = get_option('egl-angle').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['gl-win32'] and cc.has_header_symbol('EGL/eglext.h',
|
|
|
|
'EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE',
|
|
|
|
prefix: '#include <EGL/egl.h>'),
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'egl-angle could not be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-angle': egl_angle.allowed()}
|
|
|
|
if features['egl-angle']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/angle_dynamic.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
egl_angle_lib = get_option('egl-angle-lib').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['egl-angle'] and cc.has_function('eglCreateWindowSurface',
|
|
|
|
prefix: '#include <EGL/egl.h>'),
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'egl-angle-lib could not be found!',
|
|
|
|
)
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'egl-angle-lib': egl_angle_lib.allowed()}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
egl_angle_win32 = get_option('egl-angle-win32').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['egl-angle'] and features['win32-desktop'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'either this is not a win32 desktop or egl-angle was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-angle-win32': egl_angle_win32.allowed()}
|
|
|
|
if features['egl-angle-win32']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_angle.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['d3d11'] or features['egl-angle-win32']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/gpu/d3d11_helpers.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
egl = dependency('egl', version: '> 1.4.0', required: get_option('egl'))
|
|
|
|
features += {'egl': egl.found() and gl_allowed}
|
|
|
|
if features['egl']
|
|
|
|
dependencies += egl
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2021-11-15 17:24:06 +00:00
|
|
|
egl_android_opt = get_option('egl-android').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['android'] and gl_allowed,
|
2021-11-15 17:24:06 +00:00
|
|
|
error_message: 'the OS is not android!',
|
2021-11-07 19:28:16 +00:00
|
|
|
)
|
2021-11-15 17:24:06 +00:00
|
|
|
egl_android = cc.find_library('EGL', required: egl_android_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-android': egl_android.found()}
|
|
|
|
if features['egl-android']
|
2021-11-15 17:24:06 +00:00
|
|
|
dependencies += egl_android
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_android.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
egl_drm = get_option('egl-drm').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
features['drm'] and features['egl'] and gbm.found() and gl_allowed,
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'either drm, egl, or gbm could not be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-drm': egl_drm.allowed()}
|
|
|
|
if features['egl-drm']
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_drm_egl.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
egl_wayland = dependency('wayland-egl', version: '>= 9.0.0', required: get_option('egl-wayland'))
|
|
|
|
features += {'gl-wayland': features['egl'] and egl_wayland.found() and gl_allowed and features['wayland']}
|
|
|
|
if features['gl-wayland']
|
|
|
|
dependencies += egl_wayland
|
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_wayland.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
egl_x11 = get_option('egl-x11').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
features['egl'] and gl_allowed and features['x11'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'either egl or x11 could not be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-x11': egl_x11.allowed()}
|
|
|
|
if features['egl-x11']
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_x11egl.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
plain_gl = get_option('plain-gl').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
get_option('libmpv') and gl_allowed,
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'libmpv was not enabled!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'plain-gl': plain_gl.allowed()}
|
|
|
|
if features['plain-gl']
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
rpi = dependency('/opt/vc/lib/pkgconfig/brcmegl.pc', 'brcmegl', required: get_option('rpi'))
|
|
|
|
features += {'rpi': gl_allowed and rpi.found()}
|
|
|
|
if features['rpi']
|
|
|
|
dependencies += rpi
|
|
|
|
features += {'gl': true}
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/context_rpi.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'egl-helpers': features['egl'] or egl_android.found() or
|
|
|
|
egl_angle_win32.allowed() or features['rpi']}
|
|
|
|
if features['egl-helpers']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/egl_helpers.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['egl'] and features['egl-helpers']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/filter/vf_gpu.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['gl']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/common.c',
|
|
|
|
'video/out/opengl/context.c',
|
|
|
|
'video/out/opengl/formats.c',
|
|
|
|
'video/out/opengl/libmpv_gl.c',
|
|
|
|
'video/out/opengl/ra_gl.c',
|
|
|
|
'video/out/opengl/utils.c')
|
2022-08-13 00:25:50 +00:00
|
|
|
elif not features['gl'] and get_option('gl').enabled()
|
2021-11-07 19:28:16 +00:00
|
|
|
error('gl enabled but no OpenGL video output could be found!')
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# vulkan
|
2021-11-15 17:24:06 +00:00
|
|
|
vulkan_opt = get_option('vulkan').require(
|
2022-08-25 19:57:35 +00:00
|
|
|
libplacebo.get_variable('pl_has_vulkan', default_value: '0') == '1',
|
2021-11-15 17:24:06 +00:00
|
|
|
error_message: 'libplacebo could not be found!',
|
|
|
|
)
|
|
|
|
vulkan = dependency('vulkan', required: vulkan_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'vulkan': vulkan.found()}
|
|
|
|
if features['vulkan']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += vulkan
|
|
|
|
sources += files('video/out/vulkan/context.c',
|
|
|
|
'video/out/vulkan/context_display.c',
|
|
|
|
'video/out/vulkan/utils.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['vulkan'] and features['android']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vulkan/context_android.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['vulkan'] and features['wayland']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vulkan/context_wayland.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['vulkan'] and features['win32-desktop']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vulkan/context_win.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['vulkan'] and features['x11']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vulkan/context_xlib.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# hwaccel
|
|
|
|
ffnvcodec = dependency('ffnvcodec', version: '>= 8.2.15.7', required: false)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'ffnvcodec': ffnvcodec.found()}
|
|
|
|
if features['ffnvcodec']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += ffnvcodec
|
|
|
|
sources += files('video/cuda.c')
|
|
|
|
endif
|
|
|
|
|
2021-10-18 14:50:39 +00:00
|
|
|
android_media_ndk = get_option('android-media-ndk').require(
|
|
|
|
features['android'] and cc.has_header_symbol('media/NdkImageReader.h', 'AIMAGE_FORMAT_PRIVATE')
|
|
|
|
)
|
|
|
|
features += {'android-media-ndk': android_media_ndk.allowed()}
|
|
|
|
if features['android-media-ndk']
|
|
|
|
# header only, library is dynamically loaded
|
|
|
|
sources += files('video/out/hwdec/hwdec_aimagereader.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
cuda_hwaccel = get_option('cuda-hwaccel').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['ffnvcodec'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'ffnvcodec was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'cuda-hwaccel': cuda_hwaccel.allowed()}
|
|
|
|
if features['cuda-hwaccel']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/hwdec/hwdec_cuda.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
cuda_interop = get_option('cuda-interop').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['cuda-hwaccel'] and (features['gl'] or features['vulkan']),
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'cuda-hwaccel and either gl or vulkan were not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'cuda-interop': cuda_interop.allowed() and (features['gl'] or features['vulkan'])}
|
|
|
|
if features['cuda-interop'] and features['gl']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/hwdec/hwdec_cuda_gl.c')
|
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['cuda-interop'] and features['vulkan']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/hwdec/hwdec_cuda_vk.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
d3d_hwaccel = get_option('d3d-hwaccel').require(
|
|
|
|
win32,
|
|
|
|
error_message: 'the os is not win32!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'d3d-hwaccel': d3d_hwaccel.allowed()}
|
|
|
|
if features['d3d-hwaccel']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/d3d.c',
|
|
|
|
'video/filter/vf_d3d11vpp.c')
|
|
|
|
endif
|
2022-08-13 00:25:50 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['d3d-hwaccel'] and egl_angle.allowed()
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_d3d11egl.c')
|
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['d3d-hwaccel'] and features['d3d11']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/d3d11/hwdec_d3d11va.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
d3d9_hwaccel = get_option('d3d9-hwaccel').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['d3d-hwaccel'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'd3d-hwaccel was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'d3d9-hwaccel': d3d9_hwaccel.allowed()}
|
|
|
|
if features['d3d9-hwaccel'] and features['egl-angle']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_dxva2egl.c')
|
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['d3d9-hwaccel'] and features['d3d11']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/d3d11/hwdec_dxva2dxgi.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
gl_dxinterop_d3d9 = get_option('gl-dxinterop-d3d9').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['gl-dxinterop'] and features['d3d9-hwaccel'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'gl-dxinterop and d3d9-hwaccel were not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'gl-dxinterop-d3d9': gl_dxinterop_d3d9.allowed()}
|
|
|
|
if features['gl-dxinterop-d3d9']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_dxva2gldx.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
ios_gl = cc.has_header_symbol('OpenGLES/ES3/glext.h', 'GL_RGB32F', required: get_option('ios-gl'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'ios-gl': ios_gl}
|
|
|
|
if features['ios-gl']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_ios.m')
|
|
|
|
endif
|
|
|
|
|
2021-11-15 00:43:34 +00:00
|
|
|
rpi_mmal_opt = get_option('rpi-mmal').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
features['rpi'],
|
2021-11-15 00:43:34 +00:00
|
|
|
error_message: 'rpi was not found!',
|
|
|
|
)
|
|
|
|
rpi_mmal = dependency('/opt/vc/lib/pkgconfig/mmal.pc', 'mmal', required: rpi_mmal_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'rpi-mmal': rpi_mmal.found()}
|
|
|
|
if features['rpi-mmal']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += rpi_mmal
|
|
|
|
sources += files('video/out/opengl/hwdec_rpi.c',
|
|
|
|
'video/out/vo_rpi.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
vaapi = dependency('libva', version: '>= 1.1.0', required: get_option('vaapi'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'vaapi': vaapi.found() and features['libdl'] and (features['x11'] or
|
2022-08-13 00:25:50 +00:00
|
|
|
features['wayland'] or egl_drm.allowed())}
|
|
|
|
|
|
|
|
if features['vaapi']
|
|
|
|
dependencies += vaapi
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/filter/vf_vavpp.c',
|
|
|
|
'video/vaapi.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
vaapi_drm = dependency('libva-drm', version: '>= 1.1.0', required: get_option('vaapi-drm'))
|
|
|
|
features += {'vaapi-drm': features['vaapi'] and egl_drm.allowed() and vaapi_drm.found()}
|
|
|
|
if features['vaapi-drm']
|
|
|
|
dependencies += vaapi_drm
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
vaapi_wayland = dependency('libva-wayland', version: '>= 1.1.0', required: get_option('vaapi-wayland'))
|
|
|
|
features += {'vaapi-wayland': features['vaapi'] and features['gl-wayland'] and vaapi_wayland.found()}
|
|
|
|
if features['vaapi-wayland']
|
|
|
|
dependencies += vaapi_wayland
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
vaapi_x11 = dependency('libva-x11', version: '>= 1.1.0', required: get_option('vaapi-x11'))
|
|
|
|
features += {'vaapi-x11': features['vaapi'] and features['x11'] and vaapi_x11.found()}
|
|
|
|
if features['vaapi-x11']
|
|
|
|
dependencies += vaapi_x11
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vo_vaapi.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'vaapi-x-egl': features['vaapi-x11'] and egl_x11.allowed()}
|
2022-08-27 17:25:31 +00:00
|
|
|
features += {'vaapi-egl': features['vaapi-x11'] or features['vaapi-wayland'] or features['vaapi-drm']}
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'vaapi-libplacebo': features['vaapi'] and libplacebo.found()}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['vaapi-egl'] or features['vaapi-libplacebo']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/hwdec/hwdec_vaapi.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
dmabuf_interop_gl = features['egl'] and features['drm']
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'dmabuf-interop-gl': dmabuf_interop_gl}
|
|
|
|
if features['dmabuf-interop-gl']
|
2022-07-31 19:59:15 +00:00
|
|
|
sources += files('video/out/hwdec/dmabuf_interop_gl.c')
|
|
|
|
endif
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
dmabuf_interop_pl = features['vaapi-libplacebo']
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'dmabuf-interop-pl': dmabuf_interop_pl}
|
|
|
|
if features['dmabuf-interop-pl']
|
2022-07-31 19:59:15 +00:00
|
|
|
sources += files('video/out/hwdec/dmabuf_interop_pl.c')
|
|
|
|
endif
|
|
|
|
|
2022-09-27 16:12:54 +00:00
|
|
|
features += {'dmabuf-wayland' : features['wayland'] and features['memfd_create'] and (features['vaapi-wayland'] or features['drm'])}
|
|
|
|
if features['dmabuf-wayland']
|
|
|
|
sources += files('video/out/vo_dmabuf_wayland.c')
|
|
|
|
sources += files('video/out/hwdec/dmabuf_interop_wl.c')
|
2022-11-03 22:29:48 +00:00
|
|
|
sources += files('video/out/wldmabuf/context_wldmabuf.c')
|
|
|
|
sources += files('video/out/wldmabuf/ra_wldmabuf.c')
|
|
|
|
sources += files('video/out/wlbuf_pool.c')
|
2022-09-27 16:12:54 +00:00
|
|
|
endif
|
|
|
|
|
2022-06-19 01:51:31 +00:00
|
|
|
vdpau_opt = get_option('vdpau').require(
|
2022-08-13 00:25:50 +00:00
|
|
|
features['x11'],
|
2022-06-19 01:51:31 +00:00
|
|
|
error_message: 'x11 was not found!',
|
|
|
|
)
|
|
|
|
vdpau = dependency('vdpau', version: '>= 0.2', required: vdpau_opt)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'vdpau': vdpau.found()}
|
|
|
|
if features['vdpau']
|
2021-11-07 19:28:16 +00:00
|
|
|
dependencies += vdpau
|
|
|
|
sources += files('video/filter/vf_vdpaupp.c',
|
|
|
|
'video/out/vo_vdpau.c',
|
|
|
|
'video/vdpau.c',
|
|
|
|
'video/vdpau_mixer.c')
|
|
|
|
endif
|
2022-08-14 22:36:08 +00:00
|
|
|
|
|
|
|
features += {'vdpau-gl-x11': vdpau.found() and gl_x11.allowed()}
|
|
|
|
if features['vdpau'] and features['vdpau-gl-x11']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_vdpau.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
videotoolbox_gl = get_option('videotoolbox-gl').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['gl-cocoa'] or features['ios-gl'],
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'gl-cocoa nor ios-gl could be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'videotoolbox-gl': videotoolbox_gl.allowed()}
|
|
|
|
if features['videotoolbox-gl']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/opengl/hwdec_osx.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# macOS features
|
|
|
|
macos_sdk_version_py = find_program(join_paths(source_root, 'TOOLS',
|
|
|
|
'macos-sdk-version.py'))
|
2021-11-15 00:43:34 +00:00
|
|
|
macos_sdk_info = ['', '0.0']
|
|
|
|
if darwin
|
2022-01-17 14:34:23 +00:00
|
|
|
macos_sdk_info = run_command(macos_sdk_version_py, check: true).stdout().split(',')
|
2021-11-15 00:43:34 +00:00
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
macos_sdk_path = macos_sdk_info[0].strip()
|
|
|
|
macos_sdk_version = macos_sdk_info[1]
|
2021-11-15 00:43:34 +00:00
|
|
|
if macos_sdk_path != ''
|
|
|
|
message('Detected macOS sdk path: ' + macos_sdk_path)
|
|
|
|
endif
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
if macos_sdk_version != '0.0'
|
|
|
|
message('Detected macOS SDK: ' + macos_sdk_version)
|
|
|
|
add_languages('objc')
|
|
|
|
objc_link_flags = ['-isysroot', macos_sdk_path, '-L/usr/lib', '-L/usr/local/lib']
|
|
|
|
add_project_link_arguments(objc_link_flags, language: ['c', 'objc'])
|
|
|
|
endif
|
|
|
|
|
|
|
|
macos_10_11_features = get_option('macos-10-11-features').require(
|
|
|
|
macos_sdk_version.version_compare('>=10.11'),
|
|
|
|
error_message: 'a suitable macos sdk version could not be found!',
|
|
|
|
)
|
|
|
|
|
|
|
|
macos_10_12_2_features = get_option('macos-10-12-2-features').require(
|
|
|
|
macos_sdk_version.version_compare('>=10.12.2'),
|
|
|
|
error_message: 'a suitable macos sdk version could not be found!',
|
|
|
|
)
|
|
|
|
|
|
|
|
macos_10_14_features = get_option('macos-10-14-features').require(
|
|
|
|
macos_sdk_version.version_compare('>=10.14'),
|
|
|
|
error_message: 'a suitable macos sdk version could not be found!',
|
|
|
|
)
|
|
|
|
|
|
|
|
xcrun = find_program('xcrun', required: get_option('swift-build'))
|
|
|
|
swift_ver = '0.0'
|
|
|
|
if xcrun.found()
|
2022-01-17 14:34:23 +00:00
|
|
|
swift_prog = find_program(run_command(xcrun, '-find', 'swift', check: true).stdout().strip())
|
|
|
|
swift_ver_string = run_command(swift_prog, '-version', check: true).stdout()
|
2021-11-07 19:28:16 +00:00
|
|
|
verRe = '''
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
verRe = re.compile("(?i)version\s?([\d.]+)")
|
|
|
|
swift_ver = verRe.search(sys.argv[1]).group(1)
|
|
|
|
sys.stdout.write(swift_ver)
|
|
|
|
'''
|
2022-01-17 14:34:23 +00:00
|
|
|
swift_ver = run_command(python, '-c', verRe, swift_ver_string, check: true).stdout()
|
2021-11-07 19:28:16 +00:00
|
|
|
message('Detected Swift version: ' + swift_ver)
|
|
|
|
endif
|
|
|
|
|
|
|
|
swift = get_option('swift-build').require(
|
|
|
|
darwin and macos_sdk_version.version_compare('>=10.10') and swift_ver.version_compare('>=4.1'),
|
|
|
|
error_message: 'A suitable macos sdk version or swift version could not be found!',
|
|
|
|
)
|
|
|
|
|
|
|
|
swift_sources = []
|
|
|
|
if cocoa.found() and swift.allowed()
|
|
|
|
swift_sources += files('osdep/macos/libmpv_helper.swift',
|
|
|
|
'osdep/macos/log_helper.swift',
|
|
|
|
'osdep/macos/mpv_helper.swift',
|
|
|
|
'osdep/macos/swift_compat.swift',
|
|
|
|
'osdep/macos/swift_extensions.swift',
|
|
|
|
'video/out/mac/common.swift',
|
|
|
|
'video/out/mac/title_bar.swift',
|
|
|
|
'video/out/mac/view.swift',
|
|
|
|
'video/out/mac/window.swift')
|
|
|
|
endif
|
|
|
|
|
|
|
|
macos_cocoa_cb = get_option('macos-cocoa-cb').require(
|
2022-08-14 22:36:08 +00:00
|
|
|
features['cocoa'] and swift.allowed(),
|
2021-11-07 19:28:16 +00:00
|
|
|
error_message: 'Either cocoa or swift could not be found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'macos-cocoa-cb': macos_cocoa_cb.allowed()}
|
|
|
|
if features['macos-cocoa-cb']
|
2021-11-07 19:28:16 +00:00
|
|
|
swift_sources += files('video/out/cocoa_cb_common.swift',
|
|
|
|
'video/out/mac/gl_layer.swift')
|
|
|
|
endif
|
|
|
|
|
|
|
|
macos_media_player = get_option('macos-media-player').require(
|
|
|
|
macos_10_12_2_features.allowed() and swift.allowed(),
|
|
|
|
error_message: 'Either the macos sdk version is not at least 10.12.2 or swift was not found!',
|
|
|
|
)
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'macos-media-player': macos_media_player.allowed()}
|
|
|
|
if features['macos-media-player']
|
2021-11-07 19:28:16 +00:00
|
|
|
swift_sources += files('osdep/macos/remote_command_center.swift')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if swift.allowed()
|
|
|
|
subdir(join_paths('generated', 'osdep'))
|
|
|
|
endif
|
|
|
|
|
2022-11-11 16:18:25 +00:00
|
|
|
macos_touchbar = get_option('macos-touchbar').require(
|
|
|
|
cc.compiles(files(join_paths(fragments, 'touchbar.m')), name: 'macos-touchbar check') and features['cocoa'],
|
|
|
|
error_message: 'Either cocoa could not be found or the macos-touchbar check failed!',
|
|
|
|
)
|
|
|
|
features += {'macos-touchbar': macos_touchbar.allowed()}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['macos-touchbar']
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('osdep/macosx_touchbar.m')
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# manpages
|
|
|
|
manpage = 'DOCS/man/mpv.rst'
|
2021-12-17 18:31:21 +00:00
|
|
|
rst2man = find_program('rst2man', 'rst2man.py', required: get_option('manpage-build'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'manpage-build': rst2man.found()}
|
|
|
|
if features['manpage-build']
|
2021-11-07 19:28:16 +00:00
|
|
|
mandir = get_option('mandir')
|
2021-11-15 00:43:34 +00:00
|
|
|
custom_target('manpages',
|
2021-11-07 19:28:16 +00:00
|
|
|
input: manpage,
|
|
|
|
output: 'mpv.1',
|
|
|
|
command: [rst2man, '--strip-elements-with-class=contents', '@INPUT@', '@OUTPUT@'],
|
|
|
|
install: true,
|
|
|
|
install_dir: join_paths(mandir, 'man1')
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
|
|
|
|
rst2html = find_program('rst2html', required: get_option('html-build'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'html-build': rst2html.found()}
|
|
|
|
if features['html-build']
|
2021-11-07 19:28:16 +00:00
|
|
|
datadir = get_option('datadir')
|
2021-11-15 00:43:34 +00:00
|
|
|
custom_target('html-manpages',
|
2021-11-07 19:28:16 +00:00
|
|
|
input: manpage,
|
|
|
|
output: 'mpv.html',
|
2022-07-05 07:25:51 +00:00
|
|
|
command: [rst2html, '@INPUT@', '@OUTPUT@'],
|
2021-11-07 19:28:16 +00:00
|
|
|
install: true,
|
|
|
|
install_dir: join_paths(datadir, 'doc', 'mpv')
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
|
|
|
|
rst2pdf = find_program('rst2pdf', required: get_option('pdf-build'))
|
2022-08-14 22:36:08 +00:00
|
|
|
features += {'pdf-build': rst2pdf.found()}
|
|
|
|
if features['pdf-build']
|
2021-11-07 19:28:16 +00:00
|
|
|
datadir = get_option('datadir')
|
2021-11-15 00:43:34 +00:00
|
|
|
custom_target('pdf-manpages',
|
2021-11-07 19:28:16 +00:00
|
|
|
input: manpage,
|
|
|
|
output: 'mpv.pdf',
|
|
|
|
command: [rst2pdf, '-c', '-b', '1', '--repeat-table-rows', '@INPUT@', '-o', '@OUTPUT@'],
|
|
|
|
install: true,
|
|
|
|
install_dir: join_paths(datadir, 'doc', 'mpv')
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
meson: add more hardcoded values to configuration
mpv has a CONFIGURATION define which is defined at configure time in
both build systems and printed out when you use verbose flags. In waf,
this is line is exactly what the user passes on cli at configure time.
In meson, there's currently no way to do that (someone did recently open
up a PR that would make this possible), so we just hardcode the prefix
and call it a day. This is a bit of a tangent, but the build also
copies waf and sets an optimize variable (true or false) that is also
printed out on verbose output. For waf, this makes some sense because
the build has a specific --optimize option (internally all it does is
pass -O2). In meson, optimizing is a built-in option and we just set
anything that's not -O0 as "optimize". Furthermore, there is a new
optimization option added in meson 0.64 called "plain" which passes no
flags at all* so this logic would need to be updated to account for
this.
In retrospect, this is all just stupid though. optimization is not a
boolean value and there's no real use for treating it like one just
because that's what waf does. Let's remove it from the features array.
Instead, we can expose this information in the CONFIGURATION variable
along with the prefix option so we know exactly what optimization was
used in the compiled executable. For good measure, let's also throw in
buildtype since it's related.
*: https://github.com/mesonbuild/meson/commit/a590cfde0cf719c637b75e4784be0c0ae60e3b1f
2022-10-29 16:29:26 +00:00
|
|
|
# Currently, we can't easily get every single thing a user might have passed
|
|
|
|
# on the cli, but we might as well just hardcode a few options (even if they are
|
|
|
|
# not specifically set) for verbosity's sake.
|
|
|
|
configuration = 'meson configure build ' + '-Dprefix=' + get_option('prefix') + \
|
|
|
|
' -Dbuildtype=' + get_option('buildtype') + \
|
|
|
|
' -Doptimization=' + get_option('optimization')
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
features += {'cplayer': get_option('cplayer')}
|
|
|
|
features += {'libmpv-' + get_option('default_library'): get_option('libmpv')}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Set config.h
|
|
|
|
conf_data = configuration_data()
|
|
|
|
conf_data.set_quoted('CONFIGURATION', configuration)
|
|
|
|
conf_data.set_quoted('DEFAULT_DVD_DEVICE', dvd_device)
|
|
|
|
conf_data.set_quoted('DEFAULT_CDROM_DEVICE', cd_device)
|
2022-08-13 00:25:50 +00:00
|
|
|
|
|
|
|
# Loop over all features in the build, create a define and add them to config.h
|
|
|
|
feature_keys = []
|
|
|
|
foreach feature, allowed: features
|
|
|
|
define = 'HAVE_@0@'.format(feature.underscorify().to_upper())
|
|
|
|
conf_data.set10(define, allowed)
|
|
|
|
# special handling for lua
|
|
|
|
if feature == 'lua' and allowed
|
|
|
|
feature_keys += lua_version
|
|
|
|
continue
|
|
|
|
endif
|
|
|
|
if allowed
|
|
|
|
feature_keys += feature
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
|
|
|
|
# Script to sort the feature_keys object.
|
|
|
|
feature_sort = '''
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
|
|
features = " ".join(sorted(sys.argv[1:]))
|
|
|
|
sys.stdout.write(features)
|
|
|
|
'''
|
|
|
|
feature_str = run_command(python, '-c', feature_sort, feature_keys, check: true).stdout()
|
2021-11-07 19:28:16 +00:00
|
|
|
conf_data.set_quoted('FULLCONFIG', feature_str)
|
2022-11-19 18:46:06 +00:00
|
|
|
conf_data.set_quoted('MPV_CONFDIR', join_paths(get_option('prefix'), get_option('sysconfdir'), 'mpv'))
|
2021-11-07 19:28:16 +00:00
|
|
|
configure_file(output : 'config.h', configuration : conf_data)
|
|
|
|
message('List of enabled features: ' + feature_str)
|
|
|
|
|
|
|
|
|
2022-08-13 00:25:50 +00:00
|
|
|
# build targets
|
2021-11-07 19:28:16 +00:00
|
|
|
if win32
|
|
|
|
windows = import('windows')
|
|
|
|
res_flags = ['--codepage=65001']
|
|
|
|
|
|
|
|
# Unintuitively, this compile operates out of the osdep subdirectory.
|
|
|
|
# Hence, these includes are needed.
|
|
|
|
res_includes = [source_root, build_root]
|
|
|
|
|
|
|
|
resources = ['etc/mpv-icon-8bit-16x16.png',
|
|
|
|
'etc/mpv-icon-8bit-32x32.png',
|
|
|
|
'etc/mpv-icon-8bit-64x64.png',
|
|
|
|
'etc/mpv-icon-8bit-128x128.png',
|
|
|
|
'etc/mpv-icon.ico',
|
|
|
|
'osdep/mpv.exe.manifest']
|
|
|
|
|
|
|
|
sources += windows.compile_resources('osdep/mpv.rc', args: res_flags, depend_files: resources,
|
|
|
|
depends: version_h, include_directories: res_includes)
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
if get_option('libmpv')
|
|
|
|
client_h_define = cc.get_define('MPV_CLIENT_API_VERSION', prefix: '#include "libmpv/client.h"',
|
|
|
|
include_directories: include_directories('.'))
|
2021-11-29 12:12:02 +00:00
|
|
|
major = client_h_define.split('|')[0].split('<<')[0].strip('() ')
|
|
|
|
minor = client_h_define.split('|')[1].strip('() ')
|
2021-11-07 19:28:16 +00:00
|
|
|
client_api_version = major + '.' + minor + '.0'
|
|
|
|
|
2022-01-25 04:53:02 +00:00
|
|
|
libmpv = library('mpv', sources, dependencies: dependencies, gnu_symbol_visibility: 'hidden',
|
|
|
|
version: client_api_version, include_directories: includedir, install: true)
|
2021-11-07 19:28:16 +00:00
|
|
|
pkg = import('pkgconfig')
|
|
|
|
pkg.generate(libmpv, version: client_api_version,
|
|
|
|
description: 'mpv media player client library')
|
|
|
|
|
2021-11-29 12:12:02 +00:00
|
|
|
headers = ['libmpv/client.h', 'libmpv/render.h',
|
2021-11-07 19:28:16 +00:00
|
|
|
'libmpv/render_gl.h', 'libmpv/stream_cb.h']
|
|
|
|
install_headers(headers, subdir: 'mpv')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if get_option('cplayer')
|
|
|
|
datadir = get_option('datadir')
|
|
|
|
confdir = get_option('sysconfdir')
|
|
|
|
|
|
|
|
conf_files = ['etc/mpv.conf', 'etc/input.conf',
|
|
|
|
'etc/mplayer-input.conf', 'etc/restore-old-bindings.conf']
|
|
|
|
install_data(conf_files, install_dir: join_paths(datadir, 'doc', 'mpv'))
|
|
|
|
|
|
|
|
bash_install_dir = join_paths(datadir, 'bash-completion', 'completions')
|
|
|
|
install_data('etc/mpv.bash-completion', install_dir: bash_install_dir, rename: 'mpv')
|
|
|
|
|
|
|
|
zsh_install_dir = join_paths(datadir, 'zsh', 'site-functions')
|
|
|
|
install_data('etc/_mpv.zsh', install_dir: zsh_install_dir, rename: '_mpv')
|
|
|
|
|
|
|
|
install_data('etc/mpv.desktop', install_dir: join_paths(datadir, 'applications'))
|
2022-09-06 18:17:36 +00:00
|
|
|
install_data('etc/mpv.metainfo.xml', install_dir: join_paths(datadir, 'metainfo'))
|
2021-11-07 19:28:16 +00:00
|
|
|
install_data('etc/encoding-profiles.conf', install_dir: join_paths(confdir, 'mpv'))
|
|
|
|
|
|
|
|
foreach size: ['16x16', '32x32', '64x64', '128x128']
|
|
|
|
icon_dir = join_paths(datadir, 'icons', 'hicolor', size, 'apps')
|
|
|
|
install_data('etc/mpv-icon-8bit-' + size + '.png', install_dir: icon_dir, rename: 'mpv.png')
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
hicolor_dir = join_paths(datadir, 'icons', 'hicolor')
|
|
|
|
install_data('etc/mpv-gradient.svg', install_dir: join_paths(hicolor_dir, 'scalable', 'apps'),
|
|
|
|
rename: 'mpv.svg')
|
|
|
|
install_data('etc/mpv-symbolic.svg', install_dir: join_paths(hicolor_dir, 'symbolic', 'apps'))
|
|
|
|
|
2022-05-04 20:09:48 +00:00
|
|
|
executable('mpv', sources, dependencies: dependencies, win_subsystem: 'windows,6.0',
|
2021-11-07 19:28:16 +00:00
|
|
|
include_directories: includedir, install: true)
|
|
|
|
endif
|
2022-06-20 14:10:43 +00:00
|
|
|
|
2022-08-14 22:36:08 +00:00
|
|
|
summary({'d3d11': features['d3d11'],
|
|
|
|
'gpu-next': features['libplacebo-next'],
|
|
|
|
'javascript': features['javascript'],
|
2022-06-20 14:10:43 +00:00
|
|
|
'libmpv': get_option('libmpv'),
|
2022-08-14 22:36:08 +00:00
|
|
|
'lua': features['lua'],
|
2022-08-13 00:25:50 +00:00
|
|
|
'opengl': features['gl'],
|
2022-08-14 22:36:08 +00:00
|
|
|
'vulkan': features['vulkan'],
|
2022-08-13 00:25:50 +00:00
|
|
|
'wayland': features['wayland'],
|
|
|
|
'x11': features['x11']},
|
2022-06-20 14:10:43 +00:00
|
|
|
bool_yn: true)
|