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