• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2#
3# FFmpeg configure script
4#
5# Copyright (c) 2000-2002 Fabrice Bellard
6# Copyright (c) 2005-2008 Diego Biurrun
7# Copyright (c) 2005-2008 Mans Rullgard
8#
9
10# Prevent locale nonsense from breaking basic text processing.
11LC_ALL=C
12export LC_ALL
13
14# make sure we are running under a compatible shell
15# try to make this part work with most shells
16
17try_exec(){
18    echo "Trying shell $1"
19    type "$1" > /dev/null 2>&1 && exec "$@"
20}
21
22unset foo
23(: ${foo%%bar}) 2> /dev/null
24E1="$?"
25
26(: ${foo?}) 2> /dev/null
27E2="$?"
28
29if test "$E1" != 0 || test "$E2" = 0; then
30    echo "Broken shell detected.  Trying alternatives."
31    export FF_CONF_EXEC
32    if test "0$FF_CONF_EXEC" -lt 1; then
33        FF_CONF_EXEC=1
34        try_exec bash "$0" "$@"
35    fi
36    if test "0$FF_CONF_EXEC" -lt 2; then
37        FF_CONF_EXEC=2
38        try_exec ksh "$0" "$@"
39    fi
40    if test "0$FF_CONF_EXEC" -lt 3; then
41        FF_CONF_EXEC=3
42        try_exec /usr/xpg4/bin/sh "$0" "$@"
43    fi
44    echo "No compatible shell script interpreter found."
45    echo "This configure script requires a POSIX-compatible shell"
46    echo "such as bash or ksh."
47    echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
48    echo "Instead, install a working POSIX-compatible shell."
49    echo "Disabling this configure test will create a broken FFmpeg."
50    if test "$BASH_VERSION" = '2.04.0(1)-release'; then
51        echo "This bash version ($BASH_VERSION) is broken on your platform."
52        echo "Upgrade to a later version if available."
53    fi
54    exit 1
55fi
56
57test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH
58
59show_help(){
60    cat <<EOF
61Usage: configure [options]
62Options: [defaults in brackets after descriptions]
63
64Help options:
65  --help                   print this message
66  --quiet                  Suppress showing informative output
67  --list-decoders          show all available decoders
68  --list-encoders          show all available encoders
69  --list-hwaccels          show all available hardware accelerators
70  --list-demuxers          show all available demuxers
71  --list-muxers            show all available muxers
72  --list-parsers           show all available parsers
73  --list-protocols         show all available protocols
74  --list-bsfs              show all available bitstream filters
75  --list-indevs            show all available input devices
76  --list-outdevs           show all available output devices
77  --list-filters           show all available filters
78
79Standard options:
80  --logfile=FILE           log tests and output to FILE [ffbuild/config.log]
81  --disable-logging        do not log configure debug information
82  --fatal-warnings         fail if any configure warning is generated
83  --prefix=PREFIX          install in PREFIX [$prefix_default]
84  --bindir=DIR             install binaries in DIR [PREFIX/bin]
85  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
86  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
87  --libdir=DIR             install libs in DIR [PREFIX/lib]
88  --shlibdir=DIR           install shared libs in DIR [LIBDIR]
89  --incdir=DIR             install includes in DIR [PREFIX/include]
90  --mandir=DIR             install man page in DIR [PREFIX/share/man]
91  --pkgconfigdir=DIR       install pkg-config files in DIR [LIBDIR/pkgconfig]
92  --enable-rpath           use rpath to allow installing libraries in paths
93                           not part of the dynamic linker search path
94                           use rpath when linking programs (USE WITH CARE)
95  --install-name-dir=DIR   Darwin directory name for installed targets
96
97Licensing options:
98  --enable-gpl             allow use of GPL code, the resulting libs
99                           and binaries will be under GPL [no]
100  --enable-version3        upgrade (L)GPL to version 3 [no]
101  --enable-nonfree         allow use of nonfree code, the resulting libs
102                           and binaries will be unredistributable [no]
103
104Configuration options:
105  --disable-static         do not build static libraries [no]
106  --enable-shared          build shared libraries [no]
107  --enable-small           optimize for size instead of speed
108  --disable-runtime-cpudetect disable detecting CPU capabilities at runtime (smaller binary)
109  --enable-gray            enable full grayscale support (slower color)
110  --disable-swscale-alpha  disable alpha channel support in swscale
111  --disable-all            disable building components, libraries and programs
112  --disable-autodetect     disable automatically detected external libraries [no]
113
114Program options:
115  --disable-programs       do not build command line programs
116  --disable-ffmpeg         disable ffmpeg build
117  --disable-ffplay         disable ffplay build
118  --disable-ffprobe        disable ffprobe build
119
120Documentation options:
121  --disable-doc            do not build documentation
122  --disable-htmlpages      do not build HTML documentation pages
123  --disable-manpages       do not build man documentation pages
124  --disable-podpages       do not build POD documentation pages
125  --disable-txtpages       do not build text documentation pages
126
127Component options:
128  --disable-avdevice       disable libavdevice build
129  --disable-avcodec        disable libavcodec build
130  --disable-avformat       disable libavformat build
131  --disable-swresample     disable libswresample build
132  --disable-swscale        disable libswscale build
133  --disable-postproc       disable libpostproc build
134  --disable-avfilter       disable libavfilter build
135  --enable-avresample      enable libavresample build (deprecated) [no]
136  --disable-pthreads       disable pthreads [autodetect]
137  --disable-w32threads     disable Win32 threads [autodetect]
138  --disable-os2threads     disable OS/2 threads [autodetect]
139  --disable-network        disable network support [no]
140  --disable-dct            disable DCT code
141  --disable-dwt            disable DWT code
142  --disable-error-resilience disable error resilience code
143  --disable-lsp            disable LSP code
144  --disable-lzo            disable LZO decoder code
145  --disable-mdct           disable MDCT code
146  --disable-rdft           disable RDFT code
147  --disable-fft            disable FFT code
148  --disable-faan           disable floating point AAN (I)DCT code
149  --disable-pixelutils     disable pixel utils in libavutil
150
151Individual component options:
152  --disable-everything     disable all components listed below
153  --disable-encoder=NAME   disable encoder NAME
154  --enable-encoder=NAME    enable encoder NAME
155  --disable-encoders       disable all encoders
156  --disable-decoder=NAME   disable decoder NAME
157  --enable-decoder=NAME    enable decoder NAME
158  --disable-decoders       disable all decoders
159  --disable-hwaccel=NAME   disable hwaccel NAME
160  --enable-hwaccel=NAME    enable hwaccel NAME
161  --disable-hwaccels       disable all hwaccels
162  --disable-muxer=NAME     disable muxer NAME
163  --enable-muxer=NAME      enable muxer NAME
164  --disable-muxers         disable all muxers
165  --disable-demuxer=NAME   disable demuxer NAME
166  --enable-demuxer=NAME    enable demuxer NAME
167  --disable-demuxers       disable all demuxers
168  --enable-parser=NAME     enable parser NAME
169  --disable-parser=NAME    disable parser NAME
170  --disable-parsers        disable all parsers
171  --enable-bsf=NAME        enable bitstream filter NAME
172  --disable-bsf=NAME       disable bitstream filter NAME
173  --disable-bsfs           disable all bitstream filters
174  --enable-protocol=NAME   enable protocol NAME
175  --disable-protocol=NAME  disable protocol NAME
176  --disable-protocols      disable all protocols
177  --enable-indev=NAME      enable input device NAME
178  --disable-indev=NAME     disable input device NAME
179  --disable-indevs         disable input devices
180  --enable-outdev=NAME     enable output device NAME
181  --disable-outdev=NAME    disable output device NAME
182  --disable-outdevs        disable output devices
183  --disable-devices        disable all devices
184  --enable-filter=NAME     enable filter NAME
185  --disable-filter=NAME    disable filter NAME
186  --disable-filters        disable all filters
187
188External library support:
189
190  Using any of the following switches will allow FFmpeg to link to the
191  corresponding external library. All the components depending on that library
192  will become enabled, if all their other dependencies are met and they are not
193  explicitly disabled. E.g. --enable-libwavpack will enable linking to
194  libwavpack and allow the libwavpack encoder to be built, unless it is
195  specifically disabled with --disable-encoder=libwavpack.
196
197  Note that only the system libraries are auto-detected. All the other external
198  libraries must be explicitly enabled.
199
200  Also note that the following help text describes the purpose of the libraries
201  themselves, not all their features will necessarily be usable by FFmpeg.
202
203  --disable-alsa           disable ALSA support [autodetect]
204  --disable-appkit         disable Apple AppKit framework [autodetect]
205  --disable-avfoundation   disable Apple AVFoundation framework [autodetect]
206  --enable-avisynth        enable reading of AviSynth script files [no]
207  --disable-bzlib          disable bzlib [autodetect]
208  --disable-coreimage      disable Apple CoreImage framework [autodetect]
209  --enable-chromaprint     enable audio fingerprinting with chromaprint [no]
210  --enable-frei0r          enable frei0r video filtering [no]
211  --enable-gcrypt          enable gcrypt, needed for rtmp(t)e support
212                           if openssl, librtmp or gmp is not used [no]
213  --enable-gmp             enable gmp, needed for rtmp(t)e support
214                           if openssl or librtmp is not used [no]
215  --enable-gnutls          enable gnutls, needed for https support
216                           if openssl, libtls or mbedtls is not used [no]
217  --disable-iconv          disable iconv [autodetect]
218  --enable-jni             enable JNI support [no]
219  --enable-ladspa          enable LADSPA audio filtering [no]
220  --enable-libaom          enable AV1 video encoding/decoding via libaom [no]
221  --enable-libaribb24      enable ARIB text and caption decoding via libaribb24 [no]
222  --enable-libass          enable libass subtitles rendering,
223                           needed for subtitles and ass filter [no]
224  --enable-libbluray       enable BluRay reading using libbluray [no]
225  --enable-libbs2b         enable bs2b DSP library [no]
226  --enable-libcaca         enable textual display using libcaca [no]
227  --enable-libcelt         enable CELT decoding via libcelt [no]
228  --enable-libcdio         enable audio CD grabbing with libcdio [no]
229  --enable-libcodec2       enable codec2 en/decoding using libcodec2 [no]
230  --enable-libdav1d        enable AV1 decoding via libdav1d [no]
231  --enable-libdavs2        enable AVS2 decoding via libdavs2 [no]
232  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
233                           and libraw1394 [no]
234  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
235  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
236  --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
237  --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
238  --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
239  --enable-libglslang      enable GLSL->SPIRV compilation via libglslang [no]
240  --enable-libgme          enable Game Music Emu via libgme [no]
241  --enable-libgsm          enable GSM de/encoding via libgsm [no]
242  --enable-libiec61883     enable iec61883 via libiec61883 [no]
243  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
244  --enable-libjack         enable JACK audio sound server [no]
245  --enable-libklvanc       enable Kernel Labs VANC processing [no]
246  --enable-libkvazaar      enable HEVC encoding via libkvazaar [no]
247  --enable-liblensfun      enable lensfun lens correction [no]
248  --enable-libmodplug      enable ModPlug via libmodplug [no]
249  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
250  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
251  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
252  --enable-libopencv       enable video filtering via libopencv [no]
253  --enable-libopenh264     enable H.264 encoding via OpenH264 [no]
254  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
255  --enable-libopenmpt      enable decoding tracked files via libopenmpt [no]
256  --enable-libopus         enable Opus de/encoding via libopus [no]
257  --enable-libpulse        enable Pulseaudio input via libpulse [no]
258  --enable-librabbitmq     enable RabbitMQ library [no]
259  --enable-librav1e        enable AV1 encoding via rav1e [no]
260  --enable-librsvg         enable SVG rasterization via librsvg [no]
261  --enable-librubberband   enable rubberband needed for rubberband filter [no]
262  --enable-librtmp         enable RTMP[E] support via librtmp [no]
263  --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
264  --enable-libsmbclient    enable Samba protocol via libsmbclient [no]
265  --enable-libsnappy       enable Snappy compression, needed for hap encoding [no]
266  --enable-libsoxr         enable Include libsoxr resampling [no]
267  --enable-libspeex        enable Speex de/encoding via libspeex [no]
268  --enable-libsrt          enable Haivision SRT protocol via libsrt [no]
269  --enable-libssh          enable SFTP protocol via libssh [no]
270  --enable-libtensorflow   enable TensorFlow as a DNN module backend
271                           for DNN based filters like sr [no]
272  --enable-libtesseract    enable Tesseract, needed for ocr filter [no]
273  --enable-libtheora       enable Theora encoding via libtheora [no]
274  --enable-libtls          enable LibreSSL (via libtls), needed for https support
275                           if openssl, gnutls or mbedtls is not used [no]
276  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
277  --enable-libv4l2         enable libv4l2/v4l-utils [no]
278  --enable-libvidstab      enable video stabilization using vid.stab [no]
279  --enable-libvmaf         enable vmaf filter via libvmaf [no]
280  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
281  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
282                           native implementation exists [no]
283  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
284  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
285  --enable-libwebp         enable WebP encoding via libwebp [no]
286  --enable-libx264         enable H.264 encoding via x264 [no]
287  --enable-libx265         enable HEVC encoding via x265 [no]
288  --enable-libxavs         enable AVS encoding via xavs [no]
289  --enable-libxavs2        enable AVS2 encoding via xavs2 [no]
290  --enable-libxcb          enable X11 grabbing using XCB [autodetect]
291  --enable-libxcb-shm      enable X11 grabbing shm communication [autodetect]
292  --enable-libxcb-xfixes   enable X11 grabbing mouse rendering [autodetect]
293  --enable-libxcb-shape    enable X11 grabbing shape rendering [autodetect]
294  --enable-libxvid         enable Xvid encoding via xvidcore,
295                           native MPEG-4/Xvid encoder exists [no]
296  --enable-libxml2         enable XML parsing using the C library libxml2, needed
297                           for dash demuxing support [no]
298  --enable-libzimg         enable z.lib, needed for zscale filter [no]
299  --enable-libzmq          enable message passing via libzmq [no]
300  --enable-libzvbi         enable teletext support via libzvbi [no]
301  --enable-lv2             enable LV2 audio filtering [no]
302  --disable-lzma           disable lzma [autodetect]
303  --enable-decklink        enable Blackmagic DeckLink I/O support [no]
304  --enable-mbedtls         enable mbedTLS, needed for https support
305                           if openssl, gnutls or libtls is not used [no]
306  --enable-mediacodec      enable Android MediaCodec support [no]
307  --enable-mediafoundation enable encoding via MediaFoundation [auto]
308  --enable-libmysofa       enable libmysofa, needed for sofalizer filter [no]
309  --enable-openal          enable OpenAL 1.1 capture support [no]
310  --enable-opencl          enable OpenCL processing [no]
311  --enable-opengl          enable OpenGL rendering [no]
312  --enable-openssl         enable openssl, needed for https support
313                           if gnutls, libtls or mbedtls is not used [no]
314  --enable-pocketsphinx    enable PocketSphinx, needed for asr filter [no]
315  --disable-sndio          disable sndio support [autodetect]
316  --disable-schannel       disable SChannel SSP, needed for TLS support on
317                           Windows if openssl and gnutls are not used [autodetect]
318  --disable-sdl2           disable sdl2 [autodetect]
319  --disable-securetransport disable Secure Transport, needed for TLS support
320                           on OSX if openssl and gnutls are not used [autodetect]
321  --enable-vapoursynth     enable VapourSynth demuxer [no]
322  --enable-vulkan          enable Vulkan code [no]
323  --disable-xlib           disable xlib [autodetect]
324  --disable-zlib           disable zlib [autodetect]
325
326  The following libraries provide various hardware acceleration features:
327  --disable-amf            disable AMF video encoding code [autodetect]
328  --disable-audiotoolbox   disable Apple AudioToolbox code [autodetect]
329  --enable-cuda-nvcc       enable Nvidia CUDA compiler [no]
330  --disable-cuda-llvm      disable CUDA compilation using clang [autodetect]
331  --disable-cuvid          disable Nvidia CUVID support [autodetect]
332  --disable-d3d11va        disable Microsoft Direct3D 11 video acceleration code [autodetect]
333  --disable-dxva2          disable Microsoft DirectX 9 video acceleration code [autodetect]
334  --disable-ffnvcodec      disable dynamically linked Nvidia code [autodetect]
335  --enable-libdrm          enable DRM code (Linux) [no]
336  --enable-libmfx          enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no]
337  --enable-libnpp          enable Nvidia Performance Primitives-based code [no]
338  --enable-mmal            enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no]
339  --disable-nvdec          disable Nvidia video decoding acceleration (via hwaccel) [autodetect]
340  --disable-nvenc          disable Nvidia video encoding code [autodetect]
341  --enable-omx             enable OpenMAX IL code [no]
342  --enable-omx-rpi         enable OpenMAX IL code for Raspberry Pi [no]
343  --enable-rkmpp           enable Rockchip Media Process Platform code [no]
344  --disable-v4l2-m2m       disable V4L2 mem2mem code [autodetect]
345  --disable-vaapi          disable Video Acceleration API (mainly Unix/Intel) code [autodetect]
346  --disable-vdpau          disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
347  --disable-videotoolbox   disable VideoToolbox code [autodetect]
348
349Toolchain options:
350  --arch=ARCH              select architecture [$arch]
351  --cpu=CPU                select the minimum required CPU (affects
352                           instruction selection, may crash on older CPUs)
353  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
354  --progs-suffix=SUFFIX    program name suffix []
355  --enable-cross-compile   assume a cross-compiler is used
356  --sysroot=PATH           root of cross-build tree
357  --sysinclude=PATH        location of cross-build system headers
358  --target-os=OS           compiler targets OS [$target_os]
359  --target-exec=CMD        command to run executables on target
360  --target-path=DIR        path to view of build directory on target
361  --target-samples=DIR     path to samples directory on target
362  --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
363  --toolchain=NAME         set tool defaults according to NAME
364                           (gcc-asan, clang-asan, gcc-msan, clang-msan,
365                           gcc-tsan, clang-tsan, gcc-usan, clang-usan,
366                           valgrind-massif, valgrind-memcheck,
367                           msvc, icl, gcov, llvm-cov, hardened)
368  --nm=NM                  use nm tool NM [$nm_default]
369  --ar=AR                  use archive tool AR [$ar_default]
370  --as=AS                  use assembler AS [$as_default]
371  --ln_s=LN_S              use symbolic link tool LN_S [$ln_s_default]
372  --strip=STRIP            use strip tool STRIP [$strip_default]
373  --windres=WINDRES        use windows resource compiler WINDRES [$windres_default]
374  --x86asmexe=EXE          use nasm-compatible assembler EXE [$x86asmexe_default]
375  --cc=CC                  use C compiler CC [$cc_default]
376  --cxx=CXX                use C compiler CXX [$cxx_default]
377  --objcc=OCC              use ObjC compiler OCC [$cc_default]
378  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
379  --nvcc=NVCC              use Nvidia CUDA compiler NVCC or clang [$nvcc_default]
380  --ld=LD                  use linker LD [$ld_default]
381  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
382  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
383  --ranlib=RANLIB          use ranlib RANLIB [$ranlib_default]
384  --doxygen=DOXYGEN        use DOXYGEN to generate API doc [$doxygen_default]
385  --host-cc=HOSTCC         use host C compiler HOSTCC
386  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
387  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
388  --host-ld=HOSTLD         use host linker HOSTLD
389  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
390  --host-extralibs=HLIBS   use libs HLIBS when linking for host
391  --host-os=OS             compiler host OS [$target_os]
392  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
393  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
394  --extra-objcflags=FLAGS  add FLAGS to OBJCFLAGS [$CFLAGS]
395  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
396  --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
397  --extra-ldsoflags=ELDFLAGS add ELDFLAGS to LDSOFLAGS [$LDSOFLAGS]
398  --extra-libs=ELIBS       add ELIBS [$ELIBS]
399  --extra-version=STRING   version string suffix []
400  --optflags=OPTFLAGS      override optimization-related compiler flags
401  --nvccflags=NVCCFLAGS    override nvcc flags [$nvccflags_default]
402  --build-suffix=SUFFIX    library name suffix []
403  --enable-pic             build position-independent code
404  --enable-thumb           compile for Thumb instruction set
405  --enable-lto             use link-time optimization
406  --env="ENV=override"     override the environment variables
407
408Advanced options (experts only):
409  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
410  --custom-allocator=NAME  use a supported custom allocator
411  --disable-symver         disable symbol versioning
412  --enable-hardcoded-tables use hardcoded tables instead of runtime generation
413  --disable-safe-bitstream-reader
414                           disable buffer boundary checking in bitreaders
415                           (faster, but may crash)
416  --sws-max-filter-size=N  the max filter size swscale uses [$sws_max_filter_size_default]
417
418Optimization options (experts only):
419  --disable-asm            disable all assembly optimizations
420  --disable-altivec        disable AltiVec optimizations
421  --disable-vsx            disable VSX optimizations
422  --disable-power8         disable POWER8 optimizations
423  --disable-amd3dnow       disable 3DNow! optimizations
424  --disable-amd3dnowext    disable 3DNow! extended optimizations
425  --disable-mmx            disable MMX optimizations
426  --disable-mmxext         disable MMXEXT optimizations
427  --disable-sse            disable SSE optimizations
428  --disable-sse2           disable SSE2 optimizations
429  --disable-sse3           disable SSE3 optimizations
430  --disable-ssse3          disable SSSE3 optimizations
431  --disable-sse4           disable SSE4 optimizations
432  --disable-sse42          disable SSE4.2 optimizations
433  --disable-avx            disable AVX optimizations
434  --disable-xop            disable XOP optimizations
435  --disable-fma3           disable FMA3 optimizations
436  --disable-fma4           disable FMA4 optimizations
437  --disable-avx2           disable AVX2 optimizations
438  --disable-avx512         disable AVX-512 optimizations
439  --disable-aesni          disable AESNI optimizations
440  --disable-armv5te        disable armv5te optimizations
441  --disable-armv6          disable armv6 optimizations
442  --disable-armv6t2        disable armv6t2 optimizations
443  --disable-vfp            disable VFP optimizations
444  --disable-neon           disable NEON optimizations
445  --disable-inline-asm     disable use of inline assembly
446  --disable-x86asm         disable use of standalone x86 assembly
447  --disable-mipsdsp        disable MIPS DSP ASE R1 optimizations
448  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
449  --disable-msa            disable MSA optimizations
450  --disable-msa2           disable MSA2 optimizations
451  --disable-mipsfpu        disable floating point MIPS optimizations
452  --disable-mmi            disable Loongson SIMD optimizations
453  --disable-fast-unaligned consider unaligned accesses slow
454
455Developer options (useful when working on FFmpeg itself):
456  --disable-debug          disable debugging symbols
457  --enable-debug=LEVEL     set the debug level [$debuglevel]
458  --disable-optimizations  disable compiler optimizations
459  --enable-extra-warnings  enable more compiler warnings
460  --disable-stripping      disable stripping of executables and shared libraries
461  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
462                           2 causes a slowdown at runtime.
463  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
464  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
465                           leaks and errors, using the specified valgrind binary.
466                           Cannot be combined with --target-exec
467  --enable-ftrapv          Trap arithmetic overflows
468  --samples=PATH           location of test samples for FATE, if not set use
469                           \$FATE_SAMPLES at make invocation time.
470  --enable-neon-clobber-test check NEON registers for clobbering (should be
471                           used only for debugging purposes)
472  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
473                           should be used only for debugging purposes)
474  --enable-random          randomly enable/disable components
475  --disable-random
476  --enable-random=LIST     randomly enable/disable specific components or
477  --disable-random=LIST    component groups. LIST is a comma-separated list
478                           of NAME[:PROB] entries where NAME is a component
479                           (group) and PROB the probability associated with
480                           NAME (default 0.5).
481  --random-seed=VALUE      seed value for --enable/disable-random
482  --disable-valgrind-backtrace do not print a backtrace under Valgrind
483                           (only applies to --disable-optimizations builds)
484  --enable-ossfuzz         Enable building fuzzer tool
485  --libfuzzer=PATH         path to libfuzzer
486  --ignore-tests=TESTS     comma-separated list (without "fate-" prefix
487                           in the name) of tests whose result is ignored
488  --enable-linux-perf      enable Linux Performance Monitor API
489  --disable-large-tests    disable tests that use a large amount of memory
490
491NOTE: Object files are built at the place where configure is launched.
492EOF
493  exit 0
494}
495
496if test -t 1 && which tput >/dev/null 2>&1; then
497    ncolors=$(tput colors)
498    if test -n "$ncolors" && test $ncolors -ge 8; then
499        bold_color=$(tput bold)
500        warn_color=$(tput setaf 3)
501        error_color=$(tput setaf 1)
502        reset_color=$(tput sgr0)
503    fi
504    # 72 used instead of 80 since that's the default of pr
505    ncols=$(tput cols)
506fi
507: ${ncols:=72}
508
509log(){
510    echo "$@" >> $logfile
511}
512
513log_file(){
514    log BEGIN "$1"
515    log_file_i=1
516    while IFS= read -r log_file_line; do
517        printf '%5d\t%s\n' "$log_file_i" "$log_file_line"
518        log_file_i=$(($log_file_i+1))
519    done < "$1" >> "$logfile"
520    log END "$1"
521}
522
523warn(){
524    log "WARNING: $*"
525    WARNINGS="${WARNINGS}WARNING: $*\n"
526}
527
528die(){
529    log "$@"
530    echo "$error_color$bold_color$@$reset_color"
531    cat <<EOF
532
533If you think configure made a mistake, make sure you are using the latest
534version from Git.  If the latest version fails, report the problem to the
535ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
536EOF
537    if disabled logging; then
538        cat <<EOF
539Rerun configure with logging enabled (do not use --disable-logging), and
540include the log this produces with your report.
541EOF
542    else
543        cat <<EOF
544Include the log file "$logfile" produced by configure as this will help
545solve the problem.
546EOF
547    fi
548    exit 1
549}
550
551# Avoid locale weirdness, besides we really just want to translate ASCII.
552toupper(){
553    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
554}
555
556tolower(){
557    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
558}
559
560c_escape(){
561    echo "$*" | sed 's/["\\]/\\\0/g'
562}
563
564sh_quote(){
565    v=$(echo "$1" | sed "s/'/'\\\\''/g")
566    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
567    echo "$v"
568}
569
570cleanws(){
571    echo "$@" | sed 's/^ *//;s/[[:space:]][[:space:]]*/ /g;s/ *$//'
572}
573
574filter(){
575    pat=$1
576    shift
577    for v; do
578        eval "case '$v' in $pat) printf '%s ' '$v' ;; esac"
579    done
580}
581
582filter_out(){
583    pat=$1
584    shift
585    for v; do
586        eval "case '$v' in $pat) ;; *) printf '%s ' '$v' ;; esac"
587    done
588}
589
590map(){
591    m=$1
592    shift
593    for v; do eval $m; done
594}
595
596add_suffix(){
597    suffix=$1
598    shift
599    for v; do echo ${v}${suffix}; done
600}
601
602remove_suffix(){
603    suffix=$1
604    shift
605    for v; do echo ${v%$suffix}; done
606}
607
608set_all(){
609    value=$1
610    shift
611    for var in $*; do
612        eval $var=$value
613    done
614}
615
616set_weak(){
617    value=$1
618    shift
619    for var; do
620        eval : \${$var:=$value}
621    done
622}
623
624sanitize_var_name(){
625    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
626}
627
628set_sanitized(){
629    var=$1
630    shift
631    eval $(sanitize_var_name "$var")='$*'
632}
633
634get_sanitized(){
635    eval echo \$$(sanitize_var_name "$1")
636}
637
638pushvar(){
639    for pvar in $*; do
640        eval level=\${${pvar}_level:=0}
641        eval ${pvar}_${level}="\$$pvar"
642        eval ${pvar}_level=$(($level+1))
643    done
644}
645
646popvar(){
647    for pvar in $*; do
648        eval level=\${${pvar}_level:-0}
649        test $level = 0 && continue
650        eval level=$(($level-1))
651        eval $pvar="\${${pvar}_${level}}"
652        eval ${pvar}_level=$level
653        eval unset ${pvar}_${level}
654    done
655}
656
657request(){
658    for var in $*; do
659        eval ${var}_requested=yes
660        eval $var=
661    done
662}
663
664warn_if_gets_disabled(){
665    for var in $*; do
666        WARN_IF_GETS_DISABLED_LIST="$WARN_IF_GETS_DISABLED_LIST $var"
667    done
668}
669
670enable(){
671    set_all yes $*
672}
673
674disable(){
675    set_all no $*
676}
677
678disable_with_reason(){
679    disable $1
680    eval "${1}_disable_reason=\"$2\""
681    if requested $1; then
682        die "ERROR: $1 requested, but $2"
683    fi
684}
685
686enable_weak(){
687    set_weak yes $*
688}
689
690disable_weak(){
691    set_weak no $*
692}
693
694enable_sanitized(){
695    for var; do
696        enable $(sanitize_var_name $var)
697    done
698}
699
700disable_sanitized(){
701    for var; do
702        disable $(sanitize_var_name $var)
703    done
704}
705
706do_enable_deep(){
707    for var; do
708        enabled $var && continue
709        set -- $var
710        eval enable_deep \$${var}_select
711        var=$1
712        eval enable_deep_weak \$${var}_suggest
713    done
714}
715
716enable_deep(){
717    do_enable_deep $*
718    enable $*
719}
720
721enable_deep_weak(){
722    for var; do
723        disabled $var && continue
724        set -- $var
725        do_enable_deep $var
726        var=$1
727        enable_weak $var
728    done
729}
730
731requested(){
732    test "${1#!}" = "$1" && op="=" || op="!="
733    eval test "x\$${1#!}_requested" $op "xyes"
734}
735
736enabled(){
737    test "${1#!}" = "$1" && op="=" || op="!="
738    eval test "x\$${1#!}" $op "xyes"
739}
740
741disabled(){
742    test "${1#!}" = "$1" && op="=" || op="!="
743    eval test "x\$${1#!}" $op "xno"
744}
745
746enabled_all(){
747    for opt; do
748        enabled $opt || return 1
749    done
750}
751
752disabled_all(){
753    for opt; do
754        disabled $opt || return 1
755    done
756}
757
758enabled_any(){
759    for opt; do
760        enabled $opt && return 0
761    done
762}
763
764disabled_any(){
765    for opt; do
766        disabled $opt && return 0
767    done
768    return 1
769}
770
771set_default(){
772    for opt; do
773        eval : \${$opt:=\$${opt}_default}
774    done
775}
776
777is_in(){
778    value=$1
779    shift
780    for var in $*; do
781        [ $var = $value ] && return 0
782    done
783    return 1
784}
785
786# The cfg loop is very hot (several thousands iterations), and in bash also
787# potentialy quite slow. Try to abort the iterations early, preferably without
788# calling functions. 70%+ of the time cfg is already done or without deps.
789check_deps(){
790    for cfg; do
791        eval [ x\$${cfg}_checking = xdone ] && continue
792        eval [ x\$${cfg}_checking = xinprogress ] && die "Circular dependency for $cfg."
793
794        eval "
795        dep_all=\$${cfg}_deps
796        dep_any=\$${cfg}_deps_any
797        dep_con=\$${cfg}_conflict
798        dep_sel=\$${cfg}_select
799        dep_sgs=\$${cfg}_suggest
800        dep_ifa=\$${cfg}_if
801        dep_ifn=\$${cfg}_if_any
802        "
803
804        # most of the time here $cfg has no deps - avoid costly no-op work
805        if [ "$dep_all$dep_any$dep_con$dep_sel$dep_sgs$dep_ifa$dep_ifn" ]; then
806            eval ${cfg}_checking=inprogress
807
808            set -- $cfg "$dep_all" "$dep_any" "$dep_con" "$dep_sel" "$dep_sgs" "$dep_ifa" "$dep_ifn"
809            check_deps $dep_all $dep_any $dep_con $dep_sel $dep_sgs $dep_ifa $dep_ifn
810            cfg=$1; dep_all=$2; dep_any=$3; dep_con=$4; dep_sel=$5 dep_sgs=$6; dep_ifa=$7; dep_ifn=$8
811
812            [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
813            [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
814            enabled_all  $dep_all || { disable_with_reason $cfg "not all dependencies are satisfied: $dep_all"; }
815            enabled_any  $dep_any || { disable_with_reason $cfg "not any dependency is satisfied: $dep_any"; }
816            disabled_all $dep_con || { disable_with_reason $cfg "some conflicting dependencies are unsatisfied: $dep_con"; }
817            disabled_any $dep_sel && { disable_with_reason $cfg "some selected dependency is unsatisfied: $dep_sel"; }
818
819            enabled $cfg && enable_deep_weak $dep_sel $dep_sgs
820
821            for dep in $dep_all $dep_any $dep_sel $dep_sgs; do
822                # filter out library deps, these do not belong in extralibs
823                is_in $dep $LIBRARY_LIST && continue
824                enabled $dep && eval append ${cfg}_extralibs ${dep}_extralibs
825            done
826        fi
827
828        eval ${cfg}_checking=done
829    done
830}
831
832print_config(){
833    pfx=$1
834    files=$2
835    shift 2
836    map 'eval echo "$v \${$v:-no}"' "$@" |
837    awk "BEGIN { split(\"$files\", files) }
838        {
839            c = \"$pfx\" toupper(\$1);
840            v = \$2;
841            sub(/yes/, 1, v);
842            sub(/no/,  0, v);
843            for (f in files) {
844                file = files[f];
845                if (file ~ /\\.h\$/) {
846                    printf(\"#define %s %d\\n\", c, v) >>file;
847                } else if (file ~ /\\.asm\$/) {
848                    printf(\"%%define %s %d\\n\", c, v) >>file;
849                } else if (file ~ /\\.mak\$/) {
850                    n = -v ? \"\" : \"!\";
851                    printf(\"%s%s=yes\\n\", n, c) >>file;
852                } else if (file ~ /\\.texi\$/) {
853                    pre = -v ? \"\" : \"@c \";
854                    yesno = \$2;
855                    c2 = tolower(c);
856                    gsub(/_/, \"-\", c2);
857                    printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file;
858                }
859            }
860        }"
861}
862
863print_enabled(){
864    suf=$1
865    shift
866    for v; do
867        enabled $v && printf "%s\n" ${v%$suf}
868    done
869}
870
871append(){
872    var=$1
873    shift
874    eval "$var=\"\$$var $*\""
875}
876
877prepend(){
878    var=$1
879    shift
880    eval "$var=\"$* \$$var\""
881}
882
883reverse () {
884    eval '
885        reverse_out=
886        for v in $'$1'; do
887            reverse_out="$v $reverse_out"
888        done
889        '$1'=$reverse_out
890    '
891}
892
893# keeps the last occurence of each non-unique item
894unique(){
895    unique_out=
896    eval unique_in=\$$1
897    reverse unique_in
898    for v in $unique_in; do
899        # " $unique_out" +space such that every item is surrounded with spaces
900        case " $unique_out" in *" $v "*) continue; esac  # already in list
901        unique_out="$unique_out$v "
902    done
903    reverse unique_out
904    eval $1=\$unique_out
905}
906
907resolve(){
908    resolve_out=
909    eval resolve_in=\$$1
910    for v in $resolve_in; do
911        eval 'resolve_out="$resolve_out$'$v' "'
912    done
913    eval $1=\$resolve_out
914}
915
916add_cppflags(){
917    append CPPFLAGS "$@"
918}
919
920add_cflags(){
921    append CFLAGS $($cflags_filter "$@")
922}
923
924add_cflags_headers(){
925    append CFLAGS_HEADERS $($cflags_filter "$@")
926}
927
928add_cxxflags(){
929    append CXXFLAGS $($cflags_filter "$@")
930}
931
932add_objcflags(){
933    append OBJCFLAGS $($objcflags_filter "$@")
934}
935
936add_asflags(){
937    append ASFLAGS $($asflags_filter "$@")
938}
939
940add_ldflags(){
941    append LDFLAGS $($ldflags_filter "$@")
942}
943
944add_ldexeflags(){
945    append LDEXEFLAGS $($ldflags_filter "$@")
946}
947
948add_ldsoflags(){
949    append LDSOFLAGS $($ldflags_filter "$@")
950}
951
952add_extralibs(){
953    prepend extralibs $($ldflags_filter "$@")
954}
955
956add_stripflags(){
957    append ASMSTRIPFLAGS "$@"
958}
959
960add_host_cppflags(){
961    append host_cppflags "$@"
962}
963
964add_host_cflags(){
965    append host_cflags $($host_cflags_filter "$@")
966}
967
968add_host_ldflags(){
969    append host_ldflags $($host_ldflags_filter "$@")
970}
971
972add_compat(){
973    append compat_objs $1
974    shift
975    map 'add_cppflags -D$v' "$@"
976}
977
978test_cmd(){
979    log "$@"
980    "$@" >> $logfile 2>&1
981}
982
983test_stat(){
984    log test_stat "$@"
985    stat "$1" >> $logfile 2>&1
986}
987
988cc_e(){
989    eval printf '%s\\n' $CC_E
990}
991
992cc_o(){
993    eval printf '%s\\n' $CC_O
994}
995
996as_o(){
997    eval printf '%s\\n' $AS_O
998}
999
1000x86asm_o(){
1001    eval printf '%s\\n' $X86ASM_O
1002}
1003
1004ld_o(){
1005    eval printf '%s\\n' $LD_O
1006}
1007
1008hostcc_e(){
1009    eval printf '%s\\n' $HOSTCC_E
1010}
1011
1012hostcc_o(){
1013    eval printf '%s\\n' $HOSTCC_O
1014}
1015
1016nvcc_o(){
1017    eval printf '%s\\n' $NVCC_O
1018}
1019
1020test_cc(){
1021    log test_cc "$@"
1022    cat > $TMPC
1023    log_file $TMPC
1024    test_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
1025}
1026
1027test_cxx(){
1028    log test_cxx "$@"
1029    cat > $TMPCPP
1030    log_file $TMPCPP
1031    test_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
1032}
1033
1034test_objcc(){
1035    log test_objcc "$@"
1036    cat > $TMPM
1037    log_file $TMPM
1038    test_cmd $objcc -Werror=missing-prototypes $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPM
1039}
1040
1041test_nvcc(){
1042    log test_nvcc "$@"
1043    cat > $TMPCU
1044    log_file $TMPCU
1045    tmpcu_=$TMPCU
1046    tmpo_=$TMPO
1047    [ -x "$(command -v cygpath)" ] && tmpcu_=$(cygpath -m $tmpcu_) && tmpo_=$(cygpath -m $tmpo_)
1048    test_cmd $nvcc $nvccflags "$@" $NVCC_C $(nvcc_o $tmpo_) $tmpcu_
1049}
1050
1051check_nvcc() {
1052    log check_nvcc "$@"
1053    name=$1
1054    shift 1
1055    disabled $name && return
1056    disable $name
1057    test_nvcc "$@" <<EOF && enable $name
1058extern "C" {
1059    __global__ void hello(unsigned char *data) {}
1060}
1061EOF
1062}
1063
1064test_cpp(){
1065    log test_cpp "$@"
1066    cat > $TMPC
1067    log_file $TMPC
1068    test_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
1069}
1070
1071test_as(){
1072    log test_as "$@"
1073    cat > $TMPS
1074    log_file $TMPS
1075    test_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
1076}
1077
1078test_x86asm(){
1079    log test_x86asm "$@"
1080    echo "$1" > $TMPASM
1081    log_file $TMPASM
1082    shift
1083    test_cmd $x86asmexe $X86ASMFLAGS -Werror "$@" $(x86asm_o $TMPO) $TMPASM
1084}
1085
1086check_cmd(){
1087    log check_cmd "$@"
1088    cmd=$1
1089    disabled $cmd && return
1090    disable $cmd
1091    test_cmd $@ && enable $cmd
1092}
1093
1094check_as(){
1095    log check_as "$@"
1096    name=$1
1097    code=$2
1098    shift 2
1099    disable $name
1100    test_as $@ <<EOF && enable $name
1101$code
1102EOF
1103}
1104
1105check_inline_asm(){
1106    log check_inline_asm "$@"
1107    name="$1"
1108    code="$2"
1109    shift 2
1110    disable $name
1111    test_cc "$@" <<EOF && enable $name
1112void foo(void){ __asm__ volatile($code); }
1113EOF
1114}
1115
1116check_inline_asm_flags(){
1117    log check_inline_asm_flags "$@"
1118    name="$1"
1119    code="$2"
1120    flags=''
1121    shift 2
1122    while [ "$1" != "" ]; do
1123      append flags $1
1124      shift
1125    done;
1126    disable $name
1127    cat > $TMPC <<EOF
1128void foo(void){ __asm__ volatile($code); }
1129EOF
1130    log_file $TMPC
1131    test_cmd $cc $CPPFLAGS $CFLAGS $flags "$@" $CC_C $(cc_o $TMPO) $TMPC &&
1132    enable $name && add_cflags $flags && add_asflags $flags && add_ldflags $flags
1133}
1134
1135check_insn(){
1136    log check_insn "$@"
1137    check_inline_asm ${1}_inline "\"$2\""
1138    check_as ${1}_external "$2"
1139}
1140
1141check_x86asm(){
1142    log check_x86asm "$@"
1143    name=$1
1144    shift
1145    disable $name
1146    test_x86asm "$@" && enable $name
1147}
1148
1149test_ld(){
1150    log test_ld "$@"
1151    type=$1
1152    shift 1
1153    flags=$(filter_out '-l*|*.so' $@)
1154    libs=$(filter '-l*|*.so' $@)
1155    test_$type $($cflags_filter $flags) || return
1156    flags=$($ldflags_filter $flags)
1157    libs=$($ldflags_filter $libs)
1158    test_cmd $ld $LDFLAGS $LDEXEFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
1159}
1160
1161check_ld(){
1162    log check_ld "$@"
1163    type=$1
1164    name=$2
1165    shift 2
1166    disable $name
1167    test_ld $type $@ && enable $name
1168}
1169
1170print_include(){
1171    hdr=$1
1172    test "${hdr%.h}" = "${hdr}" &&
1173        echo "#include $hdr"    ||
1174        echo "#include <$hdr>"
1175}
1176
1177test_code(){
1178    log test_code "$@"
1179    check=$1
1180    headers=$2
1181    code=$3
1182    shift 3
1183    {
1184        for hdr in $headers; do
1185            print_include $hdr
1186        done
1187        echo "int main(void) { $code; return 0; }"
1188    } | test_$check "$@"
1189}
1190
1191check_cppflags(){
1192    log check_cppflags "$@"
1193    test_cpp "$@" <<EOF && append CPPFLAGS "$@"
1194#include <stdlib.h>
1195EOF
1196}
1197
1198test_cflags(){
1199    log test_cflags "$@"
1200    set -- $($cflags_filter "$@")
1201    test_cc "$@" <<EOF
1202int x;
1203EOF
1204}
1205
1206check_cflags(){
1207    log check_cflags "$@"
1208    test_cflags "$@" && add_cflags "$@"
1209}
1210
1211check_cxxflags(){
1212    log check_cxxflags "$@"
1213    set -- $($cflags_filter "$@")
1214    test_cxx "$@" <<EOF && append CXXFLAGS "$@"
1215int x;
1216EOF
1217}
1218
1219test_objcflags(){
1220    log test_objcflags "$@"
1221    set -- $($objcflags_filter "$@")
1222    test_objcc "$@" <<EOF
1223int x;
1224EOF
1225}
1226
1227check_objcflags(){
1228    log check_objcflags "$@"
1229    test_objcflags "$@" && add_objcflags "$@"
1230}
1231
1232test_ldflags(){
1233    log test_ldflags "$@"
1234    set -- $($ldflags_filter "$@")
1235    test_ld "cc" "$@" <<EOF
1236int main(void){ return 0; }
1237EOF
1238}
1239
1240check_ldflags(){
1241    log check_ldflags "$@"
1242    test_ldflags "$@" && add_ldflags "$@"
1243}
1244
1245test_stripflags(){
1246    log test_stripflags "$@"
1247    # call test_cc to get a fresh TMPO
1248    test_cc <<EOF
1249int main(void) { return 0; }
1250EOF
1251    test_cmd $strip $ASMSTRIPFLAGS "$@" $TMPO
1252}
1253
1254check_stripflags(){
1255    log check_stripflags "$@"
1256    test_stripflags "$@" && add_stripflags "$@"
1257}
1258
1259check_headers(){
1260    log check_headers "$@"
1261    headers=$1
1262    shift
1263    disable_sanitized $headers
1264    {
1265        for hdr in $headers; do
1266            print_include $hdr
1267        done
1268        echo "int x;"
1269    } | test_cpp "$@" && enable_sanitized $headers
1270}
1271
1272check_header_objcc(){
1273    log check_header_objcc "$@"
1274    rm -f -- "$TMPO"
1275    header=$1
1276    shift
1277    disable_sanitized $header
1278    {
1279       echo "#include <$header>"
1280       echo "int main(void) { return 0; }"
1281    } | test_objcc && test_stat "$TMPO" && enable_sanitized $header
1282}
1283
1284check_apple_framework(){
1285    log check_apple_framework "$@"
1286    framework="$1"
1287    name="$(tolower $framework)"
1288    header="${framework}/${framework}.h"
1289    disable $name
1290    check_header_objcc $header &&
1291        enable $name && eval ${name}_extralibs='"-framework $framework"'
1292}
1293
1294check_func(){
1295    log check_func "$@"
1296    func=$1
1297    shift
1298    disable $func
1299    test_ld "cc" "$@" <<EOF && enable $func
1300extern int $func();
1301int main(void){ $func(); }
1302EOF
1303}
1304
1305check_complexfunc(){
1306    log check_complexfunc "$@"
1307    func=$1
1308    narg=$2
1309    shift 2
1310    test $narg = 2 && args="f, g" || args="f * I"
1311    disable $func
1312    test_ld "cc" "$@" <<EOF && enable $func
1313#include <complex.h>
1314#include <math.h>
1315float foo(complex float f, complex float g) { return $func($args); }
1316int main(void){ return (int) foo; }
1317EOF
1318}
1319
1320check_mathfunc(){
1321    log check_mathfunc "$@"
1322    func=$1
1323    narg=$2
1324    shift 2
1325    test $narg = 2 && args="f, g" || args="f"
1326    disable $func
1327    test_ld "cc" "$@" <<EOF && enable $func
1328#include <math.h>
1329float foo(float f, float g) { return $func($args); }
1330int main(void){ return (int) foo; }
1331EOF
1332}
1333
1334check_func_headers(){
1335    log check_func_headers "$@"
1336    headers=$1
1337    funcs=$2
1338    shift 2
1339    {
1340        for hdr in $headers; do
1341            print_include $hdr
1342        done
1343        echo "#include <stdint.h>"
1344        for func in $funcs; do
1345            echo "long check_$func(void) { return (long) $func; }"
1346        done
1347        echo "int main(void) { int ret = 0;"
1348        # LTO could optimize out the test functions without this
1349        for func in $funcs; do
1350            echo " ret |= ((intptr_t)check_$func) & 0xFFFF;"
1351        done
1352        echo "return ret; }"
1353    } | test_ld "cc" "$@" && enable $funcs && enable_sanitized $headers
1354}
1355
1356check_class_headers_cpp(){
1357    log check_class_headers_cpp "$@"
1358    headers=$1
1359    classes=$2
1360    shift 2
1361    {
1362        for hdr in $headers; do
1363            echo "#include <$hdr>"
1364        done
1365        echo "int main(void) { "
1366        i=1
1367        for class in $classes; do
1368            echo "$class obj$i;"
1369            i=$(expr $i + 1)
1370        done
1371        echo "return 0; }"
1372    } | test_ld "cxx" "$@" && enable $funcs && enable_sanitized $headers
1373}
1374
1375test_cpp_condition(){
1376    log test_cpp_condition "$@"
1377    header=$1
1378    condition=$2
1379    shift 2
1380    test_cpp "$@" <<EOF
1381#include <$header>
1382#if !($condition)
1383#error "unsatisfied condition: $condition"
1384#endif
1385EOF
1386}
1387
1388check_cpp_condition(){
1389    log check_cpp_condition "$@"
1390    name=$1
1391    shift 1
1392    disable $name
1393    test_cpp_condition "$@" && enable $name
1394}
1395
1396test_cflags_cc(){
1397    log test_cflags_cc "$@"
1398    flags=$1
1399    header=$2
1400    condition=$3
1401    shift 3
1402    set -- $($cflags_filter "$flags")
1403    test_cc "$@" <<EOF
1404#include <$header>
1405#if !($condition)
1406#error "unsatisfied condition: $condition"
1407#endif
1408EOF
1409}
1410
1411check_lib(){
1412    log check_lib "$@"
1413    name="$1"
1414    headers="$2"
1415    funcs="$3"
1416    shift 3
1417    disable $name
1418    check_func_headers "$headers" "$funcs" "$@" &&
1419        enable $name && eval ${name}_extralibs="\$@"
1420}
1421
1422check_lib_cpp(){
1423    log check_lib_cpp "$@"
1424    name="$1"
1425    headers="$2"
1426    classes="$3"
1427    shift 3
1428    disable $name
1429    check_class_headers_cpp "$headers" "$classes" "$@" &&
1430        enable $name && eval ${name}_extralibs="\$@"
1431}
1432
1433test_pkg_config(){
1434    log test_pkg_config "$@"
1435    name="$1"
1436    pkg_version="$2"
1437    pkg="${2%% *}"
1438    headers="$3"
1439    funcs="$4"
1440    shift 4
1441    disable $name
1442    test_cmd $pkg_config --exists --print-errors $pkg_version || return
1443    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
1444    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
1445    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
1446        enable $name &&
1447        set_sanitized "${name}_cflags"    $pkg_cflags &&
1448        set_sanitized "${name}_extralibs" $pkg_libs
1449}
1450
1451check_pkg_config(){
1452    log check_pkg_config "$@"
1453    name="$1"
1454    test_pkg_config "$@" &&
1455        eval add_cflags \$${name}_cflags
1456}
1457
1458test_exec(){
1459    test_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
1460}
1461
1462check_exec_crash(){
1463    log check_exec_crash "$@"
1464    code=$(cat)
1465
1466    # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
1467    # are safe but may not be available everywhere.  Thus we use
1468    # raise(SIGTERM) instead.  The check is run in a subshell so we
1469    # can redirect the "Terminated" message from the shell.  SIGBUS
1470    # is not defined by standard C so it is used conditionally.
1471
1472    (test_exec "$@") >> $logfile 2>&1 <<EOF
1473#include <signal.h>
1474static void sighandler(int sig){
1475    raise(SIGTERM);
1476}
1477int foo(void){
1478    $code
1479}
1480int (*func_ptr)(void) = foo;
1481int main(void){
1482    signal(SIGILL, sighandler);
1483    signal(SIGFPE, sighandler);
1484    signal(SIGSEGV, sighandler);
1485#ifdef SIGBUS
1486    signal(SIGBUS, sighandler);
1487#endif
1488    return func_ptr();
1489}
1490EOF
1491}
1492
1493check_type(){
1494    log check_type "$@"
1495    headers=$1
1496    type=$2
1497    shift 2
1498    disable_sanitized "$type"
1499    test_code cc "$headers" "$type v" "$@" && enable_sanitized "$type"
1500}
1501
1502check_struct(){
1503    log check_struct "$@"
1504    headers=$1
1505    struct=$2
1506    member=$3
1507    shift 3
1508    disable_sanitized "${struct}_${member}"
1509    test_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
1510        enable_sanitized "${struct}_${member}"
1511}
1512
1513check_builtin(){
1514    log check_builtin "$@"
1515    name=$1
1516    headers=$2
1517    builtin=$3
1518    shift 3
1519    disable "$name"
1520    test_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
1521}
1522
1523check_compile_assert(){
1524    log check_compile_assert "$@"
1525    name=$1
1526    headers=$2
1527    condition=$3
1528    shift 3
1529    disable "$name"
1530    test_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
1531}
1532
1533check_cc(){
1534    log check_cc "$@"
1535    name=$1
1536    shift
1537    disable "$name"
1538    test_code cc "$@" && enable "$name"
1539}
1540
1541require(){
1542    log require "$@"
1543    name_version="$1"
1544    name="${1%% *}"
1545    shift
1546    check_lib $name "$@" || die "ERROR: $name_version not found"
1547}
1548
1549require_cc(){
1550    log require_cc "$@"
1551    name="$1"
1552    check_cc "$@" || die "ERROR: $name failed"
1553}
1554
1555require_cpp(){
1556    log require_cpp "$@"
1557    name_version="$1"
1558    name="${1%% *}"
1559    shift
1560    check_lib_cpp "$name" "$@" || die "ERROR: $name_version not found"
1561}
1562
1563require_headers(){
1564    log require_headers "$@"
1565    headers="$1"
1566    check_headers "$@" || die "ERROR: $headers not found"
1567}
1568
1569require_cpp_condition(){
1570    log require_cpp_condition "$@"
1571    condition="$3"
1572    check_cpp_condition "$@" || die "ERROR: $condition not satisfied"
1573}
1574
1575require_pkg_config(){
1576    log require_pkg_config "$@"
1577    pkg_version="$2"
1578    check_pkg_config "$@" || die "ERROR: $pkg_version not found using pkg-config$pkg_config_fail_message"
1579}
1580
1581test_host_cc(){
1582    log test_host_cc "$@"
1583    cat > $TMPC
1584    log_file $TMPC
1585    test_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1586}
1587
1588test_host_cpp(){
1589    log test_host_cpp "$@"
1590    cat > $TMPC
1591    log_file $TMPC
1592    test_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
1593}
1594
1595check_host_cppflags(){
1596    log check_host_cppflags "$@"
1597    test_host_cpp "$@" <<EOF && append host_cppflags "$@"
1598#include <stdlib.h>
1599EOF
1600}
1601
1602check_host_cflags(){
1603    log check_host_cflags "$@"
1604    set -- $($host_cflags_filter "$@")
1605    test_host_cc "$@" <<EOF && append host_cflags "$@"
1606int x;
1607EOF
1608}
1609
1610test_host_cpp_condition(){
1611    log test_host_cpp_condition "$@"
1612    header=$1
1613    condition=$2
1614    shift 2
1615    test_host_cpp "$@" <<EOF
1616#include <$header>
1617#if !($condition)
1618#error "unsatisfied condition: $condition"
1619#endif
1620EOF
1621}
1622
1623check_host_cpp_condition(){
1624    log check_host_cpp_condition "$@"
1625    name=$1
1626    shift 1
1627    disable $name
1628    test_host_cpp_condition "$@" && enable $name
1629}
1630
1631cp_if_changed(){
1632    cmp -s "$1" "$2" && { test "$quiet" != "yes" && echo "$2 is unchanged"; } && return
1633    mkdir -p "$(dirname $2)"
1634    cp -f "$1" "$2"
1635}
1636
1637# CONFIG_LIST contains configurable options, while HAVE_LIST is for
1638# system-dependent things.
1639
1640AVCODEC_COMPONENTS="
1641    bsfs
1642    decoders
1643    encoders
1644    hwaccels
1645    parsers
1646"
1647
1648AVDEVICE_COMPONENTS="
1649    indevs
1650    outdevs
1651"
1652
1653AVFILTER_COMPONENTS="
1654    filters
1655"
1656
1657AVFORMAT_COMPONENTS="
1658    demuxers
1659    muxers
1660    protocols
1661"
1662
1663COMPONENT_LIST="
1664    $AVCODEC_COMPONENTS
1665    $AVDEVICE_COMPONENTS
1666    $AVFILTER_COMPONENTS
1667    $AVFORMAT_COMPONENTS
1668"
1669
1670EXAMPLE_LIST="
1671    avio_list_dir_example
1672    avio_reading_example
1673    decode_audio_example
1674    decode_video_example
1675    demuxing_decoding_example
1676    encode_audio_example
1677    encode_video_example
1678    extract_mvs_example
1679    filter_audio_example
1680    filtering_audio_example
1681    filtering_video_example
1682    http_multiclient_example
1683    hw_decode_example
1684    metadata_example
1685    muxing_example
1686    qsvdec_example
1687    remuxing_example
1688    resampling_audio_example
1689    scaling_video_example
1690    transcode_aac_example
1691    transcoding_example
1692    vaapi_encode_example
1693    vaapi_transcode_example
1694"
1695
1696EXTERNAL_AUTODETECT_LIBRARY_LIST="
1697    alsa
1698    appkit
1699    avfoundation
1700    bzlib
1701    coreimage
1702    iconv
1703    libxcb
1704    libxcb_shm
1705    libxcb_shape
1706    libxcb_xfixes
1707    lzma
1708    mediafoundation
1709    schannel
1710    sdl2
1711    securetransport
1712    sndio
1713    xlib
1714    zlib
1715"
1716
1717EXTERNAL_LIBRARY_GPL_LIST="
1718    avisynth
1719    frei0r
1720    libcdio
1721    libdavs2
1722    librubberband
1723    libvidstab
1724    libx264
1725    libx265
1726    libxavs
1727    libxavs2
1728    libxvid
1729"
1730
1731EXTERNAL_LIBRARY_NONFREE_LIST="
1732    decklink
1733    libfdk_aac
1734    openssl
1735    libtls
1736"
1737
1738EXTERNAL_LIBRARY_VERSION3_LIST="
1739    gmp
1740    libaribb24
1741    liblensfun
1742    libopencore_amrnb
1743    libopencore_amrwb
1744    libvmaf
1745    libvo_amrwbenc
1746    mbedtls
1747    rkmpp
1748"
1749
1750EXTERNAL_LIBRARY_GPLV3_LIST="
1751    libsmbclient
1752"
1753
1754EXTERNAL_LIBRARY_LIST="
1755    $EXTERNAL_LIBRARY_GPL_LIST
1756    $EXTERNAL_LIBRARY_NONFREE_LIST
1757    $EXTERNAL_LIBRARY_VERSION3_LIST
1758    $EXTERNAL_LIBRARY_GPLV3_LIST
1759    chromaprint
1760    gcrypt
1761    gnutls
1762    jni
1763    ladspa
1764    libaom
1765    libass
1766    libbluray
1767    libbs2b
1768    libcaca
1769    libcelt
1770    libcodec2
1771    libdav1d
1772    libdc1394
1773    libdrm
1774    libflite
1775    libfontconfig
1776    libfreetype
1777    libfribidi
1778    libglslang
1779    libgme
1780    libgsm
1781    libiec61883
1782    libilbc
1783    libjack
1784    libklvanc
1785    libkvazaar
1786    libmodplug
1787    libmp3lame
1788    libmysofa
1789    libopencv
1790    libopenh264
1791    libopenjpeg
1792    libopenmpt
1793    libopus
1794    libpulse
1795    librabbitmq
1796    librav1e
1797    librsvg
1798    librtmp
1799    libshine
1800    libsmbclient
1801    libsnappy
1802    libsoxr
1803    libspeex
1804    libsrt
1805    libssh
1806    libtensorflow
1807    libtesseract
1808    libtheora
1809    libtwolame
1810    libv4l2
1811    libvorbis
1812    libvpx
1813    libwavpack
1814    libwebp
1815    libxml2
1816    libzimg
1817    libzmq
1818    libzvbi
1819    lv2
1820    mediacodec
1821    openal
1822    opengl
1823    pocketsphinx
1824    vapoursynth
1825"
1826
1827HWACCEL_AUTODETECT_LIBRARY_LIST="
1828    amf
1829    audiotoolbox
1830    crystalhd
1831    cuda
1832    cuda_llvm
1833    cuvid
1834    d3d11va
1835    dxva2
1836    ffnvcodec
1837    nvdec
1838    nvenc
1839    vaapi
1840    vdpau
1841    videotoolbox
1842    v4l2_m2m
1843    xvmc
1844"
1845
1846# catchall list of things that require external libs to link
1847EXTRALIBS_LIST="
1848    cpu_init
1849    cws2fws
1850"
1851
1852HWACCEL_LIBRARY_NONFREE_LIST="
1853    cuda_nvcc
1854    cuda_sdk
1855    libnpp
1856"
1857
1858HWACCEL_LIBRARY_LIST="
1859    $HWACCEL_LIBRARY_NONFREE_LIST
1860    libmfx
1861    mmal
1862    omx
1863    opencl
1864    vulkan
1865"
1866
1867DOCUMENT_LIST="
1868    doc
1869    htmlpages
1870    manpages
1871    podpages
1872    txtpages
1873"
1874
1875FEATURE_LIST="
1876    ftrapv
1877    gray
1878    hardcoded_tables
1879    omx_rpi
1880    runtime_cpudetect
1881    safe_bitstream_reader
1882    shared
1883    small
1884    static
1885    swscale_alpha
1886"
1887
1888# this list should be kept in linking order
1889LIBRARY_LIST="
1890    avdevice
1891    avfilter
1892    swscale
1893    postproc
1894    avformat
1895    avcodec
1896    swresample
1897    avresample
1898    avutil
1899"
1900
1901LICENSE_LIST="
1902    gpl
1903    nonfree
1904    version3
1905"
1906
1907PROGRAM_LIST="
1908    ffplay
1909    ffprobe
1910    ffmpeg
1911"
1912
1913SUBSYSTEM_LIST="
1914    dct
1915    dwt
1916    error_resilience
1917    faan
1918    fast_unaligned
1919    fft
1920    lsp
1921    lzo
1922    mdct
1923    pixelutils
1924    network
1925    rdft
1926"
1927
1928# COMPONENT_LIST needs to come last to ensure correct dependency checking
1929CONFIG_LIST="
1930    $DOCUMENT_LIST
1931    $EXAMPLE_LIST
1932    $EXTERNAL_LIBRARY_LIST
1933    $EXTERNAL_AUTODETECT_LIBRARY_LIST
1934    $HWACCEL_LIBRARY_LIST
1935    $HWACCEL_AUTODETECT_LIBRARY_LIST
1936    $FEATURE_LIST
1937    $LICENSE_LIST
1938    $LIBRARY_LIST
1939    $PROGRAM_LIST
1940    $SUBSYSTEM_LIST
1941    autodetect
1942    fontconfig
1943    large_tests
1944    linux_perf
1945    memory_poisoning
1946    neon_clobber_test
1947    ossfuzz
1948    pic
1949    thumb
1950    valgrind_backtrace
1951    xmm_clobber_test
1952    $COMPONENT_LIST
1953"
1954
1955THREADS_LIST="
1956    pthreads
1957    os2threads
1958    w32threads
1959"
1960
1961ATOMICS_LIST="
1962    atomics_gcc
1963    atomics_suncc
1964    atomics_win32
1965"
1966
1967AUTODETECT_LIBS="
1968    $EXTERNAL_AUTODETECT_LIBRARY_LIST
1969    $HWACCEL_AUTODETECT_LIBRARY_LIST
1970    $THREADS_LIST
1971"
1972
1973ARCH_LIST="
1974    aarch64
1975    alpha
1976    arm
1977    avr32
1978    avr32_ap
1979    avr32_uc
1980    bfin
1981    ia64
1982    m68k
1983    mips
1984    mips64
1985    parisc
1986    ppc
1987    ppc64
1988    s390
1989    sh4
1990    sparc
1991    sparc64
1992    tilegx
1993    tilepro
1994    tomi
1995    x86
1996    x86_32
1997    x86_64
1998"
1999
2000ARCH_EXT_LIST_ARM="
2001    armv5te
2002    armv6
2003    armv6t2
2004    armv8
2005    neon
2006    vfp
2007    vfpv3
2008    setend
2009"
2010
2011ARCH_EXT_LIST_MIPS="
2012    mipsfpu
2013    mips32r2
2014    mips32r5
2015    mips64r2
2016    mips32r6
2017    mips64r6
2018    mipsdsp
2019    mipsdspr2
2020    msa
2021    msa2
2022"
2023
2024ARCH_EXT_LIST_LOONGSON="
2025    loongson2
2026    loongson3
2027    mmi
2028"
2029
2030ARCH_EXT_LIST_X86_SIMD="
2031    aesni
2032    amd3dnow
2033    amd3dnowext
2034    avx
2035    avx2
2036    avx512
2037    fma3
2038    fma4
2039    mmx
2040    mmxext
2041    sse
2042    sse2
2043    sse3
2044    sse4
2045    sse42
2046    ssse3
2047    xop
2048"
2049
2050ARCH_EXT_LIST_PPC="
2051    altivec
2052    dcbzl
2053    ldbrx
2054    power8
2055    ppc4xx
2056    vsx
2057"
2058
2059ARCH_EXT_LIST_X86="
2060    $ARCH_EXT_LIST_X86_SIMD
2061    cpunop
2062    i686
2063"
2064
2065ARCH_EXT_LIST="
2066    $ARCH_EXT_LIST_ARM
2067    $ARCH_EXT_LIST_PPC
2068    $ARCH_EXT_LIST_X86
2069    $ARCH_EXT_LIST_MIPS
2070    $ARCH_EXT_LIST_LOONGSON
2071"
2072
2073ARCH_FEATURES="
2074    aligned_stack
2075    fast_64bit
2076    fast_clz
2077    fast_cmov
2078    local_aligned
2079    simd_align_16
2080    simd_align_32
2081    simd_align_64
2082"
2083
2084BUILTIN_LIST="
2085    atomic_cas_ptr
2086    machine_rw_barrier
2087    MemoryBarrier
2088    mm_empty
2089    rdtsc
2090    sem_timedwait
2091    sync_val_compare_and_swap
2092"
2093HAVE_LIST_CMDLINE="
2094    inline_asm
2095    symver
2096    x86asm
2097"
2098
2099HAVE_LIST_PUB="
2100    bigendian
2101    fast_unaligned
2102"
2103
2104HEADERS_LIST="
2105    arpa_inet_h
2106    asm_types_h
2107    cdio_paranoia_h
2108    cdio_paranoia_paranoia_h
2109    cuda_h
2110    dispatch_dispatch_h
2111    dev_bktr_ioctl_bt848_h
2112    dev_bktr_ioctl_meteor_h
2113    dev_ic_bt8xx_h
2114    dev_video_bktr_ioctl_bt848_h
2115    dev_video_meteor_ioctl_meteor_h
2116    direct_h
2117    dirent_h
2118    dxgidebug_h
2119    dxva_h
2120    ES2_gl_h
2121    gsm_h
2122    io_h
2123    linux_perf_event_h
2124    machine_ioctl_bt848_h
2125    machine_ioctl_meteor_h
2126    malloc_h
2127    opencv2_core_core_c_h
2128    OpenGL_gl3_h
2129    poll_h
2130    sys_param_h
2131    sys_resource_h
2132    sys_select_h
2133    sys_soundcard_h
2134    sys_time_h
2135    sys_un_h
2136    sys_videoio_h
2137    termios_h
2138    udplite_h
2139    unistd_h
2140    valgrind_valgrind_h
2141    windows_h
2142    winsock2_h
2143"
2144
2145INTRINSICS_LIST="
2146    intrinsics_neon
2147"
2148
2149COMPLEX_FUNCS="
2150    cabs
2151    cexp
2152"
2153
2154MATH_FUNCS="
2155    atanf
2156    atan2f
2157    cbrt
2158    cbrtf
2159    copysign
2160    cosf
2161    erf
2162    exp2
2163    exp2f
2164    expf
2165    hypot
2166    isfinite
2167    isinf
2168    isnan
2169    ldexpf
2170    llrint
2171    llrintf
2172    log2
2173    log2f
2174    log10f
2175    lrint
2176    lrintf
2177    powf
2178    rint
2179    round
2180    roundf
2181    sinf
2182    trunc
2183    truncf
2184"
2185
2186SYSTEM_FEATURES="
2187    dos_paths
2188    libc_msvcrt
2189    MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS
2190    section_data_rel_ro
2191    threads
2192    uwp
2193    winrt
2194"
2195
2196SYSTEM_FUNCS="
2197    access
2198    aligned_malloc
2199    arc4random
2200    clock_gettime
2201    closesocket
2202    CommandLineToArgvW
2203    fcntl
2204    getaddrinfo
2205    gethrtime
2206    getopt
2207    GetModuleHandle
2208    GetProcessAffinityMask
2209    GetProcessMemoryInfo
2210    GetProcessTimes
2211    getrusage
2212    GetStdHandle
2213    GetSystemTimeAsFileTime
2214    gettimeofday
2215    glob
2216    glXGetProcAddress
2217    gmtime_r
2218    inet_aton
2219    isatty
2220    kbhit
2221    localtime_r
2222    lstat
2223    lzo1x_999_compress
2224    mach_absolute_time
2225    MapViewOfFile
2226    memalign
2227    mkstemp
2228    mmap
2229    mprotect
2230    nanosleep
2231    PeekNamedPipe
2232    posix_memalign
2233    pthread_cancel
2234    sched_getaffinity
2235    SecItemImport
2236    SetConsoleTextAttribute
2237    SetConsoleCtrlHandler
2238    SetDllDirectory
2239    setmode
2240    setrlimit
2241    Sleep
2242    strerror_r
2243    sysconf
2244    sysctl
2245    usleep
2246    UTGetOSTypeFromString
2247    VirtualAlloc
2248    wglGetProcAddress
2249"
2250
2251SYSTEM_LIBRARIES="
2252    bcrypt
2253    vaapi_drm
2254    vaapi_x11
2255    vdpau_x11
2256"
2257
2258TOOLCHAIN_FEATURES="
2259    as_arch_directive
2260    as_dn_directive
2261    as_fpu_directive
2262    as_func
2263    as_object_arch
2264    asm_mod_q
2265    blocks_extension
2266    ebp_available
2267    ebx_available
2268    gnu_as
2269    gnu_windres
2270    ibm_asm
2271    inline_asm_direct_symbol_refs
2272    inline_asm_labels
2273    inline_asm_nonlocal_labels
2274    pragma_deprecated
2275    rsync_contimeout
2276    symver_asm_label
2277    symver_gnu_asm
2278    vfp_args
2279    xform_asm
2280    xmm_clobbers
2281"
2282
2283TYPES_LIST="
2284    kCMVideoCodecType_HEVC
2285    kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
2286    kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ
2287    kCVImageBufferTransferFunction_ITU_R_2100_HLG
2288    kCVImageBufferTransferFunction_Linear
2289    socklen_t
2290    struct_addrinfo
2291    struct_group_source_req
2292    struct_ip_mreq_source
2293    struct_ipv6_mreq
2294    struct_msghdr_msg_flags
2295    struct_pollfd
2296    struct_rusage_ru_maxrss
2297    struct_sctp_event_subscribe
2298    struct_sockaddr_in6
2299    struct_sockaddr_sa_len
2300    struct_sockaddr_storage
2301    struct_stat_st_mtim_tv_nsec
2302    struct_v4l2_frmivalenum_discrete
2303"
2304
2305HAVE_LIST="
2306    $ARCH_EXT_LIST
2307    $(add_suffix _external $ARCH_EXT_LIST)
2308    $(add_suffix _inline   $ARCH_EXT_LIST)
2309    $ARCH_FEATURES
2310    $BUILTIN_LIST
2311    $COMPLEX_FUNCS
2312    $HAVE_LIST_CMDLINE
2313    $HAVE_LIST_PUB
2314    $HEADERS_LIST
2315    $INTRINSICS_LIST
2316    $MATH_FUNCS
2317    $SYSTEM_FEATURES
2318    $SYSTEM_FUNCS
2319    $SYSTEM_LIBRARIES
2320    $THREADS_LIST
2321    $TOOLCHAIN_FEATURES
2322    $TYPES_LIST
2323    makeinfo
2324    makeinfo_html
2325    opencl_d3d11
2326    opencl_drm_arm
2327    opencl_drm_beignet
2328    opencl_dxva2
2329    opencl_vaapi_beignet
2330    opencl_vaapi_intel_media
2331    perl
2332    pod2man
2333    texi2html
2334"
2335
2336# options emitted with CONFIG_ prefix but not available on the command line
2337CONFIG_EXTRA="
2338    aandcttables
2339    ac3dsp
2340    adts_header
2341    audio_frame_queue
2342    audiodsp
2343    blockdsp
2344    bswapdsp
2345    cabac
2346    cbs
2347    cbs_av1
2348    cbs_h264
2349    cbs_h265
2350    cbs_jpeg
2351    cbs_mpeg2
2352    cbs_vp9
2353    dirac_parse
2354    dnn
2355    dvprofile
2356    exif
2357    faandct
2358    faanidct
2359    fdctdsp
2360    flacdsp
2361    fmtconvert
2362    frame_thread_encoder
2363    g722dsp
2364    golomb
2365    gplv3
2366    h263dsp
2367    h264chroma
2368    h264dsp
2369    h264parse
2370    h264pred
2371    h264qpel
2372    hevcparse
2373    hpeldsp
2374    huffman
2375    huffyuvdsp
2376    huffyuvencdsp
2377    idctdsp
2378    iirfilter
2379    mdct15
2380    intrax8
2381    iso_media
2382    ividsp
2383    jpegtables
2384    lgplv3
2385    libx262
2386    llauddsp
2387    llviddsp
2388    llvidencdsp
2389    lpc
2390    lzf
2391    me_cmp
2392    mpeg_er
2393    mpegaudio
2394    mpegaudiodsp
2395    mpegaudioheader
2396    mpegvideo
2397    mpegvideoenc
2398    mss34dsp
2399    pixblockdsp
2400    qpeldsp
2401    qsv
2402    qsvdec
2403    qsvenc
2404    qsvvpp
2405    rangecoder
2406    riffdec
2407    riffenc
2408    rtpdec
2409    rtpenc_chain
2410    rv34dsp
2411    scene_sad
2412    sinewin
2413    snappy
2414    srtp
2415    startcode
2416    texturedsp
2417    texturedspenc
2418    tpeldsp
2419    vaapi_1
2420    vaapi_encode
2421    vc1dsp
2422    videodsp
2423    vp3dsp
2424    vp56dsp
2425    vp8dsp
2426    wma_freqs
2427    wmv2dsp
2428"
2429
2430CMDLINE_SELECT="
2431    $ARCH_EXT_LIST
2432    $CONFIG_LIST
2433    $HAVE_LIST_CMDLINE
2434    $THREADS_LIST
2435    asm
2436    cross_compile
2437    debug
2438    extra_warnings
2439    logging
2440    lto
2441    optimizations
2442    rpath
2443    stripping
2444"
2445
2446PATHS_LIST="
2447    bindir
2448    datadir
2449    docdir
2450    incdir
2451    libdir
2452    mandir
2453    pkgconfigdir
2454    prefix
2455    shlibdir
2456    install_name_dir
2457"
2458
2459CMDLINE_SET="
2460    $PATHS_LIST
2461    ar
2462    arch
2463    as
2464    assert_level
2465    build_suffix
2466    cc
2467    objcc
2468    cpu
2469    cross_prefix
2470    custom_allocator
2471    cxx
2472    dep_cc
2473    doxygen
2474    env
2475    extra_version
2476    gas
2477    host_cc
2478    host_cflags
2479    host_extralibs
2480    host_ld
2481    host_ldflags
2482    host_os
2483    ignore_tests
2484    install
2485    ld
2486    ln_s
2487    logfile
2488    malloc_prefix
2489    nm
2490    optflags
2491    nvcc
2492    nvccflags
2493    pkg_config
2494    pkg_config_flags
2495    progs_suffix
2496    random_seed
2497    ranlib
2498    samples
2499    strip
2500    sws_max_filter_size
2501    sysinclude
2502    sysroot
2503    target_exec
2504    target_os
2505    target_path
2506    target_samples
2507    tempprefix
2508    toolchain
2509    valgrind
2510    windres
2511    x86asmexe
2512"
2513
2514CMDLINE_APPEND="
2515    extra_cflags
2516    extra_cxxflags
2517    extra_objcflags
2518    host_cppflags
2519"
2520
2521# code dependency declarations
2522
2523# architecture extensions
2524
2525armv5te_deps="arm"
2526armv6_deps="arm"
2527armv6t2_deps="arm"
2528armv8_deps="aarch64"
2529neon_deps_any="aarch64 arm"
2530intrinsics_neon_deps="neon"
2531vfp_deps_any="aarch64 arm"
2532vfpv3_deps="vfp"
2533setend_deps="arm"
2534
2535map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
2536
2537altivec_deps="ppc"
2538dcbzl_deps="ppc"
2539ldbrx_deps="ppc"
2540ppc4xx_deps="ppc"
2541vsx_deps="altivec"
2542power8_deps="vsx"
2543
2544loongson2_deps="mips"
2545loongson3_deps="mips"
2546mips32r2_deps="mips"
2547mips32r5_deps="mips"
2548mips32r6_deps="mips"
2549mips64r2_deps="mips"
2550mips64r6_deps="mips"
2551mipsfpu_deps="mips"
2552mipsdsp_deps="mips"
2553mipsdspr2_deps="mips"
2554mmi_deps="mips"
2555msa_deps="mipsfpu"
2556msa2_deps="msa"
2557
2558cpunop_deps="i686"
2559x86_64_select="i686"
2560x86_64_suggest="fast_cmov"
2561
2562amd3dnow_deps="mmx"
2563amd3dnowext_deps="amd3dnow"
2564i686_deps="x86"
2565mmx_deps="x86"
2566mmxext_deps="mmx"
2567sse_deps="mmxext"
2568sse2_deps="sse"
2569sse3_deps="sse2"
2570ssse3_deps="sse3"
2571sse4_deps="ssse3"
2572sse42_deps="sse4"
2573aesni_deps="sse42"
2574avx_deps="sse42"
2575xop_deps="avx"
2576fma3_deps="avx"
2577fma4_deps="avx"
2578avx2_deps="avx"
2579avx512_deps="avx2"
2580
2581mmx_external_deps="x86asm"
2582mmx_inline_deps="inline_asm x86"
2583mmx_suggest="mmx_external mmx_inline"
2584
2585for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
2586    eval dep=\$${ext}_deps
2587    eval ${ext}_external_deps='"${dep}_external"'
2588    eval ${ext}_inline_deps='"${dep}_inline"'
2589    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
2590done
2591
2592aligned_stack_if_any="aarch64 ppc x86"
2593fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
2594fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
2595fast_unaligned_if_any="aarch64 ppc x86"
2596simd_align_16_if_any="altivec neon sse"
2597simd_align_32_if_any="avx"
2598simd_align_64_if_any="avx512"
2599
2600# system capabilities
2601linux_perf_deps="linux_perf_event_h"
2602symver_if_any="symver_asm_label symver_gnu_asm"
2603valgrind_backtrace_conflict="optimizations"
2604valgrind_backtrace_deps="valgrind_valgrind_h"
2605
2606# threading support
2607atomics_gcc_if="sync_val_compare_and_swap"
2608atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
2609atomics_win32_if="MemoryBarrier"
2610atomics_native_if_any="$ATOMICS_LIST"
2611w32threads_deps="atomics_native"
2612threads_if_any="$THREADS_LIST"
2613
2614# subsystems
2615cbs_av1_select="cbs"
2616cbs_h264_select="cbs"
2617cbs_h265_select="cbs"
2618cbs_jpeg_select="cbs"
2619cbs_mpeg2_select="cbs"
2620cbs_vp9_select="cbs"
2621dct_select="rdft"
2622dirac_parse_select="golomb"
2623dnn_suggest="libtensorflow"
2624error_resilience_select="me_cmp"
2625faandct_deps="faan"
2626faandct_select="fdctdsp"
2627faanidct_deps="faan"
2628faanidct_select="idctdsp"
2629h264dsp_select="startcode"
2630hevcparse_select="golomb"
2631frame_thread_encoder_deps="encoders threads"
2632intrax8_select="blockdsp idctdsp"
2633mdct_select="fft"
2634mdct15_select="fft"
2635me_cmp_select="fdctdsp idctdsp pixblockdsp"
2636mpeg_er_select="error_resilience"
2637mpegaudio_select="mpegaudiodsp mpegaudioheader"
2638mpegaudiodsp_select="dct"
2639mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp mpeg_er videodsp"
2640mpegvideoenc_select="aandcttables me_cmp mpegvideo pixblockdsp qpeldsp"
2641vc1dsp_select="h264chroma qpeldsp startcode"
2642rdft_select="fft"
2643
2644# decoders / encoders
2645aac_decoder_select="adts_header mdct15 mdct sinewin"
2646aac_fixed_decoder_select="adts_header mdct sinewin"
2647aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin"
2648aac_latm_decoder_select="aac_decoder aac_latm_parser"
2649ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
2650ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
2651ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
2652ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
2653acelp_kelvin_decoder_select="audiodsp"
2654adpcm_g722_decoder_select="g722dsp"
2655adpcm_g722_encoder_select="g722dsp"
2656aic_decoder_select="golomb idctdsp"
2657alac_encoder_select="lpc"
2658als_decoder_select="bswapdsp"
2659amrnb_decoder_select="lsp"
2660amrwb_decoder_select="lsp"
2661amv_decoder_select="sp5x_decoder exif"
2662amv_encoder_select="jpegtables mpegvideoenc"
2663ape_decoder_select="bswapdsp llauddsp"
2664apng_decoder_deps="zlib"
2665apng_encoder_deps="zlib"
2666apng_encoder_select="llvidencdsp"
2667aptx_decoder_select="audio_frame_queue"
2668aptx_encoder_select="audio_frame_queue"
2669aptx_hd_decoder_select="audio_frame_queue"
2670aptx_hd_encoder_select="audio_frame_queue"
2671asv1_decoder_select="blockdsp bswapdsp idctdsp"
2672asv1_encoder_select="aandcttables bswapdsp fdctdsp pixblockdsp"
2673asv2_decoder_select="blockdsp bswapdsp idctdsp"
2674asv2_encoder_select="aandcttables bswapdsp fdctdsp pixblockdsp"
2675atrac1_decoder_select="mdct sinewin"
2676atrac3_decoder_select="mdct"
2677atrac3al_decoder_select="mdct"
2678atrac3p_decoder_select="mdct sinewin"
2679atrac3pal_decoder_select="mdct sinewin"
2680atrac9_decoder_select="mdct"
2681avrn_decoder_select="exif jpegtables"
2682bink_decoder_select="blockdsp hpeldsp"
2683binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
2684binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
2685cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
2686clearvideo_decoder_select="idctdsp"
2687cllc_decoder_select="bswapdsp"
2688comfortnoise_encoder_select="lpc"
2689cook_decoder_select="audiodsp mdct sinewin"
2690cscd_decoder_select="lzo"
2691cscd_decoder_suggest="zlib"
2692dca_decoder_select="mdct"
2693dca_encoder_select="mdct"
2694dds_decoder_select="texturedsp"
2695dirac_decoder_select="dirac_parse dwt golomb videodsp mpegvideoenc"
2696dnxhd_decoder_select="blockdsp idctdsp"
2697dnxhd_encoder_select="blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
2698dolby_e_decoder_select="mdct"
2699dvvideo_decoder_select="dvprofile idctdsp"
2700dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
2701dxa_decoder_deps="zlib"
2702dxv_decoder_select="lzf texturedsp"
2703eac3_decoder_select="ac3_decoder"
2704eac3_encoder_select="ac3_encoder"
2705eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
2706eatgq_decoder_select="aandcttables"
2707eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp"
2708exr_decoder_deps="zlib"
2709ffv1_decoder_select="rangecoder"
2710ffv1_encoder_select="rangecoder"
2711ffvhuff_decoder_select="huffyuv_decoder"
2712ffvhuff_encoder_select="huffyuv_encoder"
2713fic_decoder_select="golomb"
2714flac_decoder_select="flacdsp"
2715flac_encoder_select="bswapdsp flacdsp lpc"
2716flashsv2_decoder_deps="zlib"
2717flashsv2_encoder_deps="zlib"
2718flashsv_decoder_deps="zlib"
2719flashsv_encoder_deps="zlib"
2720flv_decoder_select="h263_decoder"
2721flv_encoder_select="h263_encoder"
2722fourxm_decoder_select="blockdsp bswapdsp"
2723fraps_decoder_select="bswapdsp huffman"
2724g2m_decoder_deps="zlib"
2725g2m_decoder_select="blockdsp idctdsp jpegtables"
2726g729_decoder_select="audiodsp"
2727h261_decoder_select="mpegvideo"
2728h261_encoder_select="mpegvideoenc"
2729h263_decoder_select="h263_parser h263dsp mpegvideo qpeldsp"
2730h263_encoder_select="h263dsp mpegvideoenc"
2731h263i_decoder_select="h263_decoder"
2732h263p_decoder_select="h263_decoder"
2733h263p_encoder_select="h263_encoder"
2734h264_decoder_select="cabac golomb h264chroma h264dsp h264parse h264pred h264qpel videodsp"
2735h264_decoder_suggest="error_resilience"
2736hap_decoder_select="snappy texturedsp"
2737hap_encoder_deps="libsnappy"
2738hap_encoder_select="texturedspenc"
2739hevc_decoder_select="bswapdsp cabac golomb hevcparse videodsp"
2740huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
2741huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"
2742hymt_decoder_select="huffyuv_decoder"
2743iac_decoder_select="imc_decoder"
2744imc_decoder_select="bswapdsp fft mdct sinewin"
2745imm4_decoder_select="bswapdsp"
2746imm5_decoder_select="h264_decoder hevc_decoder"
2747indeo3_decoder_select="hpeldsp"
2748indeo4_decoder_select="ividsp"
2749indeo5_decoder_select="ividsp"
2750interplay_video_decoder_select="hpeldsp"
2751jpegls_decoder_select="mjpeg_decoder"
2752jv_decoder_select="blockdsp"
2753lagarith_decoder_select="llviddsp"
2754ljpeg_encoder_select="idctdsp jpegtables mpegvideoenc"
2755lscr_decoder_deps="zlib"
2756magicyuv_decoder_select="llviddsp"
2757magicyuv_encoder_select="llvidencdsp"
2758mdec_decoder_select="blockdsp bswapdsp idctdsp mpegvideo"
2759metasound_decoder_select="lsp mdct sinewin"
2760mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
2761mjpeg_decoder_select="blockdsp hpeldsp exif idctdsp jpegtables"
2762mjpeg_encoder_select="jpegtables mpegvideoenc"
2763mjpegb_decoder_select="mjpeg_decoder"
2764mlp_decoder_select="mlp_parser"
2765mlp_encoder_select="lpc audio_frame_queue"
2766motionpixels_decoder_select="bswapdsp"
2767mp1_decoder_select="mpegaudio"
2768mp1float_decoder_select="mpegaudio"
2769mp2_decoder_select="mpegaudio"
2770mp2float_decoder_select="mpegaudio"
2771mp3_decoder_select="mpegaudio"
2772mp3adu_decoder_select="mpegaudio"
2773mp3adufloat_decoder_select="mpegaudio"
2774mp3float_decoder_select="mpegaudio"
2775mp3on4_decoder_select="mpegaudio"
2776mp3on4float_decoder_select="mpegaudio"
2777mpc7_decoder_select="bswapdsp mpegaudiodsp"
2778mpc8_decoder_select="mpegaudiodsp"
2779mpegvideo_decoder_select="mpegvideo"
2780mpeg1video_decoder_select="mpegvideo"
2781mpeg1video_encoder_select="mpegvideoenc h263dsp"
2782mpeg2video_decoder_select="mpegvideo"
2783mpeg2video_encoder_select="mpegvideoenc h263dsp"
2784mpeg4_decoder_select="h263_decoder mpeg4video_parser"
2785mpeg4_encoder_select="h263_encoder"
2786msa1_decoder_select="mss34dsp"
2787mscc_decoder_deps="zlib"
2788msmpeg4v1_decoder_select="h263_decoder"
2789msmpeg4v2_decoder_select="h263_decoder"
2790msmpeg4v2_encoder_select="h263_encoder"
2791msmpeg4v3_decoder_select="h263_decoder"
2792msmpeg4v3_encoder_select="h263_encoder"
2793mss2_decoder_select="mpegvideo qpeldsp vc1_decoder"
2794mts2_decoder_select="mss34dsp"
2795mv30_decoder_select="aandcttables blockdsp"
2796mvha_decoder_deps="zlib"
2797mvha_decoder_select="llviddsp"
2798mwsc_decoder_deps="zlib"
2799mxpeg_decoder_select="mjpeg_decoder"
2800nellymoser_decoder_select="mdct sinewin"
2801nellymoser_encoder_select="audio_frame_queue mdct sinewin"
2802notchlc_decoder_select="lzf"
2803nuv_decoder_select="idctdsp lzo"
2804on2avc_decoder_select="mdct"
2805opus_decoder_deps="swresample"
2806opus_decoder_select="mdct15"
2807opus_encoder_select="audio_frame_queue mdct15"
2808png_decoder_deps="zlib"
2809png_encoder_deps="zlib"
2810png_encoder_select="llvidencdsp"
2811prores_decoder_select="blockdsp idctdsp"
2812prores_encoder_select="fdctdsp"
2813qcelp_decoder_select="lsp"
2814qdm2_decoder_select="mdct rdft mpegaudiodsp"
2815ra_144_decoder_select="audiodsp"
2816ra_144_encoder_select="audio_frame_queue lpc audiodsp"
2817ralf_decoder_select="golomb"
2818rasc_decoder_deps="zlib"
2819rawvideo_decoder_select="bswapdsp"
2820rscc_decoder_deps="zlib"
2821rtjpeg_decoder_select="me_cmp"
2822rv10_decoder_select="h263_decoder"
2823rv10_encoder_select="h263_encoder"
2824rv20_decoder_select="h263_decoder"
2825rv20_encoder_select="h263_encoder"
2826rv30_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
2827rv40_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
2828screenpresso_decoder_deps="zlib"
2829shorten_decoder_select="bswapdsp"
2830sipr_decoder_select="lsp"
2831snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp"
2832snow_encoder_select="dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder"
2833sonic_decoder_select="golomb rangecoder"
2834sonic_encoder_select="golomb rangecoder"
2835sonic_ls_encoder_select="golomb rangecoder"
2836sp5x_decoder_select="mjpeg_decoder"
2837speedhq_decoder_select="mpegvideo"
2838srgc_decoder_deps="zlib"
2839svq1_decoder_select="hpeldsp"
2840svq1_encoder_select="hpeldsp me_cmp mpegvideoenc"
2841svq3_decoder_select="golomb h264dsp h264parse h264pred hpeldsp tpeldsp videodsp"
2842svq3_decoder_suggest="zlib"
2843tak_decoder_select="audiodsp"
2844tdsc_decoder_deps="zlib"
2845tdsc_decoder_select="mjpeg_decoder"
2846theora_decoder_select="vp3_decoder"
2847thp_decoder_select="mjpeg_decoder"
2848tiff_decoder_select="mjpeg_decoder"
2849tiff_decoder_suggest="zlib lzma"
2850tiff_encoder_suggest="zlib"
2851truehd_decoder_select="mlp_parser"
2852truehd_encoder_select="lpc audio_frame_queue"
2853truemotion2_decoder_select="bswapdsp"
2854truespeech_decoder_select="bswapdsp"
2855tscc_decoder_deps="zlib"
2856twinvq_decoder_select="mdct lsp sinewin"
2857txd_decoder_select="texturedsp"
2858utvideo_decoder_select="bswapdsp llviddsp"
2859utvideo_encoder_select="bswapdsp huffman llvidencdsp"
2860vble_decoder_select="llviddsp"
2861vc1_decoder_select="blockdsp h263_decoder h264qpel intrax8 mpegvideo vc1dsp"
2862vc1image_decoder_select="vc1_decoder"
2863vorbis_decoder_select="mdct"
2864vorbis_encoder_select="audio_frame_queue mdct"
2865vp3_decoder_select="hpeldsp vp3dsp videodsp"
2866vp4_decoder_select="vp3_decoder"
2867vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp vp56dsp"
2868vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp vp56dsp"
2869vp6a_decoder_select="vp6_decoder"
2870vp6f_decoder_select="vp6_decoder"
2871vp7_decoder_select="h264pred videodsp vp8dsp"
2872vp8_decoder_select="h264pred videodsp vp8dsp"
2873vp9_decoder_select="videodsp vp9_parser vp9_superframe_split_bsf"
2874wcmv_decoder_deps="zlib"
2875webp_decoder_select="vp8_decoder exif"
2876wmalossless_decoder_select="llauddsp"
2877wmapro_decoder_select="mdct sinewin wma_freqs"
2878wmav1_decoder_select="mdct sinewin wma_freqs"
2879wmav1_encoder_select="mdct sinewin wma_freqs"
2880wmav2_decoder_select="mdct sinewin wma_freqs"
2881wmav2_encoder_select="mdct sinewin wma_freqs"
2882wmavoice_decoder_select="lsp rdft dct mdct sinewin"
2883wmv1_decoder_select="h263_decoder"
2884wmv1_encoder_select="h263_encoder"
2885wmv2_decoder_select="blockdsp error_resilience h263_decoder idctdsp intrax8 videodsp wmv2dsp"
2886wmv2_encoder_select="h263_encoder wmv2dsp"
2887wmv3_decoder_select="vc1_decoder"
2888wmv3image_decoder_select="wmv3_decoder"
2889xma1_decoder_select="wmapro_decoder"
2890xma2_decoder_select="wmapro_decoder"
2891ylc_decoder_select="bswapdsp"
2892zerocodec_decoder_deps="zlib"
2893zlib_decoder_deps="zlib"
2894zlib_encoder_deps="zlib"
2895zmbv_decoder_deps="zlib"
2896zmbv_encoder_deps="zlib"
2897
2898# hardware accelerators
2899crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
2900cuda_deps="ffnvcodec"
2901cuvid_deps="ffnvcodec"
2902d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext"
2903dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32"
2904ffnvcodec_deps_any="libdl LoadLibrary"
2905nvdec_deps="ffnvcodec"
2906vaapi_x11_deps="xlib"
2907videotoolbox_hwaccel_deps="videotoolbox pthreads"
2908videotoolbox_hwaccel_extralibs="-framework QuartzCore"
2909xvmc_deps="X11_extensions_XvMClib_h"
2910
2911h263_vaapi_hwaccel_deps="vaapi"
2912h263_vaapi_hwaccel_select="h263_decoder"
2913h263_videotoolbox_hwaccel_deps="videotoolbox"
2914h263_videotoolbox_hwaccel_select="h263_decoder"
2915h264_d3d11va_hwaccel_deps="d3d11va"
2916h264_d3d11va_hwaccel_select="h264_decoder"
2917h264_d3d11va2_hwaccel_deps="d3d11va"
2918h264_d3d11va2_hwaccel_select="h264_decoder"
2919h264_dxva2_hwaccel_deps="dxva2"
2920h264_dxva2_hwaccel_select="h264_decoder"
2921h264_nvdec_hwaccel_deps="nvdec"
2922h264_nvdec_hwaccel_select="h264_decoder"
2923h264_vaapi_hwaccel_deps="vaapi"
2924h264_vaapi_hwaccel_select="h264_decoder"
2925h264_vdpau_hwaccel_deps="vdpau"
2926h264_vdpau_hwaccel_select="h264_decoder"
2927h264_videotoolbox_hwaccel_deps="videotoolbox"
2928h264_videotoolbox_hwaccel_select="h264_decoder"
2929hevc_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_HEVC"
2930hevc_d3d11va_hwaccel_select="hevc_decoder"
2931hevc_d3d11va2_hwaccel_deps="d3d11va DXVA_PicParams_HEVC"
2932hevc_d3d11va2_hwaccel_select="hevc_decoder"
2933hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
2934hevc_dxva2_hwaccel_select="hevc_decoder"
2935hevc_nvdec_hwaccel_deps="nvdec"
2936hevc_nvdec_hwaccel_select="hevc_decoder"
2937hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
2938hevc_vaapi_hwaccel_select="hevc_decoder"
2939hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC"
2940hevc_vdpau_hwaccel_select="hevc_decoder"
2941hevc_videotoolbox_hwaccel_deps="videotoolbox"
2942hevc_videotoolbox_hwaccel_select="hevc_decoder"
2943mjpeg_nvdec_hwaccel_deps="nvdec"
2944mjpeg_nvdec_hwaccel_select="mjpeg_decoder"
2945mjpeg_vaapi_hwaccel_deps="vaapi"
2946mjpeg_vaapi_hwaccel_select="mjpeg_decoder"
2947mpeg_xvmc_hwaccel_deps="xvmc"
2948mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
2949mpeg1_nvdec_hwaccel_deps="nvdec"
2950mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
2951mpeg1_vdpau_hwaccel_deps="vdpau"
2952mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
2953mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
2954mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder"
2955mpeg1_xvmc_hwaccel_deps="xvmc"
2956mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
2957mpeg2_d3d11va_hwaccel_deps="d3d11va"
2958mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
2959mpeg2_d3d11va2_hwaccel_deps="d3d11va"
2960mpeg2_d3d11va2_hwaccel_select="mpeg2video_decoder"
2961mpeg2_dxva2_hwaccel_deps="dxva2"
2962mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
2963mpeg2_nvdec_hwaccel_deps="nvdec"
2964mpeg2_nvdec_hwaccel_select="mpeg2video_decoder"
2965mpeg2_vaapi_hwaccel_deps="vaapi"
2966mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
2967mpeg2_vdpau_hwaccel_deps="vdpau"
2968mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
2969mpeg2_videotoolbox_hwaccel_deps="videotoolbox"
2970mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
2971mpeg2_xvmc_hwaccel_deps="xvmc"
2972mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
2973mpeg4_nvdec_hwaccel_deps="nvdec"
2974mpeg4_nvdec_hwaccel_select="mpeg4_decoder"
2975mpeg4_vaapi_hwaccel_deps="vaapi"
2976mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
2977mpeg4_vdpau_hwaccel_deps="vdpau"
2978mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
2979mpeg4_videotoolbox_hwaccel_deps="videotoolbox"
2980mpeg4_videotoolbox_hwaccel_select="mpeg4_decoder"
2981vc1_d3d11va_hwaccel_deps="d3d11va"
2982vc1_d3d11va_hwaccel_select="vc1_decoder"
2983vc1_d3d11va2_hwaccel_deps="d3d11va"
2984vc1_d3d11va2_hwaccel_select="vc1_decoder"
2985vc1_dxva2_hwaccel_deps="dxva2"
2986vc1_dxva2_hwaccel_select="vc1_decoder"
2987vc1_nvdec_hwaccel_deps="nvdec"
2988vc1_nvdec_hwaccel_select="vc1_decoder"
2989vc1_vaapi_hwaccel_deps="vaapi"
2990vc1_vaapi_hwaccel_select="vc1_decoder"
2991vc1_vdpau_hwaccel_deps="vdpau"
2992vc1_vdpau_hwaccel_select="vc1_decoder"
2993vp8_nvdec_hwaccel_deps="nvdec"
2994vp8_nvdec_hwaccel_select="vp8_decoder"
2995vp8_vaapi_hwaccel_deps="vaapi"
2996vp8_vaapi_hwaccel_select="vp8_decoder"
2997vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9"
2998vp9_d3d11va_hwaccel_select="vp9_decoder"
2999vp9_d3d11va2_hwaccel_deps="d3d11va DXVA_PicParams_VP9"
3000vp9_d3d11va2_hwaccel_select="vp9_decoder"
3001vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9"
3002vp9_dxva2_hwaccel_select="vp9_decoder"
3003vp9_nvdec_hwaccel_deps="nvdec"
3004vp9_nvdec_hwaccel_select="vp9_decoder"
3005vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9_bit_depth"
3006vp9_vaapi_hwaccel_select="vp9_decoder"
3007vp9_vdpau_hwaccel_deps="vdpau VdpPictureInfoVP9"
3008vp9_vdpau_hwaccel_select="vp9_decoder"
3009wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel"
3010wmv3_d3d11va2_hwaccel_select="vc1_d3d11va2_hwaccel"
3011wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
3012wmv3_nvdec_hwaccel_select="vc1_nvdec_hwaccel"
3013wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
3014wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
3015
3016# hardware-accelerated codecs
3017mediafoundation_deps="mftransform_h MFCreateAlignedMemoryBuffer"
3018mediafoundation_extralibs="-lmfplat -lmfuuid -lole32 -lstrmiids"
3019omx_deps="libdl pthreads"
3020omx_rpi_select="omx"
3021qsv_deps="libmfx"
3022qsvdec_select="qsv"
3023qsvenc_select="qsv"
3024qsvvpp_select="qsv"
3025vaapi_encode_deps="vaapi"
3026v4l2_m2m_deps="linux_videodev2_h sem_timedwait"
3027
3028hwupload_cuda_filter_deps="ffnvcodec"
3029scale_npp_filter_deps="ffnvcodec libnpp"
3030scale_cuda_filter_deps="ffnvcodec"
3031scale_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
3032thumbnail_cuda_filter_deps="ffnvcodec"
3033thumbnail_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
3034transpose_npp_filter_deps="ffnvcodec libnpp"
3035overlay_cuda_filter_deps="ffnvcodec"
3036overlay_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
3037
3038amf_deps_any="libdl LoadLibrary"
3039nvenc_deps="ffnvcodec"
3040nvenc_deps_any="libdl LoadLibrary"
3041nvenc_encoder_deps="nvenc"
3042
3043aac_mf_encoder_deps="mediafoundation"
3044ac3_mf_encoder_deps="mediafoundation"
3045h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
3046h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m"
3047h264_amf_encoder_deps="amf"
3048h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
3049h264_cuvid_decoder_deps="cuvid"
3050h264_cuvid_decoder_select="h264_mp4toannexb_bsf"
3051h264_mediacodec_decoder_deps="mediacodec"
3052h264_mediacodec_decoder_select="h264_mp4toannexb_bsf h264_parser"
3053h264_mf_encoder_deps="mediafoundation"
3054h264_mmal_decoder_deps="mmal"
3055h264_nvenc_encoder_deps="nvenc"
3056h264_omx_encoder_deps="omx"
3057h264_qsv_decoder_select="h264_mp4toannexb_bsf qsvdec"
3058h264_qsv_encoder_select="qsvenc"
3059h264_rkmpp_decoder_deps="rkmpp"
3060h264_rkmpp_decoder_select="h264_mp4toannexb_bsf"
3061h264_vaapi_encoder_select="cbs_h264 vaapi_encode"
3062h264_v4l2m2m_decoder_deps="v4l2_m2m h264_v4l2_m2m"
3063h264_v4l2m2m_decoder_select="h264_mp4toannexb_bsf"
3064h264_v4l2m2m_encoder_deps="v4l2_m2m h264_v4l2_m2m"
3065hevc_amf_encoder_deps="amf"
3066hevc_cuvid_decoder_deps="cuvid"
3067hevc_cuvid_decoder_select="hevc_mp4toannexb_bsf"
3068hevc_mediacodec_decoder_deps="mediacodec"
3069hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser"
3070hevc_mf_encoder_deps="mediafoundation"
3071hevc_nvenc_encoder_deps="nvenc"
3072hevc_qsv_decoder_select="hevc_mp4toannexb_bsf qsvdec"
3073hevc_qsv_encoder_select="hevcparse qsvenc"
3074hevc_rkmpp_decoder_deps="rkmpp"
3075hevc_rkmpp_decoder_select="hevc_mp4toannexb_bsf"
3076hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC"
3077hevc_vaapi_encoder_select="cbs_h265 vaapi_encode"
3078hevc_v4l2m2m_decoder_deps="v4l2_m2m hevc_v4l2_m2m"
3079hevc_v4l2m2m_decoder_select="hevc_mp4toannexb_bsf"
3080hevc_v4l2m2m_encoder_deps="v4l2_m2m hevc_v4l2_m2m"
3081mjpeg_cuvid_decoder_deps="cuvid"
3082mjpeg_qsv_decoder_select="qsvdec"
3083mjpeg_qsv_encoder_deps="libmfx"
3084mjpeg_qsv_encoder_select="qsvenc"
3085mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
3086mjpeg_vaapi_encoder_select="cbs_jpeg jpegtables vaapi_encode"
3087mp3_mf_encoder_deps="mediafoundation"
3088mpeg1_cuvid_decoder_deps="cuvid"
3089mpeg1_v4l2m2m_decoder_deps="v4l2_m2m mpeg1_v4l2_m2m"
3090mpeg2_crystalhd_decoder_select="crystalhd"
3091mpeg2_cuvid_decoder_deps="cuvid"
3092mpeg2_mmal_decoder_deps="mmal"
3093mpeg2_mediacodec_decoder_deps="mediacodec"
3094mpeg2_qsv_decoder_select="qsvdec"
3095mpeg2_qsv_encoder_select="qsvenc"
3096mpeg2_vaapi_encoder_select="cbs_mpeg2 vaapi_encode"
3097mpeg2_v4l2m2m_decoder_deps="v4l2_m2m mpeg2_v4l2_m2m"
3098mpeg4_crystalhd_decoder_select="crystalhd"
3099mpeg4_cuvid_decoder_deps="cuvid"
3100mpeg4_mediacodec_decoder_deps="mediacodec"
3101mpeg4_mmal_decoder_deps="mmal"
3102mpeg4_omx_encoder_deps="omx"
3103mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
3104mpeg4_v4l2m2m_encoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
3105msmpeg4_crystalhd_decoder_select="crystalhd"
3106nvenc_h264_encoder_select="h264_nvenc_encoder"
3107nvenc_hevc_encoder_select="hevc_nvenc_encoder"
3108vc1_crystalhd_decoder_select="crystalhd"
3109vc1_cuvid_decoder_deps="cuvid"
3110vc1_mmal_decoder_deps="mmal"
3111vc1_qsv_decoder_select="qsvdec"
3112vc1_v4l2m2m_decoder_deps="v4l2_m2m vc1_v4l2_m2m"
3113vp8_cuvid_decoder_deps="cuvid"
3114vp8_mediacodec_decoder_deps="mediacodec"
3115vp8_qsv_decoder_select="qsvdec"
3116vp8_rkmpp_decoder_deps="rkmpp"
3117vp8_vaapi_encoder_deps="VAEncPictureParameterBufferVP8"
3118vp8_vaapi_encoder_select="vaapi_encode"
3119vp8_v4l2m2m_decoder_deps="v4l2_m2m vp8_v4l2_m2m"
3120vp8_v4l2m2m_encoder_deps="v4l2_m2m vp8_v4l2_m2m"
3121vp9_cuvid_decoder_deps="cuvid"
3122vp9_mediacodec_decoder_deps="mediacodec"
3123vp9_qsv_decoder_select="qsvdec"
3124vp9_rkmpp_decoder_deps="rkmpp"
3125vp9_vaapi_encoder_deps="VAEncPictureParameterBufferVP9"
3126vp9_vaapi_encoder_select="vaapi_encode"
3127vp9_qsv_encoder_deps="libmfx MFX_CODEC_VP9"
3128vp9_qsv_encoder_select="qsvenc"
3129vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
3130wmv3_crystalhd_decoder_select="crystalhd"
3131
3132# parsers
3133aac_parser_select="adts_header"
3134av1_parser_select="cbs_av1"
3135h264_parser_select="golomb h264dsp h264parse"
3136hevc_parser_select="hevcparse"
3137mpegaudio_parser_select="mpegaudioheader"
3138mpegvideo_parser_select="mpegvideo"
3139mpeg4video_parser_select="h263dsp mpegvideo qpeldsp"
3140vc1_parser_select="vc1dsp"
3141
3142# bitstream_filters
3143aac_adtstoasc_bsf_select="adts_header"
3144av1_frame_merge_bsf_select="cbs_av1"
3145av1_frame_split_bsf_select="cbs_av1"
3146av1_metadata_bsf_select="cbs_av1"
3147eac3_core_bsf_select="ac3_parser"
3148filter_units_bsf_select="cbs"
3149h264_metadata_bsf_deps="const_nan"
3150h264_metadata_bsf_select="cbs_h264"
3151h264_redundant_pps_bsf_select="cbs_h264"
3152hevc_metadata_bsf_select="cbs_h265"
3153mjpeg2jpeg_bsf_select="jpegtables"
3154mpeg2_metadata_bsf_select="cbs_mpeg2"
3155trace_headers_bsf_select="cbs"
3156vp9_metadata_bsf_select="cbs_vp9"
3157
3158# external libraries
3159aac_at_decoder_deps="audiotoolbox"
3160aac_at_decoder_select="aac_adtstoasc_bsf"
3161ac3_at_decoder_deps="audiotoolbox"
3162ac3_at_decoder_select="ac3_parser"
3163adpcm_ima_qt_at_decoder_deps="audiotoolbox"
3164alac_at_decoder_deps="audiotoolbox"
3165amr_nb_at_decoder_deps="audiotoolbox"
3166avisynth_deps_any="libdl LoadLibrary"
3167avisynth_demuxer_deps="avisynth"
3168avisynth_demuxer_select="riffdec"
3169eac3_at_decoder_deps="audiotoolbox"
3170eac3_at_decoder_select="ac3_parser"
3171gsm_ms_at_decoder_deps="audiotoolbox"
3172ilbc_at_decoder_deps="audiotoolbox"
3173mp1_at_decoder_deps="audiotoolbox"
3174mp2_at_decoder_deps="audiotoolbox"
3175mp3_at_decoder_deps="audiotoolbox"
3176mp1_at_decoder_select="mpegaudioheader"
3177mp2_at_decoder_select="mpegaudioheader"
3178mp3_at_decoder_select="mpegaudioheader"
3179pcm_alaw_at_decoder_deps="audiotoolbox"
3180pcm_mulaw_at_decoder_deps="audiotoolbox"
3181qdmc_decoder_select="fft"
3182qdmc_at_decoder_deps="audiotoolbox"
3183qdm2_at_decoder_deps="audiotoolbox"
3184aac_at_encoder_deps="audiotoolbox"
3185aac_at_encoder_select="audio_frame_queue"
3186alac_at_encoder_deps="audiotoolbox"
3187alac_at_encoder_select="audio_frame_queue"
3188ilbc_at_encoder_deps="audiotoolbox"
3189ilbc_at_encoder_select="audio_frame_queue"
3190pcm_alaw_at_encoder_deps="audiotoolbox"
3191pcm_alaw_at_encoder_select="audio_frame_queue"
3192pcm_mulaw_at_encoder_deps="audiotoolbox"
3193pcm_mulaw_at_encoder_select="audio_frame_queue"
3194chromaprint_muxer_deps="chromaprint"
3195h264_videotoolbox_encoder_deps="pthreads"
3196h264_videotoolbox_encoder_select="videotoolbox_encoder"
3197hevc_videotoolbox_encoder_deps="pthreads"
3198hevc_videotoolbox_encoder_select="videotoolbox_encoder"
3199libaom_av1_decoder_deps="libaom"
3200libaom_av1_encoder_deps="libaom"
3201libaom_av1_encoder_select="extract_extradata_bsf"
3202libaribb24_decoder_deps="libaribb24"
3203libcelt_decoder_deps="libcelt"
3204libcodec2_decoder_deps="libcodec2"
3205libcodec2_encoder_deps="libcodec2"
3206libdav1d_decoder_deps="libdav1d"
3207libdavs2_decoder_deps="libdavs2"
3208libfdk_aac_decoder_deps="libfdk_aac"
3209libfdk_aac_encoder_deps="libfdk_aac"
3210libfdk_aac_encoder_select="audio_frame_queue"
3211libgme_demuxer_deps="libgme"
3212libgsm_decoder_deps="libgsm"
3213libgsm_encoder_deps="libgsm"
3214libgsm_ms_decoder_deps="libgsm"
3215libgsm_ms_encoder_deps="libgsm"
3216libilbc_decoder_deps="libilbc"
3217libilbc_encoder_deps="libilbc"
3218libkvazaar_encoder_deps="libkvazaar"
3219libmodplug_demuxer_deps="libmodplug"
3220libmp3lame_encoder_deps="libmp3lame"
3221libmp3lame_encoder_select="audio_frame_queue mpegaudioheader"
3222libopencore_amrnb_decoder_deps="libopencore_amrnb"
3223libopencore_amrnb_encoder_deps="libopencore_amrnb"
3224libopencore_amrnb_encoder_select="audio_frame_queue"
3225libopencore_amrwb_decoder_deps="libopencore_amrwb"
3226libopenh264_decoder_deps="libopenh264"
3227libopenh264_decoder_select="h264_mp4toannexb_bsf"
3228libopenh264_encoder_deps="libopenh264"
3229libopenjpeg_decoder_deps="libopenjpeg"
3230libopenjpeg_encoder_deps="libopenjpeg"
3231libopenmpt_demuxer_deps="libopenmpt"
3232libopus_decoder_deps="libopus"
3233libopus_encoder_deps="libopus"
3234libopus_encoder_select="audio_frame_queue"
3235librav1e_encoder_deps="librav1e"
3236librav1e_encoder_select="extract_extradata_bsf"
3237librsvg_decoder_deps="librsvg"
3238libshine_encoder_deps="libshine"
3239libshine_encoder_select="audio_frame_queue"
3240libspeex_decoder_deps="libspeex"
3241libspeex_encoder_deps="libspeex"
3242libspeex_encoder_select="audio_frame_queue"
3243libtheora_encoder_deps="libtheora"
3244libtwolame_encoder_deps="libtwolame"
3245libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
3246libvorbis_decoder_deps="libvorbis"
3247libvorbis_encoder_deps="libvorbis libvorbisenc"
3248libvorbis_encoder_select="audio_frame_queue"
3249libvpx_vp8_decoder_deps="libvpx"
3250libvpx_vp8_encoder_deps="libvpx"
3251libvpx_vp9_decoder_deps="libvpx"
3252libvpx_vp9_encoder_deps="libvpx"
3253libwavpack_encoder_deps="libwavpack"
3254libwavpack_encoder_select="audio_frame_queue"
3255libwebp_encoder_deps="libwebp"
3256libwebp_anim_encoder_deps="libwebp"
3257libx262_encoder_deps="libx262"
3258libx264_encoder_deps="libx264"
3259libx264rgb_encoder_deps="libx264 x264_csp_bgr"
3260libx264rgb_encoder_select="libx264_encoder"
3261libx265_encoder_deps="libx265"
3262libxavs_encoder_deps="libxavs"
3263libxavs2_encoder_deps="libxavs2"
3264libxvid_encoder_deps="libxvid"
3265libzvbi_teletext_decoder_deps="libzvbi"
3266vapoursynth_demuxer_deps="vapoursynth"
3267videotoolbox_suggest="coreservices"
3268videotoolbox_deps="corefoundation coremedia corevideo"
3269videotoolbox_encoder_deps="videotoolbox VTCompressionSessionPrepareToEncodeFrames"
3270
3271# demuxers / muxers
3272ac3_demuxer_select="ac3_parser"
3273act_demuxer_select="riffdec"
3274aiff_muxer_select="iso_media"
3275asf_demuxer_select="riffdec"
3276asf_o_demuxer_select="riffdec"
3277asf_muxer_select="riffenc"
3278asf_stream_muxer_select="asf_muxer"
3279av1_demuxer_select="av1_frame_merge_bsf av1_parser"
3280avi_demuxer_select="iso_media riffdec exif"
3281avi_muxer_select="riffenc"
3282caf_demuxer_select="iso_media riffdec"
3283caf_muxer_select="iso_media"
3284dash_muxer_select="mp4_muxer"
3285dash_demuxer_deps="libxml2"
3286dirac_demuxer_select="dirac_parser"
3287dts_demuxer_select="dca_parser"
3288dtshd_demuxer_select="dca_parser"
3289dv_demuxer_select="dvprofile"
3290dv_muxer_select="dvprofile"
3291dxa_demuxer_select="riffdec"
3292eac3_demuxer_select="ac3_parser"
3293f4v_muxer_select="mov_muxer"
3294fifo_muxer_deps="threads"
3295flac_demuxer_select="flac_parser"
3296flv_muxer_select="aac_adtstoasc_bsf"
3297gxf_muxer_select="pcm_rechunk_bsf"
3298hds_muxer_select="flv_muxer"
3299hls_muxer_select="mpegts_muxer"
3300hls_muxer_suggest="gcrypt openssl"
3301image2_alias_pix_demuxer_select="image2_demuxer"
3302image2_brender_pix_demuxer_select="image2_demuxer"
3303ipod_muxer_select="mov_muxer"
3304ismv_muxer_select="mov_muxer"
3305ivf_muxer_select="av1_metadata_bsf vp9_superframe_bsf"
3306latm_muxer_select="aac_adtstoasc_bsf"
3307matroska_audio_muxer_select="matroska_muxer"
3308matroska_demuxer_select="iso_media riffdec"
3309matroska_demuxer_suggest="bzlib lzo zlib"
3310matroska_muxer_select="iso_media riffenc vp9_superframe_bsf aac_adtstoasc_bsf"
3311mlp_demuxer_select="mlp_parser"
3312mmf_muxer_select="riffenc"
3313mov_demuxer_select="iso_media riffdec"
3314mov_demuxer_suggest="zlib"
3315mov_muxer_select="iso_media riffenc rtpenc_chain vp9_superframe_bsf aac_adtstoasc_bsf"
3316mp3_demuxer_select="mpegaudio_parser"
3317mp3_muxer_select="mpegaudioheader"
3318mp4_muxer_select="mov_muxer"
3319mpegts_demuxer_select="iso_media"
3320mpegts_muxer_select="adts_muxer latm_muxer h264_mp4toannexb_bsf hevc_mp4toannexb_bsf"
3321mpegtsraw_demuxer_select="mpegts_demuxer"
3322mxf_muxer_select="golomb pcm_rechunk_bsf"
3323mxf_d10_muxer_select="mxf_muxer"
3324mxf_opatom_muxer_select="mxf_muxer"
3325nut_muxer_select="riffenc"
3326nuv_demuxer_select="riffdec"
3327oga_muxer_select="ogg_muxer"
3328ogg_demuxer_select="dirac_parse"
3329ogv_muxer_select="ogg_muxer"
3330opus_muxer_select="ogg_muxer"
3331psp_muxer_select="mov_muxer"
3332rtp_demuxer_select="sdp_demuxer"
3333rtp_muxer_select="golomb jpegtables"
3334rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
3335rtsp_demuxer_select="http_protocol rtpdec"
3336rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
3337sap_demuxer_select="sdp_demuxer"
3338sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
3339sdp_demuxer_select="rtpdec"
3340smoothstreaming_muxer_select="ismv_muxer"
3341spdif_demuxer_select="adts_header"
3342spdif_muxer_select="adts_header"
3343spx_muxer_select="ogg_muxer"
3344swf_demuxer_suggest="zlib"
3345tak_demuxer_select="tak_parser"
3346truehd_demuxer_select="mlp_parser"
3347tg2_muxer_select="mov_muxer"
3348tgp_muxer_select="mov_muxer"
3349vobsub_demuxer_select="mpegps_demuxer"
3350w64_demuxer_select="wav_demuxer"
3351w64_muxer_select="wav_muxer"
3352wav_demuxer_select="riffdec"
3353wav_muxer_select="riffenc"
3354webm_chunk_muxer_select="webm_muxer"
3355webm_muxer_select="iso_media riffenc"
3356webm_dash_manifest_demuxer_select="matroska_demuxer"
3357wtv_demuxer_select="mpegts_demuxer riffdec"
3358wtv_muxer_select="mpegts_muxer riffenc"
3359xmv_demuxer_select="riffdec"
3360xwma_demuxer_select="riffdec"
3361
3362# indevs / outdevs
3363android_camera_indev_deps="android camera2ndk mediandk pthreads"
3364android_camera_indev_extralibs="-landroid -lcamera2ndk -lmediandk"
3365alsa_indev_deps="alsa"
3366alsa_outdev_deps="alsa"
3367avfoundation_indev_deps="avfoundation corevideo coremedia pthreads"
3368avfoundation_indev_suggest="coregraphics applicationservices"
3369avfoundation_indev_extralibs="-framework Foundation"
3370bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
3371caca_outdev_deps="libcaca"
3372decklink_deps_any="libdl LoadLibrary"
3373decklink_indev_deps="decklink threads"
3374decklink_indev_extralibs="-lstdc++"
3375decklink_outdev_deps="decklink threads"
3376decklink_outdev_suggest="libklvanc"
3377decklink_outdev_extralibs="-lstdc++"
3378dshow_indev_deps="IBaseFilter"
3379dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
3380fbdev_indev_deps="linux_fb_h"
3381fbdev_outdev_deps="linux_fb_h"
3382gdigrab_indev_deps="CreateDIBSection"
3383gdigrab_indev_extralibs="-lgdi32"
3384gdigrab_indev_select="bmp_decoder"
3385iec61883_indev_deps="libiec61883"
3386jack_indev_deps="libjack"
3387jack_indev_deps_any="sem_timedwait dispatch_dispatch_h"
3388kmsgrab_indev_deps="libdrm"
3389lavfi_indev_deps="avfilter"
3390libcdio_indev_deps="libcdio"
3391libdc1394_indev_deps="libdc1394"
3392openal_indev_deps="openal"
3393opengl_outdev_deps="opengl"
3394opengl_outdev_suggest="sdl2"
3395oss_indev_deps_any="sys_soundcard_h"
3396oss_outdev_deps_any="sys_soundcard_h"
3397pulse_indev_deps="libpulse"
3398pulse_outdev_deps="libpulse"
3399sdl2_outdev_deps="sdl2"
3400sndio_indev_deps="sndio"
3401sndio_outdev_deps="sndio"
3402v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
3403v4l2_indev_suggest="libv4l2"
3404v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h"
3405v4l2_outdev_suggest="libv4l2"
3406vfwcap_indev_deps="vfw32 vfwcap_defines"
3407xcbgrab_indev_deps="libxcb"
3408xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes"
3409xv_outdev_deps="xlib"
3410
3411# protocols
3412async_protocol_deps="threads"
3413bluray_protocol_deps="libbluray"
3414ffrtmpcrypt_protocol_conflict="librtmp_protocol"
3415ffrtmpcrypt_protocol_deps_any="gcrypt gmp openssl mbedtls"
3416ffrtmpcrypt_protocol_select="tcp_protocol"
3417ffrtmphttp_protocol_conflict="librtmp_protocol"
3418ffrtmphttp_protocol_select="http_protocol"
3419ftp_protocol_select="tcp_protocol"
3420gopher_protocol_select="network"
3421http_protocol_select="tcp_protocol"
3422http_protocol_suggest="zlib"
3423httpproxy_protocol_select="tcp_protocol"
3424httpproxy_protocol_suggest="zlib"
3425https_protocol_select="tls_protocol"
3426https_protocol_suggest="zlib"
3427icecast_protocol_select="http_protocol"
3428mmsh_protocol_select="http_protocol"
3429mmst_protocol_select="network"
3430rtmp_protocol_conflict="librtmp_protocol"
3431rtmp_protocol_select="tcp_protocol"
3432rtmp_protocol_suggest="zlib"
3433rtmpe_protocol_select="ffrtmpcrypt_protocol"
3434rtmpe_protocol_suggest="zlib"
3435rtmps_protocol_conflict="librtmp_protocol"
3436rtmps_protocol_select="tls_protocol"
3437rtmps_protocol_suggest="zlib"
3438rtmpt_protocol_select="ffrtmphttp_protocol"
3439rtmpt_protocol_suggest="zlib"
3440rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
3441rtmpte_protocol_suggest="zlib"
3442rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
3443rtmpts_protocol_suggest="zlib"
3444rtp_protocol_select="udp_protocol"
3445schannel_conflict="openssl gnutls libtls mbedtls"
3446sctp_protocol_deps="struct_sctp_event_subscribe struct_msghdr_msg_flags"
3447sctp_protocol_select="network"
3448securetransport_conflict="openssl gnutls libtls mbedtls"
3449srtp_protocol_select="rtp_protocol srtp"
3450tcp_protocol_select="network"
3451tls_protocol_deps_any="gnutls openssl schannel securetransport libtls mbedtls"
3452tls_protocol_select="tcp_protocol"
3453udp_protocol_select="network"
3454udplite_protocol_select="network"
3455unix_protocol_deps="sys_un_h"
3456unix_protocol_select="network"
3457
3458# external library protocols
3459libamqp_protocol_deps="librabbitmq"
3460libamqp_protocol_select="network"
3461librtmp_protocol_deps="librtmp"
3462librtmpe_protocol_deps="librtmp"
3463librtmps_protocol_deps="librtmp"
3464librtmpt_protocol_deps="librtmp"
3465librtmpte_protocol_deps="librtmp"
3466libsmbclient_protocol_deps="libsmbclient gplv3"
3467libsrt_protocol_deps="libsrt"
3468libsrt_protocol_select="network"
3469libssh_protocol_deps="libssh"
3470libtls_conflict="openssl gnutls mbedtls"
3471libzmq_protocol_deps="libzmq"
3472libzmq_protocol_select="network"
3473
3474# filters
3475afftdn_filter_deps="avcodec"
3476afftdn_filter_select="fft"
3477afftfilt_filter_deps="avcodec"
3478afftfilt_filter_select="fft"
3479afir_filter_deps="avcodec"
3480afir_filter_select="rdft"
3481amovie_filter_deps="avcodec avformat"
3482aresample_filter_deps="swresample"
3483asr_filter_deps="pocketsphinx"
3484ass_filter_deps="libass"
3485atempo_filter_deps="avcodec"
3486atempo_filter_select="rdft"
3487avgblur_opencl_filter_deps="opencl"
3488avgblur_vulkan_filter_deps="vulkan libglslang"
3489azmq_filter_deps="libzmq"
3490blackframe_filter_deps="gpl"
3491bm3d_filter_deps="avcodec"
3492bm3d_filter_select="dct"
3493boxblur_filter_deps="gpl"
3494boxblur_opencl_filter_deps="opencl gpl"
3495bs2b_filter_deps="libbs2b"
3496chromaber_vulkan_filter_deps="vulkan libglslang"
3497colorkey_opencl_filter_deps="opencl"
3498colormatrix_filter_deps="gpl"
3499convolution_opencl_filter_deps="opencl"
3500convolve_filter_deps="avcodec"
3501convolve_filter_select="fft"
3502coreimage_filter_deps="coreimage appkit"
3503coreimage_filter_extralibs="-framework OpenGL"
3504coreimagesrc_filter_deps="coreimage appkit"
3505coreimagesrc_filter_extralibs="-framework OpenGL"
3506cover_rect_filter_deps="avcodec avformat gpl"
3507cropdetect_filter_deps="gpl"
3508deconvolve_filter_deps="avcodec"
3509deconvolve_filter_select="fft"
3510deinterlace_qsv_filter_deps="libmfx"
3511deinterlace_vaapi_filter_deps="vaapi"
3512delogo_filter_deps="gpl"
3513denoise_vaapi_filter_deps="vaapi"
3514derain_filter_select="dnn"
3515deshake_filter_select="pixelutils"
3516deshake_opencl_filter_deps="opencl"
3517dilation_opencl_filter_deps="opencl"
3518dnn_processing_filter_deps="swscale"
3519dnn_processing_filter_select="dnn"
3520drawtext_filter_deps="libfreetype"
3521drawtext_filter_suggest="libfontconfig libfribidi"
3522elbg_filter_deps="avcodec"
3523eq_filter_deps="gpl"
3524erosion_opencl_filter_deps="opencl"
3525fftfilt_filter_deps="avcodec"
3526fftfilt_filter_select="rdft"
3527fftdnoiz_filter_deps="avcodec"
3528fftdnoiz_filter_select="fft"
3529find_rect_filter_deps="avcodec avformat gpl"
3530firequalizer_filter_deps="avcodec"
3531firequalizer_filter_select="rdft"
3532flite_filter_deps="libflite"
3533framerate_filter_select="scene_sad"
3534freezedetect_filter_select="scene_sad"
3535frei0r_filter_deps="frei0r libdl"
3536frei0r_src_filter_deps="frei0r libdl"
3537fspp_filter_deps="gpl"
3538headphone_filter_select="fft"
3539histeq_filter_deps="gpl"
3540hqdn3d_filter_deps="gpl"
3541interlace_filter_deps="gpl"
3542kerndeint_filter_deps="gpl"
3543ladspa_filter_deps="ladspa libdl"
3544lensfun_filter_deps="liblensfun version3"
3545lv2_filter_deps="lv2"
3546mcdeint_filter_deps="avcodec gpl"
3547movie_filter_deps="avcodec avformat"
3548mpdecimate_filter_deps="gpl"
3549mpdecimate_filter_select="pixelutils"
3550minterpolate_filter_select="scene_sad"
3551mptestsrc_filter_deps="gpl"
3552negate_filter_deps="lut_filter"
3553nlmeans_opencl_filter_deps="opencl"
3554nnedi_filter_deps="gpl"
3555ocr_filter_deps="libtesseract"
3556ocv_filter_deps="libopencv"
3557openclsrc_filter_deps="opencl"
3558overlay_opencl_filter_deps="opencl"
3559overlay_qsv_filter_deps="libmfx"
3560overlay_qsv_filter_select="qsvvpp"
3561overlay_vulkan_filter_deps="vulkan libglslang"
3562owdenoise_filter_deps="gpl"
3563pad_opencl_filter_deps="opencl"
3564pan_filter_deps="swresample"
3565perspective_filter_deps="gpl"
3566phase_filter_deps="gpl"
3567pp7_filter_deps="gpl"
3568pp_filter_deps="gpl postproc"
3569prewitt_opencl_filter_deps="opencl"
3570procamp_vaapi_filter_deps="vaapi"
3571program_opencl_filter_deps="opencl"
3572pullup_filter_deps="gpl"
3573removelogo_filter_deps="avcodec avformat swscale"
3574repeatfields_filter_deps="gpl"
3575resample_filter_deps="avresample"
3576roberts_opencl_filter_deps="opencl"
3577rubberband_filter_deps="librubberband"
3578sab_filter_deps="gpl swscale"
3579scale2ref_filter_deps="swscale"
3580scale_filter_deps="swscale"
3581scale_qsv_filter_deps="libmfx"
3582scdet_filter_select="scene_sad"
3583select_filter_select="scene_sad"
3584sharpness_vaapi_filter_deps="vaapi"
3585showcqt_filter_deps="avcodec avformat swscale"
3586showcqt_filter_suggest="libfontconfig libfreetype"
3587showcqt_filter_select="fft"
3588showfreqs_filter_deps="avcodec"
3589showfreqs_filter_select="fft"
3590showspatial_filter_select="fft"
3591showspectrum_filter_deps="avcodec"
3592showspectrum_filter_select="fft"
3593showspectrumpic_filter_deps="avcodec"
3594showspectrumpic_filter_select="fft"
3595signature_filter_deps="gpl avcodec avformat"
3596sinc_filter_select="rdft"
3597smartblur_filter_deps="gpl swscale"
3598sobel_opencl_filter_deps="opencl"
3599sofalizer_filter_deps="libmysofa avcodec"
3600sofalizer_filter_select="fft"
3601spectrumsynth_filter_deps="avcodec"
3602spectrumsynth_filter_select="fft"
3603spp_filter_deps="gpl avcodec"
3604spp_filter_select="fft idctdsp fdctdsp me_cmp pixblockdsp"
3605sr_filter_deps="avformat swscale"
3606sr_filter_select="dnn"
3607stereo3d_filter_deps="gpl"
3608subtitles_filter_deps="avformat avcodec libass"
3609super2xsai_filter_deps="gpl"
3610pixfmts_super2xsai_test_deps="super2xsai_filter"
3611superequalizer_filter_select="rdft"
3612surround_filter_select="rdft"
3613tinterlace_filter_deps="gpl"
3614tinterlace_merge_test_deps="tinterlace_filter"
3615tinterlace_pad_test_deps="tinterlace_filter"
3616tonemap_filter_deps="const_nan"
3617tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping"
3618tonemap_opencl_filter_deps="opencl const_nan"
3619transpose_opencl_filter_deps="opencl"
3620transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags"
3621unsharp_opencl_filter_deps="opencl"
3622uspp_filter_deps="gpl avcodec"
3623vaguedenoiser_filter_deps="gpl"
3624vidstabdetect_filter_deps="libvidstab"
3625vidstabtransform_filter_deps="libvidstab"
3626libvmaf_filter_deps="libvmaf pthreads"
3627zmq_filter_deps="libzmq"
3628zoompan_filter_deps="swscale"
3629zscale_filter_deps="libzimg const_nan"
3630scale_vaapi_filter_deps="vaapi"
3631scale_vulkan_filter_deps="vulkan libglslang"
3632vpp_qsv_filter_deps="libmfx"
3633vpp_qsv_filter_select="qsvvpp"
3634xfade_opencl_filter_deps="opencl"
3635yadif_cuda_filter_deps="ffnvcodec"
3636yadif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
3637
3638# examples
3639avio_list_dir_deps="avformat avutil"
3640avio_reading_deps="avformat avcodec avutil"
3641decode_audio_example_deps="avcodec avutil"
3642decode_video_example_deps="avcodec avutil"
3643demuxing_decoding_example_deps="avcodec avformat avutil"
3644encode_audio_example_deps="avcodec avutil"
3645encode_video_example_deps="avcodec avutil"
3646extract_mvs_example_deps="avcodec avformat avutil"
3647filter_audio_example_deps="avfilter avutil"
3648filtering_audio_example_deps="avfilter avcodec avformat avutil"
3649filtering_video_example_deps="avfilter avcodec avformat avutil"
3650http_multiclient_example_deps="avformat avutil fork"
3651hw_decode_example_deps="avcodec avformat avutil"
3652metadata_example_deps="avformat avutil"
3653muxing_example_deps="avcodec avformat avutil swscale"
3654qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder"
3655remuxing_example_deps="avcodec avformat avutil"
3656resampling_audio_example_deps="avutil swresample"
3657scaling_video_example_deps="avutil swscale"
3658transcode_aac_example_deps="avcodec avformat swresample"
3659transcoding_example_deps="avfilter avcodec avformat avutil"
3660vaapi_encode_example_deps="avcodec avutil h264_vaapi_encoder"
3661vaapi_transcode_example_deps="avcodec avformat avutil h264_vaapi_encoder"
3662
3663# EXTRALIBS_LIST
3664cpu_init_extralibs="pthreads_extralibs"
3665cws2fws_extralibs="zlib_extralibs"
3666
3667# libraries, in any order
3668avcodec_deps="avutil"
3669avcodec_suggest="libm"
3670avcodec_select="null_bsf"
3671avdevice_deps="avformat avcodec avutil"
3672avdevice_suggest="libm"
3673avfilter_deps="avutil"
3674avfilter_suggest="libm"
3675avformat_deps="avcodec avutil"
3676avformat_suggest="libm network zlib"
3677avresample_deps="avutil"
3678avresample_suggest="libm"
3679avutil_suggest="clock_gettime ffnvcodec libm libdrm libmfx opencl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia bcrypt"
3680postproc_deps="avutil gpl"
3681postproc_suggest="libm"
3682swresample_deps="avutil"
3683swresample_suggest="libm libsoxr"
3684swscale_deps="avutil"
3685swscale_suggest="libm"
3686
3687avcodec_extralibs="pthreads_extralibs iconv_extralibs dxva2_extralibs"
3688avfilter_extralibs="pthreads_extralibs"
3689avutil_extralibs="d3d11va_extralibs nanosleep_extralibs pthreads_extralibs vaapi_drm_extralibs vaapi_x11_extralibs vdpau_x11_extralibs"
3690
3691# programs
3692ffmpeg_deps="avcodec avfilter avformat"
3693ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter
3694               hflip_filter null_filter
3695               transpose_filter trim_filter vflip_filter"
3696ffmpeg_suggest="ole32 psapi shell32"
3697ffplay_deps="avcodec avformat swscale swresample sdl2"
3698ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotate_filter"
3699ffplay_suggest="shell32"
3700ffprobe_deps="avcodec avformat"
3701ffprobe_suggest="shell32"
3702
3703# documentation
3704podpages_deps="perl"
3705manpages_deps="perl pod2man"
3706htmlpages_deps="perl"
3707htmlpages_deps_any="makeinfo_html texi2html"
3708txtpages_deps="perl makeinfo"
3709doc_deps_any="manpages htmlpages podpages txtpages"
3710
3711# default parameters
3712
3713logfile="ffbuild/config.log"
3714
3715# installation paths
3716prefix_default="/usr/local"
3717bindir_default='${prefix}/bin'
3718datadir_default='${prefix}/share/ffmpeg'
3719docdir_default='${prefix}/share/doc/ffmpeg'
3720incdir_default='${prefix}/include'
3721libdir_default='${prefix}/lib'
3722mandir_default='${prefix}/share/man'
3723
3724# toolchain
3725ar_default="ar"
3726cc_default="gcc"
3727cxx_default="g++"
3728host_cc_default="gcc"
3729doxygen_default="doxygen"
3730install="install"
3731ln_s_default="ln -s -f"
3732nm_default="nm -g"
3733pkg_config_default=pkg-config
3734ranlib_default="ranlib"
3735strip_default="strip"
3736version_script='--version-script'
3737objformat="elf32"
3738x86asmexe_default="nasm"
3739windres_default="windres"
3740striptype="direct"
3741
3742# OS
3743target_os_default=$(tolower $(uname -s))
3744host_os=$target_os_default
3745
3746# machine
3747if test "$target_os_default" = aix; then
3748    arch_default=$(uname -p)
3749    strip_default="strip -X32_64"
3750    nm_default="nm -g -X32_64"
3751else
3752    arch_default=$(uname -m)
3753fi
3754cpu="generic"
3755intrinsics="none"
3756
3757# configurable options
3758enable $PROGRAM_LIST
3759enable $DOCUMENT_LIST
3760enable $EXAMPLE_LIST
3761enable $(filter_out avresample $LIBRARY_LIST)
3762enable stripping
3763
3764enable asm
3765enable debug
3766enable doc
3767enable faan faandct faanidct
3768enable large_tests
3769enable optimizations
3770enable runtime_cpudetect
3771enable safe_bitstream_reader
3772enable static
3773enable swscale_alpha
3774enable valgrind_backtrace
3775
3776sws_max_filter_size_default=256
3777set_default sws_max_filter_size
3778
3779# internal components are enabled by default
3780enable $EXTRALIBS_LIST
3781
3782# Avoid external, non-system, libraries getting enabled by dependency resolution
3783disable $EXTERNAL_LIBRARY_LIST $HWACCEL_LIBRARY_LIST
3784
3785# build settings
3786SHFLAGS='-shared -Wl,-soname,$$(@F)'
3787LIBPREF="lib"
3788LIBSUF=".a"
3789FULLNAME='$(NAME)$(BUILDSUF)'
3790LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
3791SLIBPREF="lib"
3792SLIBSUF=".so"
3793SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
3794SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
3795SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
3796LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
3797SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
3798SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
3799VERSION_SCRIPT_POSTPROCESS_CMD="cat"
3800
3801asflags_filter=echo
3802cflags_filter=echo
3803ldflags_filter=echo
3804
3805AS_C='-c'
3806AS_O='-o $@'
3807CC_C='-c'
3808CC_E='-E -o $@'
3809CC_O='-o $@'
3810CXX_C='-c'
3811CXX_O='-o $@'
3812OBJCC_C='-c'
3813OBJCC_E='-E -o $@'
3814OBJCC_O='-o $@'
3815X86ASM_O='-o $@'
3816LD_O='-o $@'
3817LD_LIB='-l%'
3818LD_PATH='-L'
3819HOSTCC_C='-c'
3820HOSTCC_E='-E -o $@'
3821HOSTCC_O='-o $@'
3822HOSTLD_O='-o $@'
3823NVCC_C='-c'
3824NVCC_O='-o $@'
3825
3826host_extralibs='-lm'
3827host_cflags_filter=echo
3828host_ldflags_filter=echo
3829
3830target_path='$(CURDIR)'
3831
3832# since the object filename is not given with the -MM flag, the compiler
3833# is only able to print the basename, and we must add the path ourselves
3834DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>/dev/null | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(@F),$(@D)/$(@F)," > $(@:.o=.d)'
3835DEPFLAGS='-MM'
3836
3837mkdir -p ffbuild
3838
3839# find source path
3840if test -f configure; then
3841    source_path=.
3842elif test -f src/configure; then
3843    source_path=src
3844else
3845    source_path=$(cd $(dirname "$0"); pwd)
3846    case "$source_path" in
3847        *[[:blank:]]*) die "Out of tree builds are impossible with whitespace in source path." ;;
3848    esac
3849    test -e "$source_path/config.h" &&
3850        die "Out of tree builds are impossible with config.h in source dir."
3851fi
3852
3853for v in "$@"; do
3854    r=${v#*=}
3855    l=${v%"$r"}
3856    r=$(sh_quote "$r")
3857    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
3858done
3859
3860find_things_extern(){
3861    thing=$1
3862    pattern=$2
3863    file=$source_path/$3
3864    out=${4:-$thing}
3865    sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$out/p" "$file"
3866}
3867
3868find_filters_extern(){
3869    file=$source_path/$1
3870    sed -n 's/^extern AVFilter ff_[avfsinkrc]\{2,5\}_\([[:alnum:]_]\{1,\}\);/\1_filter/p' $file
3871}
3872
3873FILTER_LIST=$(find_filters_extern libavfilter/allfilters.c)
3874OUTDEV_LIST=$(find_things_extern muxer AVOutputFormat libavdevice/alldevices.c outdev)
3875INDEV_LIST=$(find_things_extern demuxer AVInputFormat libavdevice/alldevices.c indev)
3876MUXER_LIST=$(find_things_extern muxer AVOutputFormat libavformat/allformats.c)
3877DEMUXER_LIST=$(find_things_extern demuxer AVInputFormat libavformat/allformats.c)
3878ENCODER_LIST=$(find_things_extern encoder AVCodec libavcodec/allcodecs.c)
3879DECODER_LIST=$(find_things_extern decoder AVCodec libavcodec/allcodecs.c)
3880CODEC_LIST="
3881    $ENCODER_LIST
3882    $DECODER_LIST
3883"
3884PARSER_LIST=$(find_things_extern parser AVCodecParser libavcodec/parsers.c)
3885BSF_LIST=$(find_things_extern bsf AVBitStreamFilter libavcodec/bitstream_filters.c)
3886HWACCEL_LIST=$(find_things_extern hwaccel AVHWAccel libavcodec/hwaccels.h)
3887PROTOCOL_LIST=$(find_things_extern protocol URLProtocol libavformat/protocols.c)
3888
3889AVCODEC_COMPONENTS_LIST="
3890    $BSF_LIST
3891    $DECODER_LIST
3892    $ENCODER_LIST
3893    $HWACCEL_LIST
3894    $PARSER_LIST
3895"
3896
3897AVDEVICE_COMPONENTS_LIST="
3898    $INDEV_LIST
3899    $OUTDEV_LIST
3900"
3901
3902AVFILTER_COMPONENTS_LIST="
3903    $FILTER_LIST
3904"
3905
3906AVFORMAT_COMPONENTS_LIST="
3907    $DEMUXER_LIST
3908    $MUXER_LIST
3909    $PROTOCOL_LIST
3910"
3911
3912ALL_COMPONENTS="
3913    $AVCODEC_COMPONENTS_LIST
3914    $AVDEVICE_COMPONENTS_LIST
3915    $AVFILTER_COMPONENTS_LIST
3916    $AVFORMAT_COMPONENTS_LIST
3917"
3918
3919for n in $COMPONENT_LIST; do
3920    v=$(toupper ${n%s})_LIST
3921    eval enable \$$v
3922    eval ${n}_if_any="\$$v"
3923done
3924
3925enable $ARCH_EXT_LIST
3926
3927die_unknown(){
3928    echo "Unknown option \"$1\"."
3929    echo "See $0 --help for available options."
3930    exit 1
3931}
3932
3933print_in_columns() {
3934    tr ' ' '\n' | sort | tr '\r\n' '  ' | awk -v col_width=24 -v width="$ncols" '
3935    {
3936        num_cols = width > col_width ? int(width / col_width) : 1;
3937        num_rows = int((NF + num_cols-1) / num_cols);
3938        y = x = 1;
3939        for (y = 1; y <= num_rows; y++) {
3940            i = y;
3941            for (x = 1; x <= num_cols; x++) {
3942                if (i <= NF) {
3943                  line = sprintf("%s%-" col_width "s", line, $i);
3944                }
3945                i = i + num_rows;
3946            }
3947            print line; line = "";
3948        }
3949    }' | sed 's/ *$//'
3950}
3951
3952show_list() {
3953    suffix=_$1
3954    shift
3955    echo $* | sed s/$suffix//g | print_in_columns
3956    exit 0
3957}
3958
3959rand_list(){
3960    IFS=', '
3961    set -- $*
3962    unset IFS
3963    for thing; do
3964        comp=${thing%:*}
3965        prob=${thing#$comp}
3966        prob=${prob#:}
3967        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
3968        echo "prob ${prob:-0.5}"
3969        printf '%s\n' $comp
3970    done
3971}
3972
3973do_random(){
3974    action=$1
3975    shift
3976    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
3977    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
3978}
3979
3980for opt do
3981    optval="${opt#*=}"
3982    case "$opt" in
3983        --extra-ldflags=*)
3984            add_ldflags $optval
3985        ;;
3986        --extra-ldexeflags=*)
3987            add_ldexeflags $optval
3988        ;;
3989        --extra-ldsoflags=*)
3990            add_ldsoflags $optval
3991        ;;
3992        --extra-ldlibflags=*)
3993            warn "The --extra-ldlibflags option is only provided for compatibility and will be\n"\
3994                 "removed in the future. Use --extra-ldsoflags instead."
3995            add_ldsoflags $optval
3996        ;;
3997        --extra-libs=*)
3998            add_extralibs $optval
3999        ;;
4000        --disable-devices)
4001            disable $INDEV_LIST $OUTDEV_LIST
4002        ;;
4003        --enable-debug=*)
4004            debuglevel="$optval"
4005        ;;
4006        --disable-programs)
4007            disable $PROGRAM_LIST
4008        ;;
4009        --disable-everything)
4010            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
4011        ;;
4012        --disable-all)
4013            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
4014            disable $LIBRARY_LIST $PROGRAM_LIST doc
4015            enable avutil
4016        ;;
4017        --enable-random|--disable-random)
4018            action=${opt%%-random}
4019            do_random ${action#--} $COMPONENT_LIST
4020        ;;
4021        --enable-random=*|--disable-random=*)
4022            action=${opt%%-random=*}
4023            do_random ${action#--} $optval
4024        ;;
4025        --enable-sdl)
4026            enable sdl2
4027        ;;
4028        --enable-*=*|--disable-*=*)
4029            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
4030            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
4031            eval list=\$$(toupper $thing)_LIST
4032            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
4033            list=$(filter "$name" $list)
4034            [ "$list" = "" ] && warn "Option $opt did not match anything"
4035            test $action = enable && warn_if_gets_disabled $list
4036            $action $list
4037        ;;
4038        --enable-yasm|--disable-yasm)
4039            warn "The ${opt} option is only provided for compatibility and will be\n"\
4040                 "removed in the future. Use --enable-x86asm / --disable-x86asm instead."
4041            test $opt = --enable-yasm && x86asm=yes || x86asm=no
4042        ;;
4043        --yasmexe=*)
4044            warn "The --yasmexe option is only provided for compatibility and will be\n"\
4045                 "removed in the future. Use --x86asmexe instead."
4046            x86asmexe="$optval"
4047        ;;
4048        --enable-?*|--disable-?*)
4049            eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
4050            if is_in $option $COMPONENT_LIST; then
4051                test $action = disable && action=unset
4052                eval $action \$$(toupper ${option%s})_LIST
4053            elif is_in $option $CMDLINE_SELECT; then
4054                $action $option
4055            else
4056                die_unknown $opt
4057            fi
4058        ;;
4059        --list-*)
4060            NAME="${opt#--list-}"
4061            is_in $NAME $COMPONENT_LIST || die_unknown $opt
4062            NAME=${NAME%s}
4063            eval show_list $NAME \$$(toupper $NAME)_LIST
4064        ;;
4065        --help|-h) show_help
4066        ;;
4067        --quiet|-q) quiet=yes
4068        ;;
4069        --fatal-warnings) enable fatal_warnings
4070        ;;
4071        --libfuzzer=*)
4072            libfuzzer_path="$optval"
4073        ;;
4074        *)
4075            optname="${opt%%=*}"
4076            optname="${optname#--}"
4077            optname=$(echo "$optname" | sed 's/-/_/g')
4078            if is_in $optname $CMDLINE_SET; then
4079                eval $optname='$optval'
4080            elif is_in $optname $CMDLINE_APPEND; then
4081                append $optname "$optval"
4082            else
4083                die_unknown $opt
4084            fi
4085        ;;
4086    esac
4087done
4088
4089for e in $env; do
4090    eval "export $e"
4091done
4092
4093if disabled autodetect; then
4094
4095    # Unless iconv is explicitely disabled by the user, we still want to probe
4096    # for the iconv from the libc.
4097    disabled iconv || enable libc_iconv
4098
4099    disable_weak $EXTERNAL_AUTODETECT_LIBRARY_LIST
4100    disable_weak $HWACCEL_AUTODETECT_LIBRARY_LIST
4101fi
4102# Mark specifically enabled, but normally autodetected libraries as requested.
4103for lib in $AUTODETECT_LIBS; do
4104    enabled $lib && request $lib
4105done
4106#TODO: switch to $AUTODETECT_LIBS when $THREADS_LIST is supported the same way
4107enable_weak $EXTERNAL_AUTODETECT_LIBRARY_LIST
4108enable_weak $HWACCEL_AUTODETECT_LIBRARY_LIST
4109
4110disabled logging && logfile=/dev/null
4111
4112# command line configuration sanity checks
4113
4114# we need to build at least one lib type
4115if ! enabled_any static shared; then
4116    cat <<EOF
4117At least one library type must be built.
4118Specify --enable-static to build the static libraries or --enable-shared to
4119build the shared libraries as well. To only build the shared libraries specify
4120--disable-static in addition to --enable-shared.
4121EOF
4122    exit 1
4123fi
4124
4125die_license_disabled() {
4126    enabled $1 || { enabled $v && die "$v is $1 and --enable-$1 is not specified."; }
4127}
4128
4129die_license_disabled_gpl() {
4130    enabled $1 || { enabled $v && die "$v is incompatible with the gpl and --enable-$1 is not specified."; }
4131}
4132
4133map "die_license_disabled gpl"      $EXTERNAL_LIBRARY_GPL_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
4134map "die_license_disabled version3" $EXTERNAL_LIBRARY_VERSION3_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
4135
4136enabled gpl && map "die_license_disabled_gpl nonfree" $EXTERNAL_LIBRARY_NONFREE_LIST
4137map "die_license_disabled nonfree" $HWACCEL_LIBRARY_NONFREE_LIST
4138
4139enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
4140
4141if enabled nonfree; then
4142    license="nonfree and unredistributable"
4143elif enabled gplv3; then
4144    license="GPL version 3 or later"
4145elif enabled lgplv3; then
4146    license="LGPL version 3 or later"
4147elif enabled gpl; then
4148    license="GPL version 2 or later"
4149else
4150    license="LGPL version 2.1 or later"
4151fi
4152
4153enabled_all gnutls openssl &&
4154    die "GnuTLS and OpenSSL must not be enabled at the same time."
4155
4156enabled_all gnutls mbedtls &&
4157    die "GnuTLS and mbedTLS must not be enabled at the same time."
4158
4159enabled_all openssl mbedtls &&
4160    die "OpenSSL and mbedTLS must not be enabled at the same time."
4161
4162# Disable all the library-specific components if the library itself
4163# is disabled, see AVCODEC_LIST and following _LIST variables.
4164
4165disable_components(){
4166    disabled ${1} && disable $(
4167        eval components="\$$(toupper ${1})_COMPONENTS"
4168        map 'eval echo \${$(toupper ${v%s})_LIST}' $components
4169    )
4170}
4171
4172map 'disable_components $v' $LIBRARY_LIST
4173
4174echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
4175set >> $logfile
4176
4177test -n "$valgrind" && toolchain="valgrind-memcheck"
4178
4179enabled ossfuzz && ! echo $CFLAGS | grep -q -- "-fsanitize="  && ! echo $CFLAGS | grep -q -- "-fcoverage-mapping" &&{
4180    add_cflags  -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp -fno-omit-frame-pointer
4181    add_ldflags -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp
4182}
4183
4184case "$toolchain" in
4185    *-asan)
4186        cc_default="${toolchain%-asan}"
4187        add_cflags  -fsanitize=address
4188        add_ldflags -fsanitize=address
4189    ;;
4190    *-msan)
4191        cc_default="${toolchain%-msan}"
4192        add_cflags  -fsanitize=memory -fsanitize-memory-track-origins
4193        add_ldflags -fsanitize=memory
4194    ;;
4195    *-tsan)
4196        cc_default="${toolchain%-tsan}"
4197        add_cflags  -fsanitize=thread
4198        add_ldflags -fsanitize=thread
4199        case "$toolchain" in
4200            gcc-tsan)
4201                add_cflags  -fPIC
4202                add_ldflags -fPIC
4203                ;;
4204        esac
4205    ;;
4206    *-usan)
4207        cc_default="${toolchain%-usan}"
4208        add_cflags  -fsanitize=undefined
4209        add_ldflags -fsanitize=undefined
4210    ;;
4211    valgrind-*)
4212        target_exec_default="valgrind"
4213        case "$toolchain" in
4214            valgrind-massif)
4215                target_exec_args="--tool=massif --alloc-fn=av_malloc --alloc-fn=av_mallocz --alloc-fn=av_calloc --alloc-fn=av_fast_padded_malloc --alloc-fn=av_fast_malloc --alloc-fn=av_realloc_f --alloc-fn=av_fast_realloc --alloc-fn=av_realloc"
4216                ;;
4217            valgrind-memcheck)
4218                target_exec_args="--error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp"
4219                ;;
4220        esac
4221    ;;
4222    msvc)
4223        # Check whether the current MSVC version needs the C99 converter.
4224        # From MSVC 2013 (compiler major version 18) onwards, it does actually
4225        # support enough of C99 to build ffmpeg. Default to the new
4226        # behaviour if the regexp was unable to match anything, since this
4227        # successfully parses the version number of existing supported
4228        # versions that require the converter (MSVC 2010 and 2012).
4229        cl_major_ver=$(cl.exe 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
4230        if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
4231            cc_default="cl.exe"
4232            cxx_default="cl.exe"
4233        else
4234            die "Unsupported MSVC version (2013 or newer required)"
4235        fi
4236        ld_default="$source_path/compat/windows/mslink"
4237        nm_default="dumpbin.exe -symbols"
4238        ar_default="lib.exe"
4239        case "$arch" in
4240        aarch64|arm64)
4241            as_default="armasm64.exe"
4242            ;;
4243        arm*)
4244            as_default="armasm.exe"
4245            ;;
4246        esac
4247        target_os_default="win32"
4248        # Use a relative path for TMPDIR. This makes sure all the
4249        # ffconf temp files are written with a relative path, avoiding
4250        # issues with msys/win32 path conversion for MSVC parameters
4251        # such as -Fo<file> or -out:<file>.
4252        TMPDIR=.
4253    ;;
4254    icl)
4255        cc_default="icl"
4256        ld_default="xilink"
4257        nm_default="dumpbin -symbols"
4258        ar_default="xilib"
4259        target_os_default="win32"
4260        TMPDIR=.
4261    ;;
4262    gcov)
4263        add_cflags  -fprofile-arcs -ftest-coverage
4264        add_ldflags -fprofile-arcs -ftest-coverage
4265    ;;
4266    llvm-cov)
4267        add_cflags -fprofile-arcs -ftest-coverage
4268        add_ldflags --coverage
4269    ;;
4270    hardened)
4271        add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
4272        add_cflags   -fno-strict-overflow -fstack-protector-all
4273        add_ldflags  -Wl,-z,relro -Wl,-z,now
4274        add_cflags   -fPIE
4275        add_ldexeflags -fPIE -pie
4276    ;;
4277    ?*)
4278        die "Unknown toolchain $toolchain"
4279    ;;
4280esac
4281
4282if test -n "$cross_prefix"; then
4283    test -n "$arch" && test -n "$target_os" ||
4284        die "Must specify target arch (--arch) and OS (--target-os) when cross-compiling"
4285    enable cross_compile
4286fi
4287
4288set_default target_os
4289if test "$target_os" = android; then
4290    cc_default="clang"
4291fi
4292
4293ar_default="${cross_prefix}${ar_default}"
4294cc_default="${cross_prefix}${cc_default}"
4295cxx_default="${cross_prefix}${cxx_default}"
4296nm_default="${cross_prefix}${nm_default}"
4297pkg_config_default="${cross_prefix}${pkg_config_default}"
4298if ${cross_prefix}${ranlib_default} 2>&1 | grep -q "\-D "; then
4299    ranlib_default="${cross_prefix}${ranlib_default} -D"
4300else
4301    ranlib_default="${cross_prefix}${ranlib_default}"
4302fi
4303strip_default="${cross_prefix}${strip_default}"
4304windres_default="${cross_prefix}${windres_default}"
4305
4306sysinclude_default="${sysroot}/usr/include"
4307
4308if enabled cuda_sdk; then
4309    warn "Option --enable-cuda-sdk is deprecated. Use --enable-cuda-nvcc instead."
4310    enable cuda_nvcc
4311fi
4312
4313if enabled cuda_nvcc; then
4314    nvcc_default="nvcc"
4315    nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
4316else
4317    nvcc_default="clang"
4318    nvccflags_default="--cuda-gpu-arch=sm_30 -O2"
4319    NVCC_C=""
4320fi
4321
4322set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
4323    target_exec x86asmexe nvcc
4324enabled cross_compile || host_cc_default=$cc
4325set_default host_cc
4326
4327pkg_config_fail_message=""
4328if ! $pkg_config --version >/dev/null 2>&1; then
4329    warn "$pkg_config not found, library detection may fail."
4330    pkg_config=false
4331elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then
4332    pkg_config_fail_message="
4333Note: When building a static binary, add --pkg-config-flags=\"--static\"."
4334fi
4335
4336if test $doxygen != $doxygen_default && \
4337  ! $doxygen --version >/dev/null 2>&1; then
4338    warn "Specified doxygen \"$doxygen\" not found, API documentation will fail to build."
4339fi
4340
4341exesuf() {
4342    case $1 in
4343        mingw32*|mingw64*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
4344    esac
4345}
4346
4347EXESUF=$(exesuf $target_os)
4348HOSTEXESUF=$(exesuf $host_os)
4349
4350# set temporary file name
4351: ${TMPDIR:=$TEMPDIR}
4352: ${TMPDIR:=$TMP}
4353: ${TMPDIR:=/tmp}
4354
4355if [ -n "$tempprefix" ] ; then
4356    mktemp(){
4357        tmpname="$tempprefix.${HOSTNAME}.${UID}"
4358        echo "$tmpname"
4359        mkdir "$tmpname"
4360    }
4361elif ! test_cmd mktemp -u XXXXXX; then
4362    # simple replacement for missing mktemp
4363    # NOT SAFE FOR GENERAL USE
4364    mktemp(){
4365        tmpname="${2%%XXX*}.${HOSTNAME}.${UID}.$$"
4366        echo "$tmpname"
4367        mkdir "$tmpname"
4368    }
4369fi
4370
4371FFTMPDIR=$(mktemp -d "${TMPDIR}/ffconf.XXXXXXXX" 2> /dev/null) ||
4372    die "Unable to create temporary directory in $TMPDIR."
4373
4374tmpfile(){
4375    tmp="${FFTMPDIR}/test"$2
4376    (set -C; exec > $tmp) 2> /dev/null ||
4377        die "Unable to create temporary file in $FFTMPDIR."
4378    eval $1=$tmp
4379}
4380
4381trap 'rm -rf -- "$FFTMPDIR"' EXIT
4382trap 'exit 2' INT
4383
4384tmpfile TMPASM .asm
4385tmpfile TMPC   .c
4386tmpfile TMPCPP .cpp
4387tmpfile TMPE   $EXESUF
4388tmpfile TMPH   .h
4389tmpfile TMPM   .m
4390tmpfile TMPCU  .cu
4391tmpfile TMPO   .o
4392tmpfile TMPS   .S
4393tmpfile TMPSH  .sh
4394tmpfile TMPV   .ver
4395
4396unset -f mktemp
4397
4398chmod +x $TMPE
4399
4400# make sure we can execute files in $TMPDIR
4401cat > $TMPSH 2>> $logfile <<EOF
4402#! /bin/sh
4403EOF
4404chmod +x $TMPSH >> $logfile 2>&1
4405if ! $TMPSH >> $logfile 2>&1; then
4406    cat <<EOF
4407Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
4408variable to another directory and make sure that it is not mounted noexec.
4409EOF
4410    die "Sanity test failed."
4411fi
4412
4413armasm_flags(){
4414    for flag; do
4415        case $flag in
4416            # Filter out MSVC cl.exe options from cflags that shouldn't
4417            # be passed to gas-preprocessor
4418            -M[TD]*)                                            ;;
4419            *)                  echo $flag                      ;;
4420        esac
4421   done
4422}
4423
4424cparser_flags(){
4425    for flag; do
4426        case $flag in
4427            -Wno-switch)             echo -Wno-switch-enum ;;
4428            -Wno-format-zero-length) ;;
4429            -Wdisabled-optimization) ;;
4430            -Wno-pointer-sign)       echo -Wno-other ;;
4431            *)                       echo $flag ;;
4432        esac
4433    done
4434}
4435
4436msvc_common_flags(){
4437    for flag; do
4438        case $flag in
4439            # In addition to specifying certain flags under the compiler
4440            # specific filters, they must be specified here as well or else the
4441            # generic catch all at the bottom will print the original flag.
4442            -Wall)                ;;
4443            -Wextra)              ;;
4444            -std=c*)              ;;
4445            # Common flags
4446            -fomit-frame-pointer) ;;
4447            -g)                   echo -Z7 ;;
4448            -fno-math-errno)      ;;
4449            -fno-common)          ;;
4450            -fno-signed-zeros)    ;;
4451            -fPIC)                ;;
4452            -mthumb)              ;;
4453            -march=*)             ;;
4454            -lz)                  echo zlib.lib ;;
4455            -lx264)               echo libx264.lib ;;
4456            -lstdc++)             ;;
4457            -l*)                  echo ${flag#-l}.lib ;;
4458            -LARGEADDRESSAWARE)   echo $flag ;;
4459            -L*)                  echo -libpath:${flag#-L} ;;
4460            -Wl,*)                ;;
4461            *)                    echo $flag ;;
4462        esac
4463    done
4464}
4465
4466msvc_flags(){
4467    msvc_common_flags "$@"
4468    for flag; do
4469        case $flag in
4470            -Wall)                echo -W3 -wd4018 -wd4146 -wd4244 -wd4305     \
4471                                       -wd4554 ;;
4472            -Wextra)              echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
4473                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
4474                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
4475                                       -wd4307 \
4476                                       -wd4273 -wd4554 -wd4701 -wd4703 ;;
4477        esac
4478    done
4479}
4480
4481icl_flags(){
4482    msvc_common_flags "$@"
4483    for flag; do
4484        case $flag in
4485            # Despite what Intel's documentation says -Wall, which is supported
4486            # on Windows, does enable remarks so disable them here.
4487            -Wall)                echo $flag -Qdiag-disable:remark ;;
4488            -std=c99)             echo -Qstd=c99 ;;
4489            -flto)                echo -ipo ;;
4490        esac
4491    done
4492}
4493
4494icc_flags(){
4495    for flag; do
4496        case $flag in
4497            -flto)                echo -ipo ;;
4498            *)                    echo $flag ;;
4499        esac
4500    done
4501}
4502
4503suncc_flags(){
4504    for flag; do
4505        case $flag in
4506            -march=*|-mcpu=*)
4507                case "${flag#*=}" in
4508                    native)                   echo -xtarget=native       ;;
4509                    v9|niagara)               echo -xarch=sparc          ;;
4510                    ultrasparc)               echo -xarch=sparcvis       ;;
4511                    ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
4512                    i586|pentium)             echo -xchip=pentium        ;;
4513                    i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
4514                    pentium3*|c3-2)           echo -xtarget=pentium3     ;;
4515                    pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
4516                    pentium4*)          echo -xtarget=pentium4           ;;
4517                    prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
4518                    *-sse3)             echo -xarch=sse3                 ;;
4519                    core2)              echo -xarch=ssse3 -xchip=core2   ;;
4520                    bonnell)                   echo -xarch=ssse3         ;;
4521                    corei7|nehalem)            echo -xtarget=nehalem     ;;
4522                    westmere)                  echo -xtarget=westmere    ;;
4523                    silvermont)                echo -xarch=sse4_2        ;;
4524                    corei7-avx|sandybridge)    echo -xtarget=sandybridge ;;
4525                    core-avx*|ivybridge|haswell|broadwell|skylake*|knl)
4526                                               echo -xarch=avx           ;;
4527                    amdfam10|barcelona)        echo -xtarget=barcelona   ;;
4528                    btver1)                    echo -xarch=amdsse4a      ;;
4529                    btver2|bdver*|znver*)      echo -xarch=avx           ;;
4530                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
4531                    k8|opteron|athlon64|athlon-fx)
4532                                               echo -xarch=sse2a         ;;
4533                    athlon*)                   echo -xarch=pentium_proa  ;;
4534                esac
4535                ;;
4536            -std=c99)             echo -xc99              ;;
4537            -fomit-frame-pointer) echo -xregs=frameptr    ;;
4538            -fPIC)                echo -KPIC -xcode=pic32 ;;
4539            -W*,*)                echo $flag              ;;
4540            -f*-*|-W*|-mimpure-text)                      ;;
4541            -shared)              echo -G                 ;;
4542            *)                    echo $flag              ;;
4543        esac
4544    done
4545}
4546
4547probe_cc(){
4548    pfx=$1
4549    _cc=$2
4550    first=$3
4551
4552    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
4553    unset _ld_o _ldflags _ld_lib _ld_path
4554    unset _depflags _DEPCMD _DEPFLAGS
4555    _flags_filter=echo
4556
4557    if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
4558        true # no-op to avoid reading stdin in following checks
4559    elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
4560        _type=llvm_gcc
4561        gcc_extra_ver=$(expr "$($_cc --version 2>/dev/null | head -n1)" : '.*\((.*)\)')
4562        _ident="llvm-gcc $($_cc -dumpversion 2>/dev/null) $gcc_extra_ver"
4563        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4564        _cflags_speed='-O3'
4565        _cflags_size='-Os'
4566    elif $_cc -v 2>&1 | grep -qi ^gcc; then
4567        _type=gcc
4568        gcc_version=$($_cc --version | head -n1)
4569        gcc_basever=$($_cc -dumpversion)
4570        gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
4571        gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
4572        _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
4573        case $gcc_basever in
4574            2) ;;
4575            2.*) ;;
4576            *) _depflags='-MMD -MF $(@:.o=.d) -MT $@' ;;
4577        esac
4578        if [ "$first" = true ]; then
4579            case $gcc_basever in
4580                4.2*)
4581                warn "gcc 4.2 is outdated and may miscompile FFmpeg. Please use a newer compiler." ;;
4582            esac
4583        fi
4584        _cflags_speed='-O3'
4585        _cflags_size='-Os'
4586    elif $_cc --version 2>/dev/null | grep -q ^icc; then
4587        _type=icc
4588        _ident=$($_cc --version | head -n1)
4589        _depflags='-MMD'
4590        _cflags_speed='-O3'
4591        _cflags_size='-Os'
4592        _cflags_noopt='-O1'
4593        _flags_filter=icc_flags
4594    elif $_cc -v 2>&1 | grep -q xlc; then
4595        _type=xlc
4596        _ident=$($_cc -qversion 2>/dev/null | head -n1)
4597        _cflags_speed='-O5'
4598        _cflags_size='-O5 -qcompact'
4599    elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
4600        test -d "$sysroot" || die "No valid sysroot specified."
4601        _type=armcc
4602        _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
4603        armcc_conf="$PWD/armcc.conf"
4604        $_cc --arm_linux_configure                 \
4605             --arm_linux_config_file="$armcc_conf" \
4606             --configure_sysroot="$sysroot"        \
4607             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
4608             die "Error creating armcc configuration file."
4609        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
4610        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
4611        as_default="${cross_prefix}gcc"
4612        _depflags='-MMD'
4613        _cflags_speed='-O3'
4614        _cflags_size='-Os'
4615    elif $_cc -v 2>&1 | grep -q clang && ! $_cc -? > /dev/null 2>&1; then
4616        _type=clang
4617        _ident=$($_cc --version 2>/dev/null | head -n1)
4618        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4619        _cflags_speed='-O3'
4620        _cflags_size='-Oz'
4621    elif $_cc -V 2>&1 | grep -q Sun; then
4622        _type=suncc
4623        _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
4624        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
4625        _DEPFLAGS='-xM1 -xc99'
4626        _ldflags='-std=c99'
4627        _cflags_speed='-O5'
4628        _cflags_size='-O5 -xspace'
4629        _flags_filter=suncc_flags
4630    elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
4631        _type=pathscale
4632        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
4633        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4634        _cflags_speed='-O2'
4635        _cflags_size='-Os'
4636        _flags_filter='filter_out -Wdisabled-optimization'
4637    elif $_cc -v 2>&1 | grep -q Open64; then
4638        _type=open64
4639        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
4640        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4641        _cflags_speed='-O2'
4642        _cflags_size='-Os'
4643        _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
4644    elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
4645        _type=armasm
4646        _ident=$($_cc | head -n1)
4647        # 4509: "This form of conditional instruction is deprecated"
4648        _flags="-nologo -ignore 4509"
4649        _flags_filter=armasm_flags
4650    elif $_cc 2>&1 | grep -q Intel; then
4651        _type=icl
4652        _ident=$($_cc 2>&1 | head -n1)
4653        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
4654        # Not only is O3 broken on 13.x+ but it is slower on all previous
4655        # versions (tested) as well.
4656        _cflags_speed="-O2"
4657        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
4658        if $_cc 2>&1 | grep -q Linker; then
4659            _ld_o='-out:$@'
4660        else
4661            _ld_o='-Fe$@'
4662        fi
4663        _cc_o='-Fo$@'
4664        _cc_e='-P'
4665        _flags_filter=icl_flags
4666        _ld_lib='lib%.a'
4667        _ld_path='-libpath:'
4668        # -Qdiag-error to make icl error when seeing certain unknown arguments
4669        _flags='-nologo -Qdiag-error:4044,10157'
4670        # -Qvec- -Qsimd- to prevent miscompilation, -GS, fp:precise for consistency
4671        # with MSVC which enables it by default.
4672        _cflags='-Qms0 -Qvec- -Qsimd- -GS -fp:precise'
4673        disable stripping
4674    elif $_cc -? 2>/dev/null | grep -q 'LLVM.*Linker'; then
4675        # lld can emulate multiple different linkers; in ms link.exe mode,
4676        # the -? parameter gives the help output which contains an identifyable
4677        # string, while it gives an error in other modes.
4678        _type=lld-link
4679        # The link.exe mode doesn't have a switch for getting the version,
4680        # but we can force it back to gnu mode and get the version from there.
4681        _ident=$($_cc -flavor gnu --version 2>/dev/null)
4682        _ld_o='-out:$@'
4683        _flags_filter=msvc_flags
4684        _ld_lib='lib%.a'
4685        _ld_path='-libpath:'
4686    elif $_cc -nologo- 2>&1 | grep -q Microsoft || { $_cc -v 2>&1 | grep -q clang && $_cc -? > /dev/null 2>&1; }; then
4687        _type=msvc
4688        if $_cc -nologo- 2>&1 | grep -q Microsoft; then
4689            _ident=$($_cc 2>&1 | head -n1 | tr -d '\r')
4690        else
4691            _ident=$($_cc --version 2>/dev/null | head -n1 | tr -d '\r')
4692        fi
4693        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
4694        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
4695        _cflags_speed="-O2"
4696        _cflags_size="-O1"
4697        _cflags_noopt="-O1"
4698        if $_cc -nologo- 2>&1 | grep -q Linker; then
4699            _ld_o='-out:$@'
4700        else
4701            _ld_o='-Fe$@'
4702        fi
4703        _cc_o='-Fo$@'
4704        _cc_e='-P -Fi$@'
4705        _flags_filter=msvc_flags
4706        _ld_lib='lib%.a'
4707        _ld_path='-libpath:'
4708        _flags='-nologo'
4709        disable stripping
4710    elif $_cc --version 2>/dev/null | grep -q ^cparser; then
4711        _type=cparser
4712        _ident=$($_cc --version | head -n1)
4713        _depflags='-MMD'
4714        _cflags_speed='-O4'
4715        _cflags_size='-O2'
4716        _flags_filter=cparser_flags
4717    fi
4718
4719    eval ${pfx}_type=\$_type
4720    eval ${pfx}_ident=\$_ident
4721}
4722
4723set_ccvars(){
4724    eval ${1}_C=\${_cc_c-\${${1}_C}}
4725    eval ${1}_E=\${_cc_e-\${${1}_E}}
4726    eval ${1}_O=\${_cc_o-\${${1}_O}}
4727
4728    if [ -n "$_depflags" ]; then
4729        eval ${1}_DEPFLAGS=\$_depflags
4730    else
4731        eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
4732        eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
4733        eval DEP${1}FLAGS=\$_flags
4734    fi
4735}
4736
4737probe_cc cc "$cc" "true"
4738cflags_filter=$_flags_filter
4739cflags_speed=$_cflags_speed
4740cflags_size=$_cflags_size
4741cflags_noopt=$_cflags_noopt
4742add_cflags $_flags $_cflags
4743cc_ldflags=$_ldflags
4744set_ccvars CC
4745set_ccvars CXX
4746
4747probe_cc hostcc "$host_cc"
4748host_cflags_filter=$_flags_filter
4749host_cflags_speed=$_cflags_speed
4750add_host_cflags  $_flags $_cflags
4751set_ccvars HOSTCC
4752
4753test -n "$cc_type" && enable $cc_type ||
4754    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
4755
4756: ${as_default:=$cc}
4757: ${objcc_default:=$cc}
4758: ${dep_cc_default:=$cc}
4759: ${ld_default:=$cc}
4760: ${host_ld_default:=$host_cc}
4761set_default ar as objcc dep_cc ld ln_s host_ld windres
4762
4763probe_cc as "$as"
4764asflags_filter=$_flags_filter
4765add_asflags $_flags $_cflags
4766set_ccvars AS
4767
4768probe_cc objcc "$objcc"
4769objcflags_filter=$_flags_filter
4770add_objcflags $_flags $_cflags
4771set_ccvars OBJC
4772
4773probe_cc ld "$ld"
4774ldflags_filter=$_flags_filter
4775add_ldflags $_flags $_ldflags
4776test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
4777LD_O=${_ld_o-$LD_O}
4778LD_LIB=${_ld_lib-$LD_LIB}
4779LD_PATH=${_ld_path-$LD_PATH}
4780
4781probe_cc hostld "$host_ld"
4782host_ldflags_filter=$_flags_filter
4783add_host_ldflags $_flags $_ldflags
4784HOSTLD_O=${_ld_o-$HOSTLD_O}
4785
4786if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
4787    probe_cc depcc "$dep_cc"
4788    CCDEP=${_DEPCMD:-$DEPCMD}
4789    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
4790    DEPCCFLAGS=$_flags
4791fi
4792
4793if $ar 2>&1 | grep -q Microsoft; then
4794    arflags="-nologo"
4795    ar_o='-out:$@'
4796elif $ar 2>&1 | grep -q "\[D\] "; then
4797    arflags="rcD"
4798    ar_o='$@'
4799else
4800    arflags="rc"
4801    ar_o='$@'
4802fi
4803
4804add_cflags $extra_cflags
4805add_cxxflags $extra_cxxflags
4806add_objcflags $extra_objcflags
4807add_asflags $extra_cflags
4808
4809if test -n "$sysroot"; then
4810    case "$cc_type" in
4811        gcc|llvm_gcc|clang)
4812            add_cppflags --sysroot="$sysroot"
4813            add_ldflags --sysroot="$sysroot"
4814        ;;
4815    esac
4816fi
4817
4818if test "$cpu" = host; then
4819    enabled cross_compile &&
4820        warn "--cpu=host makes no sense when cross-compiling."
4821
4822    case "$cc_type" in
4823        gcc|llvm_gcc)
4824            check_native(){
4825                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
4826                sed -n "/cc1.*$1=/{
4827                            s/.*$1=\\([^ ]*\\).*/\\1/
4828                            p
4829                            q
4830                        }" $TMPE
4831            }
4832            cpu=$(check_native -march || check_native -mcpu)
4833        ;;
4834        clang)
4835            check_native(){
4836                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
4837                sed -n "/cc1.*-target-cpu /{
4838                            s/.*-target-cpu \\([^ ]*\\).*/\\1/
4839                            p
4840                            q
4841                        }" $TMPE
4842            }
4843            cpu=$(check_native -march)
4844        ;;
4845    esac
4846
4847    test "${cpu:-host}" = host &&
4848        die "--cpu=host not supported with compiler $cc"
4849fi
4850
4851# Deal with common $arch aliases
4852case "$arch" in
4853    aarch64|arm64)
4854        arch="aarch64"
4855    ;;
4856    arm*|iPad*|iPhone*)
4857        arch="arm"
4858    ;;
4859    mips*|IP*)
4860        case "$arch" in
4861        *el)
4862            add_cppflags -EL
4863            add_ldflags -EL
4864        ;;
4865        *eb)
4866            add_cppflags -EB
4867            add_ldflags -EB
4868        ;;
4869        esac
4870        arch="mips"
4871    ;;
4872    parisc*|hppa*)
4873        arch="parisc"
4874    ;;
4875    "Power Macintosh"|ppc*|powerpc*)
4876        arch="ppc"
4877    ;;
4878    s390|s390x)
4879        arch="s390"
4880    ;;
4881    sh4|sh)
4882        arch="sh4"
4883    ;;
4884    sun4*|sparc*)
4885        arch="sparc"
4886    ;;
4887    tilegx|tile-gx)
4888        arch="tilegx"
4889    ;;
4890    i[3-6]86*|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
4891        arch="x86"
4892    ;;
4893esac
4894
4895is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
4896enable $arch
4897
4898# Add processor-specific flags
4899if enabled aarch64; then
4900
4901    case $cpu in
4902        armv*)
4903            cpuflags="-march=$cpu"
4904        ;;
4905        *)
4906            cpuflags="-mcpu=$cpu"
4907        ;;
4908    esac
4909
4910elif enabled alpha; then
4911
4912    cpuflags="-mcpu=$cpu"
4913
4914elif enabled arm; then
4915
4916    check_arm_arch() {
4917        test_cpp_condition stddef.h \
4918            "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
4919            $cpuflags
4920    }
4921
4922    probe_arm_arch() {
4923        if   check_arm_arch 4;        then echo armv4
4924        elif check_arm_arch 4T;       then echo armv4t
4925        elif check_arm_arch 5;        then echo armv5
4926        elif check_arm_arch 5E;       then echo armv5e
4927        elif check_arm_arch 5T;       then echo armv5t
4928        elif check_arm_arch 5TE;      then echo armv5te
4929        elif check_arm_arch 5TEJ;     then echo armv5te
4930        elif check_arm_arch 6;        then echo armv6
4931        elif check_arm_arch 6J;       then echo armv6j
4932        elif check_arm_arch 6K;       then echo armv6k
4933        elif check_arm_arch 6Z;       then echo armv6z
4934        elif check_arm_arch 6KZ;      then echo armv6zk
4935        elif check_arm_arch 6ZK;      then echo armv6zk
4936        elif check_arm_arch 6T2;      then echo armv6t2
4937        elif check_arm_arch 7;        then echo armv7
4938        elif check_arm_arch 7A  7_A;  then echo armv7-a
4939        elif check_arm_arch 7S;       then echo armv7-a
4940        elif check_arm_arch 7R  7_R;  then echo armv7-r
4941        elif check_arm_arch 7M  7_M;  then echo armv7-m
4942        elif check_arm_arch 7EM 7E_M; then echo armv7-m
4943        elif check_arm_arch 8A  8_A;  then echo armv8-a
4944        fi
4945    }
4946
4947    [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
4948
4949    case $cpu in
4950        armv*)
4951            cpuflags="-march=$cpu"
4952            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
4953        ;;
4954        *)
4955            cpuflags="-mcpu=$cpu"
4956            case $cpu in
4957                cortex-a*)                               subarch=armv7a  ;;
4958                cortex-r*)                               subarch=armv7r  ;;
4959                cortex-m*)                 enable thumb; subarch=armv7m  ;;
4960                arm11*)                                  subarch=armv6   ;;
4961                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
4962                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
4963                *)                             subarch=$(probe_arm_arch) ;;
4964            esac
4965        ;;
4966    esac
4967
4968    case "$subarch" in
4969        armv5t*)    enable fast_clz                ;;
4970        armv[6-8]*)
4971            enable fast_clz
4972            disabled fast_unaligned || enable fast_unaligned
4973            ;;
4974    esac
4975
4976elif enabled avr32; then
4977
4978    case $cpu in
4979        ap7[02]0[0-2])
4980            subarch="avr32_ap"
4981            cpuflags="-mpart=$cpu"
4982        ;;
4983        ap)
4984            subarch="avr32_ap"
4985            cpuflags="-march=$cpu"
4986        ;;
4987        uc3[ab]*)
4988            subarch="avr32_uc"
4989            cpuflags="-mcpu=$cpu"
4990        ;;
4991        uc)
4992            subarch="avr32_uc"
4993            cpuflags="-march=$cpu"
4994        ;;
4995    esac
4996
4997elif enabled bfin; then
4998
4999    cpuflags="-mcpu=$cpu"
5000
5001elif enabled mips; then
5002
5003    cpuflags="-march=$cpu"
5004
5005    if [ "$cpu" != "generic" ]; then
5006        disable mips32r2
5007        disable mips32r5
5008        disable mips64r2
5009        disable mips32r6
5010        disable mips64r6
5011        disable loongson2
5012        disable loongson3
5013
5014        case $cpu in
5015            24kc|24kf*|24kec|34kc|1004kc|24kef*|34kf*|1004kf*|74kc|74kf)
5016                enable mips32r2
5017                disable msa
5018            ;;
5019            p5600|i6400|p6600)
5020                disable mipsdsp
5021                disable mipsdspr2
5022            ;;
5023            loongson*)
5024                enable loongson2
5025                enable loongson3
5026                enable local_aligned
5027                enable simd_align_16
5028                enable fast_64bit
5029                enable fast_clz
5030                enable fast_cmov
5031                enable fast_unaligned
5032                disable aligned_stack
5033                disable mipsdsp
5034                disable mipsdspr2
5035                # When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
5036                if [ $cc == gcc ]; then
5037                    gcc_version=$(gcc -dumpversion)
5038                    if [ "$(echo "$gcc_version 5.3.0" | tr " " "\n" | sort -rV | head -n 1)" == "$gcc_version" ]; then
5039                        expensive_optimization_flag=""
5040                    else
5041                        expensive_optimization_flag="-fno-expensive-optimizations"
5042                    fi
5043                fi
5044                case $cpu in
5045                    loongson3*)
5046                        cpuflags="-march=loongson3a -mhard-float $expensive_optimization_flag"
5047                    ;;
5048                    loongson2e)
5049                        cpuflags="-march=loongson2e -mhard-float $expensive_optimization_flag"
5050                    ;;
5051                    loongson2f)
5052                        cpuflags="-march=loongson2f -mhard-float $expensive_optimization_flag"
5053                    ;;
5054                esac
5055            ;;
5056            *)
5057                # Unknown CPU. Disable everything.
5058                warn "unknown CPU. Disabling all MIPS optimizations."
5059                disable mipsfpu
5060                disable mipsdsp
5061                disable mipsdspr2
5062                disable msa
5063                disable mmi
5064            ;;
5065        esac
5066
5067        case $cpu in
5068            24kc)
5069                disable mipsfpu
5070                disable mipsdsp
5071                disable mipsdspr2
5072            ;;
5073            24kf*)
5074                disable mipsdsp
5075                disable mipsdspr2
5076            ;;
5077            24kec|34kc|1004kc)
5078                disable mipsfpu
5079                disable mipsdspr2
5080            ;;
5081            24kef*|34kf*|1004kf*)
5082                disable mipsdspr2
5083            ;;
5084            74kc)
5085                disable mipsfpu
5086            ;;
5087            p5600)
5088                enable mips32r5
5089                check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
5090            ;;
5091            i6400)
5092                enable mips64r6
5093                check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
5094            ;;
5095            p6600)
5096                enable mips64r6
5097                check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
5098            ;;
5099        esac
5100    else
5101        # We do not disable anything. Is up to the user to disable the unwanted features.
5102        warn 'generic cpu selected'
5103    fi
5104
5105elif enabled ppc; then
5106
5107    disable ldbrx
5108
5109    case $(tolower $cpu) in
5110        601|ppc601|powerpc601)
5111            cpuflags="-mcpu=601"
5112            disable altivec
5113        ;;
5114        603*|ppc603*|powerpc603*)
5115            cpuflags="-mcpu=603"
5116            disable altivec
5117        ;;
5118        604*|ppc604*|powerpc604*)
5119            cpuflags="-mcpu=604"
5120            disable altivec
5121        ;;
5122        g3|75*|ppc75*|powerpc75*)
5123            cpuflags="-mcpu=750"
5124            disable altivec
5125        ;;
5126        g4|745*|ppc745*|powerpc745*)
5127            cpuflags="-mcpu=7450"
5128            disable vsx
5129        ;;
5130        74*|ppc74*|powerpc74*)
5131            cpuflags="-mcpu=7400"
5132            disable vsx
5133        ;;
5134        g5|970|ppc970|powerpc970)
5135            cpuflags="-mcpu=970"
5136            disable vsx
5137        ;;
5138        power[3-6]*)
5139            cpuflags="-mcpu=$cpu"
5140            disable vsx
5141        ;;
5142        power[7-8]*)
5143            cpuflags="-mcpu=$cpu"
5144        ;;
5145        cell)
5146            cpuflags="-mcpu=cell"
5147            enable ldbrx
5148            disable vsx
5149        ;;
5150        e500mc)
5151            cpuflags="-mcpu=e500mc"
5152            disable altivec
5153        ;;
5154        e500v2)
5155            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
5156            disable altivec
5157            disable dcbzl
5158        ;;
5159        e500)
5160            cpuflags="-mcpu=8540 -mhard-float"
5161            disable altivec
5162            disable dcbzl
5163        ;;
5164    esac
5165
5166elif enabled sparc; then
5167
5168    case $cpu in
5169        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
5170            cpuflags="-mcpu=$cpu"
5171        ;;
5172        ultrasparc*|niagara[234])
5173            cpuflags="-mcpu=$cpu"
5174        ;;
5175    esac
5176
5177elif enabled x86; then
5178
5179    case $cpu in
5180        i[345]86|pentium)
5181            cpuflags="-march=$cpu"
5182            disable i686
5183            disable mmx
5184        ;;
5185        # targets that do NOT support nopl and conditional mov (cmov)
5186        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
5187            cpuflags="-march=$cpu"
5188            disable i686
5189        ;;
5190        # targets that do support nopl and conditional mov (cmov)
5191        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx\
5192        |core*|atom|bonnell|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|skylake*|knl\
5193        |amdfam10|barcelona|b[dt]ver*|znver*)
5194            cpuflags="-march=$cpu"
5195            enable i686
5196            enable fast_cmov
5197        ;;
5198        # targets that do support conditional mov but on which it's slow
5199        pentium4|pentium4m|prescott|nocona)
5200            cpuflags="-march=$cpu"
5201            enable i686
5202            disable fast_cmov
5203        ;;
5204    esac
5205
5206fi
5207
5208if [ "$cpu" != generic ]; then
5209    add_cflags  $cpuflags
5210    add_asflags $cpuflags
5211    test "$cc_type" = "$ld_type" && add_ldflags $cpuflags
5212fi
5213
5214# compiler sanity check
5215test_exec <<EOF
5216int main(void){ return 0; }
5217EOF
5218if test "$?" != 0; then
5219    echo "$cc is unable to create an executable file."
5220    if test -z "$cross_prefix" && ! enabled cross_compile ; then
5221        echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
5222        echo "Only do this if you know what cross compiling means."
5223    fi
5224    die "C compiler test failed."
5225fi
5226
5227add_cppflags -D_ISOC99_SOURCE
5228add_cxxflags -D__STDC_CONSTANT_MACROS
5229check_cxxflags -std=c++11 || check_cxxflags -std=c++0x
5230
5231# some compilers silently accept -std=c11, so we also need to check that the
5232# version macro is defined properly
5233test_cflags_cc -std=c11 ctype.h "__STDC_VERSION__ >= 201112L" &&
5234    add_cflags -std=c11 ||
5235    check_cflags -std=c99
5236
5237check_cppflags -D_FILE_OFFSET_BITS=64
5238check_cppflags -D_LARGEFILE_SOURCE
5239
5240add_host_cppflags -D_ISOC99_SOURCE
5241check_host_cflags -std=c99
5242check_host_cflags -Wall
5243check_host_cflags $host_cflags_speed
5244
5245check_64bit(){
5246    arch32=$1
5247    arch64=$2
5248    expr=${3:-'sizeof(void *) > 4'}
5249    test_code cc "" "int test[2*($expr) - 1]" &&
5250        subarch=$arch64 || subarch=$arch32
5251    enable $subarch
5252}
5253
5254case "$arch" in
5255    aarch64|alpha|ia64)
5256        enabled shared && enable_weak pic
5257    ;;
5258    mips)
5259        check_64bit mips mips64 '_MIPS_SIM > 1'
5260        enabled shared && enable_weak pic
5261    ;;
5262    parisc)
5263        check_64bit parisc parisc64
5264        enabled shared && enable_weak pic
5265    ;;
5266    ppc)
5267        check_64bit ppc ppc64
5268        enabled shared && enable_weak pic
5269    ;;
5270    s390)
5271        check_64bit s390 s390x
5272        enabled shared && enable_weak pic
5273    ;;
5274    sparc)
5275        check_64bit sparc sparc64
5276        enabled shared && enable_weak pic
5277    ;;
5278    x86)
5279        check_64bit x86_32 x86_64
5280        # Treat x32 as x64 for now. Note it also needs pic if shared
5281        test "$subarch" = "x86_32" && test_cpp_condition stddef.h 'defined(__x86_64__)' &&
5282            subarch=x86_64 && enable x86_64 && disable x86_32
5283        if enabled x86_64; then
5284            enabled shared && enable_weak pic
5285            objformat=elf64
5286        fi
5287    ;;
5288esac
5289
5290# OS specific
5291case $target_os in
5292    aix)
5293        SHFLAGS=-shared
5294        add_cppflags '-I\$(SRC_PATH)/compat/aix'
5295        enabled shared && add_ldflags -Wl,-brtl
5296        arflags='-Xany -r -c'
5297        striptype=""
5298        ;;
5299    android)
5300        disable symver
5301        enable section_data_rel_ro
5302        add_cflags -fPIE
5303        add_ldexeflags -fPIE -pie
5304        SLIB_INSTALL_NAME='$(SLIBNAME)'
5305        SLIB_INSTALL_LINKS=
5306        SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'
5307        ;;
5308    haiku)
5309        prefix_default="/boot/common"
5310        network_extralibs="-lnetwork"
5311        host_extralibs=
5312        ;;
5313    sunos)
5314        SHFLAGS='-shared -Wl,-h,$$(@F)'
5315        enabled x86 && append SHFLAGS -mimpure-text
5316        network_extralibs="-lsocket -lnsl"
5317        add_cppflags -D__EXTENSIONS__
5318        # When using suncc to build, the Solaris linker will mark
5319        # an executable with each instruction set encountered by
5320        # the Solaris assembler.  As our libraries contain their own
5321        # guards for processor-specific code, instead suppress
5322        # generation of the HWCAPS ELF section on Solaris x86 only.
5323        enabled_all suncc x86 &&
5324            echo "hwcap_1 = OVERRIDE;" > mapfile &&
5325            add_ldflags -Wl,-M,mapfile
5326        nm_default='nm -P -g'
5327        striptype=""
5328        version_script='-M'
5329        VERSION_SCRIPT_POSTPROCESS_CMD='perl $(SRC_PATH)/compat/solaris/make_sunver.pl - $(OBJS)'
5330        ;;
5331    netbsd)
5332        disable symver
5333        oss_indev_extralibs="-lossaudio"
5334        oss_outdev_extralibs="-lossaudio"
5335        enabled gcc || check_ldflags -Wl,-zmuldefs
5336        ;;
5337    openbsd|bitrig)
5338        disable symver
5339        enable section_data_rel_ro
5340        striptype=""
5341        SHFLAGS='-shared'
5342        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
5343        SLIB_INSTALL_LINKS=
5344        oss_indev_extralibs="-lossaudio"
5345        oss_outdev_extralibs="-lossaudio"
5346        ;;
5347    dragonfly)
5348        disable symver
5349        ;;
5350    freebsd)
5351        ;;
5352    bsd/os)
5353        add_extralibs -lpoll -lgnugetopt
5354        strip="strip -d"
5355        ;;
5356    darwin)
5357        enabled ppc && add_asflags -force_cpusubtype_ALL
5358        install_name_dir_default='$(SHLIBDIR)'
5359        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(INSTALL_NAME_DIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
5360        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
5361        strip="${strip} -x"
5362        add_ldflags -Wl,-dynamic,-search_paths_first
5363        check_cflags -Werror=partial-availability
5364        SLIBSUF=".dylib"
5365        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
5366        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
5367        enabled x86_64 && objformat="macho64" || objformat="macho32"
5368        enabled_any pic shared x86_64 ||
5369            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
5370        check_headers dispatch/dispatch.h &&
5371            add_cppflags '-I\$(SRC_PATH)/compat/dispatch_semaphore'
5372        if test -n "$sysroot"; then
5373            is_in -isysroot $cc $CPPFLAGS $CFLAGS || check_cppflags -isysroot $sysroot
5374            is_in -isysroot $ld $LDFLAGS          || check_ldflags  -isysroot $sysroot
5375        fi
5376        version_script='-exported_symbols_list'
5377        VERSION_SCRIPT_POSTPROCESS_CMD='tr " " "\n" | sed -n /global:/,/local:/p | grep ";" | tr ";" "\n" | sed -E "s/(.+)/_\1/g" | sed -E "s/(.+[^*])$$$$/\1*/"'
5378        # Workaround for Xcode 11 -fstack-check bug
5379        if enabled clang; then
5380            clang_version=$($cc -dumpversion)
5381            test ${clang_version%%.*} -eq 11 && add_cflags -fno-stack-check
5382        fi
5383        ;;
5384    msys*)
5385        die "Native MSYS builds are discouraged, please use the MINGW environment."
5386        ;;
5387    mingw32*|mingw64*)
5388        target_os=mingw32
5389        LIBTARGET=i386
5390        if enabled x86_64; then
5391            LIBTARGET="i386:x86-64"
5392        elif enabled arm; then
5393            LIBTARGET="arm"
5394        elif enabled aarch64; then
5395            LIBTARGET="arm64"
5396        fi
5397        if enabled shared; then
5398            # Cannot build both shared and static libs when using dllimport.
5399            disable static
5400        fi
5401        enabled shared && ! enabled small && test_cmd $windres --version && enable gnu_windres
5402        enabled x86_32 && check_ldflags -Wl,--large-address-aware
5403        shlibdir_default="$bindir_default"
5404        SLIBPREF=""
5405        SLIBSUF=".dll"
5406        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5407        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5408        if test_cmd lib.exe -list; then
5409            SLIB_EXTRA_CMD=-'lib.exe -nologo -machine:$(LIBTARGET) -def:$$(@:$(SLIBSUF)=.def) -out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
5410            if enabled x86_64; then
5411                LIBTARGET=x64
5412            fi
5413        else
5414            SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
5415        fi
5416        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5417        SLIB_INSTALL_LINKS=
5418        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
5419        SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
5420        SLIB_CREATE_DEF_CMD='EXTERN_PREFIX="$(EXTERN_PREFIX)" AR="$(AR_CMD)" NM="$(NM_CMD)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
5421        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--disable-auto-image-base $$(@:$(SLIBSUF)=.def)'
5422        enabled x86_64 && objformat="win64" || objformat="win32"
5423        dlltool="${cross_prefix}dlltool"
5424        ranlib=:
5425        enable dos_paths
5426        check_ldflags -Wl,--nxcompat,--dynamicbase
5427        # Lets work around some stupidity in binutils.
5428        # ld will strip relocations from executables even though we need them
5429        # for dynamicbase (ASLR).  Using -pie does retain the reloc section
5430        # however ld then forgets what the entry point should be (oops) so we
5431        # have to manually (re)set it.
5432        if enabled x86_32; then
5433            disabled debug && add_ldexeflags -Wl,--pic-executable,-e,_mainCRTStartup
5434        elif enabled x86_64; then
5435            disabled debug && add_ldexeflags -Wl,--pic-executable,-e,mainCRTStartup
5436            check_ldflags -Wl,--high-entropy-va # binutils 2.25
5437            # Set image base >4GB for extra entropy with HEASLR
5438            add_ldexeflags -Wl,--image-base,0x140000000
5439            append SHFLAGS -Wl,--image-base,0x180000000
5440        fi
5441        ;;
5442    win32|win64)
5443        disable symver
5444        if enabled shared; then
5445            # Link to the import library instead of the normal static library
5446            # for shared libs.
5447            LD_LIB='%.lib'
5448            # Cannot build both shared and static libs with MSVC or icl.
5449            disable static
5450        fi
5451        enabled x86_32 && check_ldflags -LARGEADDRESSAWARE
5452        shlibdir_default="$bindir_default"
5453        SLIBPREF=""
5454        SLIBSUF=".dll"
5455        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5456        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5457        SLIB_CREATE_DEF_CMD='EXTERN_PREFIX="$(EXTERN_PREFIX)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
5458        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5459        SLIB_INSTALL_LINKS=
5460        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
5461        SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
5462        SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
5463        enabled x86_64 && objformat="win64" || objformat="win32"
5464        ranlib=:
5465        enable dos_paths
5466        ;;
5467    cygwin*)
5468        target_os=cygwin
5469        shlibdir_default="$bindir_default"
5470        SLIBPREF="cyg"
5471        SLIBSUF=".dll"
5472        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5473        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5474        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5475        SLIB_INSTALL_LINKS=
5476        SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
5477        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
5478        enabled x86_64 && objformat="win64" || objformat="win32"
5479        enable dos_paths
5480        enabled shared && ! enabled small && test_cmd $windres --version && enable gnu_windres
5481        add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5482        ;;
5483    *-dos|freedos|opendos)
5484        network_extralibs="-lsocket"
5485        objformat="coff"
5486        enable dos_paths
5487        ;;
5488    linux)
5489        enable section_data_rel_ro
5490        enabled_any arm aarch64 && enable_weak linux_perf
5491        ;;
5492    irix*)
5493        target_os=irix
5494        ranlib="echo ignoring ranlib"
5495        ;;
5496    os/2*)
5497        strip="lxlite -CS"
5498        striptype=""
5499        objformat="aout"
5500        add_cppflags -D_GNU_SOURCE
5501        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zhigh-mem -Zmap
5502        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
5503        LIBSUF="_s.a"
5504        SLIBPREF=""
5505        SLIBSUF=".dll"
5506        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5507        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(FULLNAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
5508        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(FULLNAME).def; \
5509            echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(FULLNAME).def; \
5510            echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(FULLNAME).def; \
5511            echo EXPORTS >> $(SUBDIR)$(FULLNAME).def; \
5512            emxexp $(OBJS) >> $(SUBDIR)$(FULLNAME).def'
5513        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(FULLNAME)_dll.a $(SUBDIR)$(FULLNAME).def; \
5514            emximp -o $(SUBDIR)$(LIBPREF)$(FULLNAME)_dll.lib $(SUBDIR)$(FULLNAME).def;'
5515        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5516        SLIB_INSTALL_LINKS=
5517        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(FULLNAME)_dll.a $(LIBPREF)$(FULLNAME)_dll.lib'
5518        enable dos_paths
5519        enable_weak os2threads
5520        ;;
5521    gnu/kfreebsd)
5522        add_cppflags -D_BSD_SOURCE
5523        ;;
5524    gnu)
5525        ;;
5526    qnx)
5527        add_cppflags -D_QNX_SOURCE
5528        network_extralibs="-lsocket"
5529        ;;
5530    symbian)
5531        SLIBSUF=".dll"
5532        enable dos_paths
5533        add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
5534        add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
5535        add_ldflags -Wl,--target1-abs,--no-undefined \
5536                    -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
5537                    -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
5538        add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
5539                      -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
5540                      -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
5541        ;;
5542    minix)
5543        ;;
5544    none)
5545        ;;
5546    *)
5547        die "Unknown OS '$target_os'."
5548        ;;
5549esac
5550
5551# test if creating links works
5552link_dest=$(mktemp -u $TMPDIR/dest_XXXXXXXX)
5553link_name=$(mktemp -u $TMPDIR/name_XXXXXXXX)
5554mkdir "$link_dest"
5555$ln_s "$link_dest" "$link_name"
5556touch "$link_dest/test_file"
5557if [ "$source_path" != "." ] && [ "$source_path" != "src" ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then
5558    # create link to source path
5559    [ -e src ] && rm src
5560    $ln_s "$source_path" src
5561    source_link=src
5562else
5563    # creating directory links doesn't work
5564    # fall back to using the full source path
5565    source_link="$source_path"
5566fi
5567# cleanup
5568rm -r "$link_dest"
5569rm -r "$link_name"
5570
5571# determine libc flavour
5572
5573probe_libc(){
5574    pfx=$1
5575    pfx_no_=${pfx%_}
5576    # uclibc defines __GLIBC__, so it needs to be checked before glibc.
5577    if test_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
5578        eval ${pfx}libc_type=uclibc
5579        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5580    elif test_${pfx}cpp_condition features.h "defined __GLIBC__"; then
5581        eval ${pfx}libc_type=glibc
5582        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5583    # MinGW headers can be installed on Cygwin, so check for newlib first.
5584    elif test_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
5585        eval ${pfx}libc_type=newlib
5586        add_${pfx}cppflags -U__STRICT_ANSI__ -D_XOPEN_SOURCE=600
5587    # MinGW64 is backwards compatible with MinGW32, so check for it first.
5588    elif test_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
5589        eval ${pfx}libc_type=mingw64
5590        if test_${pfx}cpp_condition _mingw.h "__MINGW64_VERSION_MAJOR < 3"; then
5591            add_compat msvcrt/snprintf.o
5592            add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
5593        fi
5594        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
5595        eval test \$${pfx_no_}cc_type = "gcc" &&
5596            add_${pfx}cppflags -D__printf__=__gnu_printf__
5597        test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
5598            add_${pfx}cppflags -D_WIN32_WINNT=0x0600
5599        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5600    elif test_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
5601         test_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
5602        eval ${pfx}libc_type=mingw32
5603        test_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
5604            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
5605            die "ERROR: MinGW32 runtime version must be >= 3.15."
5606        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
5607        test_${pfx}cpp_condition _mingw.h "__MSVCRT_VERSION__ < 0x0700" &&
5608            add_${pfx}cppflags -D__MSVCRT_VERSION__=0x0700
5609        test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
5610            add_${pfx}cppflags -D_WIN32_WINNT=0x0600
5611        eval test \$${pfx_no_}cc_type = "gcc" &&
5612            add_${pfx}cppflags -D__printf__=__gnu_printf__
5613        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5614    elif test_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
5615        eval ${pfx}libc_type=msvcrt
5616        if test_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then
5617            if [ "$pfx" = host_ ]; then
5618                add_host_cppflags -Dsnprintf=_snprintf
5619            else
5620                add_compat strtod.o strtod=avpriv_strtod
5621                add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
5622                                             _snprintf=avpriv_snprintf  \
5623                                             vsnprintf=avpriv_vsnprintf
5624            fi
5625        fi
5626        add_${pfx}cppflags -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS
5627        # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
5628        # 0x601 by default unless something else is set by the user.
5629        # This can easily lead to us detecting functions only present
5630        # in such new versions and producing binaries requiring windows 7.0.
5631        # Therefore explicitly set the default to Vista unless the user has
5632        # set something else on the command line.
5633        # Don't do this if WINAPI_FAMILY is set and is set to a non-desktop
5634        # family. For these cases, configure is free to use any functions
5635        # found in the SDK headers by default. (Alternatively, we could force
5636        # _WIN32_WINNT to 0x0602 in that case.)
5637        test_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
5638            { test_${pfx}cpp <<EOF && add_${pfx}cppflags -D_WIN32_WINNT=0x0600; }
5639#ifdef WINAPI_FAMILY
5640#include <winapifamily.h>
5641#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
5642#error not desktop
5643#endif
5644#endif
5645EOF
5646        if [ "$pfx" = "" ]; then
5647            check_func strtoll || add_cflags -Dstrtoll=_strtoi64
5648            check_func strtoull || add_cflags -Dstrtoull=_strtoui64
5649        fi
5650    elif test_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
5651        eval ${pfx}libc_type=klibc
5652    elif test_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
5653        eval ${pfx}libc_type=bionic
5654    elif test_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
5655        eval ${pfx}libc_type=solaris
5656        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
5657    elif test_${pfx}cpp_condition sys/version.h "defined __DJGPP__"; then
5658        eval ${pfx}libc_type=djgpp
5659        add_cppflags -U__STRICT_ANSI__
5660        add_cflags "-include $source_path/compat/djgpp/math.h"
5661        add_compat djgpp/math.o
5662    fi
5663    test_${pfx}cc <<EOF
5664#include <time.h>
5665void *v = localtime_r;
5666EOF
5667test "$?" != 0 && test_${pfx}cc -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 <<EOF && add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5668#include <time.h>
5669void *v = localtime_r;
5670EOF
5671
5672    eval test -n "\${${pfx}libc_type}" && enable ${pfx}libc_${libc_type}
5673}
5674
5675probe_libc
5676probe_libc host_
5677
5678# hacks for compiler/libc/os combinations
5679
5680case $libc_type in
5681    bionic)
5682        add_compat strtod.o strtod=avpriv_strtod
5683        ;;
5684esac
5685
5686check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
5687    add_cppflags '-I\$(SRC_PATH)/compat/float'
5688
5689test_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
5690
5691set_default libdir
5692: ${shlibdir_default:="$libdir"}
5693: ${pkgconfigdir_default:="$libdir/pkgconfig"}
5694
5695set_default $PATHS_LIST
5696set_default nm
5697
5698disabled optimizations || enabled ossfuzz || check_cflags -fomit-frame-pointer
5699
5700enable_weak_pic() {
5701    disabled pic && return
5702    enable pic
5703    add_cppflags -DPIC
5704    case "$target_os" in
5705    mingw*|cygwin*|win*)
5706        ;;
5707    *)
5708        add_cflags -fPIC
5709        add_asflags -fPIC
5710        ;;
5711    esac
5712}
5713
5714enabled pic && enable_weak_pic
5715
5716test_cc <<EOF || die "Symbol mangling check failed."
5717int ff_extern;
5718EOF
5719sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
5720extern_prefix=${sym%%ff_extern*}
5721
5722! disabled inline_asm && check_inline_asm inline_asm '"" ::'
5723
5724for restrict_keyword in restrict __restrict__ __restrict ""; do
5725    test_code cc "" "char * $restrict_keyword p" && break
5726done
5727
5728check_cc pragma_deprecated "" '_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")'
5729
5730# The global variable ensures the bits appear unchanged in the object file.
5731test_cc <<EOF || die "endian test failed"
5732unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
5733EOF
5734od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
5735
5736check_cc const_nan math.h "struct { double d; } static const bar[] = { { NAN } }"
5737
5738if ! enabled ppc64 || enabled bigendian; then
5739    disable vsx
5740fi
5741
5742check_gas() {
5743    log "check_gas using '$as' as AS"
5744    # :vararg is used on aarch64, arm and ppc altivec
5745    check_as vararg "
5746.macro m n, y:vararg=0
5747\n: .int \y
5748.endm
5749m x" || return 1
5750    # .altmacro is only used in arm asm
5751    ! enabled arm || check_as gnu_as ".altmacro"
5752}
5753
5754if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
5755    nogas=:
5756    enabled_any arm aarch64 && nogas=die
5757    enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn
5758    as_noop=-v
5759
5760    case $as_type in
5761        arm*) gaspp_as_type=armasm; as_noop=-h ;;
5762        gcc)  gaspp_as_type=gas ;;
5763        *)    gaspp_as_type=$as_type ;;
5764    esac
5765
5766    [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
5767
5768    test "${as#*gas-preprocessor.pl}" != "$as" ||
5769    test_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- ${as:=$cc} $as_noop &&
5770        gas="${gas:=gas-preprocessor.pl} -arch $arch -as-type $gaspp_as_type -- ${as:=$cc}"
5771
5772    if ! check_gas ; then
5773        as=${gas:=$as}
5774        check_gas || \
5775            $nogas "GNU assembler not found, install/update gas-preprocessor"
5776    fi
5777
5778    check_as as_func ".func test
5779                      .endfunc"
5780fi
5781
5782check_inline_asm inline_asm_labels '"1:\n"'
5783
5784check_inline_asm inline_asm_nonlocal_labels '"Label:\n"'
5785
5786if enabled aarch64; then
5787    enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
5788    # internal assembler in clang 3.3 does not support this instruction
5789    enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
5790    enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
5791
5792    map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
5793
5794elif enabled alpha; then
5795
5796    check_cflags -mieee
5797
5798elif enabled arm; then
5799
5800    enabled msvc && check_cpp_condition thumb stddef.h "defined _M_ARMT"
5801    test_cpp_condition stddef.h "defined __thumb__" && test_cc <<EOF && enable_weak thumb
5802float func(float a, float b){ return a+b; }
5803EOF
5804    enabled thumb && check_cflags -mthumb || check_cflags -marm
5805
5806    if check_cpp_condition vfp_args stddef.h "defined __ARM_PCS_VFP"; then
5807        :
5808    elif check_cpp_condition vfp_args stddef.h "defined _M_ARM_FP && _M_ARM_FP >= 30"; then
5809        :
5810    elif ! test_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__" && [ $target_os != darwin ]; then
5811        case "${cross_prefix:-$cc}" in
5812            *hardfloat*) enable vfp_args; fpabi=vfp ;;
5813            *) check_ld "cc" vfp_args <<EOF && fpabi=vfp || fpabi=soft ;;
5814__asm__ (".eabi_attribute 28, 1");
5815int main(void) { return 0; }
5816EOF
5817        esac
5818        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
5819    fi
5820
5821    enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
5822    enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
5823    enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
5824    enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
5825    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
5826    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
5827    enabled setend  && check_insn setend  'setend be'
5828
5829    [ $target_os = linux ] || [ $target_os = android ] ||
5830        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
5831            $ARCH_EXT_LIST_ARM
5832
5833    check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
5834
5835    check_as as_arch_directive ".arch armv7-a"
5836    check_as as_dn_directive   "ra .dn d0.i16"
5837    check_as as_fpu_directive  ".fpu neon"
5838
5839    # llvm's integrated assembler supports .object_arch from llvm 3.5
5840    [ "$objformat" = elf32 ] || [ "$objformat" = elf64 ] &&
5841        check_as as_object_arch ".object_arch armv4"
5842
5843    # MS armasm fails to assemble our PIC constructs
5844    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
5845
5846elif enabled mips; then
5847
5848    enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"'
5849    enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"'
5850    enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"'
5851
5852    # Enable minimum ISA based on selected options
5853    if enabled mips64; then
5854        enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6'
5855        enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2'
5856        disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0, 0"' '-mips64'
5857    else
5858        enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6'
5859        enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5'
5860        enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2'
5861        disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags mips32r1 '"addi $0, $0, 0"' '-mips32'
5862    fi
5863
5864    enabled mipsfpu && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f2"' '-mhard-float'
5865    enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
5866    enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa' && check_headers msa.h || disable msa
5867    enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
5868    enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
5869    enabled msa && enabled msa2 && check_inline_asm_flags msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && check_headers msa2.h || disable msa2
5870
5871    if enabled bigendian && enabled msa; then
5872        disable msa
5873    fi
5874
5875elif enabled parisc; then
5876
5877    if enabled gcc; then
5878        case $($cc -dumpversion) in
5879            4.[3-9].*) check_cflags -fno-optimize-sibling-calls ;;
5880        esac
5881    fi
5882
5883elif enabled ppc; then
5884
5885    enable local_aligned
5886
5887    check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
5888    check_inline_asm ibm_asm   '"add 0, 0, 0"'
5889    check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
5890    check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
5891
5892    if enabled altivec; then
5893        check_cflags -maltivec -mabi=altivec
5894
5895        # check if our compiler supports Motorola AltiVec C API
5896        check_cc altivec altivec.h "vector signed int v1 = (vector signed int) { 0 };
5897                                    vector signed int v2 = (vector signed int) { 1 };
5898                                    v1 = vec_add(v1, v2);"
5899
5900        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
5901    fi
5902
5903    if enabled vsx; then
5904        check_cflags -mvsx &&
5905        check_cc vsx altivec.h "int v[4] = { 0 };
5906                                vector signed int v1 = vec_vsx_ld(0, v);"
5907    fi
5908
5909    if enabled power8; then
5910        check_cpp_condition power8 "altivec.h" "defined(_ARCH_PWR8)"
5911    fi
5912
5913elif enabled x86; then
5914
5915    check_builtin rdtsc    intrin.h   "__rdtsc()"
5916    check_builtin mm_empty mmintrin.h "_mm_empty()"
5917
5918    enable local_aligned
5919
5920    # check whether EBP is available on x86
5921    # As 'i' is stored on the stack, this program will crash
5922    # if the base pointer is used to access it because the
5923    # base pointer is cleared in the inline assembly code.
5924    check_exec_crash <<EOF && enable ebp_available
5925volatile int i=0;
5926__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
5927return i;
5928EOF
5929
5930    # check whether EBX is available on x86
5931    check_inline_asm ebx_available '""::"b"(0)' &&
5932        check_inline_asm ebx_available '"":::"%ebx"'
5933
5934    # check whether xmm clobbers are supported
5935    check_inline_asm xmm_clobbers '"":::"%xmm0"'
5936
5937    check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test, %eax"' ||
5938        check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test(%rip), %eax"'
5939
5940    # check whether binutils is new enough to compile SSSE3/MMXEXT
5941    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
5942    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
5943
5944    probe_x86asm(){
5945        x86asmexe_probe=$1
5946        if test_cmd $x86asmexe_probe -v; then
5947            x86asmexe=$x86asmexe_probe
5948            x86asm_type=nasm
5949            x86asm_debug="-g -F dwarf"
5950            X86ASMDEP=
5951            X86ASM_DEPFLAGS='-MD $(@:.o=.d)'
5952        elif test_cmd $x86asmexe_probe --version; then
5953            x86asmexe=$x86asmexe_probe
5954            x86asm_type=yasm
5955            x86asm_debug="-g dwarf2"
5956            X86ASMDEP='$(DEPX86ASM) $(X86ASMFLAGS) -M $(X86ASM_O) $< > $(@:.o=.d)'
5957            X86ASM_DEPFLAGS=
5958        fi
5959        check_x86asm x86asm "movbe ecx, [5]"
5960    }
5961
5962    if ! disabled_any asm mmx x86asm; then
5963        disable x86asm
5964        for program in $x86asmexe nasm yasm; do
5965            probe_x86asm $program && break
5966        done
5967        disabled x86asm && die "nasm/yasm not found or too old. Use --disable-x86asm for a crippled build."
5968        X86ASMFLAGS="-f $objformat"
5969        enabled pic               && append X86ASMFLAGS "-DPIC"
5970        test -n "$extern_prefix"  && append X86ASMFLAGS "-DPREFIX"
5971        case "$objformat" in
5972            elf*) enabled debug && append X86ASMFLAGS $x86asm_debug ;;
5973        esac
5974
5975        enabled avx512 && check_x86asm avx512_external "vmovdqa32 [eax]{k1}{z}, zmm0"
5976        enabled avx2   && check_x86asm avx2_external   "vextracti128 xmm0, ymm0, 0"
5977        enabled xop    && check_x86asm xop_external    "vpmacsdd xmm0, xmm1, xmm2, xmm3"
5978        enabled fma4   && check_x86asm fma4_external   "vfmaddps ymm0, ymm1, ymm2, ymm3"
5979        check_x86asm cpunop          "CPU amdnop"
5980    fi
5981
5982    case "$cpu" in
5983        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
5984            disable fast_clz
5985        ;;
5986    esac
5987
5988fi
5989
5990check_cc intrinsics_neon arm_neon.h "int16x8_t test = vdupq_n_s16(0)"
5991
5992check_ldflags -Wl,--as-needed
5993check_ldflags -Wl,-z,noexecstack
5994
5995if ! disabled network; then
5996    check_func getaddrinfo $network_extralibs
5997    check_func inet_aton $network_extralibs
5998
5999    check_type netdb.h "struct addrinfo"
6000    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
6001    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
6002    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
6003    check_type poll.h "struct pollfd"
6004    check_type netinet/sctp.h "struct sctp_event_subscribe"
6005    check_struct "sys/socket.h" "struct msghdr" msg_flags
6006    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
6007    check_type netinet/in.h "struct sockaddr_in6"
6008    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
6009    check_type "sys/types.h sys/socket.h" socklen_t
6010
6011    # Prefer arpa/inet.h over winsock2
6012    if check_headers arpa/inet.h ; then
6013        check_func closesocket
6014    elif check_headers winsock2.h ; then
6015        check_func_headers winsock2.h closesocket -lws2 &&
6016            network_extralibs="-lws2" ||
6017        { check_func_headers winsock2.h closesocket -lws2_32 &&
6018            network_extralibs="-lws2_32"; } || disable winsock2_h network
6019        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
6020
6021        check_type ws2tcpip.h socklen_t
6022        check_type ws2tcpip.h "struct addrinfo"
6023        check_type ws2tcpip.h "struct group_source_req"
6024        check_type ws2tcpip.h "struct ip_mreq_source"
6025        check_type ws2tcpip.h "struct ipv6_mreq"
6026        check_type winsock2.h "struct pollfd"
6027        check_struct winsock2.h "struct sockaddr" sa_len
6028        check_type ws2tcpip.h "struct sockaddr_in6"
6029        check_type ws2tcpip.h "struct sockaddr_storage"
6030    else
6031        disable network
6032    fi
6033fi
6034
6035check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
6036check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
6037check_builtin MemoryBarrier windows.h "MemoryBarrier()"
6038check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
6039check_builtin gmtime_r time.h "time_t *time; struct tm *tm; gmtime_r(time, tm)"
6040check_builtin localtime_r time.h "time_t *time; struct tm *tm; localtime_r(time, tm)"
6041check_builtin x264_csp_bgr "stdint.h x264.h" "X264_CSP_BGR"
6042
6043case "$custom_allocator" in
6044    jemalloc)
6045        # jemalloc by default does not use a prefix
6046        require libjemalloc jemalloc/jemalloc.h malloc -ljemalloc
6047    ;;
6048    tcmalloc)
6049        require_pkg_config libtcmalloc libtcmalloc gperftools/tcmalloc.h tc_malloc
6050        malloc_prefix=tc_
6051    ;;
6052esac
6053
6054check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
6055check_func  ${malloc_prefix}memalign            && enable memalign
6056check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
6057
6058check_func  access
6059check_func_headers stdlib.h arc4random
6060check_lib   clock_gettime time.h clock_gettime || check_lib clock_gettime time.h clock_gettime -lrt
6061check_func  fcntl
6062check_func  fork
6063check_func  gethrtime
6064check_func  getopt
6065check_func  getrusage
6066check_func  gettimeofday
6067check_func  isatty
6068check_func  mkstemp
6069check_func  mmap
6070check_func  mprotect
6071# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
6072check_func_headers time.h nanosleep || check_lib nanosleep time.h nanosleep -lrt
6073check_func  sched_getaffinity
6074check_func  setrlimit
6075check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
6076check_func  strerror_r
6077check_func  sysconf
6078check_func  sysctl
6079check_func  usleep
6080
6081check_func_headers conio.h kbhit
6082check_func_headers io.h setmode
6083check_func_headers lzo/lzo1x.h lzo1x_999_compress
6084check_func_headers mach/mach_time.h mach_absolute_time
6085check_func_headers stdlib.h getenv
6086check_func_headers sys/stat.h lstat
6087
6088check_func_headers windows.h GetModuleHandle
6089check_func_headers windows.h GetProcessAffinityMask
6090check_func_headers windows.h GetProcessTimes
6091check_func_headers windows.h GetStdHandle
6092check_func_headers windows.h GetSystemTimeAsFileTime
6093check_func_headers windows.h LoadLibrary
6094check_func_headers windows.h MapViewOfFile
6095check_func_headers windows.h PeekNamedPipe
6096check_func_headers windows.h SetConsoleTextAttribute
6097check_func_headers windows.h SetConsoleCtrlHandler
6098check_func_headers windows.h SetDllDirectory
6099check_func_headers windows.h Sleep
6100check_func_headers windows.h VirtualAlloc
6101check_func_headers glob.h glob
6102enabled xlib &&
6103    check_lib xlib "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
6104
6105check_headers direct.h
6106check_headers dirent.h
6107check_headers dxgidebug.h
6108check_headers dxva.h
6109check_headers dxva2api.h -D_WIN32_WINNT=0x0600
6110check_headers io.h
6111check_headers linux/perf_event.h
6112check_headers libcrystalhd/libcrystalhd_if.h
6113check_headers malloc.h
6114check_headers mftransform.h
6115check_headers net/udplite.h
6116check_headers poll.h
6117check_headers sys/param.h
6118check_headers sys/resource.h
6119check_headers sys/select.h
6120check_headers sys/time.h
6121check_headers sys/un.h
6122check_headers termios.h
6123check_headers unistd.h
6124check_headers valgrind/valgrind.h
6125check_func_headers VideoToolbox/VTCompressionSession.h VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
6126check_headers windows.h
6127check_headers X11/extensions/XvMClib.h
6128check_headers asm/types.h
6129
6130# it seems there are versions of clang in some distros that try to use the
6131# gcc headers, which explodes for stdatomic
6132# so we also check that atomics actually work here
6133check_builtin stdatomic stdatomic.h "atomic_int foo, bar = ATOMIC_VAR_INIT(-1); atomic_store(&foo, 0); foo += bar"
6134
6135check_lib advapi32 "windows.h"            RegCloseKey          -ladvapi32
6136check_lib bcrypt   "windows.h bcrypt.h"   BCryptGenRandom      -lbcrypt &&
6137    check_cpp_condition bcrypt bcrypt.h "defined BCRYPT_RNG_ALGORITHM"
6138check_lib ole32    "windows.h"            CoTaskMemFree        -lole32
6139check_lib shell32  "windows.h shellapi.h" CommandLineToArgvW   -lshell32
6140check_lib psapi    "windows.h psapi.h"    GetProcessMemoryInfo -lpsapi
6141
6142check_lib android android/native_window.h ANativeWindow_acquire -landroid
6143check_lib mediandk "stdint.h media/NdkImage.h" AImage_delete -lmediandk
6144check_lib camera2ndk "stdbool.h stdint.h camera/NdkCameraManager.h" ACameraManager_create -lcamera2ndk
6145
6146enabled appkit       && check_apple_framework AppKit
6147enabled audiotoolbox && check_apple_framework AudioToolbox
6148enabled avfoundation && check_apple_framework AVFoundation
6149enabled coreimage    && check_apple_framework CoreImage
6150enabled videotoolbox && check_apple_framework VideoToolbox
6151
6152check_apple_framework CoreFoundation
6153check_apple_framework CoreMedia
6154check_apple_framework CoreVideo
6155
6156enabled avfoundation && {
6157    disable coregraphics applicationservices
6158    check_lib coregraphics        CoreGraphics/CoreGraphics.h               CGGetActiveDisplayList "-framework CoreGraphics" ||
6159    check_lib applicationservices ApplicationServices/ApplicationServices.h CGGetActiveDisplayList "-framework ApplicationServices"; }
6160
6161enabled videotoolbox && {
6162    check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices"
6163    check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia"
6164    check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo"
6165    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo"
6166    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo"
6167    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_Linear "-framework CoreVideo"
6168}
6169
6170check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
6171
6172check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
6173check_type "windows.h dxva.h" "DXVA_PicParams_VP9" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
6174check_type "windows.h d3d11.h" "ID3D11VideoDecoder"
6175check_type "windows.h d3d11.h" "ID3D11VideoContext"
6176check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602
6177check_func_headers mfapi.h MFCreateAlignedMemoryBuffer -lmfplat
6178
6179check_type "vdpau/vdpau.h" "VdpPictureInfoHEVC"
6180check_type "vdpau/vdpau.h" "VdpPictureInfoVP9"
6181
6182if [ -z "$nvccflags" ]; then
6183    nvccflags=$nvccflags_default
6184fi
6185
6186if enabled x86_64 || enabled ppc64 || enabled aarch64; then
6187    nvccflags="$nvccflags -m64"
6188else
6189    nvccflags="$nvccflags -m32"
6190fi
6191
6192if enabled cuda_nvcc; then
6193    nvccflags="$nvccflags -ptx"
6194else
6195    nvccflags="$nvccflags -S -nocudalib -nocudainc --cuda-device-only -include ${source_link}/compat/cuda/cuda_runtime.h"
6196    check_nvcc cuda_llvm
6197fi
6198
6199if ! disabled ffnvcodec; then
6200    ffnv_hdr_list="ffnvcodec/nvEncodeAPI.h ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h ffnvcodec/dynlink_nvcuvid.h"
6201    check_pkg_config ffnvcodec "ffnvcodec >= 9.1.23.1" "$ffnv_hdr_list" "" || \
6202      check_pkg_config ffnvcodec "ffnvcodec >= 9.0.18.3 ffnvcodec < 9.1" "$ffnv_hdr_list" "" || \
6203      check_pkg_config ffnvcodec "ffnvcodec >= 8.2.15.10 ffnvcodec < 8.3" "$ffnv_hdr_list" "" || \
6204      check_pkg_config ffnvcodec "ffnvcodec >= 8.1.24.11 ffnvcodec < 8.2" "$ffnv_hdr_list" ""
6205fi
6206
6207check_cpp_condition winrt windows.h "!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)"
6208
6209if ! disabled w32threads && ! enabled pthreads; then
6210    check_func_headers "windows.h process.h" _beginthreadex &&
6211        check_type "windows.h" CONDITION_VARIABLE &&
6212        check_type "windows.h" INIT_ONCE &&
6213        enable w32threads || disable w32threads
6214    if ! enabled w32threads && enabled winrt; then
6215        check_func_headers "windows.h" CreateThread &&
6216            enable w32threads || disable w32threads
6217    fi
6218fi
6219
6220# check for some common methods of building with pthread support
6221# do this before the optional library checks as some of them require pthreads
6222if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
6223    if check_lib pthreads pthread.h pthread_join   -pthread &&
6224       check_lib pthreads pthread.h pthread_create -pthread; then
6225        add_cflags -pthread
6226    elif check_lib pthreads pthread.h pthread_join   -pthreads &&
6227         check_lib pthreads pthread.h pthread_create -pthreads; then
6228        add_cflags -pthreads
6229    elif check_lib pthreads pthread.h pthread_join   -ldl -pthread &&
6230         check_lib pthreads pthread.h pthread_create -ldl -pthread; then
6231        add_cflags -ldl -pthread
6232    elif check_lib pthreads pthread.h pthread_join   -lpthreadGC2 &&
6233         check_lib pthreads pthread.h pthread_create -lpthreadGC2; then
6234        :
6235    elif check_lib pthreads pthread.h pthread_join   -lpthread &&
6236         check_lib pthreads pthread.h pthread_create -lpthread; then
6237        :
6238    elif check_func pthread_join && check_func pthread_create; then
6239        enable pthreads
6240    fi
6241    check_cc pthreads "pthread.h" "static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER"
6242
6243    if enabled pthreads; then
6244        check_builtin sem_timedwait semaphore.h "sem_t *s; sem_init(s,0,0); sem_timedwait(s,0); sem_destroy(s)" $pthreads_extralibs
6245        check_func pthread_cancel $pthreads_extralibs
6246    fi
6247fi
6248
6249enabled  zlib && { check_pkg_config zlib zlib "zlib.h" zlibVersion ||
6250                   check_lib zlib   zlib.h      zlibVersion    -lz; }
6251enabled bzlib && check_lib bzlib bzlib.h BZ2_bzlibVersion    -lbz2
6252enabled  lzma && check_lib lzma   lzma.h lzma_version_number -llzma
6253
6254# On some systems dynamic loading requires no extra linker flags
6255check_lib libdl dlfcn.h "dlopen dlsym" || check_lib libdl dlfcn.h "dlopen dlsym" -ldl
6256
6257check_lib libm math.h sin -lm
6258
6259atan2f_args=2
6260copysign_args=2
6261hypot_args=2
6262ldexpf_args=2
6263powf_args=2
6264
6265for func in $MATH_FUNCS; do
6266    eval check_mathfunc $func \${${func}_args:-1} $libm_extralibs
6267done
6268
6269for func in $COMPLEX_FUNCS; do
6270    eval check_complexfunc $func \${${func}_args:-1}
6271done
6272
6273# these are off by default, so fail if requested and not available
6274enabled avisynth          && require_headers "avisynth/avisynth_c.h"
6275enabled cuda_nvcc         && { check_nvcc cuda_nvcc || die "ERROR: failed checking for nvcc."; }
6276enabled chromaprint       && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
6277enabled decklink          && { require_headers DeckLinkAPI.h &&
6278                               { test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a090500" || die "ERROR: Decklink API version must be >= 10.9.5."; } }
6279enabled frei0r            && require_headers "frei0r.h dlfcn.h"
6280enabled gmp               && require gmp gmp.h mpz_export -lgmp
6281enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
6282enabled jni               && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; }
6283enabled ladspa            && require_headers "ladspa.h dlfcn.h"
6284enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_codec.h aom_codec_version
6285enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
6286                               { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
6287                               die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
6288enabled lv2               && require_pkg_config lv2 lilv-0 "lilv/lilv.h" lilv_world_new
6289enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
6290enabled libass            && require_pkg_config libass libass ass/ass.h ass_library_init
6291enabled libbluray         && require_pkg_config libbluray libbluray libbluray/bluray.h bd_open
6292enabled libbs2b           && require_pkg_config libbs2b libbs2b bs2b.h bs2b_open
6293enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
6294                             { check_lib libcelt celt/celt.h celt_decoder_create_custom -lcelt0 ||
6295                               die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
6296enabled libcaca           && require_pkg_config libcaca caca caca.h caca_create_canvas
6297enabled libcodec2         && require libcodec2 codec2/codec2.h codec2_create -lcodec2
6298enabled libdav1d          && require_pkg_config libdav1d "dav1d >= 0.4.0" "dav1d/dav1d.h" dav1d_version
6299enabled libdavs2          && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open
6300enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
6301enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
6302enabled libfdk_aac        && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
6303                               { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
6304                                 warn "using libfdk without pkg-config"; } }
6305flite_extralibs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
6306enabled libflite          && require libflite "flite/flite.h" flite_init $flite_extralibs
6307enabled fontconfig        && enable libfontconfig
6308enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
6309enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
6310enabled libfribidi        && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
6311enabled libglslang        && require_cpp libglslang glslang/SPIRV/GlslangToSpv.h "glslang::TIntermediate*" -lglslang -lOSDependent -lHLSL -lOGLCompiler -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++
6312enabled libgme            && { check_pkg_config libgme libgme gme/gme.h gme_new_emu ||
6313                               require libgme gme/gme.h gme_new_emu -lgme -lstdc++; }
6314enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
6315                                   check_lib libgsm "${gsm_hdr}" gsm_create -lgsm && break;
6316                               done || die "ERROR: libgsm not found"; }
6317enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc $pthreads_extralibs
6318enabled libklvanc         && require libklvanc libklvanc/vanc.h klvanc_context_create -lklvanc
6319enabled libkvazaar        && require_pkg_config libkvazaar "kvazaar >= 0.8.1" kvazaar.h kvz_api_get
6320enabled liblensfun        && require_pkg_config liblensfun lensfun lensfun.h lf_db_new
6321# While it may appear that require is being used as a pkg-config
6322# fallback for libmfx, it is actually being used to detect a different
6323# installation route altogether.  If libmfx is installed via the Intel
6324# Media SDK or Intel Media Server Studio, these don't come with
6325# pkg-config support.  Instead, users should make sure that the build
6326# can find the libraries and headers through other means.
6327enabled libmfx            && { check_pkg_config libmfx libmfx "mfx/mfxvideo.h" MFXInit ||
6328                               { require libmfx "mfx/mfxvideo.h" MFXInit "-llibmfx $advapi32_extralibs" && warn "using libmfx without pkg-config"; } }
6329if enabled libmfx; then
6330   check_cc MFX_CODEC_VP9 "mfx/mfxvp9.h mfx/mfxstructures.h" "MFX_CODEC_VP9"
6331fi
6332
6333enabled libmodplug        && require_pkg_config libmodplug libmodplug libmodplug/modplug.h ModPlug_Load
6334enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
6335enabled libmysofa         && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine ||
6336                               require libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine -lmysofa $zlib_extralibs; }
6337enabled libnpp            && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei ||
6338                               check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppc -lnppidei ||
6339                               die "ERROR: libnpp not found"; }
6340enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
6341enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
6342enabled libopencv         && { check_headers opencv2/core/core_c.h &&
6343                               { check_pkg_config libopencv opencv opencv2/core/core_c.h cvCreateImageHeader ||
6344                                 require libopencv opencv2/core/core_c.h cvCreateImageHeader -lopencv_core -lopencv_imgproc; } ||
6345                               require_pkg_config libopencv opencv opencv/cxcore.h cvCreateImageHeader; }
6346enabled libopenh264       && require_pkg_config libopenh264 openh264 wels/codec_api.h WelsGetCodecVersion
6347enabled libopenjpeg       && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version ||
6348                               { require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } }
6349enabled libopenmpt        && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
6350enabled libopus           && {
6351    enabled libopus_decoder && {
6352        require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
6353    }
6354    enabled libopus_encoder && {
6355        require_pkg_config libopus opus opus_multistream.h opus_multistream_surround_encoder_create
6356    }
6357}
6358enabled libpulse          && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
6359enabled librabbitmq       && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection
6360enabled librav1e          && require_pkg_config librav1e "rav1e >= 0.1.0" rav1e.h rav1e_context_new
6361enabled librsvg           && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo
6362enabled librtmp           && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
6363enabled librubberband     && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++"
6364enabled libshine          && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer
6365enabled libsmbclient      && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init ||
6366                               require libsmbclient libsmbclient.h smbc_init -lsmbclient; }
6367enabled libsnappy         && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++
6368enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
6369enabled libssh            && require_pkg_config libssh libssh libssh/sftp.h sftp_init
6370enabled libspeex          && require_pkg_config libspeex speex speex/speex.h speex_decoder_init
6371enabled libsrt            && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket
6372enabled libtensorflow     && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow
6373enabled libtesseract      && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate
6374enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
6375enabled libtls            && require_pkg_config libtls libtls tls.h tls_configure
6376enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame &&
6377                             { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
6378                               die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
6379enabled libv4l2           && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl
6380enabled libvidstab        && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
6381enabled libvmaf           && require_pkg_config libvmaf "libvmaf >= 1.3.9" libvmaf.h compute_vmaf
6382enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
6383enabled libvorbis         && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init &&
6384                             require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init
6385
6386enabled libvpx            && {
6387    enabled libvpx_vp8_decoder && {
6388        check_pkg_config libvpx_vp8_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx ||
6389            check_lib libvpx_vp8_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp8_dx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
6390    }
6391    enabled libvpx_vp8_encoder && {
6392        check_pkg_config libvpx_vp8_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx ||
6393            check_lib libvpx_vp8_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp8_cx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
6394    }
6395    enabled libvpx_vp9_decoder && {
6396        check_pkg_config libvpx_vp9_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx ||
6397            check_lib libvpx_vp9_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
6398    }
6399    enabled libvpx_vp9_encoder && {
6400        check_pkg_config libvpx_vp9_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx ||
6401            check_lib libvpx_vp9_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
6402    }
6403    if disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder; then
6404        die "libvpx enabled but no supported decoders found"
6405    fi
6406}
6407
6408enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
6409enabled libwebp           && {
6410    enabled libwebp_encoder      && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
6411    enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; }
6412enabled libx264           && { check_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode ||
6413                               { require libx264 "stdint.h x264.h" x264_encoder_encode "-lx264 $pthreads_extralibs $libm_extralibs" &&
6414                                 warn "using libx264 without pkg-config"; } } &&
6415                             require_cpp_condition libx264 x264.h "X264_BUILD >= 118" &&
6416                             check_cpp_condition libx262 x264.h "X264_MPEG2"
6417enabled libx265           && require_pkg_config libx265 x265 x265.h x265_api_get &&
6418                             require_cpp_condition libx265 x265.h "X265_BUILD >= 70"
6419enabled libxavs           && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs"
6420enabled libxavs2          && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get
6421enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
6422enabled libzimg           && require_pkg_config libzimg "zimg >= 2.7.0" zimg.h zimg_get_api_version
6423enabled libzmq            && require_pkg_config libzmq "libzmq >= 4.2.1" zmq.h zmq_ctx_new
6424enabled libzvbi           && require_pkg_config libzvbi zvbi-0.2 libzvbi.h vbi_decoder_new &&
6425                             { test_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" ||
6426                               enabled gpl || die "ERROR: libzvbi requires version 0.2.28 or --enable-gpl."; }
6427enabled libxml2           && require_pkg_config libxml2 libxml-2.0 libxml2/libxml/xmlversion.h xmlCheckVersion
6428enabled mbedtls           && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt.h mbedtls_x509_crt_init ||
6429                               check_pkg_config mbedtls mbedtls mbedtls/ssl.h mbedtls_ssl_init ||
6430                               check_lib mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedx509 -lmbedcrypto ||
6431                               die "ERROR: mbedTLS not found"; }
6432enabled mediacodec        && { enabled jni || die "ERROR: mediacodec requires --enable-jni"; }
6433enabled mmal              && { check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ||
6434                               { ! enabled cross_compile &&
6435                                 add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline &&
6436                                 add_ldflags -L/opt/vc/lib/ &&
6437                                 check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host; } ||
6438                               die "ERROR: mmal not found" &&
6439                               check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS"; }
6440enabled openal            && { { for al_extralibs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
6441                               check_lib openal 'AL/al.h' alGetError "${al_extralibs}" && break; done } ||
6442                               die "ERROR: openal not found"; } &&
6443                             { test_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
6444                               die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
6445enabled opencl            && { check_pkg_config opencl OpenCL CL/cl.h clEnqueueNDRangeKernel ||
6446                               check_lib opencl OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL ||
6447                               check_lib opencl CL/cl.h clEnqueueNDRangeKernel -lOpenCL ||
6448                               die "ERROR: opencl not found"; } &&
6449                             { test_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" ||
6450                               test_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" ||
6451                               die "ERROR: opencl must be installed and version must be 1.2 or compatible"; }
6452enabled opengl            && { check_lib opengl GL/glx.h glXGetProcAddress "-lGL" ||
6453                               check_lib opengl windows.h wglGetProcAddress "-lopengl32 -lgdi32" ||
6454                               check_lib opengl OpenGL/gl3.h glGetError "-Wl,-framework,OpenGL" ||
6455                               check_lib opengl ES2/gl.h glGetError "-isysroot=${sysroot} -Wl,-framework,OpenGLES" ||
6456                               die "ERROR: opengl not found."
6457                             }
6458enabled omx_rpi           && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame ||
6459                               { ! enabled cross_compile &&
6460                                 add_cflags -isystem/opt/vc/include/IL &&
6461                                 test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame; } ||
6462                               die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } &&
6463                             enable omx
6464enabled omx               && require_headers OMX_Core.h
6465enabled openssl           && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
6466                               check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
6467                               check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
6468                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
6469                               check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
6470                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
6471                               die "ERROR: openssl not found"; }
6472enabled pocketsphinx      && require_pkg_config pocketsphinx pocketsphinx pocketsphinx/pocketsphinx.h ps_init
6473enabled rkmpp             && { require_pkg_config rkmpp rockchip_mpp  rockchip/rk_mpi.h mpp_create &&
6474                               require_pkg_config rockchip_mpp "rockchip_mpp >= 1.3.7" rockchip/rk_mpi.h mpp_create &&
6475                               { enabled libdrm ||
6476                                 die "ERROR: rkmpp requires --enable-libdrm"; }
6477                             }
6478enabled vapoursynth       && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init
6479
6480
6481if enabled gcrypt; then
6482    GCRYPT_CONFIG="${cross_prefix}libgcrypt-config"
6483    if "${GCRYPT_CONFIG}" --version > /dev/null 2>&1; then
6484        gcrypt_cflags=$("${GCRYPT_CONFIG}" --cflags)
6485        gcrypt_extralibs=$("${GCRYPT_CONFIG}" --libs)
6486        check_func_headers gcrypt.h gcry_mpi_new $gcrypt_cflags $gcrypt_extralibs ||
6487            die "ERROR: gcrypt not found"
6488        add_cflags $gcrypt_cflags
6489    else
6490        require gcrypt gcrypt.h gcry_mpi_new -lgcrypt
6491    fi
6492fi
6493
6494if enabled sdl2; then
6495    SDL2_CONFIG="${cross_prefix}sdl2-config"
6496    test_pkg_config sdl2 "sdl2 >= 2.0.1 sdl2 < 2.1.0" SDL_events.h SDL_PollEvent
6497    if disabled sdl2 && "${SDL2_CONFIG}" --version > /dev/null 2>&1; then
6498        sdl2_cflags=$("${SDL2_CONFIG}" --cflags)
6499        sdl2_extralibs=$("${SDL2_CONFIG}" --libs)
6500        test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x020001" $sdl2_cflags &&
6501        test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x020100" $sdl2_cflags &&
6502        check_func_headers SDL_events.h SDL_PollEvent $sdl2_extralibs $sdl2_cflags &&
6503            enable sdl2
6504    fi
6505    if test $target_os = "mingw32"; then
6506        sdl2_extralibs=$(filter_out '-mwindows' $sdl2_extralibs)
6507    fi
6508fi
6509
6510if enabled decklink; then
6511    case $target_os in
6512        mingw32*|mingw64*|win32|win64)
6513            decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
6514            decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
6515            ;;
6516    esac
6517fi
6518
6519enabled securetransport &&
6520    check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
6521    check_lib securetransport "Security/SecureTransport.h Security/Security.h" "SSLCreateContext" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" ||
6522        disable securetransport
6523
6524enabled securetransport &&
6525    check_func SecItemImport "-Wl,-framework,CoreFoundation -Wl,-framework,Security"
6526
6527enabled schannel &&
6528    check_func_headers "windows.h security.h" InitializeSecurityContext -DSECURITY_WIN32 -lsecur32 &&
6529    test_cpp_condition winerror.h "defined(SEC_I_CONTEXT_EXPIRED)" &&
6530    schannel_extralibs="-lsecur32" ||
6531        disable schannel
6532
6533makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
6534enabled makeinfo \
6535    && [ 0$(makeinfo --version | grep "texinfo" | sed 's/.*texinfo[^0-9]*\([0-9]*\)\..*/\1/') -ge 5 ] \
6536    && enable makeinfo_html || disable makeinfo_html
6537disabled makeinfo_html && texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
6538perl -v            > /dev/null 2>&1 && enable perl      || disable perl
6539pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
6540rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
6541
6542# check V4L2 codecs available in the API
6543if enabled v4l2_m2m; then
6544    check_headers linux/fb.h
6545    check_headers linux/videodev2.h
6546    test_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
6547    check_cc v4l2_m2m linux/videodev2.h "int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;"
6548    check_cc vc1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VC1_ANNEX_G;"
6549    check_cc mpeg1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG1;"
6550    check_cc mpeg2_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2;"
6551    check_cc mpeg4_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG4;"
6552    check_cc hevc_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC;"
6553    check_cc h263_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H263;"
6554    check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
6555    check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
6556    check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
6557fi
6558
6559check_headers sys/videoio.h
6560test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
6561
6562check_lib user32 "windows.h winuser.h" GetShellWindow -luser32
6563check_lib vfw32 "windows.h vfw.h" capCreateCaptureWindow -lvfw32
6564# check that WM_CAP_DRIVER_CONNECT is defined to the proper value
6565# w32api 3.12 had it defined wrong
6566check_cpp_condition vfwcap_defines vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER"
6567
6568check_type "dshow.h" IBaseFilter
6569
6570# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
6571check_headers "dev/bktr/ioctl_meteor.h dev/bktr/ioctl_bt848.h"                   ||
6572    check_headers "machine/ioctl_meteor.h machine/ioctl_bt848.h"                 ||
6573    check_headers "dev/video/meteor/ioctl_meteor.h dev/video/bktr/ioctl_bt848.h" ||
6574    check_headers "dev/ic/bt8xx.h"
6575
6576if check_struct sys/soundcard.h audio_buf_info bytes; then
6577    enable_sanitized sys/soundcard.h
6578else
6579    test_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_sanitized sys/soundcard.h
6580    #include <sys/soundcard.h>
6581    audio_buf_info abc;
6582EOF
6583fi
6584
6585enabled alsa && { check_pkg_config alsa alsa "alsa/asoundlib.h" snd_pcm_htimestamp ||
6586                  check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound; }
6587
6588enabled libjack &&
6589    require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range
6590
6591enabled sndio && check_lib sndio sndio.h sio_open -lsndio
6592
6593if enabled libcdio; then
6594    check_pkg_config libcdio libcdio_paranoia "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open ||
6595    check_pkg_config libcdio libcdio_paranoia "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open ||
6596    check_lib libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
6597    check_lib libcdio "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
6598    die "ERROR: No usable libcdio/cdparanoia found"
6599fi
6600
6601enabled libxcb && check_pkg_config libxcb "xcb >= 1.4" xcb/xcb.h xcb_connect ||
6602    disable libxcb_shm libxcb_shape libxcb_xfixes
6603
6604if enabled libxcb; then
6605    enabled libxcb_shm    && check_pkg_config libxcb_shm    xcb-shm    xcb/shm.h    xcb_shm_attach
6606    enabled libxcb_shape  && check_pkg_config libxcb_shape  xcb-shape  xcb/shape.h  xcb_shape_get_rectangles
6607    enabled libxcb_xfixes && check_pkg_config libxcb_xfixes xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image
6608fi
6609
6610check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs"
6611
6612# d3d11va requires linking directly to dxgi and d3d11 if not building for
6613# the desktop api partition
6614test_cpp <<EOF && enable uwp && d3d11va_extralibs="-ldxgi -ld3d11"
6615#ifdef WINAPI_FAMILY
6616#include <winapifamily.h>
6617#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
6618#error desktop, not uwp
6619#else
6620// WINAPI_FAMILY_APP, WINAPI_FAMILY_PHONE_APP => UWP
6621#endif
6622#else
6623#error no family set
6624#endif
6625EOF
6626
6627enabled vaapi &&
6628    check_pkg_config vaapi "libva >= 0.35.0" "va/va.h" vaInitialize
6629
6630if enabled vaapi; then
6631    check_pkg_config vaapi_drm "libva-drm" "va/va_drm.h" vaGetDisplayDRM
6632
6633    if enabled xlib; then
6634        check_pkg_config vaapi_x11 "libva-x11" "va/va_x11.h" vaGetDisplay
6635    fi
6636
6637    check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0, 0)"
6638
6639    check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
6640    check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
6641    check_type   "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping"
6642    check_struct "va/va.h va/va_vpp.h" "VAProcPipelineCaps" rotation_flags
6643    check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
6644    check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
6645    check_type "va/va.h va/va_enc_vp8.h"  "VAEncPictureParameterBufferVP8"
6646    check_type "va/va.h va/va_enc_vp9.h"  "VAEncPictureParameterBufferVP9"
6647fi
6648
6649if enabled_all opencl libdrm ; then
6650    check_type "CL/cl_intel.h" "clCreateImageFromFdINTEL_fn" &&
6651        enable opencl_drm_beignet
6652    check_func_headers "CL/cl_ext.h" clImportMemoryARM &&
6653        enable opencl_drm_arm
6654fi
6655
6656if enabled_all opencl vaapi ; then
6657    if enabled opencl_drm_beignet ; then
6658        enable opencl_vaapi_beignet
6659    else
6660        check_type "CL/cl.h CL/cl_va_api_media_sharing_intel.h" "clCreateFromVA_APIMediaSurfaceINTEL_fn" &&
6661            enable opencl_vaapi_intel_media
6662    fi
6663fi
6664
6665if enabled_all opencl dxva2 ; then
6666    check_type "CL/cl_dx9_media_sharing.h" cl_dx9_surface_info_khr &&
6667        enable opencl_dxva2
6668fi
6669
6670if enabled_all opencl d3d11va ; then
6671    check_type "CL/cl_d3d11.h" clGetDeviceIDsFromD3D11KHR_fn &&
6672        enable opencl_d3d11
6673fi
6674
6675enabled vdpau &&
6676    check_cpp_condition vdpau vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP"
6677
6678enabled vdpau &&
6679    check_lib vdpau_x11 "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau -lX11
6680
6681enabled crystalhd && check_lib crystalhd "stdint.h libcrystalhd/libcrystalhd_if.h" DtsCrystalHDVersion -lcrystalhd
6682
6683enabled vulkan &&
6684    require_pkg_config vulkan "vulkan >= 1.1.97" "vulkan/vulkan.h" vkCreateInstance
6685
6686if enabled x86; then
6687    case $target_os in
6688        mingw32*|mingw64*|win32|win64|linux|cygwin*)
6689            ;;
6690        *)
6691            disable ffnvcodec cuvid nvdec nvenc
6692            ;;
6693    esac
6694elif enabled_any aarch64 ppc64 && ! enabled bigendian; then
6695    case $target_os in
6696        linux)
6697            ;;
6698        *)
6699            disable ffnvcodec cuvid nvdec nvenc
6700            ;;
6701    esac
6702else
6703    disable ffnvcodec cuvid nvdec nvenc
6704fi
6705
6706enabled ffnvcodec && enable cuda
6707
6708enabled nvenc &&
6709    test_cc -I$source_path <<EOF || disable nvenc
6710#include <ffnvcodec/nvEncodeAPI.h>
6711NV_ENCODE_API_FUNCTION_LIST flist;
6712void f(void) { struct { const GUID guid; } s[] = { { NV_ENC_PRESET_HQ_GUID } }; }
6713int main(void) { return 0; }
6714EOF
6715
6716enabled amf &&
6717    check_cpp_condition amf "AMF/core/Version.h" \
6718        "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400090000"
6719
6720# Funny iconv installations are not unusual, so check it after all flags have been set
6721if enabled libc_iconv; then
6722    check_func_headers iconv.h iconv
6723elif enabled iconv; then
6724    check_func_headers iconv.h iconv || check_lib iconv iconv.h iconv -liconv
6725fi
6726
6727enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
6728
6729# add some useful compiler flags if supported
6730check_cflags -Wdeclaration-after-statement
6731check_cflags -Wall
6732check_cflags -Wdisabled-optimization
6733check_cflags -Wpointer-arith
6734check_cflags -Wredundant-decls
6735check_cflags -Wwrite-strings
6736check_cflags -Wtype-limits
6737check_cflags -Wundef
6738check_cflags -Wmissing-prototypes
6739check_cflags -Wno-pointer-to-int-cast
6740check_cflags -Wstrict-prototypes
6741check_cflags -Wempty-body
6742
6743if enabled extra_warnings; then
6744    check_cflags -Wcast-qual
6745    check_cflags -Wextra
6746    check_cflags -Wpedantic
6747fi
6748
6749check_disable_warning(){
6750    warning_flag=-W${1#-Wno-}
6751    test_cflags $unknown_warning_flags $warning_flag && add_cflags $1
6752}
6753
6754test_cflags -Werror=unused-command-line-argument &&
6755    append unknown_warning_flags "-Werror=unused-command-line-argument"
6756test_cflags -Werror=unknown-warning-option &&
6757    append unknown_warning_flags "-Werror=unknown-warning-option"
6758
6759check_disable_warning -Wno-parentheses
6760check_disable_warning -Wno-switch
6761check_disable_warning -Wno-format-zero-length
6762check_disable_warning -Wno-pointer-sign
6763check_disable_warning -Wno-unused-const-variable
6764check_disable_warning -Wno-bool-operation
6765check_disable_warning -Wno-char-subscripts
6766
6767check_disable_warning_headers(){
6768    warning_flag=-W${1#-Wno-}
6769    test_cflags $warning_flag && add_cflags_headers $1
6770}
6771
6772check_disable_warning_headers -Wno-deprecated-declarations
6773check_disable_warning_headers -Wno-unused-variable
6774
6775test_cc <<EOF && enable blocks_extension
6776void (^block)(void);
6777EOF
6778
6779# add some linker flags
6780check_ldflags -Wl,--warn-common
6781check_ldflags -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
6782enabled rpath && add_ldexeflags -Wl,-rpath,$libdir && add_ldsoflags -Wl,-rpath,$libdir
6783test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
6784
6785# add some strip flags
6786check_stripflags -x
6787
6788enabled neon_clobber_test &&
6789    check_ldflags -Wl,--wrap,avcodec_open2              \
6790                  -Wl,--wrap,avcodec_decode_audio4      \
6791                  -Wl,--wrap,avcodec_decode_video2      \
6792                  -Wl,--wrap,avcodec_decode_subtitle2   \
6793                  -Wl,--wrap,avcodec_encode_audio2      \
6794                  -Wl,--wrap,avcodec_encode_video2      \
6795                  -Wl,--wrap,avcodec_encode_subtitle    \
6796                  -Wl,--wrap,avcodec_send_packet        \
6797                  -Wl,--wrap,avcodec_receive_packet     \
6798                  -Wl,--wrap,avcodec_send_frame         \
6799                  -Wl,--wrap,avcodec_receive_frame      \
6800                  -Wl,--wrap,swr_convert                \
6801                  -Wl,--wrap,avresample_convert ||
6802    disable neon_clobber_test
6803
6804enabled xmm_clobber_test &&
6805    check_ldflags -Wl,--wrap,avcodec_open2              \
6806                  -Wl,--wrap,avcodec_decode_audio4      \
6807                  -Wl,--wrap,avcodec_decode_video2      \
6808                  -Wl,--wrap,avcodec_decode_subtitle2   \
6809                  -Wl,--wrap,avcodec_encode_audio2      \
6810                  -Wl,--wrap,avcodec_encode_video2      \
6811                  -Wl,--wrap,avcodec_encode_subtitle    \
6812                  -Wl,--wrap,avcodec_send_packet        \
6813                  -Wl,--wrap,avcodec_receive_packet     \
6814                  -Wl,--wrap,avcodec_send_frame         \
6815                  -Wl,--wrap,avcodec_receive_frame      \
6816                  -Wl,--wrap,swr_convert                \
6817                  -Wl,--wrap,avresample_convert         \
6818                  -Wl,--wrap,sws_scale ||
6819    disable xmm_clobber_test
6820
6821check_ld "cc" proper_dce <<EOF
6822extern const int array[512];
6823static inline int func(void) { return array[0]; }
6824int main(void) { return 0; }
6825EOF
6826
6827if enabled proper_dce; then
6828    echo "X { local: *; };" > $TMPV
6829    if test_ldflags -Wl,${version_script},$TMPV; then
6830        append SHFLAGS '-Wl,${version_script},\$(SUBDIR)lib\$(NAME).ver'
6831        quotes='""'
6832        test_cc <<EOF && enable symver_asm_label
6833void ff_foo(void) __asm__ ("av_foo@VERSION");
6834void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
6835EOF
6836        test_cc <<EOF && enable symver_gnu_asm
6837__asm__(".symver ff_foo,av_foo@VERSION");
6838void ff_foo(void) {}
6839EOF
6840    fi
6841fi
6842
6843if [ -z "$optflags" ]; then
6844    if enabled small; then
6845        optflags=$cflags_size
6846    elif enabled optimizations; then
6847        optflags=$cflags_speed
6848    else
6849        optflags=$cflags_noopt
6850    fi
6851fi
6852
6853check_optflags(){
6854    check_cflags "$@"
6855    enabled lto && check_ldflags "$@"
6856}
6857
6858check_optflags $optflags
6859check_optflags -fno-math-errno
6860check_optflags -fno-signed-zeros
6861
6862if enabled lto; then
6863    test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
6864    check_cflags  -flto
6865    check_ldflags -flto $cpuflags
6866    disable inline_asm_direct_symbol_refs
6867fi
6868
6869enabled ftrapv && check_cflags -ftrapv
6870
6871test_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
6872int x;
6873EOF
6874
6875
6876if enabled icc; then
6877    # Just warnings, no remarks
6878    check_cflags -w1
6879    # -wd: Disable following warnings
6880    # 144, 167, 556: -Wno-pointer-sign
6881    # 188: enumerated type mixed with another type
6882    # 1292: attribute "foo" ignored
6883    # 1419: external declaration in primary source file
6884    # 10006: ignoring unknown option -fno-signed-zeros
6885    # 10148: ignoring unknown option -Wno-parentheses
6886    # 10156: ignoring option '-W'; no argument required
6887    # 13200: No EMMS instruction before call to function
6888    # 13203: No EMMS instruction before return from function
6889    check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203
6890    # 11030: Warning unknown option --as-needed
6891    # 10156: ignoring option '-export'; no argument required
6892    check_ldflags -wd10156,11030
6893    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
6894    enable ebp_available
6895    # The test above does not test linking
6896    enabled lto && disable symver_asm_label
6897    if enabled x86_32; then
6898        icc_version=$($cc -dumpversion)
6899        test ${icc_version%%.*} -ge 11 &&
6900            check_cflags -falign-stack=maintain-16-byte ||
6901            disable aligned_stack
6902    fi
6903elif enabled gcc; then
6904    check_optflags -fno-tree-vectorize
6905    check_cflags -Werror=format-security
6906    check_cflags -Werror=implicit-function-declaration
6907    check_cflags -Werror=missing-prototypes
6908    check_cflags -Werror=return-type
6909    check_cflags -Werror=vla
6910    check_cflags -Wformat
6911    check_cflags -fdiagnostics-color=auto
6912    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
6913    if enabled x86_32; then
6914        case $target_os in
6915        *bsd*)
6916            # BSDs don't guarantee a 16 byte aligned stack, but we can
6917            # request GCC to try to maintain 16 byte alignment throughout
6918            # function calls. Library entry points that might call assembly
6919            # functions align the stack. (The parameter means 2^4 bytes.)
6920            check_cflags -mpreferred-stack-boundary=4
6921            ;;
6922        esac
6923    fi
6924elif enabled llvm_gcc; then
6925    check_cflags -mllvm -stack-alignment=16
6926elif enabled clang; then
6927    if enabled x86_32; then
6928        # Clang doesn't support maintaining alignment without assuming the
6929        # same alignment in every function. If 16 byte alignment would be
6930        # enabled, one would also have to either add attribute_align_arg on
6931        # every single entry point into the libraries or enable -mstackrealign
6932        # (doing stack realignment in every single function).
6933        case $target_os in
6934        mingw32|win32|*bsd*)
6935            disable aligned_stack
6936            ;;
6937        *)
6938            check_cflags -mllvm -stack-alignment=16
6939            check_cflags -mstack-alignment=16
6940            ;;
6941        esac
6942    else
6943        check_cflags -mllvm -stack-alignment=16
6944        check_cflags -mstack-alignment=16
6945    fi
6946    check_cflags -Qunused-arguments
6947    check_cflags -Werror=implicit-function-declaration
6948    check_cflags -Werror=missing-prototypes
6949    check_cflags -Werror=return-type
6950elif enabled cparser; then
6951    add_cflags -Wno-missing-variable-declarations
6952    add_cflags -Wno-empty-statement
6953elif enabled armcc; then
6954    add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
6955    add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
6956    # 2523: use of inline assembly is deprecated
6957    add_cflags -W${armcc_opt},--diag_suppress=2523
6958    add_cflags -W${armcc_opt},--diag_suppress=1207
6959    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
6960    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
6961    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
6962    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
6963elif enabled pathscale; then
6964    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
6965    disable inline_asm
6966elif enabled_any msvc icl; then
6967    enabled x86_32 && disable aligned_stack
6968    enabled_all x86_32 debug && add_cflags -Oy-
6969    enabled debug && add_ldflags -debug
6970    enable pragma_deprecated
6971    if enabled icl; then
6972        # -Qansi-alias is basically -fstrict-aliasing, but does not work
6973        # (correctly) on icl 13.x.
6974        test_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
6975            add_cflags -Qansi-alias
6976        # Some inline asm is not compilable in debug
6977        if enabled debug; then
6978            disable ebp_available
6979            disable ebx_available
6980        fi
6981    fi
6982    # msvcrt10 x64 incorrectly enables log2, only msvcrt12 (MSVC 2013) onwards actually has log2.
6983    check_cpp_condition log2 crtversion.h "_VC_CRT_MAJOR_VERSION >= 12"
6984    # The CRT headers contain __declspec(restrict) in a few places, but if redefining
6985    # restrict, this might break. MSVC 2010 and 2012 fail with __declspec(__restrict)
6986    # (as it ends up if the restrict redefine is done before including stdlib.h), while
6987    # MSVC 2013 and newer can handle it fine.
6988    # If this declspec fails, force including stdlib.h before the restrict redefinition
6989    # happens in config.h.
6990    if [ $restrict_keyword != restrict ]; then
6991        test_cc <<EOF || add_cflags -FIstdlib.h
6992__declspec($restrict_keyword) void *foo(int);
6993EOF
6994    fi
6995    # the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
6996    # Issue has been fixed in MSVC v19.00.24218.
6997    test_cpp_condition windows.h "_MSC_FULL_VER >= 190024218" ||
6998        check_cflags -d2SSAOptimizer-
6999    # enable utf-8 source processing on VS2015 U2 and newer
7000    test_cpp_condition windows.h "_MSC_FULL_VER >= 190023918" &&
7001        add_cflags -utf-8
7002fi
7003
7004for pfx in "" host_; do
7005    varname=${pfx%_}cc_type
7006    eval "type=\$$varname"
7007    if [ "$type" = "msvc" ]; then
7008        test_${pfx}cc <<EOF || add_${pfx}cflags -Dinline=__inline
7009static inline int foo(int a) { return a; }
7010EOF
7011    fi
7012done
7013
7014case $as_type in
7015    clang)
7016        add_asflags -Qunused-arguments
7017    ;;
7018esac
7019
7020case $ld_type in
7021    clang)
7022        check_ldflags -Qunused-arguments
7023    ;;
7024esac
7025
7026enable frame_thread_encoder
7027
7028enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
7029
7030check_deps $CONFIG_LIST       \
7031           $CONFIG_EXTRA      \
7032           $HAVE_LIST         \
7033           $ALL_COMPONENTS    \
7034
7035enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86"
7036enabled avresample && warn "Building with deprecated library libavresample"
7037
7038case $target_os in
7039haiku)
7040    disable memalign
7041    disable posix_memalign
7042    ;;
7043*-dos|freedos|opendos)
7044    if test_cpp_condition sys/version.h "defined(__DJGPP__) && __DJGPP__ == 2 && __DJGPP_MINOR__ == 5"; then
7045        disable memalign
7046    fi
7047    ;;
7048esac
7049
7050flatten_extralibs(){
7051    nested_entries=
7052    list_name=$1
7053    eval list=\$${1}
7054    for entry in $list; do
7055        entry_copy=$entry
7056        resolve entry_copy
7057        flat_entries=
7058        for e in $entry_copy; do
7059            case $e in
7060                *_extralibs) nested_entries="$nested_entries$e ";;
7061                          *) flat_entries="$flat_entries$e ";;
7062            esac
7063        done
7064        eval $entry="\$flat_entries"
7065    done
7066    append $list_name "$nested_entries"
7067
7068    resolve nested_entries
7069    if test -n "$(filter '*_extralibs' $nested_entries)"; then
7070        flatten_extralibs $list_name
7071    fi
7072}
7073
7074flatten_extralibs_wrapper(){
7075    list_name=$1
7076    flatten_extralibs $list_name
7077    unique $list_name
7078    resolve $list_name
7079    eval $list_name=\$\(\$ldflags_filter \$$list_name\)
7080    eval printf \''%s'\' \""\$$list_name"\"
7081}
7082
7083for linkunit in $LIBRARY_LIST; do
7084    unset current_extralibs
7085    eval components=\$$(toupper ${linkunit})_COMPONENTS_LIST
7086    for comp in ${components}; do
7087        enabled $comp || continue
7088        comp_extralibs="${comp}_extralibs"
7089        append current_extralibs $comp_extralibs
7090    done
7091    eval prepend ${linkunit}_extralibs $current_extralibs
7092done
7093
7094for linkunit in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
7095    eval ${linkunit}_extralibs=\$\(flatten_extralibs_wrapper ${linkunit}_extralibs\)
7096done
7097
7098map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST
7099
7100for thread in $THREADS_LIST; do
7101    if enabled $thread; then
7102        test -n "$thread_type" &&
7103            die "ERROR: Only one thread type must be selected." ||
7104            thread_type="$thread"
7105    fi
7106done
7107
7108if disabled stdatomic; then
7109    if enabled atomics_gcc; then
7110        add_cppflags '-I\$(SRC_PATH)/compat/atomics/gcc'
7111    elif enabled atomics_win32; then
7112        add_cppflags '-I\$(SRC_PATH)/compat/atomics/win32'
7113    elif enabled atomics_suncc; then
7114        add_cppflags '-I\$(SRC_PATH)/compat/atomics/suncc'
7115    elif enabled pthreads; then
7116        add_compat atomics/pthread/stdatomic.o
7117        add_cppflags '-I\$(SRC_PATH)/compat/atomics/pthread'
7118    else
7119        enabled threads && die "Threading is enabled, but no atomics are available"
7120        add_cppflags '-I\$(SRC_PATH)/compat/atomics/dummy'
7121    fi
7122fi
7123
7124# Check if requested libraries were found.
7125for lib in $AUTODETECT_LIBS; do
7126    requested $lib && ! enabled $lib && die "ERROR: $lib requested but not found";
7127done
7128
7129enabled zlib && add_cppflags -DZLIB_CONST
7130
7131# conditional library dependencies, in any order
7132enabled afftdn_filter       && prepend avfilter_deps "avcodec"
7133enabled afftfilt_filter     && prepend avfilter_deps "avcodec"
7134enabled afir_filter         && prepend avfilter_deps "avcodec"
7135enabled amovie_filter       && prepend avfilter_deps "avformat avcodec"
7136enabled aresample_filter    && prepend avfilter_deps "swresample"
7137enabled atempo_filter       && prepend avfilter_deps "avcodec"
7138enabled bm3d_filter         && prepend avfilter_deps "avcodec"
7139enabled cover_rect_filter   && prepend avfilter_deps "avformat avcodec"
7140enabled convolve_filter     && prepend avfilter_deps "avcodec"
7141enabled deconvolve_filter   && prepend avfilter_deps "avcodec"
7142enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
7143enabled elbg_filter         && prepend avfilter_deps "avcodec"
7144enabled fftfilt_filter      && prepend avfilter_deps "avcodec"
7145enabled find_rect_filter    && prepend avfilter_deps "avformat avcodec"
7146enabled firequalizer_filter && prepend avfilter_deps "avcodec"
7147enabled mcdeint_filter      && prepend avfilter_deps "avcodec"
7148enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
7149enabled pan_filter          && prepend avfilter_deps "swresample"
7150enabled pp_filter           && prepend avfilter_deps "postproc"
7151enabled removelogo_filter   && prepend avfilter_deps "avformat avcodec swscale"
7152enabled resample_filter && prepend avfilter_deps "avresample"
7153enabled sab_filter          && prepend avfilter_deps "swscale"
7154enabled scale_filter    && prepend avfilter_deps "swscale"
7155enabled scale2ref_filter    && prepend avfilter_deps "swscale"
7156enabled sofalizer_filter    && prepend avfilter_deps "avcodec"
7157enabled showcqt_filter      && prepend avfilter_deps "avformat avcodec swscale"
7158enabled showfreqs_filter    && prepend avfilter_deps "avcodec"
7159enabled showspectrum_filter && prepend avfilter_deps "avcodec"
7160enabled signature_filter    && prepend avfilter_deps "avcodec avformat"
7161enabled smartblur_filter    && prepend avfilter_deps "swscale"
7162enabled spectrumsynth_filter && prepend avfilter_deps "avcodec"
7163enabled spp_filter          && prepend avfilter_deps "avcodec"
7164enabled sr_filter           && prepend avfilter_deps "avformat swscale"
7165enabled subtitles_filter    && prepend avfilter_deps "avformat avcodec"
7166enabled uspp_filter         && prepend avfilter_deps "avcodec"
7167enabled zoompan_filter      && prepend avfilter_deps "swscale"
7168
7169enabled lavfi_indev         && prepend avdevice_deps "avfilter"
7170
7171#FIXME
7172enabled_any sdl2_outdev opengl_outdev && enabled sdl2 &&
7173    add_cflags $(filter_out '-Dmain=SDL_main' $sdl2_cflags)
7174
7175enabled opus_decoder    && prepend avcodec_deps "swresample"
7176
7177# reorder the items at var $1 to align with the items order at var $2 .
7178# die if an item at $1 is not at $2 .
7179reorder_by(){
7180    eval rb_in=\$$1
7181    eval rb_ordered=\$$2
7182
7183    for rb in $rb_in; do
7184        is_in $rb $rb_ordered || die "$rb at \$$1 is not at \$$2"
7185    done
7186
7187    rb_out=
7188    for rb in $rb_ordered; do
7189        is_in $rb $rb_in && rb_out="$rb_out$rb "
7190    done
7191    eval $1=\$rb_out
7192}
7193
7194# deps-expand fflib $1:  N x {append all expanded deps; unique}
7195# within a set of N items, N expansions are enough to expose a cycle.
7196expand_deps(){
7197    unique ${1}_deps  # required for the early break test.
7198    for dummy in $LIBRARY_LIST; do  # N iteratios
7199        eval deps=\$${1}_deps
7200        append ${1}_deps $(map 'eval echo \$${v}_deps' $deps)
7201        unique ${1}_deps
7202        eval '[ ${#deps} = ${#'${1}_deps'} ]' && break  # doesn't expand anymore
7203    done
7204
7205    eval is_in $1 \$${1}_deps && die "Dependency cycle at ${1}_deps"
7206    reorder_by ${1}_deps LIBRARY_LIST  # linking order is expected later
7207}
7208
7209#we have to remove gpl from the deps here as some code assumes all lib deps are libs
7210postproc_deps="$(filter_out 'gpl' $postproc_deps)"
7211
7212map 'expand_deps $v' $LIBRARY_LIST
7213
7214if test "$quiet" != "yes"; then
7215
7216echo "install prefix            $prefix"
7217echo "source path               $source_path"
7218echo "C compiler                $cc"
7219echo "C library                 $libc_type"
7220if test "$host_cc" != "$cc"; then
7221    echo "host C compiler           $host_cc"
7222    echo "host C library            $host_libc_type"
7223fi
7224echo "ARCH                      $arch ($cpu)"
7225if test "$build_suffix" != ""; then
7226    echo "build suffix              $build_suffix"
7227fi
7228if test "$progs_suffix" != ""; then
7229    echo "progs suffix              $progs_suffix"
7230fi
7231if test "$extra_version" != ""; then
7232    echo "version string suffix     $extra_version"
7233fi
7234echo "big-endian                ${bigendian-no}"
7235echo "runtime cpu detection     ${runtime_cpudetect-no}"
7236if enabled x86; then
7237    echo "standalone assembly       ${x86asm-no}"
7238    echo "x86 assembler             ${x86asmexe}"
7239    echo "MMX enabled               ${mmx-no}"
7240    echo "MMXEXT enabled            ${mmxext-no}"
7241    echo "3DNow! enabled            ${amd3dnow-no}"
7242    echo "3DNow! extended enabled   ${amd3dnowext-no}"
7243    echo "SSE enabled               ${sse-no}"
7244    echo "SSSE3 enabled             ${ssse3-no}"
7245    echo "AESNI enabled             ${aesni-no}"
7246    echo "AVX enabled               ${avx-no}"
7247    echo "AVX2 enabled              ${avx2-no}"
7248    echo "AVX-512 enabled           ${avx512-no}"
7249    echo "XOP enabled               ${xop-no}"
7250    echo "FMA3 enabled              ${fma3-no}"
7251    echo "FMA4 enabled              ${fma4-no}"
7252    echo "i686 features enabled     ${i686-no}"
7253    echo "CMOV is fast              ${fast_cmov-no}"
7254    echo "EBX available             ${ebx_available-no}"
7255    echo "EBP available             ${ebp_available-no}"
7256fi
7257if enabled aarch64; then
7258    echo "NEON enabled              ${neon-no}"
7259    echo "VFP enabled               ${vfp-no}"
7260fi
7261if enabled arm; then
7262    echo "ARMv5TE enabled           ${armv5te-no}"
7263    echo "ARMv6 enabled             ${armv6-no}"
7264    echo "ARMv6T2 enabled           ${armv6t2-no}"
7265    echo "VFP enabled               ${vfp-no}"
7266    echo "NEON enabled              ${neon-no}"
7267    echo "THUMB enabled             ${thumb-no}"
7268fi
7269if enabled mips; then
7270    echo "MIPS FPU enabled          ${mipsfpu-no}"
7271    echo "MIPS DSP R1 enabled       ${mipsdsp-no}"
7272    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
7273    echo "MIPS MSA enabled          ${msa-no}"
7274    echo "MIPS MSA2 enabled         ${msa2-no}"
7275    echo "LOONGSON MMI enabled      ${mmi-no}"
7276fi
7277if enabled ppc; then
7278    echo "AltiVec enabled           ${altivec-no}"
7279    echo "VSX enabled               ${vsx-no}"
7280    echo "POWER8 enabled            ${power8-no}"
7281    echo "PPC 4xx optimizations     ${ppc4xx-no}"
7282    echo "dcbzl available           ${dcbzl-no}"
7283fi
7284echo "debug symbols             ${debug-no}"
7285echo "strip symbols             ${stripping-no}"
7286echo "optimize for size         ${small-no}"
7287echo "optimizations             ${optimizations-no}"
7288echo "static                    ${static-no}"
7289echo "shared                    ${shared-no}"
7290echo "postprocessing support    ${postproc-no}"
7291echo "network support           ${network-no}"
7292echo "threading support         ${thread_type-no}"
7293echo "safe bitstream reader     ${safe_bitstream_reader-no}"
7294echo "texi2html enabled         ${texi2html-no}"
7295echo "perl enabled              ${perl-no}"
7296echo "pod2man enabled           ${pod2man-no}"
7297echo "makeinfo enabled          ${makeinfo-no}"
7298echo "makeinfo supports HTML    ${makeinfo_html-no}"
7299test -n "$random_seed" &&
7300    echo "random seed               ${random_seed}"
7301echo
7302
7303echo "External libraries:"
7304print_enabled '' $EXTERNAL_LIBRARY_LIST $EXTERNAL_AUTODETECT_LIBRARY_LIST | print_in_columns
7305echo
7306
7307echo "External libraries providing hardware acceleration:"
7308print_enabled '' $HWACCEL_LIBRARY_LIST $HWACCEL_AUTODETECT_LIBRARY_LIST | print_in_columns
7309echo
7310
7311echo "Libraries:"
7312print_enabled '' $LIBRARY_LIST | print_in_columns
7313echo
7314
7315echo "Programs:"
7316print_enabled '' $PROGRAM_LIST | print_in_columns
7317echo
7318
7319for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
7320    echo "Enabled ${type}s:"
7321    eval list=\$$(toupper $type)_LIST
7322    print_enabled '_*' $list | print_in_columns
7323    echo
7324done
7325
7326if test -n "$ignore_tests"; then
7327    ignore_tests=$(echo $ignore_tests | tr ',' ' ')
7328    echo "Ignored FATE tests:"
7329    echo $ignore_tests | print_in_columns
7330    echo
7331fi
7332
7333echo "License: $license"
7334
7335fi # test "$quiet" != "yes"
7336
7337if test -n "$WARN_IF_GETS_DISABLED_LIST"; then
7338    for cfg in $WARN_IF_GETS_DISABLED_LIST; do
7339        if disabled $cfg; then
7340            varname=${cfg}_disable_reason
7341            eval "warn \"Disabled $cfg because \$$varname\""
7342        fi
7343    done
7344fi
7345
7346if test -n "$WARNINGS"; then
7347    printf "\n%s%s$WARNINGS%s" "$warn_color" "$bold_color" "$reset_color"
7348    enabled fatal_warnings && exit 1
7349fi
7350
7351test -e Makefile || echo "include $source_path/Makefile" > Makefile
7352
7353esc(){
7354    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
7355}
7356
7357echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" > ffbuild/config.fate
7358
7359enabled stripping || strip="echo skipping strip"
7360enabled stripping || striptype=""
7361
7362config_files="$TMPH ffbuild/config.mak doc/config.texi"
7363
7364cat > ffbuild/config.mak <<EOF
7365# Automatically generated by configure - do not modify!
7366ifndef FFMPEG_CONFIG_MAK
7367FFMPEG_CONFIG_MAK=1
7368FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
7369prefix=$prefix
7370LIBDIR=\$(DESTDIR)$libdir
7371SHLIBDIR=\$(DESTDIR)$shlibdir
7372INCDIR=\$(DESTDIR)$incdir
7373BINDIR=\$(DESTDIR)$bindir
7374DATADIR=\$(DESTDIR)$datadir
7375DOCDIR=\$(DESTDIR)$docdir
7376MANDIR=\$(DESTDIR)$mandir
7377PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir
7378INSTALL_NAME_DIR=$install_name_dir
7379SRC_PATH=$source_path
7380SRC_LINK=$source_link
7381ifndef MAIN_MAKEFILE
7382SRC_PATH:=\$(SRC_PATH:.%=..%)
7383endif
7384CC_IDENT=$cc_ident
7385ARCH=$arch
7386INTRINSICS=$intrinsics
7387EXTERN_PREFIX=$extern_prefix
7388CC=$cc
7389CXX=$cxx
7390AS=$as
7391OBJCC=$objcc
7392LD=$ld
7393DEPCC=$dep_cc
7394DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
7395DEPAS=$as
7396DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
7397X86ASM=$x86asmexe
7398DEPX86ASM=$x86asmexe
7399DEPX86ASMFLAGS=\$(X86ASMFLAGS)
7400AR=$ar
7401ARFLAGS=$arflags
7402AR_O=$ar_o
7403AR_CMD=$ar
7404NM_CMD=$nm
7405RANLIB=$ranlib
7406STRIP=$strip
7407STRIPTYPE=$striptype
7408NVCC=$nvcc
7409CP=cp -p
7410LN_S=$ln_s
7411CPPFLAGS=$CPPFLAGS
7412CFLAGS=$CFLAGS
7413CXXFLAGS=$CXXFLAGS
7414OBJCFLAGS=$OBJCFLAGS
7415ASFLAGS=$ASFLAGS
7416NVCCFLAGS=$nvccflags
7417AS_C=$AS_C
7418AS_O=$AS_O
7419OBJCC_C=$OBJCC_C
7420OBJCC_E=$OBJCC_E
7421OBJCC_O=$OBJCC_O
7422CC_C=$CC_C
7423CC_E=$CC_E
7424CC_O=$CC_O
7425CXX_C=$CXX_C
7426CXX_O=$CXX_O
7427NVCC_C=$NVCC_C
7428NVCC_O=$NVCC_O
7429LD_O=$LD_O
7430X86ASM_O=$X86ASM_O
7431LD_LIB=$LD_LIB
7432LD_PATH=$LD_PATH
7433DLLTOOL=$dlltool
7434WINDRES=$windres
7435DEPWINDRES=$dep_cc
7436DOXYGEN=$doxygen
7437LDFLAGS=$LDFLAGS
7438LDEXEFLAGS=$LDEXEFLAGS
7439LDSOFLAGS=$LDSOFLAGS
7440SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
7441ASMSTRIPFLAGS=$ASMSTRIPFLAGS
7442X86ASMFLAGS=$X86ASMFLAGS
7443BUILDSUF=$build_suffix
7444PROGSSUF=$progs_suffix
7445FULLNAME=$FULLNAME
7446LIBPREF=$LIBPREF
7447LIBSUF=$LIBSUF
7448LIBNAME=$LIBNAME
7449SLIBPREF=$SLIBPREF
7450SLIBSUF=$SLIBSUF
7451EXESUF=$EXESUF
7452EXTRA_VERSION=$extra_version
7453CCDEP=$CCDEP
7454CXXDEP=$CXXDEP
7455CCDEP_FLAGS=$CCDEP_FLAGS
7456ASDEP=$ASDEP
7457ASDEP_FLAGS=$ASDEP_FLAGS
7458X86ASMDEP=$X86ASMDEP
7459X86ASMDEP_FLAGS=$X86ASMDEP_FLAGS
7460CC_DEPFLAGS=$CC_DEPFLAGS
7461AS_DEPFLAGS=$AS_DEPFLAGS
7462X86ASM_DEPFLAGS=$X86ASM_DEPFLAGS
7463HOSTCC=$host_cc
7464HOSTLD=$host_ld
7465HOSTCFLAGS=$host_cflags
7466HOSTCPPFLAGS=$host_cppflags
7467HOSTEXESUF=$HOSTEXESUF
7468HOSTLDFLAGS=$host_ldflags
7469HOSTEXTRALIBS=$host_extralibs
7470DEPHOSTCC=$host_cc
7471DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
7472HOSTCCDEP=$HOSTCCDEP
7473HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
7474HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
7475HOSTCC_C=$HOSTCC_C
7476HOSTCC_O=$HOSTCC_O
7477HOSTLD_O=$HOSTLD_O
7478TARGET_EXEC=$target_exec $target_exec_args
7479TARGET_PATH=$target_path
7480TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
7481CFLAGS-ffplay=${sdl2_cflags}
7482CFLAGS_HEADERS=$CFLAGS_HEADERS
7483LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
7484EXTRALIBS=$extralibs
7485COMPAT_OBJS=$compat_objs
7486INSTALL=$install
7487LIBTARGET=${LIBTARGET}
7488SLIBNAME=${SLIBNAME}
7489SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
7490SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
7491SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
7492SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
7493SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
7494SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
7495SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
7496SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
7497VERSION_SCRIPT_POSTPROCESS_CMD=${VERSION_SCRIPT_POSTPROCESS_CMD}
7498SAMPLES:=${samples:-\$(FATE_SAMPLES)}
7499NOREDZONE_FLAGS=$noredzone_flags
7500LIBFUZZER_PATH=$libfuzzer_path
7501IGNORE_TESTS=$ignore_tests
7502EOF
7503
7504map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> ffbuild/config.mak' $LIBRARY_LIST
7505
7506for entry in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
7507    eval echo "EXTRALIBS-${entry}=\$${entry}_extralibs" >> ffbuild/config.mak
7508done
7509
7510cat > $TMPH <<EOF
7511/* Automatically generated by configure - do not modify! */
7512#ifndef FFMPEG_CONFIG_H
7513#define FFMPEG_CONFIG_H
7514#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
7515#define FFMPEG_LICENSE "$(c_escape $license)"
7516#define CONFIG_THIS_YEAR 2021
7517#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
7518#define AVCONV_DATADIR "$(eval c_escape $datadir)"
7519#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
7520#define av_restrict $restrict_keyword
7521#define EXTERN_PREFIX "${extern_prefix}"
7522#define EXTERN_ASM ${extern_prefix}
7523#define BUILDSUF "$build_suffix"
7524#define SLIBSUF "$SLIBSUF"
7525#define HAVE_MMX2 HAVE_MMXEXT
7526#define SWS_MAX_FILTER_SIZE $sws_max_filter_size
7527EOF
7528
7529test -n "$assert_level" &&
7530    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
7531
7532test -n "$malloc_prefix" &&
7533    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
7534
7535if enabled x86asm; then
7536    append config_files $TMPASM
7537    cat > $TMPASM <<EOF
7538; Automatically generated by configure - do not modify!
7539EOF
7540fi
7541
7542enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
7543
7544
7545mkdir -p doc
7546mkdir -p tests
7547mkdir -p tests/api
7548echo "@c auto-generated by configure - do not modify! " > doc/config.texi
7549
7550print_config ARCH_   "$config_files" $ARCH_LIST
7551print_config HAVE_   "$config_files" $HAVE_LIST
7552print_config CONFIG_ "$config_files" $CONFIG_LIST       \
7553                                     $CONFIG_EXTRA      \
7554                                     $ALL_COMPONENTS    \
7555
7556echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
7557echo "endif # FFMPEG_CONFIG_MAK" >> ffbuild/config.mak
7558
7559# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
7560cp_if_changed $TMPH config.h
7561touch ffbuild/.config
7562
7563enabled x86asm && cp_if_changed $TMPASM config.asm
7564
7565cat > $TMPH <<EOF
7566/* Generated by ffmpeg configure */
7567#ifndef AVUTIL_AVCONFIG_H
7568#define AVUTIL_AVCONFIG_H
7569EOF
7570
7571print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
7572
7573echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
7574
7575cp_if_changed $TMPH libavutil/avconfig.h
7576
7577# full_filter_name_foo=vf_foo
7578# full_filter_name_bar=asrc_bar
7579# ...
7580eval "$(sed -n "s/^extern AVFilter ff_\([avfsinkrc]\{2,5\}\)_\(.*\);/full_filter_name_\2=\1_\2/p" $source_path/libavfilter/allfilters.c)"
7581
7582# generate the lists of enabled components
7583print_enabled_components(){
7584    file=$1
7585    struct_name=$2
7586    name=$3
7587    shift 3
7588    echo "static const $struct_name * const $name[] = {" > $TMPH
7589    for c in $*; do
7590        if enabled $c; then
7591            case $name in
7592                filter_list)
7593                    eval c=\$full_filter_name_${c%_filter}
7594                ;;
7595                indev_list)
7596                    c=${c%_indev}_demuxer
7597                ;;
7598                outdev_list)
7599                    c=${c%_outdev}_muxer
7600                ;;
7601            esac
7602            printf "    &ff_%s,\n" $c >> $TMPH
7603        fi
7604    done
7605    if [ "$name" = "filter_list" ]; then
7606        for c in asrc_abuffer vsrc_buffer asink_abuffer vsink_buffer; do
7607            printf "    &ff_%s,\n" $c >> $TMPH
7608        done
7609    fi
7610    echo "    NULL };" >> $TMPH
7611    cp_if_changed $TMPH $file
7612}
7613
7614print_enabled_components libavfilter/filter_list.c AVFilter filter_list $FILTER_LIST
7615print_enabled_components libavcodec/codec_list.c AVCodec codec_list $CODEC_LIST
7616print_enabled_components libavcodec/parser_list.c AVCodecParser parser_list $PARSER_LIST
7617print_enabled_components libavcodec/bsf_list.c AVBitStreamFilter bitstream_filters $BSF_LIST
7618print_enabled_components libavformat/demuxer_list.c AVInputFormat demuxer_list $DEMUXER_LIST
7619print_enabled_components libavformat/muxer_list.c AVOutputFormat muxer_list $MUXER_LIST
7620print_enabled_components libavdevice/indev_list.c AVInputFormat indev_list $INDEV_LIST
7621print_enabled_components libavdevice/outdev_list.c AVOutputFormat outdev_list $OUTDEV_LIST
7622print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $PROTOCOL_LIST
7623
7624# Settings for pkg-config files
7625
7626cat > $TMPH <<EOF
7627# Automatically generated by configure - do not modify!
7628shared=$shared
7629build_suffix=$build_suffix
7630prefix=$prefix
7631libdir=$libdir
7632incdir=$incdir
7633rpath=$(enabled rpath && echo "-Wl,-rpath,\${libdir}")
7634source_path=${source_path}
7635LIBPREF=${LIBPREF}
7636LIBSUF=${LIBSUF}
7637extralibs_avutil="$avutil_extralibs"
7638extralibs_avcodec="$avcodec_extralibs"
7639extralibs_avformat="$avformat_extralibs"
7640extralibs_avdevice="$avdevice_extralibs"
7641extralibs_avfilter="$avfilter_extralibs"
7642extralibs_avresample="$avresample_extralibs"
7643extralibs_postproc="$postproc_extralibs"
7644extralibs_swscale="$swscale_extralibs"
7645extralibs_swresample="$swresample_extralibs"
7646EOF
7647
7648for lib in $LIBRARY_LIST; do
7649    lib_deps="$(eval echo \$${lib}_deps)"
7650    echo ${lib}_deps=\"$lib_deps\" >> $TMPH
7651done
7652
7653cp_if_changed $TMPH ffbuild/config.sh
7654