From c67ba9f70c41e158a7b3d62f968fb45e095578f4 Mon Sep 17 00:00:00 2001 From: arch1t3cht Date: Fri, 13 Oct 2023 23:46:11 +0200 Subject: [PATCH] Update ffmpeg wrap to 6.0 following ffms2 updates Also bump libdav1d and turn the wrap patches into diffs. This requires bumping the minimum meson version to 0.63, but meson 1.0 is available pretty much everywhere now so this should be fine. --- meson.build | 2 +- subprojects/dav1d.wrap | 4 +- subprojects/ffmpeg.wrap | 4 +- subprojects/packagefiles/dav1d/0001.patch | 39 + .../packagefiles/dav1d/src/meson.build | 366 --- subprojects/packagefiles/ffmpeg/0001.patch | 100 + subprojects/packagefiles/ffmpeg/meson.build | 2750 ----------------- subprojects/packagefiles/ffms2/meson.build | 4 +- 8 files changed, 146 insertions(+), 3123 deletions(-) create mode 100644 subprojects/packagefiles/dav1d/0001.patch delete mode 100644 subprojects/packagefiles/dav1d/src/meson.build create mode 100644 subprojects/packagefiles/ffmpeg/0001.patch delete mode 100644 subprojects/packagefiles/ffmpeg/meson.build diff --git a/meson.build b/meson.build index 3f2c3b05e..47e33455a 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('Aegisub', ['c', 'cpp'], license: 'BSD-3-Clause', - meson_version: '>=0.57.0', + meson_version: '>=1.0.0', default_options: ['cpp_std=c++14', 'buildtype=debugoptimized'], version: '3.2.2') diff --git a/subprojects/dav1d.wrap b/subprojects/dav1d.wrap index 49251c463..2dc6bfc6d 100644 --- a/subprojects/dav1d.wrap +++ b/subprojects/dav1d.wrap @@ -1,8 +1,8 @@ [wrap-git] directory = dav1d url = https://github.com/videolan/dav1d.git -revision = 0.9.2 -patch_directory = dav1d +revision = head +diff_files = dav1d/0001.patch [provide] dav1d = dav1d_dep diff --git a/subprojects/ffmpeg.wrap b/subprojects/ffmpeg.wrap index e03e12123..3d2a60e89 100644 --- a/subprojects/ffmpeg.wrap +++ b/subprojects/ffmpeg.wrap @@ -1,8 +1,8 @@ [wrap-git] directory = ffmpeg url = https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git -revision = c7a42b33c46c7b52f5e5c908e78bc411555aac1f -patch_directory = ffmpeg +revision = head +diff_files = ffmpeg/0001.patch [provide] libavformat = libavformat_dep diff --git a/subprojects/packagefiles/dav1d/0001.patch b/subprojects/packagefiles/dav1d/0001.patch new file mode 100644 index 000000000..5356fa5e2 --- /dev/null +++ b/subprojects/packagefiles/dav1d/0001.patch @@ -0,0 +1,39 @@ +diff --git a/include/dav1d/dav1d.h b/include/dav1d/dav1d.h +index e8f0705..ff48ea0 100644 +--- a/include/dav1d/dav1d.h ++++ b/include/dav1d/dav1d.h +@@ -34,7 +34,7 @@ + #include "common.h" + #include "picture.h" + #include "data.h" +-#include "version.h" ++#include "dav1d_version.h" + + #ifdef __cplusplus + extern "C" { +diff --git a/include/dav1d/meson.build b/include/dav1d/meson.build +index 68faaf9..09b0239 100644 +--- a/include/dav1d/meson.build ++++ b/include/dav1d/meson.build +@@ -28,7 +28,7 @@ version_h_data.set('DAV1D_API_VERSION_MAJOR', dav1d_api_version_major) + version_h_data.set('DAV1D_API_VERSION_MINOR', dav1d_api_version_minor) + version_h_data.set('DAV1D_API_VERSION_PATCH', dav1d_api_version_revision) + version_h_target = configure_file(input: 'version.h.in', +- output: 'version.h', ++ output: 'dav1d_version.h', + configuration: version_h_data) + + dav1d_api_headers = [ +diff --git a/src/meson.build b/src/meson.build +index 3a34e76..53ef660 100644 +--- a/src/meson.build ++++ b/src/meson.build +@@ -335,7 +335,7 @@ libdav1d = library('dav1d', + ) + + dav1d_dep = declare_dependency(link_with: libdav1d, +- include_directories : include_directories('../include/dav1d') ++ include_directories : include_directories('../include/', '../include/dav1d/') + ) + + # diff --git a/subprojects/packagefiles/dav1d/src/meson.build b/subprojects/packagefiles/dav1d/src/meson.build deleted file mode 100644 index 6886c775f..000000000 --- a/subprojects/packagefiles/dav1d/src/meson.build +++ /dev/null @@ -1,366 +0,0 @@ -# Copyright © 2018-2019, VideoLAN and dav1d authors -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# -# Build definition for the dav1d library -# - -# libdav1d source files -libdav1d_sources = files( - 'cdf.c', - 'cpu.c', - 'data.c', - 'decode.c', - 'dequant_tables.c', - 'getbits.c', - 'intra_edge.c', - 'itx_1d.c', - 'lf_mask.c', - 'log.c', - 'mem.c', - 'msac.c', - 'obu.c', - 'picture.c', - 'qm.c', - 'ref.c', - 'refmvs.c', - 'scan.c', - 'tables.c', - 'warpmv.c', - 'wedge.c', -) - -# libdav1d bitdepth source files -# These files are compiled for each bitdepth with -# `BITDEPTH` defined to the currently built bitdepth. -libdav1d_tmpl_sources = files( - 'cdef_apply_tmpl.c', - 'cdef_tmpl.c', - 'fg_apply_tmpl.c', - 'film_grain_tmpl.c', - 'ipred_prepare_tmpl.c', - 'ipred_tmpl.c', - 'itx_tmpl.c', - 'lf_apply_tmpl.c', - 'loopfilter_tmpl.c', - 'looprestoration_tmpl.c', - 'lr_apply_tmpl.c', - 'mc_tmpl.c', - 'recon_tmpl.c', -) - -libdav1d_arch_tmpl_sources = [] - -libdav1d_bitdepth_objs = [] - -# libdav1d entrypoint source files -# These source files contain library entry points and are -# built with the stack-realign flag set, where necessary. -libdav1d_entrypoints_sources = files( - 'lib.c', - 'thread_task.c' -) - -# ASM specific sources -libdav1d_asm_objs = [] -# Arch-specific flags -arch_flags = [] -if is_asm_enabled - if (host_machine.cpu_family() == 'aarch64' or - host_machine.cpu_family().startswith('arm')) - - libdav1d_sources += files( - 'arm/cpu.c', - 'arm/refmvs_init.c', - ) - libdav1d_tmpl_sources += files( - 'arm/cdef_init_tmpl.c', - 'arm/film_grain_init_tmpl.c', - 'arm/ipred_init_tmpl.c', - 'arm/itx_init_tmpl.c', - 'arm/loopfilter_init_tmpl.c', - 'arm/looprestoration_init_tmpl.c', - 'arm/mc_init_tmpl.c', - ) - if (host_machine.cpu_family() == 'aarch64' or - host_machine.cpu() == 'arm64') - libdav1d_sources_asm = files( - # itx.S is used for both 8 and 16 bpc. - 'arm/64/itx.S', - 'arm/64/looprestoration_common.S', - 'arm/64/msac.S', - 'arm/64/refmvs.S', - ) - - if dav1d_bitdepths.contains('8') - libdav1d_sources_asm += files( - 'arm/64/cdef.S', - 'arm/64/film_grain.S', - 'arm/64/ipred.S', - 'arm/64/loopfilter.S', - 'arm/64/looprestoration.S', - 'arm/64/mc.S', - ) - endif - - if dav1d_bitdepths.contains('16') - libdav1d_sources_asm += files( - 'arm/64/cdef16.S', - 'arm/64/film_grain16.S', - 'arm/64/ipred16.S', - 'arm/64/itx16.S', - 'arm/64/loopfilter16.S', - 'arm/64/looprestoration16.S', - 'arm/64/mc16.S', - ) - endif - elif host_machine.cpu_family().startswith('arm') - libdav1d_sources_asm = files( - # itx.S is used for both 8 and 16 bpc. - 'arm/32/itx.S', - 'arm/32/looprestoration_common.S', - 'arm/32/msac.S', - 'arm/32/refmvs.S', - ) - - if dav1d_bitdepths.contains('8') - libdav1d_sources_asm += files( - 'arm/32/cdef.S', - 'arm/32/film_grain.S', - 'arm/32/ipred.S', - 'arm/32/loopfilter.S', - 'arm/32/looprestoration.S', - 'arm/32/mc.S', - ) - endif - - if dav1d_bitdepths.contains('16') - libdav1d_sources_asm += files( - 'arm/32/cdef16.S', - 'arm/32/film_grain16.S', - 'arm/32/ipred16.S', - 'arm/32/itx16.S', - 'arm/32/loopfilter16.S', - 'arm/32/looprestoration16.S', - 'arm/32/mc16.S', - ) - endif - endif - - if use_gaspp - libdav1d_asm_objs = gaspp_gen.process(libdav1d_sources_asm) - else - libdav1d_sources += libdav1d_sources_asm - endif - elif host_machine.cpu_family().startswith('x86') - - libdav1d_sources += files( - 'x86/cpu.c', - 'x86/msac_init.c', - 'x86/refmvs_init.c', - ) - - libdav1d_tmpl_sources += files( - 'x86/cdef_init_tmpl.c', - 'x86/film_grain_init_tmpl.c', - 'x86/ipred_init_tmpl.c', - 'x86/itx_init_tmpl.c', - 'x86/loopfilter_init_tmpl.c', - 'x86/looprestoration_init_tmpl.c', - 'x86/mc_init_tmpl.c', - ) - - # NASM source files - libdav1d_sources_asm = files( - 'x86/cpuid.asm', - 'x86/msac.asm', - 'x86/refmvs.asm', - 'x86/cdef_avx2.asm', - 'x86/itx_avx2.asm', - 'x86/looprestoration_avx2.asm', - 'x86/cdef_sse.asm', - 'x86/itx_sse.asm', - ) - - if dav1d_bitdepths.contains('8') - libdav1d_sources_asm += files( - 'x86/cdef_avx512.asm', - 'x86/mc_avx512.asm', - 'x86/mc_avx2.asm', - 'x86/film_grain_avx2.asm', - 'x86/ipred_avx2.asm', - 'x86/loopfilter_avx2.asm', - 'x86/film_grain_sse.asm', - 'x86/ipred_sse.asm', - 'x86/loopfilter_sse.asm', - 'x86/looprestoration_sse.asm', - 'x86/mc_sse.asm', - ) - endif - - if dav1d_bitdepths.contains('16') - libdav1d_sources_asm += files( - 'x86/cdef16_avx2.asm', - 'x86/film_grain16_avx2.asm', - 'x86/ipred16_avx2.asm', - 'x86/itx16_avx2.asm', - 'x86/loopfilter16_avx2.asm', - 'x86/looprestoration16_avx2.asm', - 'x86/mc16_avx2.asm', - 'x86/cdef16_sse.asm', - 'x86/film_grain16_sse.asm', - 'x86/ipred16_sse.asm', - 'x86/itx16_sse.asm', - 'x86/loopfilter16_sse.asm', - 'x86/looprestoration16_sse.asm', - 'x86/mc16_sse.asm', - ) - endif - - # Compile the ASM sources with NASM - libdav1d_asm_objs = nasm_gen.process(libdav1d_sources_asm) - elif host_machine.cpu() == 'ppc64le' - arch_flags = ['-maltivec', '-mvsx'] - libdav1d_sources += files( - 'ppc/cpu.c', - ) - libdav1d_arch_tmpl_sources += files( - 'ppc/cdef_init_tmpl.c', - 'ppc/looprestoration_init_tmpl.c', - ) - endif -endif - - - -api_export_flags = [] - -# -# Windows .rc file and API export flags -# - -if host_machine.system() == 'windows' and get_option('default_library') != 'static' - rc_file = configure_file( - input : 'dav1d.rc.in', - output : 'dav1d.rc', - configuration : rc_data - ) - - libdav1d_rc_obj = winmod.compile_resources(rc_file) - - api_export_flags = ['-DDAV1D_BUILDING_DLL'] -else - libdav1d_rc_obj = [] -endif - - - - -# -# Library definitions -# - -# Helper library for dav1d entrypoints -libdav1d_entrypoints_objs = static_library('dav1d_entrypoint', - libdav1d_entrypoints_sources, - rev_target, config_h_target, - - include_directories : dav1d_inc_dirs, - dependencies: [stdatomic_dependencies], - c_args : [stackalign_flag, stackrealign_flag, api_export_flags], - install : false, - build_by_default : false, -).extract_all_objects(recursive: true) - -# Helper library for each bitdepth -libdav1d_bitdepth_objs = [] -foreach bitdepth : dav1d_bitdepths - libdav1d_bitdepth_objs += static_library( - 'dav1d_bitdepth_@0@'.format(bitdepth), - libdav1d_tmpl_sources, config_h_target, - include_directories: dav1d_inc_dirs, - dependencies : [stdatomic_dependencies], - c_args : ['-DBITDEPTH=@0@'.format(bitdepth)] + stackalign_flag, - install : false, - build_by_default : false, - ).extract_all_objects(recursive: true) -endforeach - -# Helper library for each bitdepth and architecture-specific flags -foreach bitdepth : dav1d_bitdepths - libdav1d_bitdepth_objs += static_library( - 'dav1d_arch_bitdepth_@0@'.format(bitdepth), - libdav1d_arch_tmpl_sources, config_h_target, - include_directories: dav1d_inc_dirs, - dependencies : [stdatomic_dependencies], - c_args : ['-DBITDEPTH=@0@'.format(bitdepth)] + stackalign_flag + arch_flags, - install : false, - build_by_default : false, - ).extract_all_objects(recursive: true) -endforeach - -# The final dav1d library -if host_machine.system() == 'windows' - dav1d_soversion = '' -else - dav1d_soversion = dav1d_api_version_major -endif - -libdav1d = library('dav1d', - libdav1d_sources, - libdav1d_asm_objs, - libdav1d_rc_obj, - - objects : [ - libdav1d_bitdepth_objs, - libdav1d_entrypoints_objs - ], - - include_directories : dav1d_inc_dirs, - dependencies : [ - stdatomic_dependencies, - thread_dependency, - thread_compat_dep, - libdl_dependency, - ], - c_args : [stackalign_flag, api_export_flags], - version : dav1d_soname_version, - soversion : dav1d_soversion, - install : true, -) - -dav1d_dep = declare_dependency(link_with: libdav1d, - include_directories : include_directories('../include') -) - -# -# Generate pkg-config .pc file -# -# pkg_mod = import('pkgconfig') -# pkg_mod.generate(libraries: libdav1d, -# version: meson.project_version(), -# name: 'libdav1d', -# filebase: 'dav1d', -# description: 'AV1 decoding library' -# ) diff --git a/subprojects/packagefiles/ffmpeg/0001.patch b/subprojects/packagefiles/ffmpeg/0001.patch new file mode 100644 index 000000000..3c177d919 --- /dev/null +++ b/subprojects/packagefiles/ffmpeg/0001.patch @@ -0,0 +1,100 @@ +diff --git a/meson.build b/meson.build +index 688b368859..dc9d18acd5 100644 +--- a/meson.build ++++ b/meson.build +@@ -1037,7 +1037,7 @@ check_components = [ + ['user32', ['windows.h', 'winuser.h'], ['GetShellWindow'], ['user32']], + ['vfw32', ['windows.h', 'vfw.h'], ['capCreateCaptureWindow'], ['vfw3']], + ['vaapi', ['va/va.h'], ['vaInitialize'], ['va']], +- ['zlib', ['zlib.h'], ['zlibVersion'], ['z']], ++ ['zlib', ['zlib.h'], ['zlibVersion'], ['z'], {'meson-dep': 'zlib'}], + + # Libraries with preconditions + ['vaapi_drm', ['va/va.h', 'va/va_drm.h'], ['vaGetDisplayDRM'], ['va', 'va-drm'], +@@ -1925,6 +1925,7 @@ foreach check : all_checks + prefix = '' + + found = true ++ skipchecks = false + + preconditions = opts.get('preconditions', []) + +@@ -1980,6 +1981,11 @@ foreach check : all_checks + req = false + endif + dep = cc.find_library(link_with, required : req) ++ if not dep.found() and opts.has_key('meson-dep') ++ dep = dependency(opts.get('meson-dep'), required: false) ++ # We can't do compiler checks for non-external dependencies, so skip them and trust the meson dependency ++ skipchecks = true ++ endif + found = found and dep.found() + extra_deps += dep + endforeach +@@ -2009,7 +2015,8 @@ foreach check : all_checks + else + dep = dependency(pkg_name, required : req) + endif +- found = dep.found() and dep.type_name() != 'internal' ++ found = dep.found() ++ skipchecks = dep.type_name() == 'internal' # same here, trust the meson dependency + extra_deps += dep + endif + endif +@@ -2023,14 +2030,14 @@ foreach check : all_checks + endif + + if not conf.has(header.underscorify()) +- has_header = cc.has_header(header, dependencies: extra_deps) ++ has_header = skipchecks or cc.has_header(header, dependencies: extra_deps) + conf.set10(header.underscorify().to_lower(), has_header) + found = found and has_header + endif + endforeach + endif + +- if found ++ if found and not skipchecks + n_funcs_found = 0 + foreach symbol : funcs + if check_type == 'header-func' +@@ -2050,7 +2057,7 @@ foreach check : all_checks + endif + endif + +- if found ++ if found and not skipchecks + n_defines_found = 0 + foreach symbol : defines + if cc.get_define(symbol, dependencies : extra_deps, prefix: prefix, args : c_args + project_c_args) != '' +@@ -2060,15 +2067,15 @@ foreach check : all_checks + found = n_defines_found == defines.length() + endif + +- if found and compiles != '' ++ if found and compiles != '' and not skipchecks + found = cc.compiles('\n\n'.join([prefix, compiles]), dependencies : extra_deps, args : c_args + project_c_args, name: name) + endif + +- if found and links != '' ++ if found and links != '' and not skipchecks + found = cc.links('\n\n'.join([prefix, links]), dependencies : extra_deps, args : c_args + project_c_args, name: name) + endif + +- if found and type != '' ++ if found and type != '' and not skipchecks + found = cc.has_type(type, prefix : prefix, dependencies : extra_deps, args : c_args + project_c_args) + endif + +@@ -3087,6 +3094,11 @@ foreach a: arch_list + endforeach + + foreach have: have_list ++ if have == 'unistd_h' and conf.get(have) == 0 ++ # an atrocious hack to get this working with the zlib subproject on windows... ++ # zlib also uses a HAVE_UNISTD_H define, but it checks it with #ifdef and not #if ++ continue ++ endif + final_conf.set('HAVE_@0@'.format(have.to_upper()), conf.get(have.to_lower())) + endforeach + diff --git a/subprojects/packagefiles/ffmpeg/meson.build b/subprojects/packagefiles/ffmpeg/meson.build deleted file mode 100644 index 1db65b5a8..000000000 --- a/subprojects/packagefiles/ffmpeg/meson.build +++ /dev/null @@ -1,2750 +0,0 @@ -# Copyright (c) 2018 Mathieu Duponchelle -# -# This file is part of the FFmpeg Meson build -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, see . - -project('FFmpeg', 'c', - meson_version: '>= 0.59', - license: 'LGPL2.1+', - default_options: [ 'buildtype=debugoptimized', 'c_std=c99', 'cpp_std=c++11'], - version: '4.4.3', -) - -# HOWTO: -# -# Get meson >= 0.59 from pip or your distro's package manager then: -# -# meson build && ninja -C build - -# Overview of the configure process: -# -# This port is relatively faithful to the original configure script: -# We first gather system information (compiler checks, dependencies, ..), -# then pass this information through a temporary configure file to a -# script named "depresolver.py". This script implements the logic implemented -# in the configure script by the "check_deps" function, the dependency -# graph lives in a python file named "depgraph.py". -# -# That graph is made up of a set of nodes, each optionally containing -# information about the components it selects, depends on or conflicts -# with. -# -# The depresolver script returns two things: -# -# * A set of key-value pairs, indicating for each component whether -# it was enabled or not. -# * A second set of key-value pairs, associating to each component -# the set of enabled components it depended upon. -# -# The first set is used to determine which sources to compile in, -# using the dictionaries present in the relevant meson.build definitions -# in the subdirectories (eg. libavutil/meson.build) -# -# The second set is used to compute the external dependencies passed -# to the various build targets, when a component is compiled into library -# we check whether a @0@_flattened_deps.format(component) variable was -# set, and add it to the set of dependencies for that library. -# -# Various other python scripts have been implemented to reproduce other -# bits of logic in the configure script, eg. find_things.py ... -# TODO: -# -# * Assembler extensions (mmx etc..) -# * Porting the FATE test suite -# * Continue going over the configure script and importing various -# bits of logic - -common_incs = [include_directories('.')] - -python3 = import('python').find_installation() - -cc = meson.get_compiler('c') - -languages_map = {} - -if cc.get_id() == 'msvc' - # Ignore several spurious warnings for things FFmpeg does very commonly - # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it - # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once - # NOTE: Only add warnings here if you are sure they're spurious or they're - # for a pattern that ffmpeg does not care about - add_project_arguments( - '/wo4005', # macro redefinition (this likely need to be fixed) - '/wd4018', # implicit signed/unsigned conversion - '/wd4146', # unary minus on unsigned (beware INT_MIN) - '/wd4244', # lossy type conversion (e.g. double -> int) - '/wd4305', # truncating type conversion (e.g. double -> float) - '/wd4554', # operator precedence - '/wd4114', # same type qualifier used more than once - '/wd4028', # formal parameter {n} different from declaration - '/wd4090', # 'function': different 'const' qualifiers - '/wd4133', # 'type' : incompatible types - from 'type1' to 'type2' - cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 - language : 'c') -endif - -project_c_args = [ - '-D_ISOC99_SOURCE', - '-D_GNU_SOURCE', - '-D_LARGEFILE_SOURCE', - '-DPIC', - '-Wno-parentheses', - '-Wno-pointer-sign', - '-Wno-switch', - '-Wno-format-truncation', - '-Wno-deprecated-declarations', - '-Wno-unused-function', - '-Wno-maybe-uninitialized', - '-Wno-discarded-qualifiers', - '-Wno-unused-variable', - '-Wno-bool-operation', - '-Wno-incompatible-pointer-types', - '-Wno-address', -] - -# Work around meson subprojects ignoring default_options -# https://github.com/mesonbuild/meson/issues/1889#issuecomment-1275991958 -if meson.is_subproject() and meson.version().version_compare('< 0.63') - project_c_args += ['-std=c99'] -endif - -project_c_args = cc.get_supported_arguments(project_c_args) - -thread_dep = dependency('threads') - -common_deps = [thread_dep] - -if host_machine.system() == 'windows' - common_deps += [cc.find_library('ws2_32')] -endif - -conf = configuration_data() - -document_list = [ - 'doc', - 'htmlpages', - 'manpages', - 'podpages', - 'txtpages', -] - -example_list = [ - 'avio_dir_cmd_example', - 'avio_reading_example', - 'decode_audio_example', - 'decode_video_example', - 'demuxing_decoding_example', - 'encode_audio_example', - 'encode_video_example', - 'extract_mvs_example', - 'filter_audio_example', - 'filtering_audio_example', - 'filtering_video_example', - 'http_multiclient_example', - 'hw_decode_example', - 'metadata_example', - 'muxing_example', - 'qsvdec_example', - 'remuxing_example', - 'resampling_audio_example', - 'scaling_video_example', - 'transcode_aac_example', - 'transcoding_example', - 'vaapi_encode_example', - 'vaapi_transcode_example', -] - -arch_ext_list_arm = [ - 'armv5te', - 'armv6', - 'armv6t2', - 'armv8', - 'neon', - 'vfp', - 'vfpv3', - 'setend', -] - -arch_ext_list_ppc = [ - 'altivec', - 'dcbzl', - 'ldbrx', - 'power8', - 'ppc4xx', - 'vsx', -] - -arch_ext_list_x86_simd = [ - 'aesni', - 'amd3dnow', - 'amd3dnowext', - 'avx', - 'avx2', - 'avx512', - 'fma3', - 'fma4', - 'mmx', - 'mmxext', - 'sse', - 'sse2', - 'sse3', - 'sse4', - 'sse42', - 'ssse3', - 'xop', -] - -arch_ext_list_x86 = arch_ext_list_x86_simd + [ - 'cpunop', - 'i686', -] - -arch_ext_list_mips = [ - 'mipsfpu', - 'mips32r2', - 'mips32r5', - 'mips64r2', - 'mips32r6', - 'mips64r6', - 'mipsdsp', - 'mipsdspr2', - 'msa', -] - -arch_ext_list_loongson = [ - 'loongson2', - 'loongson3', - 'mmi', -] - -arch_ext_list = arch_ext_list_arm + arch_ext_list_ppc + arch_ext_list_x86 + arch_ext_list_mips + arch_ext_list_loongson - -arch_features = [ - 'aligned_stack', - 'fast_64bit', - 'fast_clz', - 'fast_cmov', - 'local_aligned', - 'simd_align_16', - 'simd_align_32', - 'simd_align_64', -] - -builtin_list = [ - 'atomic_cas_ptr', - 'machine_rw_barrier', - 'MemoryBarrier', - 'mm_empty', - 'rdtsc', - 'sem_timedwait', - 'sync_val_compare_and_swap', -] - -complex_funcs = [ - 'cabs', - 'cexp', -] - -have_list_cmdline = [ - 'inline_asm', - 'symver', - 'x86asm', -] - -have_list_pub = [ - 'bigendian', - 'fast_unaligned', -] - -headers_list = [ - 'arpa_inet_h', - 'asm_types_h', - 'cdio_paranoia_h', - 'cdio_paranoia_paranoia_h', - 'cuda_h', - 'dispatch_dispatch_h', - 'dev_bktr_ioctl_bt848_h', - 'dev_bktr_ioctl_meteor_h', - 'dev_ic_bt8xx_h', - 'dev_video_bktr_ioctl_bt848_h', - 'dev_video_meteor_ioctl_meteor_h', - 'direct_h', - 'dirent_h', - 'dxgidebug_h', - 'dxva_h', - 'ES2_gl_h', - 'gsm_h', - 'io_h', - 'linux_perf_event_h', - 'machine_ioctl_bt848_h', - 'machine_ioctl_meteor_h', - 'malloc_h', - 'opencv2_core_core_c_h', - 'OpenGL_gl3_h', - 'poll_h', - 'sys_param_h', - 'sys_resource_h', - 'sys_select_h', - 'sys_soundcard_h', - 'sys_time_h', - 'sys_un_h', - 'sys_videoio_h', - 'termios_h', - 'udplite_h', - 'unistd_h', - 'valgrind_valgrind_h', - 'windows_h', - 'winsock2_h', -] - -intrinsics_list = [ - 'intrinsics_neon', -] - -math_funcs = [ - 'atanf', - 'atan2f', - 'cbrt', - 'cbrtf', - 'copysign', - 'cosf', - 'erf', - 'exp2', - 'exp2f', - 'expf', - 'hypot', - 'isfinite', - 'isinf', - 'isnan', - 'ldexpf', - 'llrint', - 'llrintf', - 'log2', - 'log2f', - 'log10f', - 'lrint', - 'lrintf', - 'powf', - 'rint', - 'round', - 'roundf', - 'sinf', - 'trunc', - 'truncf', -] - -system_features = [ - 'dos_paths', - 'libc_msvcrt', - 'MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS', - 'section_data_rel_ro', - 'threads', - 'uwp', - 'winrt', -] - -system_funcs = [ - 'access', - 'aligned_malloc', - 'arc4random', - 'clock_gettime', - 'closesocket', - 'CommandLineToArgvW', - 'fcntl', - 'getaddrinfo', - 'gethrtime', - 'getopt', - 'GetProcessAffinityMask', - 'GetProcessMemoryInfo', - 'GetProcessTimes', - 'getrusage', - 'GetSystemTimeAsFileTime', - 'gettimeofday', - 'glob', - 'glXGetProcAddress', - 'gmtime_r', - 'inet_aton', - 'isatty', - 'kbhit', - 'localtime_r', - 'lstat', - 'lzo1x_999_compress', - 'mach_absolute_time', - 'MapViewOfFile', - 'memalign', - 'mkstemp', - 'mmap', - 'mprotect', - 'nanosleep', - 'PeekNamedPipe', - 'posix_memalign', - 'pthread_cancel', - 'sched_getaffinity', - 'SecItemImport', - 'SetConsoleTextAttribute', - 'SetConsoleCtrlHandler', - 'setmode', - 'setrlimit', - 'Sleep', - 'strerror_r', - 'sysconf', - 'sysctl', - 'usleep', - 'UTGetOSTypeFromString', - 'VirtualAlloc', - 'wglGetProcAddress', -] - -system_libraries = [ - 'bcrypt', - 'vaapi_drm', - 'vaapi_x11', - 'vdpau_x11', -] - -threads_list = [ - 'pthreads', - 'os2threads', - 'w32threads', -] - -toolchain_features = [ - 'as_arch_directive', - 'as_dn_directive', - 'as_fpu_directive', - 'as_func', - 'as_object_arch', - 'asm_mod_q', - 'blocks_extension', - 'ebp_available', - 'ebx_available', - 'gnu_as', - 'gnu_windres', - 'ibm_asm', - 'inline_asm_direct_symbol_refs', - 'inline_asm_labels', - 'inline_asm_nonlocal_labels', - 'pragma_deprecated', - 'rsync_contimeout', - 'symver_asm_label', - 'symver_gnu_asm', - 'vfp_args', - 'xform_asm', - 'xmm_clobbers', -] - -types_list = [ - 'kCMVideoCodecType_HEVC', - 'socklen_t', - 'struct_addrinfo', - 'struct_group_source_req', - 'struct_ip_mreq_source', - 'struct_ipv6_mreq', - 'struct_msghdr_msg_flags', - 'struct_pollfd', - 'struct_rusage_ru_maxrss', - 'struct_sctp_event_subscribe', - 'struct_sockaddr_in6', - 'struct_sockaddr_sa_len', - 'struct_sockaddr_storage', - 'struct_stat_st_mtim_tv_nsec', - 'struct_v4l2_frmivalenum_discrete', -] - -conf.set('runtime_cpudetect', 1) -asm = get_option('asm') -inline_asm = get_option('inline_asm') - -conf.set10('asm', asm.allowed()) - -if inline_asm.allowed() - conf.set10('inline_asm', - cc.compiles( - 'void foo(void){ __asm__ volatile(@0@); }'.format('"" ::'), - name: 'inline_asm' - ) - ) -else - conf.set10('inline_asm', false) -endif - -arch_ext_list_external = [] -arch_ext_list_inline = [] - -foreach arch_ext : arch_ext_list - conf.set10(arch_ext, conf.get('asm') == 1) - conf.set10('@0@_external'.format(arch_ext), conf.get('asm') == 1) - conf.set10('@0@_inline'.format(arch_ext), conf.get('asm') == 1 and conf.get('inline_asm') == 1) - arch_ext_list_external += ['@0@_external'.format(arch_ext)] - arch_ext_list_inline += ['@0@_inline'.format(arch_ext)] -endforeach - -have_list = (arch_ext_list + arch_ext_list_external + arch_ext_list_inline + arch_features + - builtin_list + complex_funcs + have_list_cmdline + - have_list_pub + headers_list + intrinsics_list + math_funcs + system_features + system_funcs + - system_libraries + threads_list + toolchain_features + types_list + [ - 'makeinfo', - 'makeinfo_html', - 'mmx2', - 'opencl_d3d11', - 'opencl_drm_arm', - 'opencl_drm_beignet', - 'opencl_dxva2', - 'opencl_vaapi_beignet', - 'opencl_vaapi_intel_media', - 'perl', - 'pod2man', - 'texi2html', -]) - -arch_features = [ - ['aligned_stack', ['aarch64', 'ppc', 'x86']], - ['fast_64bit', ['aarch64', 'alpha', 'ia64', 'mips64', 'parisc64', 'ppc64', 'sparc64', 'x86_64']], - ['fast_clz', ['aarch64', 'alpha', 'avr32', 'mips', 'ppc', 'x86']], - ['fast_unaligned', ['aarch64', 'ppc', 'x86']], - ['simd_align_16', ['altivec', 'neon', 'sse']], - ['simd_align_32', ['avx']], - ['simd_align_64', ['avx512']], -] - -arch_list = [ - 'aarch64', - 'alpha', - 'arm', - 'avr32', - 'avr32_ap', - 'avr32_uc', - 'bfin', - 'ia64', - 'm68k', - 'mips', - 'mips64', - 'parisc', - 'ppc', - 'ppc64', - 's390', - 'sh4', - 'sparc', - 'sparc64', - 'tilegx', - 'tilepro', - 'tomi', - 'x86', - 'x86_32', - 'x86_64', -] - -ioctl_meteor_headers = [ - ['dev/bktr/ioctl_meteor.h', 'dev/bktr/ioctl_bt848.h'], - ['machine/ioctl_meteor.h', 'machine/ioctl_bt848.h'], - ['dev/video/meteor/ioctl_meteor.h', 'dev/video/bktr/ioctl_bt848.h'], - ['dev/ic/bt8xx.h']] - -headers_found = false - -foreach headers : ioctl_meteor_headers - if not headers_found - n_headers_found = 0 - foreach header : headers - header_found = cc.has_header(header) - if header_found - n_headers_found += 1 - endif - endforeach - - headers_found = headers.length() == n_headers_found - - foreach header : headers - conf.set10(header.underscorify(), headers_found) - endforeach - endif -endforeach - -check_structs = [ - ['struct rusage', 'ru_maxrss', '#include \n#include\n'], - ['struct stat', 'st_mtim.tv_nsec', '#include \n#define _BSD_SOURCE'], -] - -hwaccel_autodetect_library_list = [ - 'amf', - 'audiotoolbox', - 'crystalhd', - 'cuda', - 'cuvid', - 'd3d11va', - 'dxva2', - 'ffnvcodec', - 'nvdec', - 'nvenc', - 'vaapi', - 'vdpau', - 'videotoolbox', - 'v4l2_m2m', - 'xvmc', -] - -external_autodetect_library_list = [ - 'alsa', - 'appkit', - 'avfoundation', - 'bzlib', - 'coreimage', - 'iconv', - 'libxcb', - 'libxcb_shm', - 'libxcb_shape', - 'libxcb_xfixes', - 'lzma', - 'mediafoundation', - 'schannel', - 'sdl2', - 'securetransport', - 'sndio', - 'xlib', - 'zlib', -] - -library_gpl_list = [ - 'avisynth', - 'frei0r', - 'libcdio', - 'libdavs2', - 'librubberband', - 'libvidstab', - 'libx264', - 'libx265', - 'libxavs', - 'libxavs2', - 'libxvid', -] - -library_nonfree_list = [ - 'decklink', - 'libfdk_aac', - 'openssl', - 'libtls', -] - -library_version3_list = [ - 'gmp', - 'libaribb24', - 'liblensfun', - 'libopencore_amrnb', - 'libopencore_amrwb', - 'libvo_amrwbenc', - 'rkmpp', -] - -library_gplv3_list = [ - 'libsmbclient', -] - -all_checks = [] - -cpp_cond = ''' -#include <@0@> - -#if !(@1@) -#error "unsatisfied condition: @1@" -#endif - -int main(void) { - return 0; -} -''' - -check_winapi_family = ''' -#ifdef WINAPI_FAMILY -#include -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -#error not desktop -#endif -#endif - -int main(void) { - return 0; -} -''' - -libc_type = '' - -if cc.links(cpp_cond.format('features.h', 'defined __UCLIBC__')) - libc_type = 'uclibc' - project_c_args += ['-D_POSIX_C_SOURCE=200112', '-D_XOPEN_SOURCE=600'] -elif cc.links(cpp_cond.format('features.h', 'defined __GLIBC__')) - libc_type = 'glibc' - project_c_args += ['-D_POSIX_C_SOURCE=200112', '-D_XOPEN_SOURCE=600'] -elif cc.links(cpp_cond.format('newlib.h', 'defined _NEWLIB_VERSION')) - libc_type = 'newlib' - project_c_args += ['-U__STRICT_ANSI__', '-D_XOPEN_SOURCE=600'] -elif cc.links(cpp_cond.format('_mingw.h', 'defined __MINGW64_VERSION_MAJOR')) - libc_type = 'mingw64' - if cc.links(cpp_cond.format('_mingw.h', '__MINGW64_VERSION_MAJOR < 3')) - # FIXME compat - endif - project_c_args += ['-U__STRICT_ANSI__', '-D__USE_MINGW_ANSI_STDIO=1'] - if cc.get_id() == 'gcc' - project_c_args += ['-D__printf__=__gnu_printf__'] - endif - if cc.links(cpp_cond.format('windows.h', '!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600')) - project_c_args += ['-D_WIN32_WINNT=0x0600'] - endif -elif (cc.links(cpp_cond.format('_mingw.h', 'defined __MINGW_VERSION')) or - cc.links(cpp_cond.format('_mingw.h', 'defined __MINGW32_VERSION'))) - libc_type = 'mingw32' - if cc.links(cpp_cond.format('_mingw.h', '__MINGW32_MAJOR_VERSION > 3 || (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15')) - error('MinGW32 runtime version must be >= 3.15') - endif - project_c_args += ['-U__STRICT_ANSI__', '-D__USE_MINGW_ANSI_STDIO=1'] - if cc.links(cpp_cond.format('_mingw.h', '__MSVCRT_VERSION__ < 0x0700')) - project_c_args += ['-D__MSVCRT_VERSION__=0x0700'] - endif - if cc.links(cpp_cond.format('windows.h', '!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600')) - project_c_args += ['-D_WIN32_WINNT=0x0600'] - endif - if cc.get_id() == 'gcc' - project_c_args += ['-D__printf__=__gnu_printf__'] - endif -elif cc.links(cpp_cond.format('crtversion.h', 'defined _VC_CRT_MAJOR_VERSION')) - libc_type = 'msvcrt' - if cc.links(cpp_cond.format('crtversion.h', '_VC_CRT_MAJOR_VERSION < 14')) - # FIXME compat - endif - project_c_args += ['-D_USE_MATH_DEFINES', '-D_CRT_SECURE_NO_WARNINGS', '-D_CRT_NONSTDC_NO_WARNINGS'] - if (cc.links(cpp_cond.format('stdlib.h', 'defined(_WIN32_WINNT)')) or - cc.links(check_winapi_family)) - project_c_args += ['-D_WIN32_WINNT=0x0600'] - endif - if not cc.has_function('strtoll') - project_c_args += ['-Dstrtoll=_strtoi64'] - endif - if not cc.has_function('strtoull') - project_c_args += ['-Dstrtoull=_strtoui64'] - endif -elif cc.links(cpp_cond.format('stddef.h', 'defined __KLIBC__')) - libc_type = 'klibc' -elif cc.links(cpp_cond.format('stddef.h', 'defined __BIONIC__')) - libc_type = 'bionic' -elif cc.links(cpp_cond.format('sys/brand.h', 'defined LABELED_BRAND_NAME')) - libc_type = 'solaris' - project_c_args += ['-D__EXTENSIONS__', '-D_XOPEN_SOURCE=600'] -endif - -if not cc.has_function('localtime_r', prefix: '#include ', args: project_c_args) - if cc.has_function('localtime_r', prefix: '#include ', args: project_c_args + ['-D_POSIX_C_SOURCE=200112', '-D_XOPEN_SOURCE=600']) - project_c_args += ['-D_POSIX_C_SOURCE=200112', '-D_XOPEN_SOURCE=600'] - endif -endif - -if libc_type != '' - conf.set('libc_@0@'.format(libc_type), 1) -endif - -conf.set10('pic', conf.get('pic', cc.links(cpp_cond.format('stdlib.h', 'defined(__PIC__) || defined(__pic__) || defined(PIC)')))) - -check_pkg_config = [ - ['alsa', ['alsa/asoundlib.h'], ['snd_pcm_htimestamp'], {}], - ['ffnvcodec', ['ffnvcodec/nvEncodeAPI.h', 'ffnvcodec/dynlink_cuda.h', 'ffnvcodec/dynlink_cuviddec.h', 'ffnvcodec/dynlink_nvcuvid.h'], - [], {'versions': ['>= 9.1.23.1', ['>= 9.0.18.3', '< 9.1'], ['>= 8.2.15.10', '< 8.3'], ['>= 8.1.24.11', '< 8.2']]}], - ['libgme', ['gme/gme.h'], ['gme_new_emu'], {}], - ['gnutls', ['gnutls/gnutls.h'], ['gnutls_global_init'], {}], - ['libaom', ['aom/aom_codec.h'], ['aom_codec_version'], {'pkg': 'aom', 'version': '>= 0.1.0'}], - ['libaribb24', ['aribb24/aribb24.h'], ['arib_instance_new'], {'pkg': 'aribb24', 'version': '> 1.0.3'}], - ['lv2', ['lilv-0/lilv/lilv.h'], ['lilv_world_new'], {'pkg': 'lilv-0'}], - ['libass', ['ass/ass.h'], ['ass_library_init'], {}], - ['libbluray', ['libbluray/bluray.h'], ['bd_open'], {}], - ['libbs2b', ['bs2b.h'], ['bs2b_open'], {}], - ['libcaca', ['caca.h'], ['caca_create_canvas'], {'pkg': 'caca'}], - ['libcdio', ['cdio/cdda.h', 'cdio/paranoia.h'], ['cdio_cddap_open'], {'pkg': 'libcdio_paranoia'}], - ['libcdio', ['cdio/paranoia/cdda.h', 'cdio/paranoia/paranoia.h'], ['cdio_cddap_open'], {'pkg': 'libcdio_paranoia'}], - ['libdavs2', ['davs2.h'], ['davs2_decoder_open'], {'pkg': 'davs2', 'version': '>= 1.6.0'}], - ['libdc1394', ['dc1394/dc1394.h'], ['dc1394_new'], {'pkg': 'libdc1394-2'}], - ['libdrm', ['xf86drm.h'], ['drmGetVersion'], {}], - ['libfdk_aac', ['fdk-aac/aacenc_lib.h'], ['aacEncOpen'], {'pkg': 'fdk-aac'}], - ['libfontconfig', ['fontconfig/fontconfig.h'], ['FcInit'], {'pkg': 'fontconfig'}], - ['libfreetype', ['ft2build.h', 'FT_FREETYPE_H'], ['FT_Init_FreeType'], {'pkg': 'freetype2'}], - ['libfribidi', ['fribidi.h'], ['fribidi_version_info'], {'pkg': 'fribidi'}], - ['libjack', ['jack/jack.h'], ['jack_port_get_latency_range'], {'pkg': 'jack'}], - ['libklvanc', ['libklvanc/vanc.h'], ['klvanc_context_create'], {}], - ['libkvazaar', ['kvazaar.h'], ['kvz_api_get'], {'pkg': 'kvazaar', 'version': '>= 0.8.1'}], - ['liblensfun', ['lensfun.h'], ['lf_db_new'], {'pkg': 'lensfun'}], - ['libmfx', ['mfx/mfxvideo.h'], ['MFXInit'], {}], - ['libmodplug', ['libmodplug/modplug.h'], ['ModPlug_Load'], {}], - ['libopencv', ['opencv2/core/core_c.h'], ['cvCreateImageHeader'], {'pkg': 'opencv'}], - ['libopencv', ['opencv/cxcore.h'], ['cvCreateImageHeader'], {'pkg': 'opencv'}], - ['libopenh264', ['wels/codec_api.h'], ['WelsGetCodecVersion'], {'pkg': 'openh264'}], - ['libdav1d', ['dav1d/dav1d.h'], ['dav1d_version'], {'pkg': 'dav1d', 'version': '>= 0.4.0'}], - ['libopenjpeg', ['openjpeg.h'], ['opj_version'], {'pkg': 'libopenjp2', - 'version': '>= 2.1.0'}], - ['libopenjpeg', ['openjpeg.h'], ['opj_version'], {'pkg': 'libopenjp2', - 'version': '>= 2.1.0', - 'c_args': ['-DOPJ_STATIC']}], - ['libopenmpt', ['libopenmpt/libopenmpt.h'], ['openmpt_module_create'], {'version': '>= 0.2.6557'}], - ['libopus', ['opus_multistream.h'], ['opus_multistream_decoder_create', 'opus_multistream_surround_encoder_create'], {'pkg': 'opus'}], - ['libpulse', ['pulse/pulseaudio.h'], ['pa_context_new'], {}], - ['librabbitmq', ['amqp.h'], ['amqp_new_connection'], {'pkg': 'librabbitmq', 'version': '>= 0.7.1'}], - ['librav1e', ['rav1e.h'], ['rav1e_context_new'], {'pkg': 'rav1e', 'version': '>= 0.1.0'}], - ['librist', ['librist/librist.h'], ['rist_receiver_create'], {'pkg': 'rist', 'version': '>= 0.2'}], - ['librsvg', ['librsvg-2.0/librsvg/rsvg.h'], ['rsvg_handle_render_cairo'], {'pkg': 'librsvg-2.0'}], - ['librtmp', ['librtmp/rtmp.h'], ['RTMP_Socket'], {}], - ['librubberband', ['rubberband/rubberband-c.h'], ['rubberband_new'], {'pkg': 'rubberband', 'version': '>= 1.8.1'}], - ['libshine', ['shine/layer3.h'], ['shine_encode_buffer'], {'pkg': 'shine'}], - ['libsmbclient', ['libsmbclient.h'], ['smbc_init'], {'pkg': 'smbclient'}], - ['libssh', ['libssh/sftp.h'], ['sftp_init'], {}], - ['libspeex', ['speex/speex.h'], ['speex_decoder_init'], {'pkg': 'speex'}], - ['libsrt', ['srt/srt.h'], ['srt_socket'], {'pkg': 'srt', 'version': '>= 1.2.0'}], - ['libsvtav1', ['EbSvtAv1Enc.h'], ['svt_av1_enc_init_handle'], {'pkg': 'SvtAv1Enc', 'version': '>= 0.8.4'}], - ['libtesseract', ['tesseract/capi.h'], ['TessBaseAPICreate'], {'pkg': 'tesseract'}], - ['libtls', ['tls.h'], ['tls_configure'], {}], - ['libv4l2', ['libv4l2.h'], ['v4l2_ioctl'], {}], - ['libvidstab', ['vid.stab/libvidstab.h'], ['vsMotionDetectInit'], {'pkg': 'vidstab', 'version': '>= 0.98'}], - ['libvmaf', ['libvmaf.h'], ['compute_vmaf'], {'version': '>= 0.6.2'}], - ['libvorbis', ['vorbis/codec.h'], ['vorbis_info_init'], {'pkg': 'vorbis'}], - ['libvorbisenc', ['vorbis/vorbisenc.h'], ['vorbis_encode_init'], {'pkg': 'vorbisenc'}], - ['libvpx', ['vpx/vpx_decoder.h', 'vpx/vpx_encoder.h'], [], {'pkg': 'vpx', 'version': '>= 1.4.0'}], - ['libvpx_vp8_decoder', ['vpx/vpx_decoder.h', 'vpx/vp8dx.h'], ['vpx_codec_vp8_dx'], {'pkg': 'vpx', 'version': '>= 1.4.0'}], - ['libvpx_vp8_encoder', ['vpx/vpx_encoder.h', 'vpx/vp8cx.h'], ['vpx_codec_vp8_cx'], {'pkg': 'vpx', 'version': '>= 1.4.0'}], - ['libvpx_vp9_decoder', ['vpx/vpx_decoder.h', 'vpx/vp8dx.h'], ['vpx_codec_vp9_dx'], {'pkg': 'vpx', 'version': '>= 1.4.0'}], - ['libvpx_vp9_encoder', ['vpx/vpx_encoder.h', 'vpx/vp8cx.h'], ['vpx_codec_vp9_cx'], {'pkg': 'vpx', 'version': '>= 1.4.0'}], - ['libwebp', ['webp/encode.h'], ['WebPGetEncoderVersion'], {'version': '>= 0.2.0'}], - ['libwebp_anim_encoder', ['webp/mux.h'], ['WebPAnimEncoderOptionsInit'], {'pkg': 'libwebpmux', 'version': '>= 0.4.0'}], - ['libx264', ['stdint.h', 'x264.h'], ['x264_encoder_encode'], {'pkg': 'x264'}], - ['libx265', ['x265.h'], ['x265_api_get'], {'pkg': 'x265'}], - ['libxcb', ['xcb/xcb.h'], ['xcb_connect'], {'pkg': 'xcb', 'version': '>= 1.4'}], - ['libxcb_shm', ['xcb/shm.h'], ['xcb_shm_attach'], {'pkg': 'xcb-shm'}], - ['libxcb_shape', ['xcb/shape.h'], ['xcb_shape_get_rectangles'], {'pkg': 'xcb-shape'}], - ['libxcb_xfixes', ['xcb/xfixes.h'], ['xcb_xfixes_get_cursor_image'], {'pkg': 'xcb-xfixes'}], - ['libxml2', ['libxml2/libxml/xmlversion.h'], ['xmlCheckVersion'], {'pkg': 'libxml-2.0'}], - ['libzimg', ['zimg.h'], ['zimg_get_api_version'], {'pkg': 'zimg', 'version': '>= 2.7.0'}], - ['libzmq', ['zmq.h'], ['zmq_ctx_new'], {}], - ['libzvbi', ['libzvbi.h'], ['vbi_decoder_new'], {'pkg': 'zvbi-0.2'}], - ['openssl', ['openssl/ssl.h'], ['OPENSSL_init_ssl', 'SSL_library_init'], {'has_any_func': true}], - ['pocketsphinx', ['pocketsphinx/pocketsphinx.h'], ['ps_init'], {}], - ['rkmpp', ['rockchip/rk_mpi.h'], ['mpp_create'], {'pkg': 'rockchip_mpp'}], - ['rockchip_mpp', ['rockchip/rk_mpi.h'], ['mpp_create'], {'version': '>= 1.3.7'}], - ['sdl2', ['SDL_events.h'], ['SDL_PollEvent'], {'version': ['>= 2.0.1', '< 3.0.0']}], - ['vapoursynth', ['VSScript.h'], ['vsscript_init'], {'pkg': 'vapoursynth-script', 'version': '>= 42'}], - ['vulkan', ['vulkan/vulkan.h'], ['vkCreateInstance'], {'pkg': 'vulkan', 'version': '>= 1.1.97'}], -] - -foreach check : check_pkg_config - all_checks += [['pkg-config', check]] -endforeach - -conf.set10('vdpau', cc.has_header('vdpau/vdpau.h') and - cc.get_define('VDP_DECODER_PROFILE_MPEG4_PART2_ASP', prefix: '#include ') != '') - -conf.set10('nanosleep', cc.has_function('nanosleep', prefix: '#include ')) - -check_components = [ - ['advapi32', ['windows.h'], ['RegCloseKey'], ['advapi32']], - ['avsynth', ['avisynth/avisynth_c.h'], [], []], - ['alsa', ['alsa/asoundlib.h'], ['snd_pcm_htimestamp'], ['asound']], - ['android', ['android/native_window.h'], ['ANativeWindow_acquire'], ['android']], - ['bcrypt', ['windows.h', 'bcrypt.h'], ['BCryptGenRandom'], ['bcrypt']], - ['bzlib', ['bzlib.h'], ['BZ2_bzlibVersion'], ['bz2']], - ['camera2ndk', ['stdbool.h', 'stdint.h', 'camera/NdkCameraManager.h'], ['ACameraManager_create'], ['camera2ndk']], - ['decklink', ['DeckLinkAPI.h'], [], []], - ['libcelt', ['celt/celt.h'], ['celt_decoder_create_custom'], ['celt0']], - ['chromaprint', ['chromaprint.h'], ['chromaprint_get_version'], ['chromaprint']], - ['clock_gettime', ['time.h'], ['clock_gettime'], []], - ['clock_gettime', ['time.h'], ['clock_gettime'], ['rt']], - ['cuda_sdk', ['cuda.h'], ['cuCtxCreate'], ['cuda']], - ['crystalhd', ['stdint.h', 'libcrystalhd/libcrystalhd_if.h'], ['DtsCrystalHDVersion'], ['crystalhd']], - ['frei0r', ['frei0r.h', 'dlfcn.h'], [], []], - ['libgme', ['gme/gme.h'], ['gme_new_emu'], ['gme', 'stdc++']], - ['gcrypt', ['gcrypt.h'], ['gcry_mpi_new'], ['gcrypt']], - ['gmp', ['gmp.h'], ['mpz_export'], ['gmp']], - ['ladspa', ['ladspa.h', 'dlfcn.h'], [], []], - ['libcdio', ['cdio/cdda.h', 'cdio/paranoia.h'], ['cdio_cddap_open'], ['cdio_paranoia', 'cdio_cdda', 'cdio']], - ['libcdio', ['cdio/paranoia/cdda.h', 'cdio/paranoia/paranoia.h'], ['cdio_cddap_open'], ['cdio_paranoia', 'cdio_cdda', 'cdio']], - ['libcodec2', ['codec2/codec2.h'], ['codec2_create'], ['codec2']], - ['libdl', ['dlfcn.h'], ['dlopen', 'dlsym'], []], - ['libdl', ['dlfcn.h'], ['dlopen', 'dlsym'], ['dl']], - ['libfdk_aac', ['fdk-aac/aacenc_lib.h'], ['aacEncOpen'], ['fdk-aac']], - ['libflite', ['flite/flite.h'], ['flite_init'], ['flite_cmu_time_awb', 'flite_cmu_us_awb', 'flite_cmu_us_kal', - 'flite_cmu_us_kal16', 'flite_cmu_us_rms', 'flite_cmu_us_slt', - 'flite_usenglish', 'flite_cmulex', 'flite']], - ['libgsm', ['gsm.h'], ['gsm_create'], ['gsm']], - ['libgsm', ['gsm/gsm.h'], ['gsm_create'], ['gsm']], - ['libiec61883', ['libiec61883/iec61883.h'], ['iec61883_cmp_connect'], ['raw1394', 'avc1394', 'rom1394', 'iec61883']], - ['libilbc', ['ilbc.h'], ['WebRtcIlbcfix_InitDecode'], ['lbc']], - ['libm', ['math.h'], ['sin'], ['m'], {'always-check': true}], # always check for libm don't provide an option to disable it - ['libopenvino', ['c_api/ie_c_api.h'], ['ie_c_api_version'], ['inference_engine_c_api']], - ['libnpp', ['npp.h'], ['nppGetLibVersion'], ['nppig', 'nppicc', 'nppc']], - ['libnpp', ['npp.h'], ['nppGetLibVersion'], ['nppi', 'nppc']], - ['libopencore_amrnb', ['opencore-amrnb/interf_dec.h'], ['Decoder_Interface_init'], ['opencore-amrnb']], - ['libopencore_amrwb', ['opencore-amrwb/dec_if.h'], ['D_IF_init'], ['opencore-amrwb']], - ['libopencv', ['opencv2/core/core_c.h'], ['cvCreateImageHeader'], ['opencv_core', 'opencv_imgproc']], - ['libsmbclient', ['libsmbclient.h'], ['smbc_init'], ['smbclient']], - ['libsnappy', ['snappy-c.h'], ['snappy_compress'], ['snappy', 'stdc++']], - ['libsoxr', ['soxr.h'], ['soxr_create'], ['soxr']], - ['libtensorflow', ['tensorflow/c/c_api.h'], ['TF_Version'], ['tensorflow']], - ['libtheora', ['theora/theoraenc.h'], ['th_info_init'], ['theoraenc', 'theoradec', 'ogg']], - ['libtwolame', ['twolame.h'], ['twolame_init', 'twolame_encode_buffer_float32_interleaved'], ['twolame']], - ['libvo_amrwbenc', ['vo-amrwbenc/enc_if.h'], ['E_IF_init'], ['vo-amrwbenc']], - ['libvpx_vp8_decoder', ['vpx/vpx_decoder.h', 'vpx/vp8dx.h'], ['vpx_codec_vp8_dx'], ['vpx'], - {'defines': ['VPX_IMG_FMT_HIGHBITDEPTH'], 'extra_deps': ['libm_extra_deps', 'thread_dep']}], - ['libvpx_vp8_encoder', ['vpx/vpx_encoder.h', 'vpx/vp8cx.h'], ['vpx_codec_vp8_cx'], ['vpx'], - {'defines': ['VPX_IMG_FMT_HIGHBITDEPTH'], 'extra_deps': ['libm_extra_deps', 'thread_dep']}], - ['libvpx_vp9_decoder', ['vpx/vpx_decoder.h', 'vpx/vp8dx.h'], ['vpx_codec_vp9_dx'], ['vpx'], - {'defines': ['VPX_IMG_FMT_HIGHBITDEPTH'], 'extra_deps': ['libm_extra_deps', 'thread_dep']}], - ['libvpx_vp9_encoder', ['vpx/vpx_encoder.h', 'vpx/vp8cx.h'], ['vpx_codec_vp9_cx'], ['vpx'], - {'defines': ['VPX_IMG_FMT_HIGHBITDEPTH'], 'extra_deps': ['libm_extra_deps', 'thread_dep']}], - ['libxvid', ['xvid.h'], ['xvid_global'], ['xvidcore']], - ['linux_fb_h', ['linux/fb.h'], [], []], - ['lzma', ['lzma.h'], ['lzma_version_number'], ['lzma']], - ['mediafoundation', ['mfapi.h'], ['MFCreateAlignedMemoryBuffer'], ['mfplat', 'mfuuid', 'ole32', 'strmiids'], {'defines': ['mftransform_h']}], - ['mediandk', ['stdint.h', 'media/NdkImage.h'], ['AImage_delete'], ['mediandk']], - ['mmal', ['interface/mmal/mmal.h'], ['mmal_port_connect'], ['mmal_core', 'mmal_util', 'mmal_vc_client', 'bcm_host']], - ['nanosleep', ['time.h'], ['nanosleep'], ['rt']], - ['ole32', ['windows.h'], ['CoTaskMemFree'], ['ole32']], - ['omx', ['OMX_Core.h'], [], []], - ['openal', ['AL/al.h'], ['alGetError'], ['openal']], - ['openal', ['AL/al.h'], ['alGetError'], ['OpenAL32']], - # FIXME- Get opencl working - remove the disabler() at that time. - ['opencl', ['CL/cl.h'], ['clEnqueueNDRangeKernel'], ['OpenCL', disabler()]], - ['opengl', ['GL/glx.h'], ['glXGetProcAddress'], ['GL']], - ['opengl', ['windows.h'], ['wglGetProcAddress'], ['opengl32', 'gdi32']], - ['openssl', ['openssl/ssl.h'], ['SSL_library_init'], ['ssl', 'crypto']], - ['openssl', ['openssl/ssl.h'], ['SSL_library_init'], ['ssl32', 'eay32']], - ['openssl', ['openssl/ssl.h'], ['SSL_library_init'], ['ssl', 'crypto', 'ws2_32', 'gdi32']], - ['psapi', ['windows.h', 'psapi.h'], ['GetProcessMemoryInfo'], ['psapi']], - ['shell32', ['windows.h', 'shellapi.h'], ['CommandLineToArgvW'], ['shell32']], - ['sndio', ['sndio.h'], ['sio_open'], ['sndio']], - ['user32', ['windows.h', 'winuser.h'], ['GetShellWindow'], ['user32']], - ['vfw32', ['windows.h', 'vfw.h'], ['capCreateCaptureWindow'], ['vfw3']], - ['vaapi', ['va/va.h'], ['vaInitialize'], ['va']], - ['zlib', ['zlib.h'], ['zlibVersion'], ['z'], {'meson-dep': 'zlib'}], - - # Libraries with preconditions - ['vaapi_drm', ['va/va.h', 'va/va_drm.h'], ['vaGetDisplayDRM'], ['va', 'va-drm'], - {'preconditions': ['vaapi']}], - ['vaapi_x11', ['va/va.h', 'va/va_x11.h'], ['vaGetDisplay'], ['va', 'va-x11', 'X11'], - {'preconditions': ['vaapi']}], - ['vdpau_x11', ['vdpau/vdpau.h', 'vdpau/vdpau_x11.h'], ['vdp_device_create_x11'], ['vdpau', 'X11'], - {'preconditions' : ['vdpau']}], - ['libmfx', ['mfx/mfxvideo.h'], ['MFXInit'], ['libmfx'], - {'preconditions': ['advapi32'], 'extra_deps': ['advapi32_extra_deps']}], - ['libmp3lame', ['lame/lame.h'], ['lame_set_VBR_quality'], ['mp3lame'], - {'preconditions': ['libm'], 'extra_deps': ['libm_extra_deps']}], - ['libmysofa', ['mysofa.h'], ['mysofa_load'], ['mysofa'], - {'preconditions': ['zlib'], 'extra_deps': ['zlib_extra_deps']}], - ['libx264', ['stdint.h', 'x264.h'], ['x264_encoder_encode'], ['x264'], - {'preconditions': ['libm'], 'extra_deps': ['libm_extra_deps']}], - ['libxavs', ['stdint.h', 'xavs.h'], ['xavs_encoder_encode'], ['xavs'], - {'preconditions': ['libm'], 'extra_deps': ['libm_extra_deps']}], -] - -foreach check : check_components - all_checks += [['component', check]] -endforeach - -check_header_funcs = [ - ['aligned_malloc', ['malloc.h'], {'funcs': ['_aligned_malloc']}], - ['arc4random', ['stdlib.h']], - ['kbhit', ['conio.h']], - ['setmode', ['io.h']], - ['lzo1x_999_compress', ['lzo/lzo1x.h']], - ['mach_absolute_time', ['mach/mach_time.h']], - ['getenv', ['stdlib.h']], - ['lstat', ['sys/stat.h']], - ['GetProcessAffinityMask', ['windows.h']], - ['GetProcessTimes', ['windows.h']], - ['GetSystemTimeAsFileTime', ['windows.h']], - ['LoadLibrary', ['windows.h']], - ['MapViewOfFile', ['windows.h']], - ['PeekNamedPipe', ['windows.h']], - ['SetConsoleTextAttribute', ['windows.h']], - ['SetConsoleCtrlHandler', ['windows.h']], - ['Sleep', ['windows.h']], - ['VirtualAlloc', ['windows.h']], - ['glob', ['glob.h']], - ['XvGetPortAttribute', ['X11/Xlib.h', 'X11/extensions/Xvlib.h'], {'link_with': ['Xv', 'X11', 'Xext']}], - ['CreateDIBSection', ['windows.h'], {'link_with': ['gdi32']}], - ['InitializeSecurityContext', ['windows.h', 'security.h'], {'link_with': ['secur32']}], - ['atomic_cas_ptr', ['atomic.h']], - ['machine_rw_barrier', ['mbarrier.h'], {'funcs': ['__machine_rw_barrier']}], - ['MemoryBarrier', ['windows.h']], - ['x264_csp_bgr', ['stdint.h', 'x264.h'], {'defines': ['X264_CSP_BGR']}], - ['posix_memalign', ['stdlib.h']], - ['sem_timedwait', ['semaphore.h'], {'preconditions': ['pthreads'], 'extra_deps': ['thread_dep']}], -] - -foreach func : complex_funcs - check_header_funcs += [[func, ['complex.h', 'math.h']]] -endforeach - -foreach func : math_funcs - check_header_funcs += [[func, ['math.h'], {'extra_deps': ['libm_extra_deps']}]] -endforeach - -check_funcs = [ - ['getaddrinfo'], - ['inet_aton'], - ['memalign'], - ['access'], - ['fcntl'], - ['fork'], - ['gethrtime'], - ['getopt'], - ['getrusage'], - ['gettimeofday'], - ['isatty'], - ['mkstemp'], - ['mmap'], - ['mprotect'], - ['sched_getaffinity'], - ['setrlimit'], - ['strerror_r'], - ['sysconf'], - ['sysctl'], - ['usleep'], - ['pthread_join', {'preconditions': ['pthreads'], 'extra_deps': ['thread_dep']}], - ['pthread_create', {'preconditions': ['pthreads'], 'extra_deps': ['thread_dep']}], - ['pthread_cancel', {'preconditions': ['pthreads'], 'extra_deps': ['thread_dep']}], - ['sync_val_compare_and_swap', {'funcs': ['__sync_val_compare_and_swap']}], - ['gmtime_r'], - ['localtime_r'], -] - -check_types = [ - ['DXVA_PicParams_HEVC', ['windows.h', 'dxva.h'], {'c_args': ['-DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP', '-D_CRT_BUILD_DESKTOP_APP=0']}], - ['DXVA_PicParams_VP9', ['windows.h', 'dxva.h'], {'c_args': ['-DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP', '-D_CRT_BUILD_DESKTOP_APP=0']}], - ['ID3D11VideoDecoder', ['windows.h', 'd3d11.h']], - ['ID3D11VideoContext', ['windows.h', 'd3d11.h']], - ['DXVA2_ConfigPictureDecode', ['d3d9.h', 'dxva2api.h'], {'c_args': ['-D_WIN32_WINNT=0x0602']}], - ['VAPictureParameterBufferHEVC', ['va/va.h', 'va/va_dec_hevc.h']], - ['VAPictureParameterBufferVP8', ['va/va.h', 'va/va_dec_vp8.h']], - ['VAProcPipelineParameterBuffer', ['va/va.h', 'va/va_vpp.h']], - ['VAProcPipelineParameterBuffer', ['va/va.h', 'va/va_vpp.h']], - ['VAEncPictureParameterBufferH264', ['va/va.h', 'va/va_enc_h264.h']], - ['VAEncPictureParameterBufferHEVC', ['va/va.h', 'va/va_enc_hevc.h']], - ['VAEncPictureParameterBufferJPEG', ['va/va.h', 'va/va_enc_mpeg2.h']], - ['VAEncPictureParameterBufferMPEG2', ['va/va.h', 'va/va_enc_mpeg2.h']], - ['VAEncPictureParameterBufferVP8', ['va/va.h', 'va/va_enc_vp8.h']], - ['VAEncPictureParameterBufferVP9', ['va/va.h', 'va/va_enc_vp9.h']], - ['VdpPictureInfoHEVC', ['vdpau/vdpau.h']], - ['IBaseFilter', ['dshow.h']], - ['clCreateImageFromFdINTEL_fn', ['CL/cl_intel.h'], - {'preconditions': ['libdrm', 'opencl']}], - ['clCreateFromVA_APIMediaSurfaceINTEL_fn', ['CL/cl.h', 'CL/va_ext.h'], - {'preconditions': ['vaapi', 'opencl', 'libmfx']}], - ['cl_dx9_surface_info_khr', ['CL/cl_dx9_media_sharing.h'], - {'preconditions': ['dxva2', 'opencl']}], - ['clGetDeviceIDsFromD3D11KHR_fn', ['CL/cl_d3d11.h'], - {'preconditions': ['d3d11va', 'opencl']}], - ['struct addrinfo', ['netdb.h']], - ['struct group_source_req', ['netinet/in.h']], - ['struct ip_mreq_source', ['netinet/in.h']], - ['struct ipv6_mreq', ['netinet/in.h']], - ['struct pollfd', ['poll.h']], - ['struct sctp_event_subscribe', ['netinet/sctp.h']], - ['struct sockaddr_in6', ['netinet/in.h']], - ['struct sockaddr_storage', ['sys/types.h', 'sys/socket.h']], - ['socklen_t', ['sys/types.h', 'sys/socket.h']], -] - -if cc.has_header('arpa/inet.h') - conf.set('arpa_inet_h', 1) - check_funcs += [['closesocket']] -elif cc.has_header('winsock2.h') - conf.set('winsock2_h', 1) - # FIXME network_extralibs - check_header_funcs += [ - ['closesocket', ['winsock2.h']], - ['getaddrinfo', ['ws2tcpip.h']], - ] - check_types += [ - ['socklen_t', ['ws2tcpip.h']], - ['struct addrinfo', ['ws2tcpip.h']], - ['struct group_source_req', ['ws2tcpip.h']], - ['struct ip_mreq_source', ['ws2tcpip.h']], - ['struct ipv6_mreq', ['ws2tcpip.h']], - ['struct pollfd', ['winsock2.h']], - ['struct sockaddr_in6', ['ws2tcpip.h']], - ['struct sockaddr_storage', ['ws2tcpip.h']], - ] -endif - -foreach check : check_funcs - all_checks += [['func', check]] -endforeach - -foreach check : check_header_funcs - all_checks += [['header-func', check]] -endforeach - -foreach check : check_types - all_checks += [['type', check]] -endforeach - -check_headers = [ - ['direct.h'], - ['dirent.h'], - ['dxgidebug.h'], - ['msa.h'], - ['net/udplite.h'], - ['sys/param.h'], - ['sys/resource.h'], - ['sys/select.h'], - ['sys/soundcard.h'], - ['sys/un.h'], - ['sys/videoio.h'], - ['termios.h'], - ['unistd.h'], - ['valgrind/valgrind.h'], - ['X11/extensions/XvMClib.h'], - ['asm/types.h'], -] - -if host_machine.system() == 'darwin' - check_headers += [['dispatch/dispatch.h']] -elif host_machine.system() == 'android' - check_headers += [['jni.h']] -endif - -foreach check : check_headers - all_checks += [['header', check]] -endforeach - -external_library_list = library_gpl_list + library_nonfree_list + library_version3_list + library_gplv3_list + [ - 'chromaprint', - 'gcrypt', - 'gnutls', - 'jni', - 'ladspa', - 'libaom', - 'libass', - 'libbluray', - 'libbs2b', - 'libcaca', - 'libcelt', - 'libcodec2', - 'libdav1d', - 'libdc1394', - 'libdrm', - 'libflite', - 'libfontconfig', - 'libfreetype', - 'libfribidi', - 'libglslang', - 'libgme', - 'libgsm', - 'libiec61883', - 'libilbc', - 'libjack', - 'libklvanc', - 'libkvazaar', - 'libmodplug', - 'libmp3lame', - 'libmysofa', - 'libopencv', - 'libopenh264', - 'libopenjpeg', - 'libopenmpt', - 'libopus', - 'libpulse', - 'librabbitmq', - 'librav1e', - 'librist', - 'librsvg', - 'librtmp', - 'libshine', - 'libsmbclient', - 'libsnappy', - 'libsoxr', - 'libspeex', - 'libsrt', - 'libssh', - 'libsvtav1', - 'libtesseract', - 'libtheora', - 'libtwolame', - 'libuavs3d', - 'libv4l2', - 'libvmaf', - 'libvorbis', - 'libvpx', - 'libwebp', - 'libxml2', - 'libzimg', - 'libzmq', - 'libzvbi', - 'lv2', - 'mediacodec', - 'openal', - 'opengl', - 'pocketsphinx', - 'vapoursynth', -] - -hwaccel_library_nonfree_list = [ - 'cuda_sdk', - 'libnpp', -] - -hwaccel_library_list = hwaccel_library_nonfree_list + [ - 'libmfx', - 'mmal', - 'omx', - 'opencl', - 'vulkan' -] - -subsystem_list = [ - 'dct', - 'dwt', - 'error_resilience', - 'faan', - 'fast_unaligned', - 'fft', - 'lsp', - 'lzo', - 'mdct', - 'pixelutils', - 'network', - 'rdft', -] - -meta_list = [ - 'autodetect', - 'fontconfig', - 'linux_perf', - 'memory_poisoning', - 'neon_clobber_test', - 'ossfuzz', - 'pic', - 'thumb', - 'valgrind_backtrace', - 'xmm_clobber_test', -] - -feature_list = [ - 'ftrapv', - 'gray', - 'hardcoded_tables', - 'omx_rpi', - 'runtime_cpudetect', - 'safe_bitstream_reader', - 'shared', - 'small', - 'static', - 'swscale_alpha', -] - -network_funcs = [ - 'getaddrinfo', - 'inet_aton', -] - -extra_funcs = [] - -config_extra = [ - 'aandcttables', - 'ac3dsp', - 'adts_header', - 'audio_frame_queue', - 'audiodsp', - 'blockdsp', - 'bswapdsp', - 'cabac', - 'cbs', - 'cbs_h264', - 'cbs_h265', - 'cbs_mpeg2', - 'dirac_parse', - 'dnn', - 'dvprofile', - 'exif', - 'faandct', - 'faanidct', - 'fdctdsp', - 'flacdsp', - 'fmtconvert', - 'frame_thread_encoder', - 'g722dsp', - 'golomb', - 'gplv3', - 'h263dsp', - 'h264chroma', - 'h264dsp', - 'h264parse', - 'h264pred', - 'h264qpel', - 'hevcparse', - 'hpeldsp', - 'huffman', - 'huffyuvdsp', - 'huffyuvencdsp', - 'idctdsp', - 'iirfilter', - 'mdct15', - 'intrax8', - 'iso_media', - 'ividsp', - 'jpegtables', - 'lgplv3', - 'libx262', - 'llauddsp', - 'llviddsp', - 'llvidencdsp', - 'lpc', - 'lzf', - 'me_cmp', - 'mpeg_er', - 'mpegaudio', - 'mpegaudiodsp', - 'mpegaudioheader', - 'mpegvideo', - 'mpegvideoenc', - 'mss34dsp', - 'pixblockdsp', - 'qpeldsp', - 'qsv', - 'qsvdec', - 'qsvenc', - 'qsvvpp', - 'rangecoder', - 'riffdec', - 'riffenc', - 'rtpdec', - 'rtpenc_chain', - 'rv34dsp', - 'sinewin', - 'snappy', - 'srtp', - 'startcode', - 'texturedsp', - 'texturedspenc', - 'tpeldsp', - 'vaapi_1', - 'vaapi_encode', - 'vc1dsp', - 'videodsp', - 'vp3dsp', - 'vp56dsp', - 'vp8dsp', - 'wma_freqs', - 'wmv2dsp', -] - -license_list = [ - 'gpl', - 'nonfree', - 'version3', -] - -library_list = [ - 'avcodec', - 'avdevice', - 'avfilter', - 'avformat', - 'avresample', - 'avutil', - 'postproc', - 'swresample', - 'swscale', -] - -program_list = [ - 'ffplay', - 'ffprobe', - 'ffmpeg', -] - -apple_frameworks = [ - 'CoreFoundation', - 'CoreMedia', - 'CoreVideo', - 'AppKit', - 'AudioToolbox', - 'AVFoundation', - 'CoreImage', - 'VideoToolbox', - 'CoreGraphics', - 'CoreServices', - 'ApplicationServices', -] - -avcodec_components = [ - 'bsfs', - 'decoders', - 'encoders', - 'hwaccels', - 'parsers', -] - -avdevice_components = [ - 'indevs', - 'outdevs', -] - -avfilter_components = [ - 'filters', -] - -avformat_components = [ - 'demuxers', - 'muxers', - 'protocols', -] - -component_list = avcodec_components + avdevice_components + avfilter_components + avformat_components - -foreach component : component_list - conf.set10(component, get_option(component).allowed()) -endforeach - -config_list = ( - document_list + - example_list + - external_library_list + - external_autodetect_library_list + - hwaccel_library_list + - hwaccel_autodetect_library_list + - feature_list + - license_list + - library_list + - program_list + - subsystem_list + - [ - 'autodetect', - 'fontconfig', - 'linux_perf', - 'memory_poisoning', - 'neon_clobber_test', - 'ossfuzz', - 'pic', - 'thumb', - 'valgrind_backtrace', - 'xmm_clobber_test', - ] + - component_list -) - -check_compiles = [ - ['v4l2_m2m', ['linux/videodev2.h'], 'int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;'], - ['pragma_deprecated', [], 'int main(void) {_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\""); return 0; }'], - ['const_nan', ['math.h'], 'struct { double d; } static const bar[] = { { NAN } };'], - ['intrinsics_neon', ['arm_neon.h'], 'int16x8_t test = vdupq_n_s16(0);'], -] - -check_links = [ - ['stdatomic', ['stdatomic.h'], 'int main(void) {atomic_int foo, bar = ATOMIC_VAR_INIT(-1); atomic_store(&foo, 0); foo += bar;}', {'link_with': ['atomic']}], - ['stdatomic', ['stdatomic.h'], 'int main(void) {atomic_int foo, bar = ATOMIC_VAR_INIT(-1); atomic_store(&foo, 0); foo += bar;}'], -] - -v4l2m2m_formats = [ - ['vc1', 'VC1_ANNEX_G'], - ['mpeg1'], - ['mpeg2'], - ['mpeg4'], - ['hevc'], - ['h263'], - ['h264'], - ['vp8'], - ['vp9'], -] - -foreach format : v4l2m2m_formats - suffix = format.length() > 1 ? format[1] : format[0].to_upper() - check_compiles += [['@0@_v4l2_m2m'.format(format[0]), ['sys/time.h', 'linux/videodev2.h'], 'int i = V4L2_PIX_FMT_@0@;'.format(suffix)]] -endforeach - -foreach check : check_compiles - all_checks += [['compiles', check]] -endforeach - -foreach check : check_links - all_checks += [['links', check]] -endforeach - -foreach arch : arch_list - conf.set(arch, 0) -endforeach - -foreach lib : hwaccel_autodetect_library_list - conf.set(lib, 0) -endforeach - -foreach check_struct : check_structs - conf_name = '@0@_@1@'.format(check_struct[0].underscorify(), check_struct[1].underscorify()) - - conf.set10(conf_name, - cc.has_member(check_struct[0], check_struct[1], prefix : check_struct[2])) -endforeach - -foreach license : license_list - conf.set10(license, not get_option(license).disabled()) -endforeach - -foreach lib : library_list - conf.set(lib, get_option(lib).enabled().to_int()) -endforeach - -arch = 'c' - -cpu = host_machine.cpu_family() - -if cpu == 'x86' - arch = 'x86' - conf.set('x86', 1) - conf.set('i686', 1) - conf.set('x86_32', 1) -elif cpu == 'x86_64' - arch = 'x86' - conf.set('x86', 1) - conf.set('i686', 1) - conf.set('x86_64', 1) -elif cpu == 'aarch64' - # FIXME: Implement assembly support for MSVC - # It relies on Meson adding support for armasm and MASM, - # see foreach check : asm_as_checks below. - if cc.get_id() == 'msvc' - warning('Using aarch64 assembly on MSVC is not yet supported by Meson.') - else - arch = 'aarch64' - conf.set('aarch64', 1) - endif -elif cpu == 'arm' - arch = 'arm' - conf.set('arm', 1) -endif - -foreach feature : arch_features - name = feature[0] - have = false - conditions = feature[1] - foreach condition: conditions - if conf.get(condition, 0) == 1 - have = true - endif - endforeach - - conf.set10(name, have) -endforeach - -if cc.get_id() == 'clang' - if conf.get('x86_32') == 1 - # Clang doesn't support maintaining alignment without assuming the - # same alignment in every function. If 16 byte alignment would be - # enabled, one would also have to either add attribute_align_arg on - # every single entry point into the libraries or enable -mstackrealign - # (doing stack realignment in every single function). - - if ['windows', 'freebsd', 'netbsd', 'openbsd'].contains(host_machine.system()) - conf.set('aligned_stack', 0) - else - project_c_args += cc.get_supported_arguments([ - '-mllvm -stack-alignment=16', - '-mstack-alignment=16' - ]) - endif - else - project_c_args += cc.get_supported_arguments([ - '-mllvm -stack-alignment=16', - '-mstack-alignment=16' - ]) - endif -elif cc.get_id() == 'msvc' - if conf.get('x86_32') == 1 - conf.set('aligned_stack', 0) - endif - # the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code - # Issue has been fixed in MSVC v19.00.24218. - if cc.links(cpp_cond.format('windows.h', '_MSC_FULL_VER < 190024218')) - project_c_args += cc.get_supported_arguments([ - 'd2SSAOptimizer-' - ]) - endif - if conf.get('x86_32') == 1 and (get_option('buildtype') == 'debug' or get_option('optimization') == '0') - project_c_args += cc.get_supported_arguments([ - '-Oy-' - ]) - endif -endif - -conf.set10('shared', get_option('default_library') != 'static') -conf.set('pthreads', 0) -conf.set('w32threads', 0) -conf.set('os2threads', 0) -conf.set10('bigendian', host_machine.endian() == 'big') -conf.set10('fast_unaligned', ['x86', 'x86_64', 'aarch', 'ppc'].contains(host_machine.cpu_family())) - -conf.set('frame_thread_encoder', 1) - -if ['linux', 'darwin', 'android'].contains(host_machine.system()) - conf.set10('pthreads', thread_dep.found()) -elif host_machine.system() == 'windows' - conf.set10('w32threads', thread_dep.found()) - conf.set('symver', 0) - conf.set('dos_paths', 1) -endif - -if ['linux', 'openbsd', 'android'].contains(host_machine.system()) - conf.set('section_data_rel_ro', 1) -endif - -# Our option names can't be 1:1 mapping because newer meson versions disallow -# options with language prefixes i.e. "cuda_sdk" in our case -options_map = { - 'cuda_sdk' : 'ff_cuda_sdk', - 'linux_fb_h' : 'linux_fbdev', -} - -foreach check : all_checks - check_type = check[0] - check = check[1] - - name = check[0] - opt_name = options_map.get(name, name) - - if check_type == 'func' - headers = [] - elif check_type == 'header' - headers = [name] - else - headers = check[1] - endif - - opts = {} - link_withs = [] - funcs = [] - compiles = '' - links = '' - type = '' - - if check_type == 'pkg-config' - if check.length() > 3 - opts = check[3] - endif - elif check_type == 'component' - link_withs = check[3] - if check.length() > 4 - opts = check[4] - endif - elif check_type == 'header-func' - if check.length() > 2 - opts = check[2] - endif - elif check_type == 'func' or check_type == 'header' - if check.length() > 1 - opts = check[1] - endif - elif check_type == 'compiles' - if check.length() > 3 - opts = check[3] - endif - compiles = check[2] - elif check_type == 'links' - if check.length() > 3 - opts = check[3] - endif - links = check[2] - elif check_type == 'type' - if check.length() > 2 - opts = check[2] - endif - type = name - endif - - if check_type == 'header-func' or check_type == 'func' - funcs = opts.get('funcs', [name]) - elif check_type == 'pkg-config' or check_type == 'component' - funcs = check[2] - endif - - if check_type != 'component' - link_withs = opts.get('link_with', []) - endif - - found = false - - if conf.get(name.underscorify(), 0) == 0 - defines = opts.get('defines', []) - has_any_func = opts.get('has_any_func', false) - c_args = opts.get('c_args', []) - extra_deps = [] - - foreach dep_name : opts.get('extra_deps', []) - extra_deps += [get_variable(dep_name)] - endforeach - - prefix = '' - - found = true - skipchecks = false - - preconditions = opts.get('preconditions', []) - - foreach precondition : preconditions - found = found and conf.get(precondition) == 1 - endforeach - - # FIXME: or should these just be preconditions in the list above instead? - disabled = false - if get_option('gpl').disabled() - gpl_list = library_gpl_list + library_gplv3_list - disabled = gpl_list.contains(name) - endif - if get_option('version3').disabled() - v3_list = library_gplv3_list + library_version3_list - disabled = disabled or v3_list.contains(name) - endif - if get_option('nonfree').disabled() - nonfree_list = library_nonfree_list + hwaccel_library_nonfree_list - disabled = disabled or nonfree_list.contains(name) - endif - - if disabled - if get_option(opt_name).enabled() - error('Incompatible options combination: @0@ requested, but has disabled license.'.format(name)) - endif - message('Skipping @0@ because of license'.format(name)) - found = false - endif - - if found - if check_type != 'pkg-config' - foreach link_with : link_withs - if check_type == 'component' and not ('always-check' in opts) - req = get_option(opt_name) - else - req = false - endif - dep = cc.find_library(link_with, required : req) - if not dep.found() and opts.has_key('meson-dep') - dep = dependency(opts.get('meson-dep'), required: false) - # We can't do compiler checks for non-external dependencies, so skip them and trust the meson dependency - skipchecks = true - endif - found = found and dep.found() - extra_deps += dep - endforeach - else - req = get_option(opt_name) - pkg_name = opts.get('pkg', name) - if opts.has_key('versions') - foreach version: opts['versions'] - dep = dependency(pkg_name, required: false, version: version) - endforeach - - if not dep.found() and req.enabled() - error('@0@ @1@ could not be found'.format(pkg_name, opts['versions'])) - endif - elif opts.has_key('version') - dep = dependency(pkg_name, required : req, version: opts.get('version')) - else - dep = dependency(pkg_name, required : req) - endif - found = dep.found() - skipchecks = dep.type_name() == 'internal' # same here, trust the meson dependency - extra_deps += dep - endif - endif - - if found - foreach header : headers - if header.endswith('.h') - prefix += '#include <@0@>\n'.format(header) - else - prefix += '#include @0@\n'.format(header) - endif - - if not conf.has(header.underscorify()) - has_header = skipchecks or cc.has_header(header, dependencies: extra_deps) - conf.set10(header.underscorify().to_lower(), has_header) - found = found and has_header - endif - endforeach - endif - - if found and not skipchecks - n_funcs_found = 0 - foreach symbol : funcs - if check_type == 'header-func' - if cc.has_header_symbol(headers[0], symbol, dependencies : extra_deps, prefix: prefix, args : c_args + project_c_args) - n_funcs_found += 1 - endif - else - if cc.has_function(symbol, dependencies : extra_deps, prefix: prefix, args : c_args + project_c_args) - n_funcs_found += 1 - endif - endif - endforeach - if has_any_func - found = n_funcs_found >= 1 - else - found = n_funcs_found == funcs.length() - endif - endif - - if found and not skipchecks - n_defines_found = 0 - foreach symbol : defines - if cc.get_define(symbol, dependencies : extra_deps, prefix: prefix, args : c_args + project_c_args) != '' - n_defines_found += 1 - endif - endforeach - found = n_defines_found == defines.length() - endif - - if found and compiles != '' and not skipchecks - found = cc.compiles('\n\n'.join([prefix, compiles]), dependencies : extra_deps, args : c_args + project_c_args, name: name) - endif - - if found and links != '' and not skipchecks - found = cc.links('\n\n'.join([prefix, links]), dependencies : extra_deps, args : c_args + project_c_args, name: name) - endif - - if found and type != '' and not skipchecks - found = cc.has_type(type, prefix : prefix, dependencies : extra_deps, args : c_args + project_c_args) - endif - - if check_type != 'header' - conf.set10(name.underscorify().to_lower(), found) - endif - - foreach symbol : funcs + defines - conf.set10(symbol.to_lower(), found) - endforeach - - if found - set_variable('@0@_extra_deps'.format(name.to_lower().underscorify()), extra_deps) - else - set_variable('@0@_extra_deps'.format(name.to_lower().underscorify()), []) - endif - endif -endforeach - -if conf.get('gnutls') == 1 and conf.get('openssl') == 1 - # Simply picking one for now - conf.set('openssl', 0) -endif - -if conf.get('opengl') == 1 and not cc.has_header('GL/glext.h') - conf.set('opengl', 0) -endif - -if conf.get('libx265') == 1 - x265_build = cc.get_define('X265_BUILD', prefix: '#include ', dependencies: libx265_extra_deps) - - if x265_build == '' - message ('X265_BUILD not found, disabling') - conf.set('libx265', 0) - elif x265_build.to_int() < 68 - message ('X265_BUILD too old, disabling') - conf.set('libx265', 0) - else - message ('X265_BUILD >= 68, keeping enabled') - endif -endif - -if conf.get('libzvbi') == 1 - conf.set('libzvbi', cc.compute_int( - 'VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28', - prefix: '#include ', dependencies: libzvbi_extra_deps)) -endif - -x86asm_type = 'none' - -x86asm_checks = [] - -asm_inline_checks = [ - ['"1:\\n"', 'inline_asm_labels'], - ['"Label:\\n"', 'inline_asm_nonlocal_labels'] -] - -extern_prefix = cc.symbols_have_underscore_prefix() ? '_' : '' - -asm_insn_checks = [] - -asm_as_checks = [] - -if host_machine.system() == 'windows' - asm_format = conf.get('x86_64') == 1 ? 'win64' : 'win32' -elif host_machine.system() == 'darwin' - asm_format = conf.get('x86_64') == 1 ? 'macho64' : 'macho32' -else - asm_format = conf.get('x86_64') == 1 ? 'elf64' : 'elf32' -endif - -x86asm = disabler() -conf.set('x86asm', 0) - -if conf.get('x86') == 1 - conf.set10('rdtsc', cc.has_function('__rdtsc', prefix: '#include ')) - conf.set10('mm_empty', cc.has_function('_mm_empty', prefix: '#include ')) - - conf.set('local_aligned', 1) - - if conf.get('asm', 0) == 1 - nasm_version = '>=0' - if host_machine.system() == 'windows' - nasm_version = '>=2.12' - endif - x86asm = find_program('nasm', version: nasm_version, required: false) - x86asm_type = 'nasm' - if not x86asm.found() and host_machine.system() == 'windows' - # Note that on Windows we require NASM because when optimizations are - # disabled, the Windows linker does not optimize out functions with - # EXTERNAL_* SIMD calls and errors out with unresolved symbols - subproject('win-nasm') - x86asm = find_program('nasm', version: nasm_version) - endif - if not x86asm.found() - x86asm = find_program('yasm', required: false) - x86asm_type = 'yasm' - endif - conf.set10('x86asm', x86asm.found()) - if x86asm.found() - x86asm_checks += [ - ['meson_asm_checks/cpunop.asm', 'cpunop'], - ['meson_asm_checks/avx2_external.asm', 'avx2_external'], - ['meson_asm_checks/avx512_external.asm', 'avx512_external'], - ['meson_asm_checks/fma4_external.asm', 'fma4_external'], - ['meson_asm_checks/xop_external.asm', 'xop_external'], - ] - - asm_inline_checks += [ - ['"":::"%xmm0"', 'xmm_clobbers'], - ['"pabsw %xmm0, %xmm0"', 'ssse3_inline'], - ['"pmaxub %mm0, %mm1"', 'mmxext_inline'], - ] - endif - endif - - ebp_available = cc.run(''' - int main() { - volatile int i=0; - __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp"); - return i; - } - ''', name: 'if_ebp_available_this_should_crash') - - # FFmpeg upstream doesn't know that EBP is always unavailable - # under Clang if stack realignment is used. This is probably - # because the only compilers still supporting the architecture - # are the Android NDK and MSYS CLANG32. - # Thus an additional check on aligned_stack is done here. - # See: - # - https://github.com/android/ndk/issues/693 - # - https://bugs.llvm.org/show_bug.cgi?id=37542 - conf.set10('ebp_available', conf.get('aligned_stack') == 1 and ebp_available.compiled() and ebp_available.returncode() != 0) - - asm_inline_checks += [ - ['""::"b"(0)', 'ebx_available_1'], - ['"":::"%ebx"', 'ebx_available_2'], - ['"movl @0@test, %eax"'.format(extern_prefix), 'inline_asm_direct_symbol_refs_1'], - ['"movl @0@test(%rip), %eax"'.format(extern_prefix), 'inline_asm_direct_symbol_refs_2'], - ['"":::"%xmm0"', 'xmm_clobbers'], - ['"pabsw %xmm0, %xmm0"', 'ssse3_inline'], - ['"pmaxub %mm0, %mm1"', 'mmxext_inline'], - ] -elif conf.get('aarch64') == 1 - asm_insn_checks += [ - ['prfm pldl1strm, [x0]', 'armv8'], - ['ext v0.8B, v0.8B, v1.8B, #1', 'neon'], - ['fmadd d0, d0, d1, d2', 'vfp'], - ] -elif conf.get('arm') == 1 - if cc.get_id() == 'msvc' - conf.set10('thumb', cc.has_header_symbol('stddef.h', '_M_ARMT')) - endif - if cc.has_header_symbol('stddef.h', '__thumb__') - conf.set10('thumb', cc.compiles( - 'float func(float a, float b){ return a+b; }', - name: 'weak_thumb')) - endif - if conf.get('thumb', 0) == 1 - if cc.has_argument('-mthumb') - project_c_args += ['-mthumb'] - elif cc.has_argument('-marm') - project_c_args += ['-marm'] - endif - endif - - if cc.has_header_symbol('stddef.h', '__ARM_PCS_VFP') - conf.set('vfp_args', 1) - elif cc.links(cpp_cond.format('stddef.h', 'defined _M_ARM_FP && _M_ARM_FP >= 30'), name: 'vfp_args_fp') - conf.set('vfp_args', 1) - elif not cc.links(cpp_cond.format('stddef.h', 'defined __ARM_PCS || defined __SOFTFP__'), name: 'arm_pcs_or_softfp') and host_machine.system() != 'darwin' - if not cc.has_header_symbol('stddef.h', '__SOFTFP__') - conf.set('vfp_args', 1) - conf.set('fpabi', 'vfp') - elif cc.links('__asm__ (".eabi_attribute 28, 1"); int main(void) { return 0; }', name: 'vfp_abi_check') - conf.set('vfp_args', 1) - conf.set('fpabi', 'vfp') - else - conf.set('fpabi', 'soft') - endif - - message('Floating point ABI: @0@'.format(conf.get('fpabi'))) - endif - - asm_insn_checks += [ - ['qadd r0, r0, r0', 'armv5te'], - ['sadd16 r0, r0, r0', 'armv6'], - ['movt r0, #0', 'armv6t2'], - ['vadd.i16 q0, q0, q0', 'neon'], - ['fadds s0, s0, s0', 'vfp'], - ['vmov.f32 s0, #1.0', 'vfpv3'], - ['setend be', 'setend'] - ] - - asm_inline_checks += [ - ['"add r0, %Q0, %R0" :: "r"((long long)0)', 'asm_mod_q'] - ] - - asm_as_checks += [ - ['.arch armv7-a', 'as_arch_directive'], - ['ra .dn d0.i16', 'as_dn_directive'], - ['.fpu neon', 'as_fpu_directive'] - ] - - # llvm's integrated assembler supports .object_arch from llvm 3.5 - if asm_format == 'elf32' or asm_format == 'elf64' - asm_as_checks += [ - ['.object_arch armv4', 'as_object_arch'] - ] - endif -endif - -asm_args = ['-DPIC'] -# Add debug args explicitly -# yasm: `-g ` -# nasm: ` -g -F ` -# The only modern debugging format supported by either is DWARF -# -# nasm and yasm don't support DWARF in the PE format (Windows) -if asm_format.startswith('win') - debug_format = 'null' -else - # Supported on Linux, BSD, macOS - debug_format = 'dwarf' -endif -# Add the format args -if x86asm_type == 'yasm' - if debug_format == 'dwarf' - asm_args += ['-g', 'dwarf2'] - else - asm_args += ['-g', 'null'] - endif -elif x86asm_type == 'nasm' - if debug_format == 'dwarf' - asm_args += ['-g', '-F', 'dwarf'] - endif -endif - -asm_inc = join_paths(meson.current_source_dir(), 'libavutil/x86/') - -if extern_prefix != '' - asm_args += ['-DPREFIX'] -endif - -foreach ext : arch_ext_list_x86_simd - if ext == 'mmx' - continue - endif - - inline = '@0@_inline'.format(ext) - external = '@0@_external'.format(ext) - conf.set10(inline, conf.get(ext) == 1 and conf.get('inline_asm') == 1 and conf.get('x86') == 1) - conf.set10(external, conf.get(ext) == 1 and conf.get('x86asm') == 1) -endforeach - -foreach check: x86asm_checks - result = run_command(x86asm, '-f', asm_format, asm_args, '-Werror', check[0], '-o', join_paths(meson.current_build_dir(), 'tmpasm.o'), check: false) - - if conf.get('asm') == 1 - conf.set10(check[1], result.returncode() == 0) - - if result.returncode() != 0 - message('@0@ x86 asm check failed: @1@'.format(check[1], result.stderr().strip())) - endif - else - conf.set10(check[1], false) - endif -endforeach - -foreach check : asm_insn_checks - asm_inline_checks += [ - ['"@0@"'.format(check[0]), '@0@_inline'.format(check[1])] - ] - asm_as_checks += [ - [check[0], '@0@_external'.format(check[1])] - ] -endforeach - -foreach check: asm_inline_checks - if conf.get('inline_asm') == 1 - result = cc.compiles( - 'void foo(void){ __asm__ volatile(@0@); }'.format(check[0]), - name: check[1] - ) - - conf.set10(check[1], result) - else - conf.set10(check[1], false) - endif -endforeach - -if (conf.get('arm', 0) == 1 or conf.get('aarch64', 0) == 1) and cc.get_id() != 'msvc' - asm_as_checks += [ - [''' - .macro m n, y:vararg=0 - .int \y - .endm - m x - ''', 'vararg'], - ] - - if conf.get('arm', 0) == 1 - asm_as_checks += [ - ['.altmacro', 'gnu_as'] - ] - endif - - asm_as_checks += [ - ['''.func test - .endfunc''', 'as_func'] - ] -endif - - -# FIXME: this won't work until Meson detects and -# exposes the underlying assembler. -# These checks cannot be done with run_command either -# because they rely on setup-time input. -# See: -# - https://github.com/mesonbuild/meson/issues/9889 -# - https://github.com/mesonbuild/meson/pull/10916 -# - https://github.com/mesonbuild/meson/pull/10922 -foreach check : asm_as_checks - warning('Meson does not yet expose the ASM compiler, skipping @0@ check'.format(check[1])) - # if conf.get('asm') == 1 - # conf.set10(check[1], cc.compiles( - # check[0], - # args: ['-x', 'assembler'], - # name: check[1] - # )) - # else - conf.set10(check[1], false) - # endif -endforeach - -if conf.get('x86') == 1 - conf.set10('ebx_available', conf.get('ebx_available_1') == 1 and conf.get('ebx_available_2') == 1) - message('EBX available: @0@'.format(conf.get('ebx_available'))) - conf.set10('inline_asm_direct_symbol_refs', conf.get('inline_asm_direct_symbol_refs_1') == 1 or conf.get('inline_asm_direct_symbol_refs_2') == 1) - message('Inline assembly direct symbol references available: @0@'.format(conf.get('inline_asm_direct_symbol_refs'))) -endif - -arm_skip_checks = conf.get('arm', 0) == 1 and (host_machine.system() == 'linux' or host_machine.system() == 'android') - -foreach ext : arch_ext_list_arm - inline = '@0@_inline'.format(ext) - external = '@0@_external'.format(ext) - if not arm_skip_checks - conf.set10(ext, conf.get(inline, 0) == 1 or conf.get(external, 0) == 1) - endif -endforeach - -if get_option('b_lto') - conf.set10('inline_asm_direct_symbol_refs', 0) -endif - -extern_things = [ - ['AVOutputFormat', 'muxer', 'libavformat/allformats.c', 'muxer_list'], - ['AVInputFormat', 'demuxer', 'libavformat/allformats.c', 'demuxer_list'], - ['AVCodec', 'encoder', 'libavcodec/allcodecs.c', 'encoder_list'], - ['AVCodec', 'decoder', 'libavcodec/allcodecs.c', 'decoder_list'], - ['AVCodecParser', 'parser', 'libavcodec/parsers.c', 'parser_list'], - ['AVBitStreamFilter', 'bsf', 'libavcodec/bitstream_filters.c', 'bsf_list'], - ['AVHWAccel', 'hwaccel', 'libavcodec/hwaccels.h', 'hwaccel_list'], - ['URLProtocol', 'protocol', 'libavformat/protocols.c', 'protocol_list'], - ['AVOutputFormat', 'muxer', 'libavdevice/alldevices.c', 'outdev_list', 'outdev'], - ['AVInputFormat', 'demuxer', 'libavdevice/alldevices.c', 'indev_list', 'indev'], -] - -find_things_extern = find_program('find_things_extern.py') - -foreach extern_thing : extern_things - c_type = extern_thing[0] - type = extern_thing[1] - filename = extern_thing[2] - variable_name = extern_thing[3] - - if extern_thing.length() > 4 - thing_suffix = extern_thing[4] - else - thing_suffix = type - endif - - result = run_command(find_things_extern, - '--type=@0@'.format(c_type), - '--suffix=@0@'.format(type), - '--thing-suffix=@0@'.format(thing_suffix), - files(filename), - check: true) - list = result.stdout().strip().split('\n') - - thing_allowed = get_option('@0@s'.format(thing_suffix)).allowed() - - foreach elem : list - opt = get_option(elem) - conf.set(elem, (opt.enabled() or (opt.allowed() and thing_allowed)).to_int()) - endforeach - - set_variable(variable_name, list) -endforeach - -find_things = find_program('find_things.py') - -result = run_command(find_things, files('libavfilter/allfilters.c'), check: true) -filter_list = result.stdout().strip().split('\n') - -filters_allowed = get_option('filters').allowed() - -foreach filter : filter_list - opt = get_option(filter) - conf.set(filter, (opt.enabled() or (opt.allowed() and filters_allowed)).to_int()) -endforeach - -foreach program : program_list - conf.set(program, get_option(program).allowed().to_int()) -endforeach - -result = run_command(find_things, '--full', files('libavfilter/allfilters.c'), check: true) -full_filter_list = result.stdout().strip().split('\n') - -avcodec_components_list = bsf_list + decoder_list + encoder_list + hwaccel_list + parser_list -avdevice_components_list = indev_list + outdev_list -avfilter_components_list = filter_list -avformat_components_list = demuxer_list + muxer_list + protocol_list - -all_components = avcodec_components_list + avdevice_components_list + avfilter_components_list + avformat_components_list - -tmpconfig_h = configure_file(configuration: conf, output: 'tmpconfig.h') - -# Working around Windows command line limitation -components_to_resolve = configuration_data() -foreach comp : config_list + config_extra + have_list + all_components - components_to_resolve.set(comp, true) -endforeach -components_h = configure_file(configuration: components_to_resolve, output: 'components.h') - -dep_resolver = find_program('depresolver.py') - -res = run_command(dep_resolver, tmpconfig_h, components_h, check: true) - -conf = configuration_data() - -split = res.stdout().split('//BEGIN_DEPENDS') -resolved = split[0] -flattened_deps = split[1] - -foreach kv : resolved.split() - split = kv.split('=') - k = split[0] - v = split[1].to_int() - - conf.set(k, v) -endforeach - -foreach kv : flattened_deps.split() - split = kv.split('=') - k = split[0] - v = split[1].split(',') - - set_variable('@0@_flattened_deps'.format(k), v) -endforeach - -dshow_indev_extra_deps = [] - -if host_machine.system() == 'windows' - foreach libname: ['psapi', 'ole32', 'strmiids', 'uuid', 'oleaut32', 'shlwapi'] - dshow_indev_extra_deps += [cc.find_library(libname, required: false)] - endforeach -endif - -foreach comp : avcodec_components_list - avcodec_flattened_deps += get_variable('@0@_flattened_deps'.format(comp), []) -endforeach - -foreach comp : avdevice_components_list - avdevice_flattened_deps += get_variable('@0@_flattened_deps'.format(comp), []) -endforeach - -foreach comp : avfilter_components_list - avfilter_flattened_deps += get_variable('@0@_flattened_deps'.format(comp), []) -endforeach - -foreach comp : avformat_components_list - avformat_flattened_deps += get_variable('@0@_flattened_deps'.format(comp), []) -endforeach - -subdir('libavutil') -subdir('libpostproc') -subdir('libswresample') -subdir('libswscale') -subdir('libavcodec') -subdir('libavformat') -subdir('libavfilter') -subdir('libavdevice') -subdir('libavresample') -subdir('fftools') - -util_list = ['cuda', 'd3d11va', 'dxva2', 'libdrm', 'lzo', 'mediacodec', 'opencl', 'qsv', 'vaapi', 'vdpau', 'videotoolbox'] - -if conf.get('schannel') == 1 - secur32_dep = cc.find_library('secur32') - if secur32_dep.found() - libavformat_optional_deps += [secur32_dep] - else - conf.set('schannel', 0) - endif -endif - -things_to_print = [ - ['libavcodec/codec_list.c', 'AVCodec', 'codec_list', encoder_list + decoder_list], - ['libavcodec/parser_list.c', 'AVCodecParser', 'parser_list', parser_list], - ['libavcodec/bsf_list.c', 'AVBitStreamFilter', 'bitstream_filters', bsf_list], - ['libavformat/muxer_list.c', 'AVOutputFormat', 'muxer_list', muxer_list], - ['libavformat/demuxer_list.c', 'AVInputFormat', 'demuxer_list', demuxer_list], - ['libavformat/protocol_list.c', 'URLProtocol', 'url_protocols', protocol_list], - ['libavdevice/outdev_list.c', 'AVOutputFormat', 'outdev_list', outdev_list], - ['libavdevice/indev_list.c', 'AVInputFormat', 'indev_list', indev_list], - ['libavfilter/filter_list.c', 'AVFilter', 'filter_list', filter_list], -] - -print_things = find_program('print_things.py') - -foreach thing : things_to_print - list = [] - ctr = 0 - foreach comp : thing[3] - if conf.get(comp) == 1 - if thing[1] == 'AVFilter' - comp_name = full_filter_list[ctr] - elif thing[2] == 'indev_list' - comp_name = '@0@_demuxer'.format(comp.split('_indev')[0]) - elif thing[2] == 'outdev_list' - comp_name = '@0@_muxer'.format(comp.split('_outdev')[0]) - else - comp_name = comp - endif - - list += [comp_name] - endif - ctr += 1 - endforeach - - if thing[1] == 'AVFilter' - list += ['asrc_abuffer', 'vsrc_buffer', 'asink_abuffer', 'vsink_buffer'] - endif - - res = run_command(print_things, - '--filename=@0@'.format(join_paths(meson.current_build_dir(), thing[0])), - '--struct-name=@0@'.format(thing[1]), - '--name=@0@'.format(thing[2]), - list, check: true) -endforeach - -if not cc.check_header('stdatomic.h') and thread_dep.found() - if host_machine.system() == 'windows' - common_incs += [include_directories('compat/atomics/win32')] - elif cc.get_id() == 'gcc' - common_incs += [include_directories('compat/atomics/gcc')] - endif -endif - -add_project_arguments(project_c_args, language: 'c') - -libavutil_optional_deps = [vaapi_drm_extra_deps + vaapi_x11_extra_deps + vdpau_x11_extra_deps] -libavdevice_extra_deps = [xvgetportattribute_extra_deps] -libswresample_optional_deps = [libsoxr_extra_deps] - -common_deps += libm_extra_deps - -built_libs = [ - ['avutil', []], - ['postproc', ['libavutil']], - ['swresample', ['libavutil']], - ['swscale', ['libavutil']], - ['avcodec', ['libavutil', 'libswresample']], - ['avformat', ['libavutil', 'libavcodec']], - ['avresample', ['libavutil']], - ['avfilter', ['libavutil', 'libavcodec', 'libavformat', 'libswscale', 'libswresample', 'libavresample', 'libpostproc']], - ['avdevice', ['libavutil', 'libavformat', 'libavfilter', 'libavcodec']], -] - -windows = import('windows') - -makedef = find_program('compat/windows/makedef.py') - -makedef_args = [makedef] - -if cc.get_id() != 'msvc' - nm = find_program('nm', required: true) - makedef_args += ['--nm', nm] -else - dumpbin = find_program('dumpbin', required: true) - makedef_args += ['--dumpbin', dumpbin] -endif - -makedef_args += ['--prefix', extern_prefix] - -foreach built_lib : built_libs - sources = get_variable('lib@0@_sources'.format(built_lib[0])) + [ffversion_h] - x86asm_sources = [] - tests = get_variable('lib@0@_tests'.format(built_lib[0]), []) - gen_objects = [] - optional_deps = get_variable('lib@0@_optional_deps'.format(built_lib[0]), []) - - sources += get_variable('lib@0@_@1@_sources'.format(built_lib[0], arch), []) - - if host_machine.system() == 'windows' - sources += windows.compile_resources( - 'lib@0@/@1@res.rc'.format(built_lib[0], built_lib[0]), - include_directories: common_incs, - depends: ffversion_h - ) - endif - - foreach arch_ext : arch_list - if conf.get(arch_ext, 0) == 1 - sources += get_variable('lib@0@_@1@_sources'.format(built_lib[0], arch_ext), []) - endif - endforeach - - foreach arch_ext : arch_ext_list - if conf.get(arch_ext, 0) == 1 - sources += get_variable('lib@0@_@1@_@2@_sources'.format(built_lib[0], arch, arch_ext), []) - endif - endforeach - - if conf.get('x86asm') == 1 - x86asm_sources += get_variable('lib@0@_@1@_x86asm_sources'.format(built_lib[0], arch), []) - endif - - optional_sources = get_variable('lib@0@_optional_sources'.format(built_lib[0]), {}) - optional_tests = get_variable('lib@0@_optional_tests'.format(built_lib[0]), {}) - - foreach comp_name, comp_sources : optional_sources - if conf.get(comp_name, 0) == 1 - sources += comp_sources - endif - - if languages_map.has_key(comp_name) - foreach lang: languages_map[comp_name] - add_languages(languages_map[comp_name], required: get_option(comp_name).enabled(), native: false) - endforeach - endif - endforeach - - optional_sources = get_variable('lib@0@_@1@_optional_sources'.format(built_lib[0], arch), {}) - foreach comp_name, comp_sources : optional_sources - if conf.get(comp_name, 0) == 1 - sources += comp_sources - endif - endforeach - - if conf.get('x86asm') == 1 - optional_sources = get_variable('lib@0@_@1@_x86asm_optional_sources'.format(built_lib[0], arch), {}) - foreach comp_name, comp_sources : optional_sources - if conf.get(comp_name, 0) == 1 - x86asm_sources += comp_sources - endif - endforeach - endif - - foreach arch_ext : arch_ext_list - if conf.get(arch_ext, 0) == 1 - optional_sources = get_variable('lib@0@_@1@_@2@_optional_sources'.format(built_lib[0], arch, arch_ext), {}) - foreach comp_name, comp_sources : optional_sources - if conf.get(comp_name, 0) == 1 - sources += comp_sources - endif - endforeach - endif - endforeach - - foreach comp_name, comp_tests : optional_tests - if conf.get(comp_name, 0) == 1 - tests += comp_tests - endif - endforeach - - foreach dep_comp_name: get_variable('@0@_flattened_deps'.format(built_lib[0]), []) - optional_deps += get_variable('@0@_extra_deps'.format(dep_comp_name), []) - endforeach - - deps = common_deps + optional_deps - - link_with = [] - - foreach dep : built_lib[1] - link_with += [get_variable(dep)] - endforeach - - version = get_variable('lib@0@_majorver'.format(built_lib[0])) - - if x86asm_sources.length() > 0 - # FIXME dedup should happen in meson - deduped_sources = [] - foreach source : x86asm_sources - if not deduped_sources.contains(source) - deduped_sources += [source] - endif - endforeach - - asm_gen = generator(x86asm, - output : '@BASENAME@.o', - arguments : asm_args + [ - '-f', asm_format, - '-i', meson.current_source_dir() + '/', - '-i', meson.current_build_dir() + '/', - '-i', join_paths(meson.current_source_dir(), 'lib@0@'.format(built_lib[0]), 'x86', ''), - '-P', join_paths(meson.current_build_dir(), 'config.asm'), - '@INPUT@', - '-o', '@OUTPUT@']) - - gen_objects += asm_gen.process(deduped_sources) - endif - - vflag = '-Wl,--version-script,@0@/lib@1@/lib@1@.ver'.format(meson.current_build_dir(), built_lib[0]) - c_args = ['-DHAVE_AV_CONFIG_H', '-DBUILDING_@0@'.format(built_lib[0])] - - link_args = cc.get_supported_link_arguments([vflag]) - - static_link_args = [] - - if cc.get_id() == 'msvc' - message('Applying MSVC link workaround for Debug mode and static libraries.') - static_link_args += cc.get_supported_link_arguments('/FORCE:UNRESOLVED') - - if get_option('buildtype') == 'debug' or get_option('optimization') == '0' - link_args += cc.get_supported_link_arguments('/FORCE:UNRESOLVED') - endif - endif - - static_lib = static_library('@0@-static'.format(built_lib[0]), sources + gen_objects, - dependencies: deps, - include_directories: common_incs, - link_with: link_with, - link_args: static_link_args, - c_args: c_args, - implicit_include_directories : false, - ) - - vs_module_def = custom_target('@0@-def'.format(built_lib[0]), - output: '@0@.def'.format(built_lib[0]), - command: [makedef_args, '@0@/lib@1@/lib@1@.ver'.format(meson.current_build_dir(), built_lib[0]), static_lib], - capture: true - ) - - lib = library(built_lib[0], - dependencies: deps, - soversion: version, - include_directories: common_incs, - link_with: link_with, - link_whole: static_lib, - link_args: link_args, - c_args: c_args, - vs_module_defs: vs_module_def, - implicit_include_directories : false, - install: true, - ) - - set_variable('lib@0@'.format(built_lib[0]), lib) - - declared_dep = declare_dependency(link_with: lib, - include_directories: include_directories('.'), - dependencies: deps, - version: get_variable('lib@0@_version'.format(built_lib[0])) - ) - - set_variable('lib@0@_dep'.format(built_lib[0]), declared_dep) - - if not get_option('tests').disabled() - foreach test_ : tests - test_name = test_[0] - test_sources = test_[1] - opts = test_.get(2, {}) - test_deps = deps - - extra_libs = opts.get('extra_libs', []) - foreach libname: extra_libs - test_deps += [cc.find_library(libname)] - endforeach - - exe = executable('test_@0@_@1@'.format(built_lib[0], test_name), test_sources, - c_args: c_args, - dependencies: test_deps, - include_directories: common_incs, - link_args: static_link_args, - link_with: [static_lib] + link_with, - implicit_include_directories : false) - - test('@0@_@1@'.format(built_lib[0], test_name), exe, - timeout: 180, - workdir: join_paths(meson.current_source_dir(), 'lib@0@'.format(built_lib[0]), 'tests')) - endforeach - endif -endforeach - -built_exe_list = [] -if not get_option('cli').disabled() - foreach program : program_list - if conf.get(program) == 1 - built_exe_list += program - endif - endforeach -endif - -foreach built_exe : built_exe_list - sources = get_variable('@0@_sources'.format(built_exe)) + [ffversion_h] - optional_deps = [] - - message('Checking @0@ dependencies'.format(built_exe)) - - optional_sources = get_variable('@0@_optional_sources'.format(built_exe), {}) - - foreach comp_name, comp_sources : optional_sources - if conf.get(comp_name, 0) == 1 - sources += comp_sources - endif - endforeach - - foreach dep_comp_name: get_variable('@0@_flattened_deps'.format(built_exe), []) - optional_deps += get_variable('@0@_extra_deps'.format(dep_comp_name), []) - endforeach - - message('Gathered @0@ optional deps'.format(optional_deps.length())) - - deps = common_deps + optional_deps - - exe = executable(built_exe, sources, - install: true, - dependencies: deps, - include_directories: common_incs, - link_with: [libavutil, libavcodec, libavfilter, libavdevice, libavformat, libavresample, libswscale, libswresample, libpostproc], - implicit_include_directories : false, - ) - - set_variable('@0@_exe'.format(built_exe[0]), exe) -endforeach - -pkg = import('pkgconfig') - -pkg_infos = [ - ['Multimedia utilities', 'libavutil'], - ['FFmpeg postprocessing library', 'libpostproc'], - ['FFmpeg audio resampling library', 'libswresample'], - ['FFmpeg image rescaling library', 'libswscale'], - ['Multimedia codecs', 'libavcodec'], - ['Multimedia formats', 'libavformat'], - ['Media device handling', 'libavdevice'], - ['Audio/video filtering library', 'libavfilter'], - ['Libav audio resampling library', 'libavresample'], -] - -foreach pkg_info : pkg_infos - libname = pkg_info[1] - pkg.generate(get_variable(libname), - filebase: libname, - description: pkg_info[0], - version: get_variable(libname + '_version') - ) -endforeach - -final_conf = configuration_data() - -final_conf.set_quoted('FFMPEG_CONFIGURATION', '') # FIXME -final_conf.set('CONFIG_THIS_YEAR', 2022) -final_conf.set_quoted('FFMPEG_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) -final_conf.set_quoted('AVCONV_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) -final_conf.set_quoted('CC_IDENT', '@0@ @1@'.format(cc.get_id(), cc.version())) -final_conf.set_quoted('BUILDSUF', '') -final_conf.set_quoted('SLIBSUF', host_machine.system() == 'windows' ? '.dll' : '.so') -final_conf.set('SWS_MAX_FILTER_SIZE', 256) -final_conf.set('EXTERN_ASM', extern_prefix) -final_conf.set_quoted('EXTERN_PREFIX', extern_prefix) - -if not get_option('nonfree').disabled() - license = 'nonfree and unredistributable' -elif not get_option('gpl').disabled() and not get_option('version3').disabled() - license = 'GPL version 3 or later' -elif not get_option('version3').disabled() - license = 'LGPL version 3 or later' -elif not get_option('gpl').disabled() - license = 'GPL version 2 or later' -else - license = 'LGPL version 2.1 or later' -endif -final_conf.set_quoted('FFMPEG_LICENSE', license) -message('License: ' + license) - -if not get_option('version3').disabled() - if not get_option('gpl').disabled() - conf.set('gplv3', 1) - else - conf.set('lgplv3', 1) - endif -endif - -conf.set('mmx2', conf.get('mmxext')) - -foreach restrict_kw : ['restrict', '__restrict__', '__restrict', ''] - if not final_conf.has('av_restrict') and cc.compiles('void foo(char * @0@ p);'.format(restrict_kw)) - final_conf.set('av_restrict', restrict_kw) - endif -endforeach - -foreach arch: arch_list - final_conf.set('ARCH_@0@'.format(arch.to_upper()), conf.get(arch.to_lower())) -endforeach - -foreach have: have_list - if have == 'unistd_h' and conf.get(have) == 0 - # an atrocious hack to get this working with the zlib subproject on windows... - # zlib also uses a HAVE_UNISTD_H define, but it checks it with #ifdef and not #if - continue - endif - final_conf.set('HAVE_@0@'.format(have.to_upper()), conf.get(have.to_lower())) -endforeach - -foreach config: config_list + config_extra + all_components - final_conf.set('CONFIG_@0@'.format(config.to_upper()), conf.get(config.to_lower())) -endforeach - -configure_file( - output: 'config.h', - configuration: final_conf, -) - -configure_file( - output: 'config.asm', - output_format: 'nasm', - configuration: final_conf, -) - -# Put this at the end so people see it -if conf.get('x86_32') == 1 and conf.get('asm') == 1 and cc.get_id() == 'msvc' and cc.version().version_compare('<19.30') - # -Dasm=enabled seems to hang reliably on some Visual Studio 2019 installations, ask users to report back to us - warning('Using VS 2019 x86 with `asm` enabled: if you see a hang while linking, please report an issue at https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg/-/issues') -endif diff --git a/subprojects/packagefiles/ffms2/meson.build b/subprojects/packagefiles/ffms2/meson.build index 91d649f68..ab08b613c 100644 --- a/subprojects/packagefiles/ffms2/meson.build +++ b/subprojects/packagefiles/ffms2/meson.build @@ -5,8 +5,8 @@ deps = [] opts = ['tests=disabled', 'libdav1d=enabled'] deps += dependency('zlib') -deps += dependency('libavformat', default_options: opts) -deps += dependency('libavcodec', default_options: opts) +deps += dependency('libavformat', version: '>=60', default_options: opts) +deps += dependency('libavcodec', version: '>=60', default_options: opts) deps += dependency('libswscale', default_options: opts) deps += dependency('libavutil', default_options: opts) deps += dependency('libswresample', default_options: opts)