2021-11-07 19:28:16 +00:00
|
|
|
project('mpv',
|
|
|
|
'c',
|
|
|
|
license: ['GPL2+', 'LGPL2.1+'],
|
|
|
|
version: files('./VERSION'),
|
2023-05-01 17:05:00 +00:00
|
|
|
meson_version: '>=0.62.0',
|
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
|
2022-11-29 19:16:57 +00:00
|
|
|
libavcodec = dependency('libavcodec', version: '>= 58.134.100')
|
|
|
|
libavfilter = dependency('libavfilter', version: '>= 7.110.100')
|
|
|
|
libavformat = dependency('libavformat', version: '>= 58.76.100')
|
|
|
|
libavutil = dependency('libavutil', version: '>= 56.70.100')
|
|
|
|
libswresample = dependency('libswresample', version: '>= 3.9.100')
|
|
|
|
libswscale = dependency('libswscale', version: '>= 5.9.100')
|
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'),
|
2023-03-24 23:30:57 +00:00
|
|
|
'avif_muxer': libavformat.version().version_compare('>= 59.24.100'),
|
2022-08-13 00:25:50 +00:00
|
|
|
'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',
|
2021-05-26 22:46:56 +00:00
|
|
|
'misc/language.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'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',
|
2022-12-13 14:58:13 +00:00
|
|
|
'video/out/vo_kitty.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'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')
|
2023-01-30 20:40:49 +00:00
|
|
|
flags += ['-Wformat', '-Werror=format-security']
|
2021-11-15 00:34:51 +00:00
|
|
|
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
|
2022-11-08 00:02:22 +00:00
|
|
|
|
|
|
|
features += {'darwin': darwin}
|
2022-08-13 00:25:50 +00:00
|
|
|
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
|
|
|
|
2023-05-01 17:05:00 +00:00
|
|
|
libdl = dependency('dl', required: false)
|
|
|
|
features += {'libdl': libdl.found()}
|
2022-08-14 22:36:08 +00:00
|
|
|
if features['libdl']
|
2023-05-01 17:05:00 +00:00
|
|
|
dependencies += libdl
|
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 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
|
2021-05-26 22:47:30 +00:00
|
|
|
sources += files('osdep/apple_utils.c',
|
2021-05-26 22:55:08 +00:00
|
|
|
'osdep/language-apple.c',
|
2021-05-26 22:47:30 +00:00
|
|
|
'osdep/macosx_application.m',
|
2021-11-07 19:28:16 +00:00
|
|
|
'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
|
2023-02-26 03:50:08 +00:00
|
|
|
path_source = files('osdep/path-unix.c')
|
|
|
|
subprocess_source = files('osdep/subprocess-posix.c')
|
|
|
|
sources += path_source + subprocess_source + \
|
|
|
|
files('input/ipc-unix.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'osdep/polldev.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-05-26 22:55:08 +00:00
|
|
|
sources += files('osdep/main-fn-unix.c',
|
|
|
|
'osdep/language-posix.c')
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
if darwin
|
2022-11-08 00:02:22 +00:00
|
|
|
path_source = files('osdep/path-darwin.c')
|
|
|
|
sources += path_source + files('osdep/timer-darwin.c')
|
hwdec_vulkan: add Vulkan HW Interop
Vulkan Video Decoding has finally become a reality, as it's now
showing up in shipping drivers, and the ffmpeg support has been
merged.
With that in mind, this change introduces HW interop support for
ffmpeg Vulkan frames. The implementation is functionally complete - it
can display frames produced by hardware decoding, and it can work with
ffmpeg vulkan filters. There are still various caveats due to gaps and
bugs in drivers, so YMMV, as always.
Primary testing has been done on Intel, AMD, and nvidia hardware on
Linux with basic Windows testing on nvidia.
Notable caveats:
* Due to driver bugs, video decoding on nvidia does not work right now,
unless you use the Vulkan Beta driver. It can be worked around, but
requires ffmpeg changes that are not considered acceptable to merge.
* Even if those work-arounds are applied, Vulkan filters will not work
on video that was decoded by Vulkan, due to additional bugs in the
nvidia drivers. The filters do work correctly on content decoded some
other way, and then uploaded to Vulkan (eg: Decode with nvdec, upload
with --vf=format=vulkan)
* Vulkan filters can only be used with drivers that support
VK_EXT_descriptor_buffer which doesn't include Intel ANV as yet.
There is an MR outstanding for this.
* When dealing with 1080p content, there may be some visual distortion
in the bottom lines of frames due to chroma scaling incorporating the
extra hidden lines at the bottom of the frame (1080p content is
actually stored as 1088 lines), depending on the hardware/driver
combination and the scaling algorithm. This cannot be easily
addressed as the mechanical fix for it violates the Vulkan spec, and
probably requires a spec change to resolve properly.
All of these caveats will be fixed in either drivers or ffmpeg, and so
will not require mpv changes (unless something unexpected happens)
If you want to run on nvidia with the non-beta drivers, you can this
ffmpeg tree with the work-around patches:
* https://github.com/philipl/FFmpeg/tree/vulkan-nvidia-workarounds
2022-03-12 19:21:29 +00:00
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
if posix and not darwin
|
2022-11-08 00:02:22 +00:00
|
|
|
sources += files('osdep/path-unix.c',
|
|
|
|
'osdep/timer-linux.c')
|
2021-11-07 19:28:16 +00:00
|
|
|
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'),
|
2023-03-19 05:40:53 +00:00
|
|
|
cc.find_library('uxtheme'),
|
2021-11-07 19:28:16 +00:00
|
|
|
cc.find_library('version'),
|
|
|
|
cc.find_library('winmm')]
|
|
|
|
dependencies += win32_desktop_libs
|
2023-02-26 03:50:08 +00:00
|
|
|
path_source = files('osdep/path-win.c')
|
|
|
|
subprocess_source = files('osdep/subprocess-win.c')
|
|
|
|
sources += path_source + subprocess_source + \
|
|
|
|
files('input/ipc-win.c',
|
2021-05-26 22:55:08 +00:00
|
|
|
'osdep/language-win.c',
|
2021-11-07 19:28:16 +00:00
|
|
|
'osdep/main-fn-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']
|
2023-02-26 03:50:08 +00:00
|
|
|
subprocess_source = files('osdep/subprocess-dummy.c')
|
|
|
|
sources += subprocess_source + files('input/ipc-dummy.c')
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
2023-01-31 15:22:59 +00:00
|
|
|
# macOS's pthread_setname_np is a special snowflake and differs from literally every other platform.
|
|
|
|
features += {'osx-thread-name': darwin}
|
2021-11-07 19:28:16 +00:00
|
|
|
|
2023-01-31 15:22:59 +00:00
|
|
|
features += {'glibc-thread-name': false}
|
|
|
|
if not features['osx-thread-name']
|
|
|
|
features += {'glibc-thread-name': posix and cc.has_function('pthread_setname_np', args: '-D_GNU_SOURCE',
|
|
|
|
dependencies: pthreads, prefix: '#include <pthread.h>')}
|
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']
|
2023-01-31 15:22:59 +00:00
|
|
|
features += {'bsd-thread-name': posix and cc.has_function('pthread_set_name_np', dependencies: pthreads,
|
|
|
|
prefix: '#include <pthread.h>\n#include <pthread_np.h>')}
|
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
|
|
|
|
2023-01-31 19:59:21 +00:00
|
|
|
vector_attribute = '''int main() {
|
|
|
|
float v __attribute__((vector_size(32)));
|
|
|
|
}
|
|
|
|
'''
|
2022-08-13 00:25:50 +00:00
|
|
|
vector = get_option('vector').require(
|
2023-01-31 19:59:21 +00:00
|
|
|
cc.compiles(vector_attribute, name: 'vector check'),
|
2022-08-13 00:25:50 +00:00
|
|
|
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')
|
2023-01-12 03:44:29 +00:00
|
|
|
docutils_wrapper = find_program(join_paths(tools_directory, 'docutils-wrapper.py'))
|
2021-11-07 19:28:16 +00:00
|
|
|
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'))
|
|
|
|
|
2023-07-23 22:54:35 +00:00
|
|
|
ebml_defs = custom_target('ebml_defs.inc',
|
|
|
|
output: 'ebml_defs.inc',
|
|
|
|
command: [matroska, '--generate-definitions', '@OUTPUT@'],
|
|
|
|
)
|
|
|
|
|
|
|
|
ebml_types = custom_target('ebml_types.h',
|
|
|
|
output: 'ebml_types.h',
|
|
|
|
command: [matroska, '--generate-header', '@OUTPUT@'],
|
|
|
|
)
|
|
|
|
|
|
|
|
version_h = custom_target('version.h',
|
|
|
|
output: 'version.h',
|
|
|
|
command: [version_py, '@OUTPUT@'],
|
|
|
|
build_always_stale: true,
|
|
|
|
)
|
|
|
|
sources += [ebml_defs, ebml_types, version_h]
|
|
|
|
|
|
|
|
subdir('etc')
|
|
|
|
subdir('player')
|
|
|
|
subdir('sub')
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
if darwin
|
2023-07-23 22:54:35 +00:00
|
|
|
subdir(join_paths('TOOLS', 'osxbundle'))
|
2021-11-07 19:28:16 +00:00
|
|
|
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')
|
|
|
|
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
|
|
|
|
|
2022-11-29 19:16:57 +00:00
|
|
|
libavdevice = dependency('libavdevice', version: '>= 58.13.100', 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')
|
|
|
|
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')
|
2023-01-24 09:26:25 +00:00
|
|
|
features += {'zimg-st428': zimg.version().version_compare('>= 3.0.5')}
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
|
2023-06-18 20:36:28 +00:00
|
|
|
pipewire = dependency('libpipewire-0.3', version: '>= 0.3.48', 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()}
|
2023-07-24 20:01:25 +00:00
|
|
|
features += {'sndio-1-9': sndio.version().version_compare('>= 1.9.0')}
|
2022-08-14 22:36:08 +00:00
|
|
|
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!',
|
|
|
|
)
|
2023-01-30 22:14:28 +00:00
|
|
|
direct3d = cc.has_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
|
|
|
|
|
2023-07-31 18:35:24 +00:00
|
|
|
drm = dependency('libdrm', version: '>= 2.4.105', required: get_option('drm'))
|
2022-08-14 22:36:08 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
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()}
|
|
|
|
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')
|
2023-03-27 17:23:31 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
libplacebo_next = get_option('libplacebo-next').require(
|
2023-07-22 17:25:23 +00:00
|
|
|
features['libplacebo'] and libplacebo.version().version_compare('>=5.264.0'),
|
|
|
|
error_message: 'libplacebo v5.264.0+ was not found!',
|
2023-03-27 17:23:31 +00:00
|
|
|
)
|
|
|
|
features += {'libplacebo-next': libplacebo_next.allowed()}
|
|
|
|
if features['libplacebo-next']
|
|
|
|
sources += files('video/out/vo_gpu_next.c',
|
|
|
|
'video/out/gpu_next/context.c')
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
|
2022-12-26 14:08:07 +00:00
|
|
|
features += {'posix_shm': false}
|
|
|
|
if features['posix']
|
|
|
|
features += {'posix_shm': cc.has_function('shm_open', prefix: '#include <sys/mman.h>')}
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
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 = {
|
2023-06-12 19:19:29 +00:00
|
|
|
'deps': [dependency('wayland-client', version: '>= 1.20.0', required: get_option('wayland')),
|
|
|
|
dependency('wayland-cursor', version: '>= 1.20.0', required: get_option('wayland')),
|
2023-06-12 19:34:50 +00:00
|
|
|
dependency('wayland-protocols', version: '>= 1.25', required: get_option('wayland')),
|
2021-11-07 19:28:16 +00:00
|
|
|
dependency('xkbcommon', version: '>= 0.3.0', required: get_option('wayland'))],
|
2022-11-15 12:18:56 +00:00
|
|
|
'header': cc.has_header('linux/input-event-codes.h', required: get_option('wayland'),
|
|
|
|
# Pass CFLAGS from a related package as a hint for non-Linux
|
|
|
|
dependencies: dependency('wayland-client', required: get_option('wayland'))),
|
2021-11-07 19:28:16 +00:00
|
|
|
'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']
|
2023-07-23 22:54:35 +00:00
|
|
|
subdir(join_paths('video', 'out'))
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
|
2023-07-13 01:11:32 +00:00
|
|
|
dmabuf_wayland = get_option('dmabuf-wayland').require(
|
|
|
|
features['drm'] and features['memfd_create'] and features['wayland'],
|
|
|
|
error_message: 'drm, memfd_create, or wayland was not found!',
|
|
|
|
)
|
|
|
|
features += {'dmabuf-wayland': dmabuf_wayland.allowed()}
|
|
|
|
if features['dmabuf-wayland']
|
|
|
|
sources += files('video/out/vo_dmabuf_wayland.c')
|
|
|
|
sources += files('video/out/hwdec/dmabuf_interop_wl.c')
|
|
|
|
sources += files('video/out/wldmabuf/context_wldmabuf.c')
|
|
|
|
sources += files('video/out/wldmabuf/ra_wldmabuf.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
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(
|
2023-03-30 13:24:22 +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>') and
|
|
|
|
cc.has_header_symbol('EGL/eglext_angle.h',
|
|
|
|
'PFNEGLCREATEDEVICEANGLEPROC',
|
|
|
|
# TODO: change to list when meson 1.0.0 is required
|
|
|
|
prefix: '#include <EGL/egl.h>\n#include <EGL/eglext.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
|
|
|
|
|
2023-01-17 01:27:04 +00:00
|
|
|
egl_dep = cc.find_library('EGL', required: get_option('egl-angle-lib'))
|
2021-11-07 19:28:16 +00:00
|
|
|
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',
|
2023-01-17 01:27:04 +00:00
|
|
|
dependencies: egl_dep,
|
2022-08-14 22:36:08 +00:00
|
|
|
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()}
|
2023-01-17 01:27:04 +00:00
|
|
|
if features['egl-angle-lib']
|
|
|
|
dependencies += egl_dep
|
|
|
|
endif
|
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'))
|
2023-07-23 20:05:59 +00:00
|
|
|
features += {'egl-wayland': features['egl'] and egl_wayland.found() and gl_allowed and features['wayland']}
|
|
|
|
if features['egl-wayland']
|
2022-08-13 00:25:50 +00:00
|
|
|
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(
|
2023-01-19 03:14:23 +00:00
|
|
|
gl_allowed,
|
|
|
|
error_message: 'gl was not enabled!',
|
2021-11-07 19:28:16 +00:00
|
|
|
)
|
2023-01-19 18:16:40 +00:00
|
|
|
if plain_gl.allowed()
|
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/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
|
|
|
|
|
2023-02-20 02:23:33 +00:00
|
|
|
features += {'vk_khr_display': cc.has_function('vkCreateDisplayPlaneSurfaceKHR', prefix: '#include <vulkan/vulkan_core.h>',
|
|
|
|
dependencies: [vulkan])}
|
|
|
|
|
|
|
|
if features['vk_khr_display']
|
|
|
|
sources += files('video/out/vulkan/context_display.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
|
|
|
|
# hwaccel
|
2023-06-04 17:28:59 +00:00
|
|
|
ffnvcodec = dependency('ffnvcodec', version: '>= 11.1.5.1', 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
|
|
|
|
|
hwdec_vulkan: add Vulkan HW Interop
Vulkan Video Decoding has finally become a reality, as it's now
showing up in shipping drivers, and the ffmpeg support has been
merged.
With that in mind, this change introduces HW interop support for
ffmpeg Vulkan frames. The implementation is functionally complete - it
can display frames produced by hardware decoding, and it can work with
ffmpeg vulkan filters. There are still various caveats due to gaps and
bugs in drivers, so YMMV, as always.
Primary testing has been done on Intel, AMD, and nvidia hardware on
Linux with basic Windows testing on nvidia.
Notable caveats:
* Due to driver bugs, video decoding on nvidia does not work right now,
unless you use the Vulkan Beta driver. It can be worked around, but
requires ffmpeg changes that are not considered acceptable to merge.
* Even if those work-arounds are applied, Vulkan filters will not work
on video that was decoded by Vulkan, due to additional bugs in the
nvidia drivers. The filters do work correctly on content decoded some
other way, and then uploaded to Vulkan (eg: Decode with nvdec, upload
with --vf=format=vulkan)
* Vulkan filters can only be used with drivers that support
VK_EXT_descriptor_buffer which doesn't include Intel ANV as yet.
There is an MR outstanding for this.
* When dealing with 1080p content, there may be some visual distortion
in the bottom lines of frames due to chroma scaling incorporating the
extra hidden lines at the bottom of the frame (1080p content is
actually stored as 1088 lines), depending on the hardware/driver
combination and the scaling algorithm. This cannot be easily
addressed as the mechanical fix for it violates the Vulkan spec, and
probably requires a spec change to resolve properly.
All of these caveats will be fixed in either drivers or ffmpeg, and so
will not require mpv changes (unless something unexpected happens)
If you want to run on nvidia with the non-beta drivers, you can this
ffmpeg tree with the work-around patches:
* https://github.com/philipl/FFmpeg/tree/vulkan-nvidia-workarounds
2022-03-12 19:21:29 +00:00
|
|
|
vulkan_interop = get_option('vulkan-interop').require(
|
2023-05-29 19:40:35 +00:00
|
|
|
features['vulkan'] and vulkan.version().version_compare('>=1.3.238') and
|
2023-05-29 21:38:00 +00:00
|
|
|
features['libplacebo'] and libplacebo.version().version_compare('>=6.278.0') and
|
hwdec_vulkan: add Vulkan HW Interop
Vulkan Video Decoding has finally become a reality, as it's now
showing up in shipping drivers, and the ffmpeg support has been
merged.
With that in mind, this change introduces HW interop support for
ffmpeg Vulkan frames. The implementation is functionally complete - it
can display frames produced by hardware decoding, and it can work with
ffmpeg vulkan filters. There are still various caveats due to gaps and
bugs in drivers, so YMMV, as always.
Primary testing has been done on Intel, AMD, and nvidia hardware on
Linux with basic Windows testing on nvidia.
Notable caveats:
* Due to driver bugs, video decoding on nvidia does not work right now,
unless you use the Vulkan Beta driver. It can be worked around, but
requires ffmpeg changes that are not considered acceptable to merge.
* Even if those work-arounds are applied, Vulkan filters will not work
on video that was decoded by Vulkan, due to additional bugs in the
nvidia drivers. The filters do work correctly on content decoded some
other way, and then uploaded to Vulkan (eg: Decode with nvdec, upload
with --vf=format=vulkan)
* Vulkan filters can only be used with drivers that support
VK_EXT_descriptor_buffer which doesn't include Intel ANV as yet.
There is an MR outstanding for this.
* When dealing with 1080p content, there may be some visual distortion
in the bottom lines of frames due to chroma scaling incorporating the
extra hidden lines at the bottom of the frame (1080p content is
actually stored as 1088 lines), depending on the hardware/driver
combination and the scaling algorithm. This cannot be easily
addressed as the mechanical fix for it violates the Vulkan spec, and
probably requires a spec change to resolve properly.
All of these caveats will be fixed in either drivers or ffmpeg, and so
will not require mpv changes (unless something unexpected happens)
If you want to run on nvidia with the non-beta drivers, you can this
ffmpeg tree with the work-around patches:
* https://github.com/philipl/FFmpeg/tree/vulkan-nvidia-workarounds
2022-03-12 19:21:29 +00:00
|
|
|
libavutil.version().version_compare('>=58.11.100'),
|
2023-05-29 21:38:00 +00:00
|
|
|
error_message: 'Vulkan Interop requires vulkan headers >= 1.3.238, libplacebo >= 6.278.0, and libavutil >= 58.11.100',
|
hwdec_vulkan: add Vulkan HW Interop
Vulkan Video Decoding has finally become a reality, as it's now
showing up in shipping drivers, and the ffmpeg support has been
merged.
With that in mind, this change introduces HW interop support for
ffmpeg Vulkan frames. The implementation is functionally complete - it
can display frames produced by hardware decoding, and it can work with
ffmpeg vulkan filters. There are still various caveats due to gaps and
bugs in drivers, so YMMV, as always.
Primary testing has been done on Intel, AMD, and nvidia hardware on
Linux with basic Windows testing on nvidia.
Notable caveats:
* Due to driver bugs, video decoding on nvidia does not work right now,
unless you use the Vulkan Beta driver. It can be worked around, but
requires ffmpeg changes that are not considered acceptable to merge.
* Even if those work-arounds are applied, Vulkan filters will not work
on video that was decoded by Vulkan, due to additional bugs in the
nvidia drivers. The filters do work correctly on content decoded some
other way, and then uploaded to Vulkan (eg: Decode with nvdec, upload
with --vf=format=vulkan)
* Vulkan filters can only be used with drivers that support
VK_EXT_descriptor_buffer which doesn't include Intel ANV as yet.
There is an MR outstanding for this.
* When dealing with 1080p content, there may be some visual distortion
in the bottom lines of frames due to chroma scaling incorporating the
extra hidden lines at the bottom of the frame (1080p content is
actually stored as 1088 lines), depending on the hardware/driver
combination and the scaling algorithm. This cannot be easily
addressed as the mechanical fix for it violates the Vulkan spec, and
probably requires a spec change to resolve properly.
All of these caveats will be fixed in either drivers or ffmpeg, and so
will not require mpv changes (unless something unexpected happens)
If you want to run on nvidia with the non-beta drivers, you can this
ffmpeg tree with the work-around patches:
* https://github.com/philipl/FFmpeg/tree/vulkan-nvidia-workarounds
2022-03-12 19:21:29 +00:00
|
|
|
)
|
|
|
|
features += {'vulkan-interop': vulkan_interop.allowed()}
|
|
|
|
if vulkan_interop.allowed()
|
|
|
|
sources += files('video/out/hwdec/hwdec_vulkan.c')
|
|
|
|
endif
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
|
2023-07-25 14:10:42 +00:00
|
|
|
libva = dependency('libva', version: '>= 1.1.0', required: get_option('vaapi'))
|
2022-08-13 00:25:50 +00:00
|
|
|
|
2023-07-25 14:10:42 +00:00
|
|
|
vaapi_drm = dependency('libva-drm', version: '>= 1.1.0',
|
|
|
|
required: get_option('vaapi-drm').require(libva.found() and features['drm']))
|
|
|
|
features += {'vaapi-drm': vaapi_drm.found()}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['vaapi-drm']
|
|
|
|
dependencies += vaapi_drm
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2023-07-25 14:10:42 +00:00
|
|
|
vaapi_wayland = dependency('libva-wayland', version: '>= 1.1.0',
|
|
|
|
required: get_option('vaapi-wayland').require(libva.found() and features['wayland']))
|
|
|
|
features += {'vaapi-wayland': vaapi_wayland.found()}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['vaapi-wayland']
|
|
|
|
dependencies += vaapi_wayland
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2023-07-25 14:10:42 +00:00
|
|
|
vaapi_x11 = dependency('libva-x11', version: '>= 1.1.0',
|
|
|
|
required: get_option('vaapi-x11').require(libva.found() and features['x11']))
|
|
|
|
features += {'vaapi-x11': vaapi_x11.found()}
|
2022-08-13 00:25:50 +00:00
|
|
|
if features['vaapi-x11']
|
|
|
|
dependencies += vaapi_x11
|
2021-11-07 19:28:16 +00:00
|
|
|
sources += files('video/out/vo_vaapi.c')
|
|
|
|
endif
|
|
|
|
|
2023-07-25 19:38:25 +00:00
|
|
|
vaapi = get_option('vaapi').require(libva.found() and (features['vaapi-drm'] or
|
|
|
|
features['vaapi-wayland'] or features['vaapi-x11']))
|
2023-07-25 14:10:42 +00:00
|
|
|
features += {'vaapi': vaapi.allowed()}
|
|
|
|
|
|
|
|
if features['vaapi']
|
|
|
|
dependencies += libva
|
|
|
|
sources += files('video/filter/vf_vavpp.c',
|
|
|
|
'video/vaapi.c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
features += {'vaapi-egl': features['vaapi'] and features['egl'] and features['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-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
|
2023-01-19 22:08:31 +00:00
|
|
|
macos_sdk_version_py = find_program(join_paths(source_root, 'TOOLS', 'macos-sdk-version.py'),
|
|
|
|
required: get_option('swift-build').require(darwin))
|
|
|
|
macos_sdk_path = ''
|
|
|
|
macos_sdk_version = '0.0'
|
|
|
|
if macos_sdk_version_py.found()
|
2022-01-17 14:34:23 +00:00
|
|
|
macos_sdk_info = run_command(macos_sdk_version_py, check: true).stdout().split(',')
|
2023-01-19 22:08:31 +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
|
|
|
endif
|
|
|
|
|
|
|
|
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
|
|
|
|
|
2023-01-19 22:08:31 +00:00
|
|
|
xcrun = find_program('xcrun', required: get_option('swift-build').require(darwin))
|
2021-11-07 19:28:16 +00:00
|
|
|
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
|
|
|
|
|
2023-01-19 22:08:31 +00:00
|
|
|
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!',
|
|
|
|
)
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
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()
|
2023-07-23 22:54:35 +00:00
|
|
|
subdir('osdep')
|
2021-11-07 19:28:16 +00:00
|
|
|
endif
|
|
|
|
|
2022-11-11 16:18:25 +00:00
|
|
|
macos_touchbar = get_option('macos-touchbar').require(
|
2023-01-31 16:12:44 +00:00
|
|
|
features['cocoa'] and cc.has_header('AppKit/NSTouchBar.h'),
|
|
|
|
error_message: 'Either cocoa could not be found or AppKit/NSTouchBar.h could not be found!',
|
2022-11-11 16:18:25 +00:00
|
|
|
)
|
|
|
|
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',
|
2023-01-05 23:28:16 +00:00
|
|
|
command: [
|
|
|
|
docutils_wrapper, rst2man,
|
|
|
|
'--record-dependencies', '@DEPFILE@',
|
|
|
|
'--strip-elements-with-class=contents',
|
|
|
|
'@INPUT@', '@OUTPUT@'],
|
|
|
|
depfile: 'mpv.1.dep',
|
2021-11-07 19:28:16 +00:00
|
|
|
install: true,
|
|
|
|
install_dir: join_paths(mandir, 'man1')
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
|
2023-01-13 04:46:26 +00:00
|
|
|
rst2html = find_program('rst2html', 'rst2html.py', 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',
|
2023-01-05 23:28:16 +00:00
|
|
|
command: [
|
|
|
|
docutils_wrapper, rst2html,
|
|
|
|
'--record-dependencies', '@DEPFILE@',
|
|
|
|
'@INPUT@', '@OUTPUT@'],
|
|
|
|
depfile: 'mpv.html.dep',
|
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']
|
2023-05-01 17:05:00 +00:00
|
|
|
dependency_file = rst2pdf.version().version_compare('>=0.100')
|
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',
|
2023-03-06 19:11:07 +00:00
|
|
|
command: [
|
|
|
|
docutils_wrapper, rst2pdf,
|
|
|
|
'-c', '-b', '1', '--repeat-table-rows',
|
2023-05-01 17:05:00 +00:00
|
|
|
dependency_file ? ['--record-dependencies', '@DEPFILE@'] : [],
|
2023-03-06 19:11:07 +00:00
|
|
|
'@INPUT@', '-o', '@OUTPUT@'],
|
|
|
|
depfile: 'mpv.pdf.dep',
|
2021-11-07 19:28:16 +00:00
|
|
|
install: true,
|
|
|
|
install_dir: join_paths(datadir, 'doc', 'mpv')
|
|
|
|
)
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
2023-02-21 01:34:02 +00:00
|
|
|
if meson.version().version_compare('>= 1.1.0')
|
|
|
|
configuration = meson.build_options()
|
|
|
|
else
|
|
|
|
# Arbitrary hardcoded things to pass if the meson version is too
|
|
|
|
# old to have the build_options method.
|
|
|
|
configuration = 'meson configure build ' + '-Dprefix=' + get_option('prefix') + \
|
|
|
|
' -Dbuildtype=' + get_option('buildtype') + \
|
|
|
|
' -Doptimization=' + get_option('optimization')
|
|
|
|
endif
|
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'))
|
2022-01-23 05:06:26 +00:00
|
|
|
conf_data.set_quoted('PLATFORM', host_machine.system())
|
2021-11-07 19:28:16 +00:00
|
|
|
configure_file(output : 'config.h', configuration : conf_data)
|
|
|
|
message('List of enabled features: ' + feature_str)
|
|
|
|
|
2023-01-19 02:46:26 +00:00
|
|
|
# These are intentionally not added to conf_data.
|
|
|
|
features += {'cplayer': get_option('cplayer')}
|
|
|
|
features += {'libmpv-' + get_option('default_library'): get_option('libmpv')}
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
2023-01-27 01:59:17 +00:00
|
|
|
client_h_define = cc.get_define('MPV_CLIENT_API_VERSION', prefix: '#include "libmpv/client.h"',
|
|
|
|
include_directories: include_directories('.'))
|
|
|
|
major = client_h_define.split('|')[0].split('<<')[0].strip('() ')
|
|
|
|
minor = client_h_define.split('|')[1].strip('() ')
|
|
|
|
client_api_version = major + '.' + minor + '.0'
|
|
|
|
|
|
|
|
libmpv = library('mpv', sources, dependencies: dependencies, gnu_symbol_visibility: 'hidden',
|
|
|
|
version: client_api_version, include_directories: includedir,
|
|
|
|
install: get_option('libmpv'), build_by_default: get_option('libmpv'))
|
|
|
|
|
|
|
|
|
2021-11-07 19:28:16 +00:00
|
|
|
if get_option('libmpv')
|
|
|
|
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'))
|
|
|
|
|
2023-02-26 03:50:08 +00:00
|
|
|
mpv = executable('mpv', objects: libmpv.extract_all_objects(recursive: true), dependencies: dependencies,
|
|
|
|
win_subsystem: 'windows,6.0', include_directories: includedir, install: true)
|
|
|
|
endif
|
|
|
|
|
|
|
|
if get_option('tests')
|
|
|
|
subdir('test')
|
2021-11-07 19:28:16 +00:00
|
|
|
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)
|