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"
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
3787arch_default=$(uname -p)
3788cpu="generic"
3789intrinsics="none"
3790
3791# configurable options
3792enable $PROGRAM_LIST
3793enable $DOCUMENT_LIST
3794enable $EXAMPLE_LIST
3795enable $(filter_out avresample $LIBRARY_LIST)
3796enable stripping
3797
3798enable asm
3799enable debug
3800enable doc
3801enable faan faandct faanidct
3802enable large_tests
3803enable optimizations
3804enable runtime_cpudetect
3805enable safe_bitstream_reader
3806enable static
3807enable swscale_alpha
3808enable valgrind_backtrace
3809
3810sws_max_filter_size_default=256
3811set_default sws_max_filter_size
3812
3813# internal components are enabled by default
3814enable $EXTRALIBS_LIST
3815
3816# Avoid external, non-system, libraries getting enabled by dependency resolution
3817disable $EXTERNAL_LIBRARY_LIST $HWACCEL_LIBRARY_LIST
3818
3819# build settings
3820SHFLAGS='-shared -Wl,-soname,$$(@F)'
3821LIBPREF="lib"
3822LIBSUF=".a"
3823FULLNAME='$(NAME)$(BUILDSUF)'
3824LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
3825SLIBPREF="lib"
3826SLIBSUF=".so"
3827SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
3828SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
3829SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
3830LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
3831SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
3832SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
3833VERSION_SCRIPT_POSTPROCESS_CMD="cat"
3834
3835asflags_filter=echo
3836cflags_filter=echo
3837ldflags_filter=echo
3838
3839AS_C='-c'
3840AS_O='-o $@'
3841CC_C='-c'
3842CC_E='-E -o $@'
3843CC_O='-o $@'
3844CXX_C='-c'
3845CXX_O='-o $@'
3846OBJCC_C='-c'
3847OBJCC_E='-E -o $@'
3848OBJCC_O='-o $@'
3849X86ASM_O='-o $@'
3850LD_O='-o $@'
3851LD_LIB='-l%'
3852LD_PATH='-L'
3853HOSTCC_C='-c'
3854HOSTCC_E='-E -o $@'
3855HOSTCC_O='-o $@'
3856HOSTLD_O='-o $@'
3857NVCC_C='-c'
3858NVCC_O='-o $@'
3859
3860host_extralibs='-lm'
3861host_cflags_filter=echo
3862host_ldflags_filter=echo
3863
3864target_path='$(CURDIR)'
3865
3866# since the object filename is not given with the -MM flag, the compiler
3867# is only able to print the basename, and we must add the path ourselves
3868DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>/dev/null | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(@F),$(@D)/$(@F)," > $(@:.o=.d)'
3869DEPFLAGS='-MM'
3870
3871mkdir -p ffbuild
3872
3873# find source path
3874if test -f configure; then
3875    source_path=.
3876elif test -f src/configure; then
3877    source_path=src
3878else
3879    source_path=$(cd $(dirname "$0"); pwd)
3880    case "$source_path" in
3881        *[[:blank:]]*) die "Out of tree builds are impossible with whitespace in source path." ;;
3882    esac
3883    test -e "$source_path/config.h" &&
3884        die "Out of tree builds are impossible with config.h in source dir."
3885fi
3886
3887for v in "$@"; do
3888    r=${v#*=}
3889    l=${v%"$r"}
3890    r=$(sh_quote "$r")
3891    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
3892done
3893
3894find_things_extern(){
3895    thing=$1
3896    pattern=$2
3897    file=$source_path/$3
3898    out=${4:-$thing}
3899    sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$out/p" "$file"
3900}
3901
3902find_filters_extern(){
3903    file=$source_path/$1
3904    sed -n 's/^extern AVFilter ff_[avfsinkrc]\{2,5\}_\([[:alnum:]_]\{1,\}\);/\1_filter/p' $file
3905}
3906
3907FILTER_LIST=$(find_filters_extern libavfilter/allfilters.c)
3908OUTDEV_LIST=$(find_things_extern muxer AVOutputFormat libavdevice/alldevices.c outdev)
3909INDEV_LIST=$(find_things_extern demuxer AVInputFormat libavdevice/alldevices.c indev)
3910MUXER_LIST=$(find_things_extern muxer AVOutputFormat libavformat/allformats.c)
3911DEMUXER_LIST=$(find_things_extern demuxer AVInputFormat libavformat/allformats.c)
3912ENCODER_LIST=$(find_things_extern encoder AVCodec libavcodec/allcodecs.c)
3913DECODER_LIST=$(find_things_extern decoder AVCodec libavcodec/allcodecs.c)
3914CODEC_LIST="
3915    $ENCODER_LIST
3916    $DECODER_LIST
3917"
3918PARSER_LIST=$(find_things_extern parser AVCodecParser libavcodec/parsers.c)
3919BSF_LIST=$(find_things_extern bsf AVBitStreamFilter libavcodec/bitstream_filters.c)
3920HWACCEL_LIST=$(find_things_extern hwaccel AVHWAccel libavcodec/hwaccels.h)
3921PROTOCOL_LIST=$(find_things_extern protocol URLProtocol libavformat/protocols.c)
3922
3923AVCODEC_COMPONENTS_LIST="
3924    $BSF_LIST
3925    $DECODER_LIST
3926    $ENCODER_LIST
3927    $HWACCEL_LIST
3928    $PARSER_LIST
3929"
3930
3931AVDEVICE_COMPONENTS_LIST="
3932    $INDEV_LIST
3933    $OUTDEV_LIST
3934"
3935
3936AVFILTER_COMPONENTS_LIST="
3937    $FILTER_LIST
3938"
3939
3940AVFORMAT_COMPONENTS_LIST="
3941    $DEMUXER_LIST
3942    $MUXER_LIST
3943    $PROTOCOL_LIST
3944"
3945
3946ALL_COMPONENTS="
3947    $AVCODEC_COMPONENTS_LIST
3948    $AVDEVICE_COMPONENTS_LIST
3949    $AVFILTER_COMPONENTS_LIST
3950    $AVFORMAT_COMPONENTS_LIST
3951"
3952
3953for n in $COMPONENT_LIST; do
3954    v=$(toupper ${n%s})_LIST
3955    eval enable \$$v
3956    eval ${n}_if_any="\$$v"
3957done
3958
3959enable $ARCH_EXT_LIST
3960
3961die_unknown(){
3962    echo "Unknown option \"$1\"."
3963    echo "See $0 --help for available options."
3964    exit 1
3965}
3966
3967print_in_columns() {
3968    tr ' ' '\n' | sort | tr '\r\n' '  ' | awk -v col_width=24 -v width="$ncols" '
3969    {
3970        num_cols = width > col_width ? int(width / col_width) : 1;
3971        num_rows = int((NF + num_cols-1) / num_cols);
3972        y = x = 1;
3973        for (y = 1; y <= num_rows; y++) {
3974            i = y;
3975            for (x = 1; x <= num_cols; x++) {
3976                if (i <= NF) {
3977                  line = sprintf("%s%-" col_width "s", line, $i);
3978                }
3979                i = i + num_rows;
3980            }
3981            print line; line = "";
3982        }
3983    }' | sed 's/ *$//'
3984}
3985
3986show_list() {
3987    suffix=_$1
3988    shift
3989    echo $* | sed s/$suffix//g | print_in_columns
3990    exit 0
3991}
3992
3993rand_list(){
3994    IFS=', '
3995    set -- $*
3996    unset IFS
3997    for thing; do
3998        comp=${thing%:*}
3999        prob=${thing#$comp}
4000        prob=${prob#:}
4001        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
4002        echo "prob ${prob:-0.5}"
4003        printf '%s\n' $comp
4004    done
4005}
4006
4007do_random(){
4008    action=$1
4009    shift
4010    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
4011    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
4012}
4013
4014for opt do
4015    optval="${opt#*=}"
4016    case "$opt" in
4017        --extra-ldflags=*)
4018            add_ldflags $optval
4019        ;;
4020        --extra-ldexeflags=*)
4021            add_ldexeflags $optval
4022        ;;
4023        --extra-ldsoflags=*)
4024            add_ldsoflags $optval
4025        ;;
4026        --extra-ldlibflags=*)
4027            warn "The --extra-ldlibflags option is only provided for compatibility and will be\n"\
4028                 "removed in the future. Use --extra-ldsoflags instead."
4029            add_ldsoflags $optval
4030        ;;
4031        --extra-libs=*)
4032            add_extralibs $optval
4033        ;;
4034        --disable-devices)
4035            disable $INDEV_LIST $OUTDEV_LIST
4036        ;;
4037        --enable-debug=*)
4038            debuglevel="$optval"
4039        ;;
4040        --disable-programs)
4041            disable $PROGRAM_LIST
4042        ;;
4043        --disable-everything)
4044            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
4045        ;;
4046        --disable-all)
4047            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
4048            disable $LIBRARY_LIST $PROGRAM_LIST doc
4049            enable avutil
4050        ;;
4051        --enable-random|--disable-random)
4052            action=${opt%%-random}
4053            do_random ${action#--} $COMPONENT_LIST
4054        ;;
4055        --enable-random=*|--disable-random=*)
4056            action=${opt%%-random=*}
4057            do_random ${action#--} $optval
4058        ;;
4059        --enable-sdl)
4060            enable sdl2
4061        ;;
4062        --enable-*=*|--disable-*=*)
4063            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
4064            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
4065            eval list=\$$(toupper $thing)_LIST
4066            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
4067            list=$(filter "$name" $list)
4068            [ "$list" = "" ] && warn "Option $opt did not match anything"
4069            test $action = enable && warn_if_gets_disabled $list
4070            $action $list
4071        ;;
4072        --enable-yasm|--disable-yasm)
4073            warn "The ${opt} option is only provided for compatibility and will be\n"\
4074                 "removed in the future. Use --enable-x86asm / --disable-x86asm instead."
4075            test $opt = --enable-yasm && x86asm=yes || x86asm=no
4076        ;;
4077        --yasmexe=*)
4078            warn "The --yasmexe option is only provided for compatibility and will be\n"\
4079                 "removed in the future. Use --x86asmexe instead."
4080            x86asmexe="$optval"
4081        ;;
4082        --enable-?*|--disable-?*)
4083            eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
4084            if is_in $option $COMPONENT_LIST; then
4085                test $action = disable && action=unset
4086                eval $action \$$(toupper ${option%s})_LIST
4087            elif is_in $option $CMDLINE_SELECT; then
4088                $action $option
4089            else
4090                die_unknown $opt
4091            fi
4092        ;;
4093        --list-*)
4094            NAME="${opt#--list-}"
4095            is_in $NAME $COMPONENT_LIST || die_unknown $opt
4096            NAME=${NAME%s}
4097            eval show_list $NAME \$$(toupper $NAME)_LIST
4098        ;;
4099        --help|-h) show_help
4100        ;;
4101        --quiet|-q) quiet=yes
4102        ;;
4103        --fatal-warnings) enable fatal_warnings
4104        ;;
4105        --libfuzzer=*)
4106            libfuzzer_path="$optval"
4107        ;;
4108        *)
4109            optname="${opt%%=*}"
4110            optname="${optname#--}"
4111            optname=$(echo "$optname" | sed 's/-/_/g')
4112            if is_in $optname $CMDLINE_SET; then
4113                eval $optname='$optval'
4114            elif is_in $optname $CMDLINE_APPEND; then
4115                append $optname "$optval"
4116            else
4117                die_unknown $opt
4118            fi
4119        ;;
4120    esac
4121done
4122
4123for e in $env; do
4124    eval "export $e"
4125done
4126
4127if disabled autodetect; then
4128
4129    # Unless iconv is explicitely disabled by the user, we still want to probe
4130    # for the iconv from the libc.
4131    disabled iconv || enable libc_iconv
4132
4133    disable_weak $EXTERNAL_AUTODETECT_LIBRARY_LIST
4134    disable_weak $HWACCEL_AUTODETECT_LIBRARY_LIST
4135fi
4136# Mark specifically enabled, but normally autodetected libraries as requested.
4137for lib in $AUTODETECT_LIBS; do
4138    enabled $lib && request $lib
4139done
4140#TODO: switch to $AUTODETECT_LIBS when $THREADS_LIST is supported the same way
4141enable_weak $EXTERNAL_AUTODETECT_LIBRARY_LIST
4142enable_weak $HWACCEL_AUTODETECT_LIBRARY_LIST
4143
4144disabled logging && logfile=/dev/null
4145
4146# command line configuration sanity checks
4147
4148# we need to build at least one lib type
4149if ! enabled_any static shared; then
4150    cat <<EOF
4151At least one library type must be built.
4152Specify --enable-static to build the static libraries or --enable-shared to
4153build the shared libraries as well. To only build the shared libraries specify
4154--disable-static in addition to --enable-shared.
4155EOF
4156    exit 1
4157fi
4158
4159die_license_disabled() {
4160    enabled $1 || { enabled $v && die "$v is $1 and --enable-$1 is not specified."; }
4161}
4162
4163die_license_disabled_gpl() {
4164    enabled $1 || { enabled $v && die "$v is incompatible with the gpl and --enable-$1 is not specified."; }
4165}
4166
4167map "die_license_disabled gpl"      $EXTERNAL_LIBRARY_GPL_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
4168map "die_license_disabled version3" $EXTERNAL_LIBRARY_VERSION3_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
4169
4170enabled gpl && map "die_license_disabled_gpl nonfree" $EXTERNAL_LIBRARY_NONFREE_LIST
4171map "die_license_disabled nonfree" $HWACCEL_LIBRARY_NONFREE_LIST
4172
4173enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
4174
4175if enabled nonfree; then
4176    license="nonfree and unredistributable"
4177elif enabled gplv3; then
4178    license="GPL version 3 or later"
4179elif enabled lgplv3; then
4180    license="LGPL version 3 or later"
4181elif enabled gpl; then
4182    license="GPL version 2 or later"
4183else
4184    license="LGPL version 2.1 or later"
4185fi
4186
4187enabled_all gnutls openssl &&
4188    die "GnuTLS and OpenSSL must not be enabled at the same time."
4189
4190enabled_all gnutls mbedtls &&
4191    die "GnuTLS and mbedTLS must not be enabled at the same time."
4192
4193enabled_all openssl mbedtls &&
4194    die "OpenSSL and mbedTLS must not be enabled at the same time."
4195
4196# Disable all the library-specific components if the library itself
4197# is disabled, see AVCODEC_LIST and following _LIST variables.
4198
4199disable_components(){
4200    disabled ${1} && disable $(
4201        eval components="\$$(toupper ${1})_COMPONENTS"
4202        map 'eval echo \${$(toupper ${v%s})_LIST}' $components
4203    )
4204}
4205
4206map 'disable_components $v' $LIBRARY_LIST
4207
4208echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
4209set >> $logfile
4210
4211test -n "$valgrind" && toolchain="valgrind-memcheck"
4212
4213enabled ossfuzz && ! echo $CFLAGS | grep -q -- "-fsanitize="  && ! echo $CFLAGS | grep -q -- "-fcoverage-mapping" &&{
4214    add_cflags  -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp -fno-omit-frame-pointer
4215    add_ldflags -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp
4216}
4217
4218case "$toolchain" in
4219    *-asan)
4220        cc_default="${toolchain%-asan}"
4221        add_cflags  -fsanitize=address
4222        add_ldflags -fsanitize=address
4223    ;;
4224    *-msan)
4225        cc_default="${toolchain%-msan}"
4226        add_cflags  -fsanitize=memory -fsanitize-memory-track-origins
4227        add_ldflags -fsanitize=memory
4228    ;;
4229    *-tsan)
4230        cc_default="${toolchain%-tsan}"
4231        add_cflags  -fsanitize=thread
4232        add_ldflags -fsanitize=thread
4233        case "$toolchain" in
4234            gcc-tsan)
4235                add_cflags  -fPIC
4236                add_ldflags -fPIC
4237                ;;
4238        esac
4239    ;;
4240    *-usan)
4241        cc_default="${toolchain%-usan}"
4242        add_cflags  -fsanitize=undefined
4243        add_ldflags -fsanitize=undefined
4244    ;;
4245    valgrind-*)
4246        target_exec_default="valgrind"
4247        case "$toolchain" in
4248            valgrind-massif)
4249                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"
4250                ;;
4251            valgrind-memcheck)
4252                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"
4253                ;;
4254        esac
4255    ;;
4256    msvc)
4257        # Check whether the current MSVC version needs the C99 converter.
4258        # From MSVC 2013 (compiler major version 18) onwards, it does actually
4259        # support enough of C99 to build ffmpeg. Default to the new
4260        # behaviour if the regexp was unable to match anything, since this
4261        # successfully parses the version number of existing supported
4262        # versions that require the converter (MSVC 2010 and 2012).
4263        cl_major_ver=$(cl.exe 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
4264        if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
4265            cc_default="cl.exe"
4266            cxx_default="cl.exe"
4267        else
4268            die "Unsupported MSVC version (2013 or newer required)"
4269        fi
4270        ld_default="$source_path/compat/windows/mslink"
4271        nm_default="dumpbin.exe -symbols"
4272        ar_default="lib.exe"
4273        case "${arch:-$arch_default}" in
4274        aarch64|arm64)
4275            as_default="armasm64.exe"
4276            ;;
4277        arm*)
4278            as_default="armasm.exe"
4279            ;;
4280        esac
4281        target_os_default="win32"
4282        # Use a relative path for TMPDIR. This makes sure all the
4283        # ffconf temp files are written with a relative path, avoiding
4284        # issues with msys/win32 path conversion for MSVC parameters
4285        # such as -Fo<file> or -out:<file>.
4286        TMPDIR=.
4287    ;;
4288    icl)
4289        cc_default="icl"
4290        ld_default="xilink"
4291        nm_default="dumpbin -symbols"
4292        ar_default="xilib"
4293        target_os_default="win32"
4294        TMPDIR=.
4295    ;;
4296    gcov)
4297        add_cflags  -fprofile-arcs -ftest-coverage
4298        add_ldflags -fprofile-arcs -ftest-coverage
4299    ;;
4300    llvm-cov)
4301        add_cflags -fprofile-arcs -ftest-coverage
4302        add_ldflags --coverage
4303    ;;
4304    hardened)
4305        add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
4306        add_cflags   -fno-strict-overflow -fstack-protector-all
4307        add_ldflags  -Wl,-z,relro -Wl,-z,now
4308        add_cflags   -fPIE
4309        add_ldexeflags -fPIE -pie
4310    ;;
4311    ?*)
4312        die "Unknown toolchain $toolchain"
4313    ;;
4314esac
4315
4316if test -n "$cross_prefix"; then
4317    test -n "$arch" && test -n "$target_os" ||
4318        die "Must specify target arch (--arch) and OS (--target-os) when cross-compiling"
4319    enable cross_compile
4320fi
4321
4322set_default target_os
4323if test "$target_os" = android; then
4324    cc_default="clang"
4325fi
4326
4327ar_default="${cross_prefix}${ar_default}"
4328cc_default="${cross_prefix}${cc_default}"
4329cxx_default="${cross_prefix}${cxx_default}"
4330nm_default="${cross_prefix}${nm_default}"
4331pkg_config_default="${cross_prefix}${pkg_config_default}"
4332if ${cross_prefix}${ranlib_default} 2>&1 | grep -q "\-D "; then
4333    ranlib_default="${cross_prefix}${ranlib_default} -D"
4334else
4335    ranlib_default="${cross_prefix}${ranlib_default}"
4336fi
4337strip_default="${cross_prefix}${strip_default}"
4338windres_default="${cross_prefix}${windres_default}"
4339
4340sysinclude_default="${sysroot}/usr/include"
4341
4342if enabled cuda_sdk; then
4343    warn "Option --enable-cuda-sdk is deprecated. Use --enable-cuda-nvcc instead."
4344    enable cuda_nvcc
4345fi
4346
4347if enabled cuda_nvcc; then
4348    nvcc_default="nvcc"
4349    nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
4350else
4351    nvcc_default="clang"
4352    nvccflags_default="--cuda-gpu-arch=sm_30 -O2"
4353    NVCC_C=""
4354fi
4355
4356set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
4357    target_exec x86asmexe nvcc
4358enabled cross_compile || host_cc_default=$cc
4359set_default host_cc
4360
4361pkg_config_fail_message=""
4362if ! $pkg_config --version >/dev/null 2>&1; then
4363    warn "$pkg_config not found, library detection may fail."
4364    pkg_config=false
4365elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then
4366    pkg_config_fail_message="
4367Note: When building a static binary, add --pkg-config-flags=\"--static\"."
4368fi
4369
4370if test $doxygen != $doxygen_default && \
4371  ! $doxygen --version >/dev/null 2>&1; then
4372    warn "Specified doxygen \"$doxygen\" not found, API documentation will fail to build."
4373fi
4374
4375exesuf() {
4376    case $1 in
4377        mingw32*|mingw64*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
4378    esac
4379}
4380
4381EXESUF=$(exesuf $target_os)
4382HOSTEXESUF=$(exesuf $host_os)
4383
4384# set temporary file name
4385: ${TMPDIR:=$TEMPDIR}
4386: ${TMPDIR:=$TMP}
4387: ${TMPDIR:=/tmp}
4388
4389if [ -n "$tempprefix" ] ; then
4390    mktemp(){
4391        tmpname="$tempprefix.${HOSTNAME}.${UID}"
4392        echo "$tmpname"
4393        mkdir "$tmpname"
4394    }
4395elif ! test_cmd mktemp -u XXXXXX; then
4396    # simple replacement for missing mktemp
4397    # NOT SAFE FOR GENERAL USE
4398    mktemp(){
4399        tmpname="${2%%XXX*}.${HOSTNAME}.${UID}.$$"
4400        echo "$tmpname"
4401        mkdir "$tmpname"
4402    }
4403fi
4404
4405FFTMPDIR=$(mktemp -d "${TMPDIR}/ffconf.XXXXXXXX" 2> /dev/null) ||
4406    die "Unable to create temporary directory in $TMPDIR."
4407
4408tmpfile(){
4409    tmp="${FFTMPDIR}/test"$2
4410    (set -C; exec > $tmp) 2> /dev/null ||
4411        die "Unable to create temporary file in $FFTMPDIR."
4412    eval $1=$tmp
4413}
4414
4415trap 'rm -rf -- "$FFTMPDIR"' EXIT
4416trap 'exit 2' INT
4417
4418tmpfile TMPASM .asm
4419tmpfile TMPC   .c
4420tmpfile TMPCPP .cpp
4421tmpfile TMPE   $EXESUF
4422tmpfile TMPH   .h
4423tmpfile TMPM   .m
4424tmpfile TMPCU  .cu
4425tmpfile TMPO   .o
4426tmpfile TMPS   .S
4427tmpfile TMPSH  .sh
4428tmpfile TMPV   .ver
4429
4430unset -f mktemp
4431
4432chmod +x $TMPE
4433
4434# make sure we can execute files in $TMPDIR
4435cat > $TMPSH 2>> $logfile <<EOF
4436#! /bin/sh
4437EOF
4438chmod +x $TMPSH >> $logfile 2>&1
4439if ! $TMPSH >> $logfile 2>&1; then
4440    cat <<EOF
4441Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
4442variable to another directory and make sure that it is not mounted noexec.
4443EOF
4444    die "Sanity test failed."
4445fi
4446
4447armasm_flags(){
4448    for flag; do
4449        case $flag in
4450            # Filter out MSVC cl.exe options from cflags that shouldn't
4451            # be passed to gas-preprocessor
4452            -M[TD]*)                                            ;;
4453            *)                  echo $flag                      ;;
4454        esac
4455   done
4456}
4457
4458cparser_flags(){
4459    for flag; do
4460        case $flag in
4461            -Wno-switch)             echo -Wno-switch-enum ;;
4462            -Wno-format-zero-length) ;;
4463            -Wdisabled-optimization) ;;
4464            -Wno-pointer-sign)       echo -Wno-other ;;
4465            *)                       echo $flag ;;
4466        esac
4467    done
4468}
4469
4470msvc_common_flags(){
4471    for flag; do
4472        case $flag in
4473            # In addition to specifying certain flags under the compiler
4474            # specific filters, they must be specified here as well or else the
4475            # generic catch all at the bottom will print the original flag.
4476            -Wall)                ;;
4477            -Wextra)              ;;
4478            -std=c*)              ;;
4479            # Common flags
4480            -fomit-frame-pointer) ;;
4481            -g)                   echo -Z7 ;;
4482            -fno-math-errno)      ;;
4483            -fno-common)          ;;
4484            -fno-signed-zeros)    ;;
4485            -fPIC)                ;;
4486            -mthumb)              ;;
4487            -march=*)             ;;
4488            -lz)                  echo zlib.lib ;;
4489            -lx264)               echo libx264.lib ;;
4490            -lstdc++)             ;;
4491            -l*)                  echo ${flag#-l}.lib ;;
4492            -LARGEADDRESSAWARE)   echo $flag ;;
4493            -L*)                  echo -libpath:${flag#-L} ;;
4494            -Wl,*)                ;;
4495            *)                    echo $flag ;;
4496        esac
4497    done
4498}
4499
4500msvc_flags(){
4501    msvc_common_flags "$@"
4502    for flag; do
4503        case $flag in
4504            -Wall)                echo -W3 -wd4018 -wd4146 -wd4244 -wd4305     \
4505                                       -wd4554 ;;
4506            -Wextra)              echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
4507                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
4508                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
4509                                       -wd4307 \
4510                                       -wd4273 -wd4554 -wd4701 -wd4703 ;;
4511        esac
4512    done
4513}
4514
4515icl_flags(){
4516    msvc_common_flags "$@"
4517    for flag; do
4518        case $flag in
4519            # Despite what Intel's documentation says -Wall, which is supported
4520            # on Windows, does enable remarks so disable them here.
4521            -Wall)                echo $flag -Qdiag-disable:remark ;;
4522            -std=c99)             echo -Qstd=c99 ;;
4523            -flto)                echo -ipo ;;
4524        esac
4525    done
4526}
4527
4528icc_flags(){
4529    for flag; do
4530        case $flag in
4531            -flto)                echo -ipo ;;
4532            *)                    echo $flag ;;
4533        esac
4534    done
4535}
4536
4537suncc_flags(){
4538    for flag; do
4539        case $flag in
4540            -march=*|-mcpu=*)
4541                case "${flag#*=}" in
4542                    native)                   echo -xtarget=native       ;;
4543                    v9|niagara)               echo -xarch=sparc          ;;
4544                    ultrasparc)               echo -xarch=sparcvis       ;;
4545                    ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
4546                    i586|pentium)             echo -xchip=pentium        ;;
4547                    i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
4548                    pentium3*|c3-2)           echo -xtarget=pentium3     ;;
4549                    pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
4550                    pentium4*)          echo -xtarget=pentium4           ;;
4551                    prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
4552                    *-sse3)             echo -xarch=sse3                 ;;
4553                    core2)              echo -xarch=ssse3 -xchip=core2   ;;
4554                    bonnell)                   echo -xarch=ssse3         ;;
4555                    corei7|nehalem)            echo -xtarget=nehalem     ;;
4556                    westmere)                  echo -xtarget=westmere    ;;
4557                    silvermont)                echo -xarch=sse4_2        ;;
4558                    corei7-avx|sandybridge)    echo -xtarget=sandybridge ;;
4559                    core-avx*|ivybridge|haswell|broadwell|skylake*|knl)
4560                                               echo -xarch=avx           ;;
4561                    amdfam10|barcelona)        echo -xtarget=barcelona   ;;
4562                    btver1)                    echo -xarch=amdsse4a      ;;
4563                    btver2|bdver*|znver*)      echo -xarch=avx           ;;
4564                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
4565                    k8|opteron|athlon64|athlon-fx)
4566                                               echo -xarch=sse2a         ;;
4567                    athlon*)                   echo -xarch=pentium_proa  ;;
4568                esac
4569                ;;
4570            -std=c99)             echo -xc99              ;;
4571            -fomit-frame-pointer) echo -xregs=frameptr    ;;
4572            -fPIC)                echo -KPIC -xcode=pic32 ;;
4573            -W*,*)                echo $flag              ;;
4574            -f*-*|-W*|-mimpure-text)                      ;;
4575            -shared)              echo -G                 ;;
4576            *)                    echo $flag              ;;
4577        esac
4578    done
4579}
4580
4581probe_cc(){
4582    pfx=$1
4583    _cc=$2
4584    first=$3
4585
4586    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
4587    unset _ld_o _ldflags _ld_lib _ld_path
4588    unset _depflags _DEPCMD _DEPFLAGS
4589    _flags_filter=echo
4590
4591    if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
4592        true # no-op to avoid reading stdin in following checks
4593    elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
4594        _type=llvm_gcc
4595        gcc_extra_ver=$(expr "$($_cc --version 2>/dev/null | head -n1)" : '.*\((.*)\)')
4596        _ident="llvm-gcc $($_cc -dumpversion 2>/dev/null) $gcc_extra_ver"
4597        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4598        _cflags_speed='-O3'
4599        _cflags_size='-Os'
4600    elif $_cc -v 2>&1 | grep -qi ^gcc; then
4601        _type=gcc
4602        gcc_version=$($_cc --version | head -n1)
4603        gcc_basever=$($_cc -dumpversion)
4604        gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
4605        gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
4606        _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
4607        case $gcc_basever in
4608            2) ;;
4609            2.*) ;;
4610            *) _depflags='-MMD -MF $(@:.o=.d) -MT $@' ;;
4611        esac
4612        if [ "$first" = true ]; then
4613            case $gcc_basever in
4614                4.2*)
4615                warn "gcc 4.2 is outdated and may miscompile FFmpeg. Please use a newer compiler." ;;
4616            esac
4617        fi
4618        _cflags_speed='-O3'
4619        _cflags_size='-Os'
4620    elif $_cc --version 2>/dev/null | grep -q ^icc; then
4621        _type=icc
4622        _ident=$($_cc --version | head -n1)
4623        _depflags='-MMD'
4624        _cflags_speed='-O3'
4625        _cflags_size='-Os'
4626        _cflags_noopt='-O1'
4627        _flags_filter=icc_flags
4628    elif $_cc -v 2>&1 | grep -q xlc; then
4629        _type=xlc
4630        _ident=$($_cc -qversion 2>/dev/null | head -n1)
4631        _cflags_speed='-O5'
4632        _cflags_size='-O5 -qcompact'
4633    elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
4634        test -d "$sysroot" || die "No valid sysroot specified."
4635        _type=armcc
4636        _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
4637        armcc_conf="$PWD/armcc.conf"
4638        $_cc --arm_linux_configure                 \
4639             --arm_linux_config_file="$armcc_conf" \
4640             --configure_sysroot="$sysroot"        \
4641             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
4642             die "Error creating armcc configuration file."
4643        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
4644        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
4645        as_default="${cross_prefix}gcc"
4646        _depflags='-MMD'
4647        _cflags_speed='-O3'
4648        _cflags_size='-Os'
4649    elif $_cc -v 2>&1 | grep -q clang && ! $_cc -? > /dev/null 2>&1; then
4650        _type=clang
4651        _ident=$($_cc --version 2>/dev/null | head -n1)
4652        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4653        _cflags_speed='-O3'
4654        _cflags_size='-Oz'
4655    elif $_cc -V 2>&1 | grep -q Sun; then
4656        _type=suncc
4657        _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
4658        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
4659        _DEPFLAGS='-xM1 -xc99'
4660        _ldflags='-std=c99'
4661        _cflags_speed='-O5'
4662        _cflags_size='-O5 -xspace'
4663        _flags_filter=suncc_flags
4664    elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
4665        _type=pathscale
4666        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
4667        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4668        _cflags_speed='-O2'
4669        _cflags_size='-Os'
4670        _flags_filter='filter_out -Wdisabled-optimization'
4671    elif $_cc -v 2>&1 | grep -q Open64; then
4672        _type=open64
4673        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
4674        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
4675        _cflags_speed='-O2'
4676        _cflags_size='-Os'
4677        _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
4678    elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
4679        _type=armasm
4680        _ident=$($_cc | head -n1)
4681        # 4509: "This form of conditional instruction is deprecated"
4682        _flags="-nologo -ignore 4509"
4683        _flags_filter=armasm_flags
4684    elif $_cc 2>&1 | grep -q Intel; then
4685        _type=icl
4686        _ident=$($_cc 2>&1 | head -n1)
4687        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
4688        # Not only is O3 broken on 13.x+ but it is slower on all previous
4689        # versions (tested) as well.
4690        _cflags_speed="-O2"
4691        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
4692        if $_cc 2>&1 | grep -q Linker; then
4693            _ld_o='-out:$@'
4694        else
4695            _ld_o='-Fe$@'
4696        fi
4697        _cc_o='-Fo$@'
4698        _cc_e='-P'
4699        _flags_filter=icl_flags
4700        _ld_lib='lib%.a'
4701        _ld_path='-libpath:'
4702        # -Qdiag-error to make icl error when seeing certain unknown arguments
4703        _flags='-nologo -Qdiag-error:4044,10157'
4704        # -Qvec- -Qsimd- to prevent miscompilation, -GS, fp:precise for consistency
4705        # with MSVC which enables it by default.
4706        _cflags='-Qms0 -Qvec- -Qsimd- -GS -fp:precise'
4707        disable stripping
4708    elif $_cc -? 2>/dev/null | grep -q 'LLVM.*Linker'; then
4709        # lld can emulate multiple different linkers; in ms link.exe mode,
4710        # the -? parameter gives the help output which contains an identifyable
4711        # string, while it gives an error in other modes.
4712        _type=lld-link
4713        # The link.exe mode doesn't have a switch for getting the version,
4714        # but we can force it back to gnu mode and get the version from there.
4715        _ident=$($_cc -flavor gnu --version 2>/dev/null)
4716        _ld_o='-out:$@'
4717        _flags_filter=msvc_flags
4718        _ld_lib='lib%.a'
4719        _ld_path='-libpath:'
4720    elif $_cc -nologo- 2>&1 | grep -q Microsoft || { $_cc -v 2>&1 | grep -q clang && $_cc -? > /dev/null 2>&1; }; then
4721        _type=msvc
4722        if $_cc -nologo- 2>&1 | grep -q Microsoft; then
4723            _ident=$($_cc 2>&1 | head -n1 | tr -d '\r')
4724        else
4725            _ident=$($_cc --version 2>/dev/null | head -n1 | tr -d '\r')
4726        fi
4727        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
4728        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
4729        _cflags_speed="-O2"
4730        _cflags_size="-O1"
4731        _cflags_noopt="-O1"
4732        if $_cc -nologo- 2>&1 | grep -q Linker; then
4733            _ld_o='-out:$@'
4734        else
4735            _ld_o='-Fe$@'
4736        fi
4737        _cc_o='-Fo$@'
4738        _cc_e='-P -Fi$@'
4739        _flags_filter=msvc_flags
4740        _ld_lib='lib%.a'
4741        _ld_path='-libpath:'
4742        _flags='-nologo'
4743        disable stripping
4744    elif $_cc --version 2>/dev/null | grep -q ^cparser; then
4745        _type=cparser
4746        _ident=$($_cc --version | head -n1)
4747        _depflags='-MMD'
4748        _cflags_speed='-O4'
4749        _cflags_size='-O2'
4750        _flags_filter=cparser_flags
4751    fi
4752
4753    eval ${pfx}_type=\$_type
4754    eval ${pfx}_ident=\$_ident
4755}
4756
4757set_ccvars(){
4758    eval ${1}_C=\${_cc_c-\${${1}_C}}
4759    eval ${1}_E=\${_cc_e-\${${1}_E}}
4760    eval ${1}_O=\${_cc_o-\${${1}_O}}
4761
4762    if [ -n "$_depflags" ]; then
4763        eval ${1}_DEPFLAGS=\$_depflags
4764    else
4765        eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
4766        eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
4767        eval DEP${1}FLAGS=\$_flags
4768    fi
4769}
4770
4771probe_cc cc "$cc" "true"
4772cflags_filter=$_flags_filter
4773cflags_speed=$_cflags_speed
4774cflags_size=$_cflags_size
4775cflags_noopt=$_cflags_noopt
4776add_cflags $_flags $_cflags
4777cc_ldflags=$_ldflags
4778set_ccvars CC
4779set_ccvars CXX
4780
4781probe_cc hostcc "$host_cc"
4782host_cflags_filter=$_flags_filter
4783host_cflags_speed=$_cflags_speed
4784add_host_cflags  $_flags $_cflags
4785set_ccvars HOSTCC
4786
4787test -n "$cc_type" && enable $cc_type ||
4788    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
4789
4790: ${as_default:=$cc}
4791: ${objcc_default:=$cc}
4792: ${dep_cc_default:=$cc}
4793: ${ld_default:=$cc}
4794: ${host_ld_default:=$host_cc}
4795set_default ar as objcc dep_cc ld ln_s host_ld windres
4796
4797probe_cc as "$as"
4798asflags_filter=$_flags_filter
4799add_asflags $_flags $_cflags
4800set_ccvars AS
4801
4802probe_cc objcc "$objcc"
4803objcflags_filter=$_flags_filter
4804add_objcflags $_flags $_cflags
4805set_ccvars OBJC
4806
4807probe_cc ld "$ld"
4808ldflags_filter=$_flags_filter
4809add_ldflags $_flags $_ldflags
4810test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
4811LD_O=${_ld_o-$LD_O}
4812LD_LIB=${_ld_lib-$LD_LIB}
4813LD_PATH=${_ld_path-$LD_PATH}
4814
4815probe_cc hostld "$host_ld"
4816host_ldflags_filter=$_flags_filter
4817add_host_ldflags $_flags $_ldflags
4818HOSTLD_O=${_ld_o-$HOSTLD_O}
4819
4820if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
4821    probe_cc depcc "$dep_cc"
4822    CCDEP=${_DEPCMD:-$DEPCMD}
4823    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
4824    DEPCCFLAGS=$_flags
4825fi
4826
4827if $ar 2>&1 | grep -q Microsoft; then
4828    arflags="-nologo"
4829    ar_o='-out:$@'
4830elif $ar 2>&1 | grep -q "\[D\] "; then
4831    arflags="rcD"
4832    ar_o='$@'
4833else
4834    arflags="rc"
4835    ar_o='$@'
4836fi
4837
4838add_cflags $extra_cflags
4839add_cxxflags $extra_cxxflags
4840add_objcflags $extra_objcflags
4841add_asflags $extra_cflags
4842
4843if test -n "$sysroot"; then
4844    case "$cc_type" in
4845        gcc|llvm_gcc|clang)
4846            add_cppflags --sysroot="$sysroot"
4847            add_ldflags --sysroot="$sysroot"
4848        ;;
4849    esac
4850fi
4851
4852if test "$cpu" = host; then
4853    enabled cross_compile &&
4854        warn "--cpu=host makes no sense when cross-compiling."
4855
4856    case "$cc_type" in
4857        gcc|llvm_gcc)
4858            check_native(){
4859                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
4860                sed -n "/cc1.*$1=/{
4861                            s/.*$1=\\([^ ]*\\).*/\\1/
4862                            p
4863                            q
4864                        }" $TMPE
4865            }
4866            cpu=$(check_native -march || check_native -mcpu)
4867        ;;
4868        clang)
4869            check_native(){
4870                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
4871                sed -n "/cc1.*-target-cpu /{
4872                            s/.*-target-cpu \\([^ ]*\\).*/\\1/
4873                            p
4874                            q
4875                        }" $TMPE
4876            }
4877            cpu=$(check_native -march)
4878        ;;
4879    esac
4880
4881    test "${cpu:-host}" = host &&
4882        die "--cpu=host not supported with compiler $cc"
4883fi
4884
4885# Deal with common $arch aliases
4886case "$arch" in
4887    aarch64|arm64)
4888        arch="aarch64"
4889    ;;
4890    arm*|iPad*|iPhone*)
4891        arch="arm"
4892    ;;
4893    mips*|IP*)
4894        case "$arch" in
4895        *el)
4896            add_cppflags -EL
4897            add_ldflags -EL
4898        ;;
4899        *eb)
4900            add_cppflags -EB
4901            add_ldflags -EB
4902        ;;
4903        esac
4904        arch="mips"
4905    ;;
4906    parisc*|hppa*)
4907        arch="parisc"
4908    ;;
4909    "Power Macintosh"|ppc*|powerpc*)
4910        arch="ppc"
4911    ;;
4912    s390|s390x)
4913        arch="s390"
4914    ;;
4915    sh4|sh)
4916        arch="sh4"
4917    ;;
4918    sun4*|sparc*)
4919        arch="sparc"
4920    ;;
4921    tilegx|tile-gx)
4922        arch="tilegx"
4923    ;;
4924    i[3-6]86*|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
4925        arch="x86"
4926    ;;
4927esac
4928
4929is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
4930enable $arch
4931
4932# Add processor-specific flags
4933if enabled aarch64; then
4934
4935    case $cpu in
4936        armv*)
4937            cpuflags="-march=$cpu"
4938        ;;
4939        *)
4940            cpuflags="-mcpu=$cpu"
4941        ;;
4942    esac
4943
4944elif enabled alpha; then
4945
4946    cpuflags="-mcpu=$cpu"
4947
4948elif enabled arm; then
4949
4950    check_arm_arch() {
4951        test_cpp_condition stddef.h \
4952            "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
4953            $cpuflags
4954    }
4955
4956    probe_arm_arch() {
4957        if   check_arm_arch 4;        then echo armv4
4958        elif check_arm_arch 4T;       then echo armv4t
4959        elif check_arm_arch 5;        then echo armv5
4960        elif check_arm_arch 5E;       then echo armv5e
4961        elif check_arm_arch 5T;       then echo armv5t
4962        elif check_arm_arch 5TE;      then echo armv5te
4963        elif check_arm_arch 5TEJ;     then echo armv5te
4964        elif check_arm_arch 6;        then echo armv6
4965        elif check_arm_arch 6J;       then echo armv6j
4966        elif check_arm_arch 6K;       then echo armv6k
4967        elif check_arm_arch 6Z;       then echo armv6z
4968        elif check_arm_arch 6KZ;      then echo armv6zk
4969        elif check_arm_arch 6ZK;      then echo armv6zk
4970        elif check_arm_arch 6T2;      then echo armv6t2
4971        elif check_arm_arch 7;        then echo armv7
4972        elif check_arm_arch 7A  7_A;  then echo armv7-a
4973        elif check_arm_arch 7S;       then echo armv7-a
4974        elif check_arm_arch 7R  7_R;  then echo armv7-r
4975        elif check_arm_arch 7M  7_M;  then echo armv7-m
4976        elif check_arm_arch 7EM 7E_M; then echo armv7-m
4977        elif check_arm_arch 8A  8_A;  then echo armv8-a
4978        fi
4979    }
4980
4981    [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
4982
4983    case $cpu in
4984        armv*)
4985            cpuflags="-march=$cpu"
4986            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
4987        ;;
4988        *)
4989            cpuflags="-mcpu=$cpu"
4990            case $cpu in
4991                cortex-a*)                               subarch=armv7a  ;;
4992                cortex-r*)                               subarch=armv7r  ;;
4993                cortex-m*)                 enable thumb; subarch=armv7m  ;;
4994                arm11*)                                  subarch=armv6   ;;
4995                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
4996                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
4997                *)                             subarch=$(probe_arm_arch) ;;
4998            esac
4999        ;;
5000    esac
5001
5002    case "$subarch" in
5003        armv5t*)    enable fast_clz                ;;
5004        armv[6-8]*)
5005            enable fast_clz
5006            disabled fast_unaligned || enable fast_unaligned
5007            ;;
5008    esac
5009
5010elif enabled avr32; then
5011
5012    case $cpu in
5013        ap7[02]0[0-2])
5014            subarch="avr32_ap"
5015            cpuflags="-mpart=$cpu"
5016        ;;
5017        ap)
5018            subarch="avr32_ap"
5019            cpuflags="-march=$cpu"
5020        ;;
5021        uc3[ab]*)
5022            subarch="avr32_uc"
5023            cpuflags="-mcpu=$cpu"
5024        ;;
5025        uc)
5026            subarch="avr32_uc"
5027            cpuflags="-march=$cpu"
5028        ;;
5029    esac
5030
5031elif enabled bfin; then
5032
5033    cpuflags="-mcpu=$cpu"
5034
5035elif enabled mips; then
5036
5037    if [ "$cpu" != "generic" ]; then
5038        disable mips32r2
5039        disable mips32r5
5040        disable mips64r2
5041        disable mips32r6
5042        disable mips64r6
5043        disable loongson2
5044        disable loongson3
5045        disable mipsdsp
5046        disable mipsdspr2
5047
5048        cpuflags="-march=$cpu"
5049
5050        case $cpu in
5051            # General ISA levels
5052            mips1|mips3)
5053            ;;
5054            mips32r2)
5055                enable mips32r2
5056            ;;
5057            mips32r5)
5058                enable mips32r2
5059                enable mips32r5
5060            ;;
5061            mips64r2|mips64r5)
5062                enable mips64r2
5063                enable loongson3
5064            ;;
5065            # Cores from MIPS(MTI)
5066            24kc)
5067                disable mipsfpu
5068                enable mips32r2
5069            ;;
5070            24kf*|24kec|34kc|74Kc|1004kc)
5071                enable mips32r2
5072            ;;
5073            24kef*|34kf*|1004kf*)
5074                enable mipsdsp
5075                enable mips32r2
5076            ;;
5077            p5600)
5078                enable mips32r2
5079                enable mips32r5
5080                check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
5081            ;;
5082            i6400)
5083                enable mips64r6
5084                check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
5085            ;;
5086            p6600)
5087                enable mips64r6
5088                check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
5089            ;;
5090            # Cores from Loongson
5091            loongson2e|loongson2f|loongson3*)
5092                enable local_aligned
5093                enable simd_align_16
5094                enable fast_64bit
5095                enable fast_clz
5096                enable fast_cmov
5097                enable fast_unaligned
5098                disable aligned_stack
5099                # When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
5100                if test "$cc_type" = "gcc"; then
5101                    case $gcc_basever in
5102                        2|2.*|3.*|4.*|5.0|5.1|5.2)
5103                        expensive_optimization_flag="-fno-expensive-optimizations"
5104                        ;;
5105                        *)
5106                        expensive_optimization_flag=""
5107                        ;;
5108                    esac
5109                fi
5110
5111                case $cpu in
5112                    loongson3*)
5113                        enable loongson3
5114                        cpuflags="-march=loongson3a -mhard-float $expensive_optimization_flag"
5115                    ;;
5116                    loongson2e)
5117                        enable loongson2
5118                        cpuflags="-march=loongson2e -mhard-float $expensive_optimization_flag"
5119                    ;;
5120                    loongson2f)
5121                        enable loongson2
5122                        cpuflags="-march=loongson2f -mhard-float $expensive_optimization_flag"
5123                    ;;
5124                esac
5125            ;;
5126            *)
5127                warn "unknown MIPS CPU"
5128            ;;
5129        esac
5130
5131    else
5132        disable mipsdsp
5133        disable mipsdspr2
5134        # Disable DSP stuff for generic CPU, it can't be detected at runtime.
5135        warn 'generic cpu selected'
5136    fi
5137
5138elif enabled ppc; then
5139
5140    disable ldbrx
5141
5142    case $(tolower $cpu) in
5143        601|ppc601|powerpc601)
5144            cpuflags="-mcpu=601"
5145            disable altivec
5146        ;;
5147        603*|ppc603*|powerpc603*)
5148            cpuflags="-mcpu=603"
5149            disable altivec
5150        ;;
5151        604*|ppc604*|powerpc604*)
5152            cpuflags="-mcpu=604"
5153            disable altivec
5154        ;;
5155        g3|75*|ppc75*|powerpc75*)
5156            cpuflags="-mcpu=750"
5157            disable altivec
5158        ;;
5159        g4|745*|ppc745*|powerpc745*)
5160            cpuflags="-mcpu=7450"
5161            disable vsx
5162        ;;
5163        74*|ppc74*|powerpc74*)
5164            cpuflags="-mcpu=7400"
5165            disable vsx
5166        ;;
5167        g5|970|ppc970|powerpc970)
5168            cpuflags="-mcpu=970"
5169            disable vsx
5170        ;;
5171        power[3-6]*)
5172            cpuflags="-mcpu=$cpu"
5173            disable vsx
5174        ;;
5175        power[7-8]*)
5176            cpuflags="-mcpu=$cpu"
5177        ;;
5178        cell)
5179            cpuflags="-mcpu=cell"
5180            enable ldbrx
5181            disable vsx
5182        ;;
5183        e500mc)
5184            cpuflags="-mcpu=e500mc"
5185            disable altivec
5186        ;;
5187        e500v2)
5188            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
5189            disable altivec
5190            disable dcbzl
5191        ;;
5192        e500)
5193            cpuflags="-mcpu=8540 -mhard-float"
5194            disable altivec
5195            disable dcbzl
5196        ;;
5197    esac
5198
5199elif enabled sparc; then
5200
5201    case $cpu in
5202        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
5203            cpuflags="-mcpu=$cpu"
5204        ;;
5205        ultrasparc*|niagara[234])
5206            cpuflags="-mcpu=$cpu"
5207        ;;
5208    esac
5209
5210elif enabled x86; then
5211
5212    case $cpu in
5213        i[345]86|pentium)
5214            cpuflags="-march=$cpu"
5215            disable i686
5216            disable mmx
5217        ;;
5218        # targets that do NOT support nopl and conditional mov (cmov)
5219        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
5220            cpuflags="-march=$cpu"
5221            disable i686
5222        ;;
5223        # targets that do support nopl and conditional mov (cmov)
5224        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx\
5225        |core*|atom|bonnell|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|skylake*|knl\
5226        |amdfam10|barcelona|b[dt]ver*|znver*)
5227            cpuflags="-march=$cpu"
5228            enable i686
5229            enable fast_cmov
5230        ;;
5231        # targets that do support conditional mov but on which it's slow
5232        pentium4|pentium4m|prescott|nocona)
5233            cpuflags="-march=$cpu"
5234            enable i686
5235            disable fast_cmov
5236        ;;
5237    esac
5238
5239fi
5240
5241if [ "$cpu" != generic ]; then
5242    add_cflags  $cpuflags
5243    add_asflags $cpuflags
5244    test "$cc_type" = "$ld_type" && add_ldflags $cpuflags
5245fi
5246
5247# compiler sanity check
5248test_exec <<EOF
5249int main(void){ return 0; }
5250EOF
5251if test "$?" != 0; then
5252    echo "$cc is unable to create an executable file."
5253    if test -z "$cross_prefix" && ! enabled cross_compile ; then
5254        echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
5255        echo "Only do this if you know what cross compiling means."
5256    fi
5257    die "C compiler test failed."
5258fi
5259
5260add_cppflags -D_ISOC99_SOURCE
5261add_cxxflags -D__STDC_CONSTANT_MACROS
5262check_cxxflags -std=c++11 || check_cxxflags -std=c++0x
5263
5264# some compilers silently accept -std=c11, so we also need to check that the
5265# version macro is defined properly
5266test_cflags_cc -std=c11 ctype.h "__STDC_VERSION__ >= 201112L" &&
5267    add_cflags -std=c11 ||
5268    check_cflags -std=c99
5269
5270check_cppflags -D_FILE_OFFSET_BITS=64
5271check_cppflags -D_LARGEFILE_SOURCE
5272
5273add_host_cppflags -D_ISOC99_SOURCE
5274check_host_cflags -std=c99
5275check_host_cflags -Wall
5276check_host_cflags $host_cflags_speed
5277
5278check_64bit(){
5279    arch32=$1
5280    arch64=$2
5281    expr=${3:-'sizeof(void *) > 4'}
5282    test_code cc "" "int test[2*($expr) - 1]" &&
5283        subarch=$arch64 || subarch=$arch32
5284    enable $subarch
5285}
5286
5287case "$arch" in
5288    aarch64|alpha|ia64)
5289        enabled shared && enable_weak pic
5290    ;;
5291    mips)
5292        check_64bit mips mips64 '_MIPS_SIM > 1'
5293        enabled shared && enable_weak pic
5294    ;;
5295    parisc)
5296        check_64bit parisc parisc64
5297        enabled shared && enable_weak pic
5298    ;;
5299    ppc)
5300        check_64bit ppc ppc64
5301        enabled shared && enable_weak pic
5302    ;;
5303    s390)
5304        check_64bit s390 s390x
5305        enabled shared && enable_weak pic
5306    ;;
5307    sparc)
5308        check_64bit sparc sparc64
5309        enabled shared && enable_weak pic
5310    ;;
5311    x86)
5312        check_64bit x86_32 x86_64
5313        # Treat x32 as x64 for now. Note it also needs pic if shared
5314        test "$subarch" = "x86_32" && test_cpp_condition stddef.h 'defined(__x86_64__)' &&
5315            subarch=x86_64 && enable x86_64 && disable x86_32
5316        if enabled x86_64; then
5317            enabled shared && enable_weak pic
5318            objformat=elf64
5319        fi
5320    ;;
5321esac
5322
5323# OS specific
5324case $target_os in
5325    aix)
5326        SHFLAGS=-shared
5327        add_cppflags '-I\$(SRC_PATH)/compat/aix'
5328        enabled shared && add_ldflags -Wl,-brtl
5329        arflags='-Xany -r -c'
5330        striptype=""
5331        ;;
5332    android)
5333        disable symver
5334        enable section_data_rel_ro
5335        add_cflags -fPIE
5336        add_ldexeflags -fPIE -pie
5337        SLIB_INSTALL_NAME='$(SLIBNAME)'
5338        SLIB_INSTALL_LINKS=
5339        SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'
5340        ;;
5341    haiku)
5342        prefix_default="/boot/common"
5343        network_extralibs="-lnetwork"
5344        host_extralibs=
5345        ;;
5346    sunos)
5347        SHFLAGS='-shared -Wl,-h,$$(@F)'
5348        enabled x86 && append SHFLAGS -mimpure-text
5349        network_extralibs="-lsocket -lnsl"
5350        add_cppflags -D__EXTENSIONS__
5351        # When using suncc to build, the Solaris linker will mark
5352        # an executable with each instruction set encountered by
5353        # the Solaris assembler.  As our libraries contain their own
5354        # guards for processor-specific code, instead suppress
5355        # generation of the HWCAPS ELF section on Solaris x86 only.
5356        enabled_all suncc x86 &&
5357            echo "hwcap_1 = OVERRIDE;" > mapfile &&
5358            add_ldflags -Wl,-M,mapfile
5359        nm_default='nm -P -g'
5360        striptype=""
5361        version_script='-M'
5362        VERSION_SCRIPT_POSTPROCESS_CMD='perl $(SRC_PATH)/compat/solaris/make_sunver.pl - $(OBJS)'
5363        ;;
5364    netbsd)
5365        disable symver
5366        oss_indev_extralibs="-lossaudio"
5367        oss_outdev_extralibs="-lossaudio"
5368        enabled gcc || check_ldflags -Wl,-zmuldefs
5369        ;;
5370    openbsd|bitrig)
5371        disable symver
5372        enable section_data_rel_ro
5373        striptype=""
5374        SHFLAGS='-shared'
5375        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
5376        SLIB_INSTALL_LINKS=
5377        oss_indev_extralibs="-lossaudio"
5378        oss_outdev_extralibs="-lossaudio"
5379        ;;
5380    dragonfly)
5381        disable symver
5382        ;;
5383    freebsd)
5384        ;;
5385    bsd/os)
5386        add_extralibs -lpoll -lgnugetopt
5387        strip="strip -d"
5388        ;;
5389    darwin)
5390        enabled ppc && add_asflags -force_cpusubtype_ALL
5391        install_name_dir_default='$(SHLIBDIR)'
5392        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(INSTALL_NAME_DIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
5393        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
5394        strip="${strip} -x"
5395        add_ldflags -Wl,-dynamic,-search_paths_first
5396        check_cflags -Werror=partial-availability
5397        SLIBSUF=".dylib"
5398        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
5399        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
5400        enabled x86_64 && objformat="macho64" || objformat="macho32"
5401        enabled_any pic shared x86_64 ||
5402            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
5403        check_headers dispatch/dispatch.h &&
5404            add_cppflags '-I\$(SRC_PATH)/compat/dispatch_semaphore'
5405        if test -n "$sysroot"; then
5406            is_in -isysroot $cc $CPPFLAGS $CFLAGS || check_cppflags -isysroot $sysroot
5407            is_in -isysroot $ld $LDFLAGS          || check_ldflags  -isysroot $sysroot
5408        fi
5409        version_script='-exported_symbols_list'
5410        VERSION_SCRIPT_POSTPROCESS_CMD='tr " " "\n" | sed -n /global:/,/local:/p | grep ";" | tr ";" "\n" | sed -E "s/(.+)/_\1/g" | sed -E "s/(.+[^*])$$$$/\1*/"'
5411        # Workaround for Xcode 11 -fstack-check bug
5412        if enabled clang; then
5413            clang_version=$($cc -dumpversion)
5414            test ${clang_version%%.*} -eq 11 && add_cflags -fno-stack-check
5415        fi
5416        ;;
5417    msys*)
5418        die "Native MSYS builds are discouraged, please use the MINGW environment."
5419        ;;
5420    mingw32*|mingw64*)
5421        target_os=mingw32
5422        LIBTARGET=i386
5423        if enabled x86_64; then
5424            LIBTARGET="i386:x86-64"
5425        elif enabled arm; then
5426            LIBTARGET="arm"
5427        elif enabled aarch64; then
5428            LIBTARGET="arm64"
5429        fi
5430        if enabled shared; then
5431            # Cannot build both shared and static libs when using dllimport.
5432            disable static
5433        fi
5434        enabled shared && ! enabled small && test_cmd $windres --version && enable gnu_windres
5435        enabled x86_32 && check_ldflags -Wl,--large-address-aware
5436        shlibdir_default="$bindir_default"
5437        SLIBPREF=""
5438        SLIBSUF=".dll"
5439        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5440        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5441        if test_cmd lib.exe -list; then
5442            SLIB_EXTRA_CMD=-'lib.exe -nologo -machine:$(LIBTARGET) -def:$$(@:$(SLIBSUF)=.def) -out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
5443            if enabled x86_64; then
5444                LIBTARGET=x64
5445            fi
5446        else
5447            SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
5448        fi
5449        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5450        SLIB_INSTALL_LINKS=
5451        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
5452        SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
5453        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)'
5454        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--disable-auto-image-base $$(@:$(SLIBSUF)=.def)'
5455        enabled x86_64 && objformat="win64" || objformat="win32"
5456        dlltool="${cross_prefix}dlltool"
5457        ranlib=:
5458        enable dos_paths
5459        check_ldflags -Wl,--nxcompat,--dynamicbase
5460        # Lets work around some stupidity in binutils.
5461        # ld will strip relocations from executables even though we need them
5462        # for dynamicbase (ASLR).  Using -pie does retain the reloc section
5463        # however ld then forgets what the entry point should be (oops) so we
5464        # have to manually (re)set it.
5465        if enabled x86_32; then
5466            disabled debug && add_ldexeflags -Wl,--pic-executable,-e,_mainCRTStartup
5467        elif enabled x86_64; then
5468            disabled debug && add_ldexeflags -Wl,--pic-executable,-e,mainCRTStartup
5469            check_ldflags -Wl,--high-entropy-va # binutils 2.25
5470            # Set image base >4GB for extra entropy with HEASLR
5471            add_ldexeflags -Wl,--image-base,0x140000000
5472            append SHFLAGS -Wl,--image-base,0x180000000
5473        fi
5474        ;;
5475    win32|win64)
5476        disable symver
5477        if enabled shared; then
5478            # Link to the import library instead of the normal static library
5479            # for shared libs.
5480            LD_LIB='%.lib'
5481            # Cannot build both shared and static libs with MSVC or icl.
5482            disable static
5483        fi
5484        enabled x86_32 && check_ldflags -LARGEADDRESSAWARE
5485        shlibdir_default="$bindir_default"
5486        SLIBPREF=""
5487        SLIBSUF=".dll"
5488        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5489        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5490        SLIB_CREATE_DEF_CMD='EXTERN_PREFIX="$(EXTERN_PREFIX)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
5491        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5492        SLIB_INSTALL_LINKS=
5493        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
5494        SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
5495        SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
5496        enabled x86_64 && objformat="win64" || objformat="win32"
5497        ranlib=:
5498        enable dos_paths
5499        ;;
5500    cygwin*)
5501        target_os=cygwin
5502        shlibdir_default="$bindir_default"
5503        SLIBPREF="cyg"
5504        SLIBSUF=".dll"
5505        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5506        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
5507        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5508        SLIB_INSTALL_LINKS=
5509        SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
5510        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
5511        enabled x86_64 && objformat="win64" || objformat="win32"
5512        enable dos_paths
5513        enabled shared && ! enabled small && test_cmd $windres --version && enable gnu_windres
5514        add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5515        ;;
5516    *-dos|freedos|opendos)
5517        network_extralibs="-lsocket"
5518        objformat="coff"
5519        enable dos_paths
5520        ;;
5521    linux)
5522        enable section_data_rel_ro
5523        enabled_any arm aarch64 && enable_weak linux_perf
5524        ;;
5525    irix*)
5526        target_os=irix
5527        ranlib="echo ignoring ranlib"
5528        ;;
5529    os/2*)
5530        strip="lxlite -CS"
5531        striptype=""
5532        objformat="aout"
5533        add_cppflags -D_GNU_SOURCE
5534        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zhigh-mem -Zmap
5535        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
5536        LIBSUF="_s.a"
5537        SLIBPREF=""
5538        SLIBSUF=".dll"
5539        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
5540        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(FULLNAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
5541        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(FULLNAME).def; \
5542            echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(FULLNAME).def; \
5543            echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(FULLNAME).def; \
5544            echo EXPORTS >> $(SUBDIR)$(FULLNAME).def; \
5545            emxexp $(OBJS) >> $(SUBDIR)$(FULLNAME).def'
5546        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(FULLNAME)_dll.a $(SUBDIR)$(FULLNAME).def; \
5547            emximp -o $(SUBDIR)$(LIBPREF)$(FULLNAME)_dll.lib $(SUBDIR)$(FULLNAME).def;'
5548        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
5549        SLIB_INSTALL_LINKS=
5550        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(FULLNAME)_dll.a $(LIBPREF)$(FULLNAME)_dll.lib'
5551        enable dos_paths
5552        enable_weak os2threads
5553        ;;
5554    gnu/kfreebsd)
5555        add_cppflags -D_BSD_SOURCE
5556        ;;
5557    gnu)
5558        ;;
5559    qnx)
5560        add_cppflags -D_QNX_SOURCE
5561        network_extralibs="-lsocket"
5562        ;;
5563    symbian)
5564        SLIBSUF=".dll"
5565        enable dos_paths
5566        add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
5567        add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
5568        add_ldflags -Wl,--target1-abs,--no-undefined \
5569                    -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
5570                    -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
5571        add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
5572                      -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
5573                      -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
5574        ;;
5575    minix)
5576        ;;
5577    none)
5578        ;;
5579    *)
5580        die "Unknown OS '$target_os'."
5581        ;;
5582esac
5583
5584# test if creating links works
5585link_dest=$(mktemp -u $TMPDIR/dest_XXXXXXXX)
5586link_name=$(mktemp -u $TMPDIR/name_XXXXXXXX)
5587mkdir "$link_dest"
5588$ln_s "$link_dest" "$link_name"
5589touch "$link_dest/test_file"
5590if [ "$source_path" != "." ] && [ "$source_path" != "src" ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then
5591    # create link to source path
5592    [ -e src ] && rm src
5593    $ln_s "$source_path" src
5594    source_link=src
5595else
5596    # creating directory links doesn't work
5597    # fall back to using the full source path
5598    source_link="$source_path"
5599fi
5600# cleanup
5601rm -r "$link_dest"
5602rm -r "$link_name"
5603
5604# determine libc flavour
5605
5606probe_libc(){
5607    pfx=$1
5608    pfx_no_=${pfx%_}
5609    # uclibc defines __GLIBC__, so it needs to be checked before glibc.
5610    if test_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
5611        eval ${pfx}libc_type=uclibc
5612        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5613    elif test_${pfx}cpp_condition features.h "defined __GLIBC__"; then
5614        eval ${pfx}libc_type=glibc
5615        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5616    # MinGW headers can be installed on Cygwin, so check for newlib first.
5617    elif test_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
5618        eval ${pfx}libc_type=newlib
5619        add_${pfx}cppflags -U__STRICT_ANSI__ -D_XOPEN_SOURCE=600
5620    # MinGW64 is backwards compatible with MinGW32, so check for it first.
5621    elif test_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
5622        eval ${pfx}libc_type=mingw64
5623        if test_${pfx}cpp_condition _mingw.h "__MINGW64_VERSION_MAJOR < 3"; then
5624            add_compat msvcrt/snprintf.o
5625            add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
5626        fi
5627        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
5628        eval test \$${pfx_no_}cc_type = "gcc" &&
5629            add_${pfx}cppflags -D__printf__=__gnu_printf__
5630        test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
5631            add_${pfx}cppflags -D_WIN32_WINNT=0x0600
5632        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5633    elif test_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
5634         test_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
5635        eval ${pfx}libc_type=mingw32
5636        test_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
5637            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
5638            die "ERROR: MinGW32 runtime version must be >= 3.15."
5639        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
5640        test_${pfx}cpp_condition _mingw.h "__MSVCRT_VERSION__ < 0x0700" &&
5641            add_${pfx}cppflags -D__MSVCRT_VERSION__=0x0700
5642        test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
5643            add_${pfx}cppflags -D_WIN32_WINNT=0x0600
5644        eval test \$${pfx_no_}cc_type = "gcc" &&
5645            add_${pfx}cppflags -D__printf__=__gnu_printf__
5646        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
5647    elif test_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
5648        eval ${pfx}libc_type=msvcrt
5649        if test_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then
5650            if [ "$pfx" = host_ ]; then
5651                add_host_cppflags -Dsnprintf=_snprintf
5652            else
5653                add_compat strtod.o strtod=avpriv_strtod
5654                add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
5655                                             _snprintf=avpriv_snprintf  \
5656                                             vsnprintf=avpriv_vsnprintf
5657            fi
5658        fi
5659        add_${pfx}cppflags -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS
5660        # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
5661        # 0x601 by default unless something else is set by the user.
5662        # This can easily lead to us detecting functions only present
5663        # in such new versions and producing binaries requiring windows 7.0.
5664        # Therefore explicitly set the default to Vista unless the user has
5665        # set something else on the command line.
5666        # Don't do this if WINAPI_FAMILY is set and is set to a non-desktop
5667        # family. For these cases, configure is free to use any functions
5668        # found in the SDK headers by default. (Alternatively, we could force
5669        # _WIN32_WINNT to 0x0602 in that case.)
5670        test_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
5671            { test_${pfx}cpp <<EOF && add_${pfx}cppflags -D_WIN32_WINNT=0x0600; }
5672#ifdef WINAPI_FAMILY
5673#include <winapifamily.h>
5674#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
5675#error not desktop
5676#endif
5677#endif
5678EOF
5679        if [ "$pfx" = "" ]; then
5680            check_func strtoll || add_cflags -Dstrtoll=_strtoi64
5681            check_func strtoull || add_cflags -Dstrtoull=_strtoui64
5682        fi
5683    elif test_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
5684        eval ${pfx}libc_type=klibc
5685    elif test_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
5686        eval ${pfx}libc_type=bionic
5687    elif test_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
5688        eval ${pfx}libc_type=solaris
5689        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
5690    elif test_${pfx}cpp_condition sys/version.h "defined __DJGPP__"; then
5691        eval ${pfx}libc_type=djgpp
5692        add_cppflags -U__STRICT_ANSI__
5693        add_cflags "-include $source_path/compat/djgpp/math.h"
5694        add_compat djgpp/math.o
5695    fi
5696    test_${pfx}cc <<EOF
5697#include <time.h>
5698void *v = localtime_r;
5699EOF
5700test "$?" != 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
5701#include <time.h>
5702void *v = localtime_r;
5703EOF
5704
5705    eval test -n "\${${pfx}libc_type}" && enable ${pfx}libc_${libc_type}
5706}
5707
5708probe_libc
5709probe_libc host_
5710
5711# hacks for compiler/libc/os combinations
5712
5713case $libc_type in
5714    bionic)
5715        add_compat strtod.o strtod=avpriv_strtod
5716        ;;
5717esac
5718
5719check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
5720    add_cppflags '-I\$(SRC_PATH)/compat/float'
5721
5722test_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
5723
5724set_default libdir
5725: ${shlibdir_default:="$libdir"}
5726: ${pkgconfigdir_default:="$libdir/pkgconfig"}
5727
5728set_default $PATHS_LIST
5729set_default nm
5730
5731disabled optimizations || enabled ossfuzz || check_cflags -fomit-frame-pointer
5732
5733enable_weak_pic() {
5734    disabled pic && return
5735    enable pic
5736    add_cppflags -DPIC
5737    case "$target_os" in
5738    mingw*|cygwin*|win*)
5739        ;;
5740    *)
5741        add_cflags -fPIC
5742        add_asflags -fPIC
5743        ;;
5744    esac
5745}
5746
5747enabled pic && enable_weak_pic
5748
5749test_cc <<EOF || die "Symbol mangling check failed."
5750int ff_extern;
5751EOF
5752sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
5753extern_prefix=${sym%%ff_extern*}
5754
5755! disabled inline_asm && check_inline_asm inline_asm '"" ::'
5756
5757for restrict_keyword in restrict __restrict__ __restrict ""; do
5758    test_code cc "" "char * $restrict_keyword p" && break
5759done
5760
5761check_cc pragma_deprecated "" '_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")'
5762
5763# The global variable ensures the bits appear unchanged in the object file.
5764test_cc <<EOF || die "endian test failed"
5765unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
5766EOF
5767od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
5768
5769check_cc const_nan math.h "struct { double d; } static const bar[] = { { NAN } }"
5770
5771if ! enabled ppc64 || enabled bigendian; then
5772    disable vsx
5773fi
5774
5775check_gas() {
5776    log "check_gas using '$as' as AS"
5777    # :vararg is used on aarch64, arm and ppc altivec
5778    check_as vararg "
5779.macro m n, y:vararg=0
5780\n: .int \y
5781.endm
5782m x" || return 1
5783    # .altmacro is only used in arm asm
5784    ! enabled arm || check_as gnu_as ".altmacro"
5785}
5786
5787if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
5788    nogas=:
5789    enabled_any arm aarch64 && nogas=die
5790    enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn
5791    as_noop=-v
5792
5793    case $as_type in
5794        arm*) gaspp_as_type=armasm; as_noop=-h ;;
5795        gcc)  gaspp_as_type=gas ;;
5796        *)    gaspp_as_type=$as_type ;;
5797    esac
5798
5799    [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
5800
5801    test "${as#*gas-preprocessor.pl}" != "$as" ||
5802    test_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- ${as:=$cc} $as_noop &&
5803        gas="${gas:=gas-preprocessor.pl} -arch $arch -as-type $gaspp_as_type -- ${as:=$cc}"
5804
5805    if ! check_gas ; then
5806        as=${gas:=$as}
5807        check_gas || \
5808            $nogas "GNU assembler not found, install/update gas-preprocessor"
5809    fi
5810
5811    check_as as_func ".func test
5812                      .endfunc"
5813fi
5814
5815check_inline_asm inline_asm_labels '"1:\n"'
5816
5817check_inline_asm inline_asm_nonlocal_labels '"Label:\n"'
5818
5819if enabled aarch64; then
5820    enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
5821    # internal assembler in clang 3.3 does not support this instruction
5822    enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
5823    enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
5824
5825    map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
5826
5827elif enabled alpha; then
5828
5829    check_cflags -mieee
5830
5831elif enabled arm; then
5832
5833    enabled msvc && check_cpp_condition thumb stddef.h "defined _M_ARMT"
5834    test_cpp_condition stddef.h "defined __thumb__" && test_cc <<EOF && enable_weak thumb
5835float func(float a, float b){ return a+b; }
5836EOF
5837    enabled thumb && check_cflags -mthumb || check_cflags -marm
5838
5839    if check_cpp_condition vfp_args stddef.h "defined __ARM_PCS_VFP"; then
5840        :
5841    elif check_cpp_condition vfp_args stddef.h "defined _M_ARM_FP && _M_ARM_FP >= 30"; then
5842        :
5843    elif ! test_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__" && [ $target_os != darwin ]; then
5844        case "${cross_prefix:-$cc}" in
5845            *hardfloat*) enable vfp_args; fpabi=vfp ;;
5846            *) check_ld "cc" vfp_args <<EOF && fpabi=vfp || fpabi=soft ;;
5847__asm__ (".eabi_attribute 28, 1");
5848int main(void) { return 0; }
5849EOF
5850        esac
5851        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
5852    fi
5853
5854    enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
5855    enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
5856    enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
5857    enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
5858    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
5859    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
5860    enabled setend  && check_insn setend  'setend be'
5861
5862    [ $target_os = linux ] || [ $target_os = android ] ||
5863        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
5864            $ARCH_EXT_LIST_ARM
5865
5866    check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
5867
5868    check_as as_arch_directive ".arch armv7-a"
5869    check_as as_dn_directive   "ra .dn d0.i16"
5870    check_as as_fpu_directive  ".fpu neon"
5871
5872    # llvm's integrated assembler supports .object_arch from llvm 3.5
5873    [ "$objformat" = elf32 ] || [ "$objformat" = elf64 ] &&
5874        check_as as_object_arch ".object_arch armv4"
5875
5876    # MS armasm fails to assemble our PIC constructs
5877    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
5878
5879elif enabled mips; then
5880
5881    # Check toolchain ISA level
5882    if enabled mips64; then
5883        enabled mips64r6 && check_inline_asm mips64r6 '"dlsa $0, $0, $0, 1"' &&
5884            disable mips64r2
5885
5886        enabled mips64r2 && check_inline_asm mips64r2 '"dext $0, $0, 0, 1"'
5887
5888        disable mips32r6 && disable mips32r5 && disable mips32r2
5889    else
5890        enabled mips32r6 && check_inline_asm mips32r6 '"aui $0, $0, 0"' &&
5891            disable mips32r5 && disable mips32r2
5892
5893        enabled mips32r5 && check_inline_asm mips32r5 '"eretnc"'
5894        enabled mips32r2 && check_inline_asm mips32r2 '"ext $0, $0, 0, 1"'
5895
5896        disable mips64r6 && disable mips64r5 && disable mips64r2
5897    fi
5898
5899    enabled mipsfpu && check_inline_asm mipsfpu '"cvt.d.l $f0, $f2"'
5900    enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
5901
5902    enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
5903    enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
5904
5905    # MSA and MSA2 can be detected at runtime so we supply extra flags here
5906    enabled mipsfpu && enabled msa && check_inline_asm msa '"addvi.b $w0, $w1, 1"' '-mmsa' && append MSAFLAGS '-mmsa'
5907    enabled msa && enabled msa2 && check_inline_asm msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && append MSAFLAGS '-mmsa2'
5908
5909    # loongson2 have no switch cflag so we can only probe toolchain ability
5910    enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"' && disable loongson3
5911
5912    # loongson3 is paired with MMI
5913    enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"' '-mloongson-ext' && append MMIFLAGS '-mloongson-ext'
5914
5915    # MMI can be detected at runtime too
5916    enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"' '-mloongson-mmi' && append MMIFLAGS '-mloongson-mmi'
5917
5918    if enabled bigendian && enabled msa; then
5919        disable msa
5920    fi
5921
5922elif enabled parisc; then
5923
5924    if enabled gcc; then
5925        case $($cc -dumpversion) in
5926            4.[3-9].*) check_cflags -fno-optimize-sibling-calls ;;
5927        esac
5928    fi
5929
5930elif enabled ppc; then
5931
5932    enable local_aligned
5933
5934    check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
5935    check_inline_asm ibm_asm   '"add 0, 0, 0"'
5936    check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
5937    check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
5938
5939    if enabled altivec; then
5940        check_cflags -maltivec -mabi=altivec
5941
5942        # check if our compiler supports Motorola AltiVec C API
5943        check_cc altivec altivec.h "vector signed int v1 = (vector signed int) { 0 };
5944                                    vector signed int v2 = (vector signed int) { 1 };
5945                                    v1 = vec_add(v1, v2);"
5946
5947        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
5948    fi
5949
5950    if enabled vsx; then
5951        check_cflags -mvsx &&
5952        check_cc vsx altivec.h "int v[4] = { 0 };
5953                                vector signed int v1 = vec_vsx_ld(0, v);"
5954    fi
5955
5956    if enabled power8; then
5957        check_cpp_condition power8 "altivec.h" "defined(_ARCH_PWR8)"
5958    fi
5959
5960elif enabled x86; then
5961
5962    check_builtin rdtsc    intrin.h   "__rdtsc()"
5963    check_builtin mm_empty mmintrin.h "_mm_empty()"
5964
5965    enable local_aligned
5966
5967    # check whether EBP is available on x86
5968    # As 'i' is stored on the stack, this program will crash
5969    # if the base pointer is used to access it because the
5970    # base pointer is cleared in the inline assembly code.
5971    check_exec_crash <<EOF && enable ebp_available
5972volatile int i=0;
5973__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
5974return i;
5975EOF
5976
5977    # check whether EBX is available on x86
5978    check_inline_asm ebx_available '""::"b"(0)' &&
5979        check_inline_asm ebx_available '"":::"%ebx"'
5980
5981    # check whether xmm clobbers are supported
5982    check_inline_asm xmm_clobbers '"":::"%xmm0"'
5983
5984    check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test, %eax"' ||
5985        check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test(%rip), %eax"'
5986
5987    # check whether binutils is new enough to compile SSSE3/MMXEXT
5988    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
5989    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
5990
5991    probe_x86asm(){
5992        x86asmexe_probe=$1
5993        if test_cmd $x86asmexe_probe -v; then
5994            x86asmexe=$x86asmexe_probe
5995            x86asm_type=nasm
5996            x86asm_debug="-g -F dwarf"
5997            X86ASMDEP=
5998            X86ASM_DEPFLAGS='-MD $(@:.o=.d)'
5999        elif test_cmd $x86asmexe_probe --version; then
6000            x86asmexe=$x86asmexe_probe
6001            x86asm_type=yasm
6002            x86asm_debug="-g dwarf2"
6003            X86ASMDEP='$(DEPX86ASM) $(X86ASMFLAGS) -M $(X86ASM_O) $< > $(@:.o=.d)'
6004            X86ASM_DEPFLAGS=
6005        fi
6006        check_x86asm x86asm "movbe ecx, [5]"
6007    }
6008
6009    if ! disabled_any asm mmx x86asm; then
6010        disable x86asm
6011        for program in $x86asmexe nasm yasm; do
6012            probe_x86asm $program && break
6013        done
6014        disabled x86asm && die "nasm/yasm not found or too old. Use --disable-x86asm for a crippled build."
6015        X86ASMFLAGS="-f $objformat"
6016        enabled pic               && append X86ASMFLAGS "-DPIC"
6017        test -n "$extern_prefix"  && append X86ASMFLAGS "-DPREFIX"
6018        case "$objformat" in
6019            elf*) enabled debug && append X86ASMFLAGS $x86asm_debug ;;
6020        esac
6021
6022        enabled avx512 && check_x86asm avx512_external "vmovdqa32 [eax]{k1}{z}, zmm0"
6023        enabled avx2   && check_x86asm avx2_external   "vextracti128 xmm0, ymm0, 0"
6024        enabled xop    && check_x86asm xop_external    "vpmacsdd xmm0, xmm1, xmm2, xmm3"
6025        enabled fma4   && check_x86asm fma4_external   "vfmaddps ymm0, ymm1, ymm2, ymm3"
6026        check_x86asm cpunop          "CPU amdnop"
6027    fi
6028
6029    case "$cpu" in
6030        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
6031            disable fast_clz
6032        ;;
6033    esac
6034
6035fi
6036
6037check_cc intrinsics_neon arm_neon.h "int16x8_t test = vdupq_n_s16(0)"
6038
6039check_ldflags -Wl,--as-needed
6040check_ldflags -Wl,-z,noexecstack
6041
6042if ! disabled network; then
6043    check_func getaddrinfo $network_extralibs
6044    check_func inet_aton $network_extralibs
6045
6046    check_type netdb.h "struct addrinfo"
6047    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
6048    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
6049    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
6050    check_type poll.h "struct pollfd"
6051    check_type netinet/sctp.h "struct sctp_event_subscribe"
6052    check_struct "sys/socket.h" "struct msghdr" msg_flags
6053    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
6054    check_type netinet/in.h "struct sockaddr_in6"
6055    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
6056    check_type "sys/types.h sys/socket.h" socklen_t
6057
6058    # Prefer arpa/inet.h over winsock2
6059    if check_headers arpa/inet.h ; then
6060        check_func closesocket
6061    elif check_headers winsock2.h ; then
6062        check_func_headers winsock2.h closesocket -lws2 &&
6063            network_extralibs="-lws2" ||
6064        { check_func_headers winsock2.h closesocket -lws2_32 &&
6065            network_extralibs="-lws2_32"; } || disable winsock2_h network
6066        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
6067
6068        check_type ws2tcpip.h socklen_t
6069        check_type ws2tcpip.h "struct addrinfo"
6070        check_type ws2tcpip.h "struct group_source_req"
6071        check_type ws2tcpip.h "struct ip_mreq_source"
6072        check_type ws2tcpip.h "struct ipv6_mreq"
6073        check_type winsock2.h "struct pollfd"
6074        check_struct winsock2.h "struct sockaddr" sa_len
6075        check_type ws2tcpip.h "struct sockaddr_in6"
6076        check_type ws2tcpip.h "struct sockaddr_storage"
6077    else
6078        disable network
6079    fi
6080fi
6081
6082check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
6083check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
6084check_builtin MemoryBarrier windows.h "MemoryBarrier()"
6085check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
6086check_builtin gmtime_r time.h "time_t *time; struct tm *tm; gmtime_r(time, tm)"
6087check_builtin localtime_r time.h "time_t *time; struct tm *tm; localtime_r(time, tm)"
6088check_builtin x264_csp_bgr "stdint.h x264.h" "X264_CSP_BGR"
6089
6090case "$custom_allocator" in
6091    jemalloc)
6092        # jemalloc by default does not use a prefix
6093        require libjemalloc jemalloc/jemalloc.h malloc -ljemalloc
6094    ;;
6095    tcmalloc)
6096        require_pkg_config libtcmalloc libtcmalloc gperftools/tcmalloc.h tc_malloc
6097        malloc_prefix=tc_
6098    ;;
6099esac
6100
6101check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
6102check_func  ${malloc_prefix}memalign            && enable memalign
6103check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
6104
6105check_func  access
6106check_func_headers stdlib.h arc4random
6107check_lib   clock_gettime time.h clock_gettime || check_lib clock_gettime time.h clock_gettime -lrt
6108check_func  fcntl
6109check_func  fork
6110check_func  gethrtime
6111check_func  getopt
6112check_func  getrusage
6113check_func  gettimeofday
6114check_func  isatty
6115check_func  mkstemp
6116check_func  mmap
6117check_func  mprotect
6118# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
6119check_func_headers time.h nanosleep || check_lib nanosleep time.h nanosleep -lrt
6120check_func  sched_getaffinity
6121check_func  setrlimit
6122check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
6123check_func  strerror_r
6124check_func  sysconf
6125check_func  sysctl
6126check_func  usleep
6127
6128check_func_headers conio.h kbhit
6129check_func_headers io.h setmode
6130check_func_headers lzo/lzo1x.h lzo1x_999_compress
6131check_func_headers mach/mach_time.h mach_absolute_time
6132check_func_headers stdlib.h getenv
6133check_func_headers sys/stat.h lstat
6134
6135check_func_headers windows.h GetModuleHandle
6136check_func_headers windows.h GetProcessAffinityMask
6137check_func_headers windows.h GetProcessTimes
6138check_func_headers windows.h GetStdHandle
6139check_func_headers windows.h GetSystemTimeAsFileTime
6140check_func_headers windows.h LoadLibrary
6141check_func_headers windows.h MapViewOfFile
6142check_func_headers windows.h PeekNamedPipe
6143check_func_headers windows.h SetConsoleTextAttribute
6144check_func_headers windows.h SetConsoleCtrlHandler
6145check_func_headers windows.h SetDllDirectory
6146check_func_headers windows.h Sleep
6147check_func_headers windows.h VirtualAlloc
6148check_func_headers glob.h glob
6149enabled xlib &&
6150    check_lib xlib "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
6151
6152check_headers direct.h
6153check_headers dirent.h
6154check_headers dxgidebug.h
6155check_headers dxva.h
6156check_headers dxva2api.h -D_WIN32_WINNT=0x0600
6157check_headers io.h
6158enabled libdrm &&
6159    check_headers linux/dma-buf.h
6160
6161check_headers linux/perf_event.h
6162check_headers libcrystalhd/libcrystalhd_if.h
6163check_headers malloc.h
6164check_headers mftransform.h
6165check_headers net/udplite.h
6166check_headers poll.h
6167check_headers sys/param.h
6168check_headers sys/resource.h
6169check_headers sys/select.h
6170check_headers sys/time.h
6171check_headers sys/un.h
6172check_headers termios.h
6173check_headers unistd.h
6174check_headers valgrind/valgrind.h
6175check_func_headers VideoToolbox/VTCompressionSession.h VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
6176check_headers windows.h
6177check_headers X11/extensions/XvMClib.h
6178check_headers asm/types.h
6179
6180# it seems there are versions of clang in some distros that try to use the
6181# gcc headers, which explodes for stdatomic
6182# so we also check that atomics actually work here
6183check_builtin stdatomic stdatomic.h "atomic_int foo, bar = ATOMIC_VAR_INIT(-1); atomic_store(&foo, 0); foo += bar"
6184
6185check_lib advapi32 "windows.h"            RegCloseKey          -ladvapi32
6186check_lib bcrypt   "windows.h bcrypt.h"   BCryptGenRandom      -lbcrypt &&
6187    check_cpp_condition bcrypt bcrypt.h "defined BCRYPT_RNG_ALGORITHM"
6188check_lib ole32    "windows.h"            CoTaskMemFree        -lole32
6189check_lib shell32  "windows.h shellapi.h" CommandLineToArgvW   -lshell32
6190check_lib psapi    "windows.h psapi.h"    GetProcessMemoryInfo -lpsapi
6191
6192check_lib android android/native_window.h ANativeWindow_acquire -landroid
6193check_lib mediandk "stdint.h media/NdkImage.h" AImage_delete -lmediandk
6194check_lib camera2ndk "stdbool.h stdint.h camera/NdkCameraManager.h" ACameraManager_create -lcamera2ndk
6195
6196enabled appkit       && check_apple_framework AppKit
6197enabled audiotoolbox && check_apple_framework AudioToolbox
6198enabled avfoundation && check_apple_framework AVFoundation
6199enabled coreimage    && check_apple_framework CoreImage
6200enabled videotoolbox && check_apple_framework VideoToolbox
6201
6202check_apple_framework CoreFoundation
6203check_apple_framework CoreMedia
6204check_apple_framework CoreVideo
6205check_apple_framework CoreAudio
6206
6207enabled avfoundation && {
6208    disable coregraphics applicationservices
6209    check_lib coregraphics        CoreGraphics/CoreGraphics.h               CGGetActiveDisplayList "-framework CoreGraphics" ||
6210    check_lib applicationservices ApplicationServices/ApplicationServices.h CGGetActiveDisplayList "-framework ApplicationServices"; }
6211
6212enabled videotoolbox && {
6213    check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices"
6214    check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia"
6215    check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVCWithAlpha "-framework CoreMedia"
6216    check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo"
6217    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo"
6218    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo"
6219    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_Linear "-framework CoreVideo"
6220}
6221
6222check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
6223
6224check_type "windows.h dxva.h" "DXVA_PicParams_AV1" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
6225check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
6226check_type "windows.h dxva.h" "DXVA_PicParams_VP9" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
6227check_type "windows.h d3d11.h" "ID3D11VideoDecoder"
6228check_type "windows.h d3d11.h" "ID3D11VideoContext"
6229check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602
6230check_func_headers mfapi.h MFCreateAlignedMemoryBuffer -lmfplat
6231
6232check_type "vdpau/vdpau.h" "VdpPictureInfoHEVC"
6233check_type "vdpau/vdpau.h" "VdpPictureInfoVP9"
6234
6235if [ -z "$nvccflags" ]; then
6236    nvccflags=$nvccflags_default
6237fi
6238
6239if enabled x86_64 || enabled ppc64 || enabled aarch64; then
6240    nvccflags="$nvccflags -m64"
6241else
6242    nvccflags="$nvccflags -m32"
6243fi
6244
6245if enabled cuda_nvcc; then
6246    nvccflags="$nvccflags -ptx"
6247else
6248    nvccflags="$nvccflags -S -nocudalib -nocudainc --cuda-device-only -Wno-c++11-narrowing -include ${source_link}/compat/cuda/cuda_runtime.h"
6249    check_nvcc cuda_llvm
6250fi
6251
6252if ! disabled ffnvcodec; then
6253    ffnv_hdr_list="ffnvcodec/nvEncodeAPI.h ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h ffnvcodec/dynlink_nvcuvid.h"
6254    check_pkg_config ffnvcodec "ffnvcodec >= 9.1.23.1" "$ffnv_hdr_list" "" || \
6255      check_pkg_config ffnvcodec "ffnvcodec >= 9.0.18.3 ffnvcodec < 9.1" "$ffnv_hdr_list" "" || \
6256      check_pkg_config ffnvcodec "ffnvcodec >= 8.2.15.10 ffnvcodec < 8.3" "$ffnv_hdr_list" "" || \
6257      check_pkg_config ffnvcodec "ffnvcodec >= 8.1.24.11 ffnvcodec < 8.2" "$ffnv_hdr_list" ""
6258fi
6259
6260check_cpp_condition winrt windows.h "!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)"
6261
6262if ! disabled w32threads && ! enabled pthreads; then
6263    check_func_headers "windows.h process.h" _beginthreadex &&
6264        check_type "windows.h" CONDITION_VARIABLE &&
6265        check_type "windows.h" INIT_ONCE &&
6266        enable w32threads || disable w32threads
6267    if ! enabled w32threads && enabled winrt; then
6268        check_func_headers "windows.h" CreateThread &&
6269            enable w32threads || disable w32threads
6270    fi
6271fi
6272
6273# check for some common methods of building with pthread support
6274# do this before the optional library checks as some of them require pthreads
6275if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
6276    if check_lib pthreads pthread.h pthread_join   -pthread &&
6277       check_lib pthreads pthread.h pthread_create -pthread; then
6278        add_cflags -pthread
6279    elif check_lib pthreads pthread.h pthread_join   -pthreads &&
6280         check_lib pthreads pthread.h pthread_create -pthreads; then
6281        add_cflags -pthreads
6282    elif check_lib pthreads pthread.h pthread_join   -ldl -pthread &&
6283         check_lib pthreads pthread.h pthread_create -ldl -pthread; then
6284        add_cflags -ldl -pthread
6285    elif check_lib pthreads pthread.h pthread_join   -lpthreadGC2 &&
6286         check_lib pthreads pthread.h pthread_create -lpthreadGC2; then
6287        :
6288    elif check_lib pthreads pthread.h pthread_join   -lpthread &&
6289         check_lib pthreads pthread.h pthread_create -lpthread; then
6290        :
6291    elif check_func pthread_join && check_func pthread_create; then
6292        enable pthreads
6293    fi
6294    check_cc pthreads "pthread.h" "static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER"
6295
6296    if enabled pthreads; then
6297        check_builtin sem_timedwait semaphore.h "sem_t *s; sem_init(s,0,0); sem_timedwait(s,0); sem_destroy(s)" $pthreads_extralibs
6298        check_func pthread_cancel $pthreads_extralibs
6299    fi
6300fi
6301
6302enabled  zlib && { check_pkg_config zlib zlib "zlib.h" zlibVersion ||
6303                   check_lib zlib   zlib.h      zlibVersion    -lz; }
6304enabled bzlib && check_lib bzlib bzlib.h BZ2_bzlibVersion    -lbz2
6305enabled  lzma && check_lib lzma   lzma.h lzma_version_number -llzma
6306
6307# On some systems dynamic loading requires no extra linker flags
6308check_lib libdl dlfcn.h "dlopen dlsym" || check_lib libdl dlfcn.h "dlopen dlsym" -ldl
6309
6310check_lib libm math.h sin -lm
6311
6312atan2f_args=2
6313copysign_args=2
6314hypot_args=2
6315ldexpf_args=2
6316powf_args=2
6317
6318for func in $MATH_FUNCS; do
6319    eval check_mathfunc $func \${${func}_args:-1} $libm_extralibs
6320done
6321
6322for func in $COMPLEX_FUNCS; do
6323    eval check_complexfunc $func \${${func}_args:-1}
6324done
6325
6326# these are off by default, so fail if requested and not available
6327enabled avisynth          && require_headers "avisynth/avisynth_c.h"
6328enabled cuda_nvcc         && { check_nvcc cuda_nvcc || die "ERROR: failed checking for nvcc."; }
6329enabled chromaprint       && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
6330enabled decklink          && { require_headers DeckLinkAPI.h &&
6331                               { test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a0a0000" || die "ERROR: Decklink API version must be >= 10.10"; } }
6332enabled frei0r            && require_headers "frei0r.h dlfcn.h"
6333enabled gmp               && require gmp gmp.h mpz_export -lgmp
6334enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
6335enabled jni               && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; }
6336enabled ladspa            && require_headers "ladspa.h dlfcn.h"
6337enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_codec.h aom_codec_version
6338enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
6339                               { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
6340                               die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
6341enabled lv2               && require_pkg_config lv2 lilv-0 "lilv/lilv.h" lilv_world_new
6342enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
6343enabled libass            && require_pkg_config libass libass ass/ass.h ass_library_init
6344enabled libbluray         && require_pkg_config libbluray libbluray libbluray/bluray.h bd_open
6345enabled libbs2b           && require_pkg_config libbs2b libbs2b bs2b.h bs2b_open
6346enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
6347                             { check_lib libcelt celt/celt.h celt_decoder_create_custom -lcelt0 ||
6348                               die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
6349enabled libcaca           && require_pkg_config libcaca caca caca.h caca_create_canvas
6350enabled libcodec2         && require libcodec2 codec2/codec2.h codec2_create -lcodec2
6351enabled libdav1d          && require_pkg_config libdav1d "dav1d >= 0.5.0" "dav1d/dav1d.h" dav1d_version
6352enabled libdavs2          && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open
6353enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
6354enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
6355enabled libfdk_aac        && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
6356                               { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
6357                                 warn "using libfdk without pkg-config"; } }
6358flite_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"
6359enabled libflite          && require libflite "flite/flite.h" flite_init $flite_extralibs
6360enabled fontconfig        && enable libfontconfig
6361enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
6362enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
6363enabled libfribidi        && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
6364enabled 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++
6365enabled libgme            && { check_pkg_config libgme libgme gme/gme.h gme_new_emu ||
6366                               require libgme gme/gme.h gme_new_emu -lgme -lstdc++; }
6367enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
6368                                   check_lib libgsm "${gsm_hdr}" gsm_create -lgsm && break;
6369                               done || die "ERROR: libgsm not found"; }
6370enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc $pthreads_extralibs
6371enabled libklvanc         && require libklvanc libklvanc/vanc.h klvanc_context_create -lklvanc
6372enabled libkvazaar        && require_pkg_config libkvazaar "kvazaar >= 0.8.1" kvazaar.h kvz_api_get
6373enabled liblensfun        && require_pkg_config liblensfun lensfun lensfun.h lf_db_new
6374# While it may appear that require is being used as a pkg-config
6375# fallback for libmfx, it is actually being used to detect a different
6376# installation route altogether.  If libmfx is installed via the Intel
6377# Media SDK or Intel Media Server Studio, these don't come with
6378# pkg-config support.  Instead, users should make sure that the build
6379# can find the libraries and headers through other means.
6380enabled libmfx            && { check_pkg_config libmfx libmfx "mfx/mfxvideo.h" MFXInit ||
6381                               { require libmfx "mfx/mfxvideo.h" MFXInit "-llibmfx $advapi32_extralibs" && warn "using libmfx without pkg-config"; } }
6382if enabled libmfx; then
6383   check_cc MFX_CODEC_VP9 "mfx/mfxvp9.h mfx/mfxstructures.h" "MFX_CODEC_VP9"
6384fi
6385
6386enabled libmodplug        && require_pkg_config libmodplug libmodplug libmodplug/modplug.h ModPlug_Load
6387enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
6388enabled libmysofa         && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine ||
6389                               require libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine -lmysofa $zlib_extralibs; }
6390enabled libnpp            && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei ||
6391                               check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppc -lnppidei ||
6392                               die "ERROR: libnpp not found"; }
6393enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
6394enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
6395enabled libopencv         && { check_headers opencv2/core/core_c.h &&
6396                               { check_pkg_config libopencv opencv opencv2/core/core_c.h cvCreateImageHeader ||
6397                                 require libopencv opencv2/core/core_c.h cvCreateImageHeader -lopencv_core -lopencv_imgproc; } ||
6398                               require_pkg_config libopencv opencv opencv/cxcore.h cvCreateImageHeader; }
6399enabled libopenh264       && require_pkg_config libopenh264 openh264 wels/codec_api.h WelsGetCodecVersion
6400enabled libopenjpeg       && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version ||
6401                               { require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } }
6402enabled libopenmpt        && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
6403enabled libopenvino       && require libopenvino c_api/ie_c_api.h ie_c_api_version -linference_engine_c_api
6404enabled libopus           && {
6405    enabled libopus_decoder && {
6406        require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
6407    }
6408    enabled libopus_encoder && {
6409        require_pkg_config libopus opus opus_multistream.h opus_multistream_surround_encoder_create
6410    }
6411}
6412enabled libpulse          && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
6413enabled librabbitmq       && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection
6414enabled librav1e          && require_pkg_config librav1e "rav1e >= 0.4.0" rav1e.h rav1e_context_new
6415enabled librist           && require_pkg_config librist "librist >= 0.2" librist/librist.h rist_receiver_create
6416enabled librsvg           && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo
6417enabled librtmp           && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
6418enabled librubberband     && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++"
6419enabled libshine          && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer
6420enabled libsmbclient      && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init ||
6421                               require libsmbclient libsmbclient.h smbc_init -lsmbclient; }
6422enabled libsnappy         && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++
6423enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
6424enabled libssh            && require_pkg_config libssh libssh libssh/sftp.h sftp_init
6425enabled libspeex          && require_pkg_config libspeex speex speex/speex.h speex_decoder_init
6426enabled libsrt            && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket
6427enabled libsvtav1         && require_pkg_config libsvtav1 "SvtAv1Enc >= 0.8.4" EbSvtAv1Enc.h svt_av1_enc_init_handle
6428enabled libtensorflow     && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow
6429enabled libtesseract      && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate
6430enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
6431enabled libtls            && require_pkg_config libtls libtls tls.h tls_configure
6432enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame &&
6433                             { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
6434                               die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
6435enabled libuavs3d         && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode
6436enabled libv4l2           && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl
6437enabled libvidstab        && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
6438enabled libvmaf           && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init
6439enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
6440enabled libvorbis         && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init &&
6441                             require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init
6442
6443enabled libvpx            && {
6444    enabled libvpx_vp8_decoder && {
6445        check_pkg_config libvpx_vp8_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx ||
6446            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"
6447    }
6448    enabled libvpx_vp8_encoder && {
6449        check_pkg_config libvpx_vp8_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx ||
6450            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"
6451    }
6452    enabled libvpx_vp9_decoder && {
6453        check_pkg_config libvpx_vp9_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx ||
6454            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"
6455    }
6456    enabled libvpx_vp9_encoder && {
6457        check_pkg_config libvpx_vp9_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx ||
6458            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"
6459    }
6460    if disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder; then
6461        die "libvpx enabled but no supported decoders found"
6462    fi
6463}
6464
6465enabled libwebp           && {
6466    enabled libwebp_encoder      && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
6467    enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; }
6468enabled libx264           && { check_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode ||
6469                               { require libx264 "stdint.h x264.h" x264_encoder_encode "-lx264 $pthreads_extralibs $libm_extralibs" &&
6470                                 warn "using libx264 without pkg-config"; } } &&
6471                             require_cpp_condition libx264 x264.h "X264_BUILD >= 118" &&
6472                             check_cpp_condition libx262 x264.h "X264_MPEG2"
6473enabled libx265           && require_pkg_config libx265 x265 x265.h x265_api_get &&
6474                             require_cpp_condition libx265 x265.h "X265_BUILD >= 70"
6475enabled libxavs           && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs"
6476enabled libxavs2          && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get
6477enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
6478enabled libzimg           && require_pkg_config libzimg "zimg >= 2.7.0" zimg.h zimg_get_api_version
6479enabled libzmq            && require_pkg_config libzmq "libzmq >= 4.2.1" zmq.h zmq_ctx_new
6480enabled libzvbi           && require_pkg_config libzvbi zvbi-0.2 libzvbi.h vbi_decoder_new &&
6481                             { test_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" ||
6482                               enabled gpl || die "ERROR: libzvbi requires version 0.2.28 or --enable-gpl."; }
6483enabled libxml2           && require_pkg_config libxml2 libxml-2.0 libxml2/libxml/xmlversion.h xmlCheckVersion
6484enabled mbedtls           && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt.h mbedtls_x509_crt_init ||
6485                               check_pkg_config mbedtls mbedtls mbedtls/ssl.h mbedtls_ssl_init ||
6486                               check_lib mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedx509 -lmbedcrypto ||
6487                               die "ERROR: mbedTLS not found"; }
6488enabled mediacodec        && { enabled jni || die "ERROR: mediacodec requires --enable-jni"; }
6489enabled mmal              && { check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ||
6490                               { ! enabled cross_compile &&
6491                                 add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline &&
6492                                 add_ldflags -L/opt/vc/lib/ &&
6493                                 check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host; } ||
6494                               die "ERROR: mmal not found" &&
6495                               check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS"; }
6496enabled openal            && { { for al_extralibs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
6497                               check_lib openal 'AL/al.h' alGetError "${al_extralibs}" && break; done } ||
6498                               die "ERROR: openal not found"; } &&
6499                             { test_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
6500                               die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
6501enabled opencl            && { check_pkg_config opencl OpenCL CL/cl.h clEnqueueNDRangeKernel ||
6502                               check_lib opencl OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL ||
6503                               check_lib opencl CL/cl.h clEnqueueNDRangeKernel -lOpenCL ||
6504                               die "ERROR: opencl not found"; } &&
6505                             { test_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" ||
6506                               test_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" ||
6507                               die "ERROR: opencl must be installed and version must be 1.2 or compatible"; }
6508enabled opengl            && { check_lib opengl GL/glx.h glXGetProcAddress "-lGL" ||
6509                               check_lib opengl windows.h wglGetProcAddress "-lopengl32 -lgdi32" ||
6510                               check_lib opengl OpenGL/gl3.h glGetError "-Wl,-framework,OpenGL" ||
6511                               check_lib opengl ES2/gl.h glGetError "-isysroot=${sysroot} -Wl,-framework,OpenGLES" ||
6512                               die "ERROR: opengl not found."
6513                             }
6514enabled omx_rpi           && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame ||
6515                               { ! enabled cross_compile &&
6516                                 add_cflags -isystem/opt/vc/include/IL &&
6517                                 test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame; } ||
6518                               die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } &&
6519                             enable omx
6520enabled omx               && require_headers OMX_Core.h
6521enabled openssl           && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
6522                               check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
6523                               check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
6524                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
6525                               check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
6526                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
6527                               die "ERROR: openssl not found"; }
6528enabled pocketsphinx      && require_pkg_config pocketsphinx pocketsphinx pocketsphinx/pocketsphinx.h ps_init
6529enabled rkmpp             && { require_pkg_config rkmpp rockchip_mpp  rockchip/rk_mpi.h mpp_create &&
6530                               require_pkg_config rockchip_mpp "rockchip_mpp >= 1.3.7" rockchip/rk_mpi.h mpp_create &&
6531                               { enabled libdrm ||
6532                                 die "ERROR: rkmpp requires --enable-libdrm"; }
6533                             }
6534enabled vapoursynth       && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init
6535
6536
6537if enabled gcrypt; then
6538    GCRYPT_CONFIG="${cross_prefix}libgcrypt-config"
6539    if "${GCRYPT_CONFIG}" --version > /dev/null 2>&1; then
6540        gcrypt_cflags=$("${GCRYPT_CONFIG}" --cflags)
6541        gcrypt_extralibs=$("${GCRYPT_CONFIG}" --libs)
6542        check_func_headers gcrypt.h gcry_mpi_new $gcrypt_cflags $gcrypt_extralibs ||
6543            die "ERROR: gcrypt not found"
6544        add_cflags $gcrypt_cflags
6545    else
6546        require gcrypt gcrypt.h gcry_mpi_new -lgcrypt
6547    fi
6548fi
6549
6550if enabled sdl2; then
6551    SDL2_CONFIG="${cross_prefix}sdl2-config"
6552    test_pkg_config sdl2 "sdl2 >= 2.0.1 sdl2 < 2.1.0" SDL_events.h SDL_PollEvent
6553    if disabled sdl2 && "${SDL2_CONFIG}" --version > /dev/null 2>&1; then
6554        sdl2_cflags=$("${SDL2_CONFIG}" --cflags)
6555        sdl2_extralibs=$("${SDL2_CONFIG}" --libs)
6556        test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x020001" $sdl2_cflags &&
6557        test_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x020100" $sdl2_cflags &&
6558        check_func_headers SDL_events.h SDL_PollEvent $sdl2_extralibs $sdl2_cflags &&
6559            enable sdl2
6560    fi
6561    if test $target_os = "mingw32"; then
6562        sdl2_extralibs=$(filter_out '-mwindows' $sdl2_extralibs)
6563    fi
6564fi
6565
6566if enabled decklink; then
6567    case $target_os in
6568        mingw32*|mingw64*|win32|win64)
6569            decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
6570            decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
6571            ;;
6572    esac
6573fi
6574
6575enabled securetransport &&
6576    check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
6577    check_lib securetransport "Security/SecureTransport.h Security/Security.h" "SSLCreateContext" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" ||
6578        disable securetransport
6579
6580enabled securetransport &&
6581    check_func SecItemImport "-Wl,-framework,CoreFoundation -Wl,-framework,Security"
6582
6583enabled schannel &&
6584    check_func_headers "windows.h security.h" InitializeSecurityContext -DSECURITY_WIN32 -lsecur32 &&
6585    test_cpp_condition winerror.h "defined(SEC_I_CONTEXT_EXPIRED)" &&
6586    schannel_extralibs="-lsecur32" ||
6587        disable schannel
6588
6589makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
6590enabled makeinfo \
6591    && [ 0$(makeinfo --version | grep "texinfo" | sed 's/.*texinfo[^0-9]*\([0-9]*\)\..*/\1/') -ge 5 ] \
6592    && enable makeinfo_html || disable makeinfo_html
6593disabled makeinfo_html && texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
6594perl -v            > /dev/null 2>&1 && enable perl      || disable perl
6595pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
6596rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
6597
6598# check V4L2 codecs available in the API
6599if enabled v4l2_m2m; then
6600    check_headers linux/fb.h
6601    check_headers linux/videodev2.h
6602    test_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
6603    check_cc v4l2_m2m linux/videodev2.h "int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;"
6604    check_cc vc1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VC1_ANNEX_G;"
6605    check_cc mpeg1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG1;"
6606    check_cc mpeg2_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2;"
6607    check_cc mpeg4_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG4;"
6608    check_cc hevc_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC;"
6609    check_cc h263_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H263;"
6610    check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
6611    check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
6612    check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
6613fi
6614
6615check_headers sys/videoio.h
6616test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
6617
6618check_lib user32 "windows.h winuser.h" GetShellWindow -luser32
6619check_lib vfw32 "windows.h vfw.h" capCreateCaptureWindow -lvfw32
6620# check that WM_CAP_DRIVER_CONNECT is defined to the proper value
6621# w32api 3.12 had it defined wrong
6622check_cpp_condition vfwcap_defines vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER"
6623
6624check_type "dshow.h" IBaseFilter
6625
6626# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
6627check_headers "dev/bktr/ioctl_meteor.h dev/bktr/ioctl_bt848.h"                   ||
6628    check_headers "machine/ioctl_meteor.h machine/ioctl_bt848.h"                 ||
6629    check_headers "dev/video/meteor/ioctl_meteor.h dev/video/bktr/ioctl_bt848.h" ||
6630    check_headers "dev/ic/bt8xx.h"
6631
6632if check_struct sys/soundcard.h audio_buf_info bytes; then
6633    enable_sanitized sys/soundcard.h
6634else
6635    test_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_sanitized sys/soundcard.h
6636    #include <sys/soundcard.h>
6637    audio_buf_info abc;
6638EOF
6639fi
6640
6641enabled alsa && { check_pkg_config alsa alsa "alsa/asoundlib.h" snd_pcm_htimestamp ||
6642                  check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound; }
6643
6644enabled libjack &&
6645    require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range
6646
6647enabled sndio && check_lib sndio sndio.h sio_open -lsndio
6648
6649if enabled libcdio; then
6650    check_pkg_config libcdio libcdio_paranoia "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open ||
6651    check_pkg_config libcdio libcdio_paranoia "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open ||
6652    check_lib libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
6653    check_lib libcdio "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
6654    die "ERROR: No usable libcdio/cdparanoia found"
6655fi
6656
6657enabled libxcb && check_pkg_config libxcb "xcb >= 1.4" xcb/xcb.h xcb_connect ||
6658    disable libxcb_shm libxcb_shape libxcb_xfixes
6659
6660if enabled libxcb; then
6661    enabled libxcb_shm    && check_pkg_config libxcb_shm    xcb-shm    xcb/shm.h    xcb_shm_attach
6662    enabled libxcb_shape  && check_pkg_config libxcb_shape  xcb-shape  xcb/shape.h  xcb_shape_get_rectangles
6663    enabled libxcb_xfixes && check_pkg_config libxcb_xfixes xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image
6664fi
6665
6666check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs"
6667
6668# d3d11va requires linking directly to dxgi and d3d11 if not building for
6669# the desktop api partition
6670test_cpp <<EOF && enable uwp && d3d11va_extralibs="-ldxgi -ld3d11"
6671#ifdef WINAPI_FAMILY
6672#include <winapifamily.h>
6673#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
6674#error desktop, not uwp
6675#else
6676// WINAPI_FAMILY_APP, WINAPI_FAMILY_PHONE_APP => UWP
6677#endif
6678#else
6679#error no family set
6680#endif
6681EOF
6682
6683enabled libdrm &&
6684    check_pkg_config libdrm_getfb2 libdrm "xf86drmMode.h" drmModeGetFB2
6685
6686enabled vaapi &&
6687    check_pkg_config vaapi "libva >= 0.35.0" "va/va.h" vaInitialize
6688
6689if enabled vaapi; then
6690    check_pkg_config vaapi_drm "libva-drm" "va/va_drm.h" vaGetDisplayDRM
6691
6692    if enabled xlib; then
6693        check_pkg_config vaapi_x11 "libva-x11" "va/va_x11.h" vaGetDisplay
6694    fi
6695
6696    check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0, 0)"
6697
6698    check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
6699    check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
6700    check_struct "va/va.h" "VADecPictureParameterBufferAV1" bit_depth_idx
6701    check_type   "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping"
6702    check_struct "va/va.h va/va_vpp.h" "VAProcPipelineCaps" rotation_flags
6703    check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
6704    check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
6705    check_type "va/va.h va/va_enc_vp8.h"  "VAEncPictureParameterBufferVP8"
6706    check_type "va/va.h va/va_enc_vp9.h"  "VAEncPictureParameterBufferVP9"
6707fi
6708
6709if enabled_all opencl libdrm ; then
6710    check_type "CL/cl_intel.h" "clCreateImageFromFdINTEL_fn" &&
6711        enable opencl_drm_beignet
6712    check_func_headers "CL/cl_ext.h" clImportMemoryARM &&
6713        enable opencl_drm_arm
6714fi
6715
6716if enabled_all opencl vaapi ; then
6717    if enabled opencl_drm_beignet ; then
6718        enable opencl_vaapi_beignet
6719    else
6720        check_type "CL/cl.h CL/cl_va_api_media_sharing_intel.h" "clCreateFromVA_APIMediaSurfaceINTEL_fn" &&
6721            enable opencl_vaapi_intel_media
6722    fi
6723fi
6724
6725if enabled_all opencl dxva2 ; then
6726    check_type "CL/cl_dx9_media_sharing.h" cl_dx9_surface_info_khr &&
6727        enable opencl_dxva2
6728fi
6729
6730if enabled_all opencl d3d11va ; then
6731    check_type "CL/cl_d3d11.h" clGetDeviceIDsFromD3D11KHR_fn &&
6732        enable opencl_d3d11
6733fi
6734
6735enabled vdpau &&
6736    check_cpp_condition vdpau vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP"
6737
6738enabled vdpau &&
6739    check_lib vdpau_x11 "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau -lX11
6740
6741enabled crystalhd && check_lib crystalhd "stdint.h libcrystalhd/libcrystalhd_if.h" DtsCrystalHDVersion -lcrystalhd
6742
6743enabled vulkan &&
6744    require_pkg_config vulkan "vulkan >= 1.1.97" "vulkan/vulkan.h" vkCreateInstance
6745
6746if enabled x86; then
6747    case $target_os in
6748        mingw32*|mingw64*|win32|win64|linux|cygwin*)
6749            ;;
6750        *)
6751            disable ffnvcodec cuvid nvdec nvenc
6752            ;;
6753    esac
6754elif enabled_any aarch64 ppc64 && ! enabled bigendian; then
6755    case $target_os in
6756        linux)
6757            ;;
6758        *)
6759            disable ffnvcodec cuvid nvdec nvenc
6760            ;;
6761    esac
6762else
6763    disable ffnvcodec cuvid nvdec nvenc
6764fi
6765
6766enabled ffnvcodec && enable cuda
6767
6768enabled nvenc &&
6769    test_cc -I$source_path <<EOF || disable nvenc
6770#include <ffnvcodec/nvEncodeAPI.h>
6771NV_ENCODE_API_FUNCTION_LIST flist;
6772void f(void) { struct { const GUID guid; } s[] = { { NV_ENC_PRESET_HQ_GUID } }; }
6773int main(void) { return 0; }
6774EOF
6775
6776if enabled_any nvdec cuvid; then
6777    check_type "ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h" "CUVIDAV1PICPARAMS"
6778fi
6779
6780enabled amf &&
6781    check_cpp_condition amf "AMF/core/Version.h" \
6782        "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400090000"
6783
6784# Funny iconv installations are not unusual, so check it after all flags have been set
6785if enabled libc_iconv; then
6786    check_func_headers iconv.h iconv
6787elif enabled iconv; then
6788    check_func_headers iconv.h iconv || check_lib iconv iconv.h iconv -liconv
6789fi
6790
6791enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
6792
6793# add some useful compiler flags if supported
6794check_cflags -Wdeclaration-after-statement
6795check_cflags -Wall
6796check_cflags -Wdisabled-optimization
6797check_cflags -Wpointer-arith
6798check_cflags -Wredundant-decls
6799check_cflags -Wwrite-strings
6800check_cflags -Wtype-limits
6801check_cflags -Wundef
6802check_cflags -Wmissing-prototypes
6803check_cflags -Wno-pointer-to-int-cast
6804check_cflags -Wstrict-prototypes
6805check_cflags -Wempty-body
6806
6807if enabled extra_warnings; then
6808    check_cflags -Wcast-qual
6809    check_cflags -Wextra
6810    check_cflags -Wpedantic
6811fi
6812
6813check_disable_warning(){
6814    warning_flag=-W${1#-Wno-}
6815    test_cflags $unknown_warning_flags $warning_flag && add_cflags $1
6816}
6817
6818test_cflags -Werror=unused-command-line-argument &&
6819    append unknown_warning_flags "-Werror=unused-command-line-argument"
6820test_cflags -Werror=unknown-warning-option &&
6821    append unknown_warning_flags "-Werror=unknown-warning-option"
6822
6823check_disable_warning -Wno-parentheses
6824check_disable_warning -Wno-switch
6825check_disable_warning -Wno-format-zero-length
6826check_disable_warning -Wno-pointer-sign
6827check_disable_warning -Wno-unused-const-variable
6828check_disable_warning -Wno-bool-operation
6829check_disable_warning -Wno-char-subscripts
6830
6831check_disable_warning_headers(){
6832    warning_flag=-W${1#-Wno-}
6833    test_cflags $warning_flag && add_cflags_headers $1
6834}
6835
6836check_disable_warning_headers -Wno-deprecated-declarations
6837check_disable_warning_headers -Wno-unused-variable
6838
6839test_cc <<EOF && enable blocks_extension
6840void (^block)(void);
6841EOF
6842
6843# add some linker flags
6844check_ldflags -Wl,--warn-common
6845check_ldflags -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
6846enabled rpath && add_ldexeflags -Wl,-rpath,$libdir && add_ldsoflags -Wl,-rpath,$libdir
6847test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
6848
6849# add some strip flags
6850check_stripflags -x
6851
6852enabled neon_clobber_test &&
6853    check_ldflags -Wl,--wrap,avcodec_open2              \
6854                  -Wl,--wrap,avcodec_decode_audio4      \
6855                  -Wl,--wrap,avcodec_decode_video2      \
6856                  -Wl,--wrap,avcodec_decode_subtitle2   \
6857                  -Wl,--wrap,avcodec_encode_audio2      \
6858                  -Wl,--wrap,avcodec_encode_video2      \
6859                  -Wl,--wrap,avcodec_encode_subtitle    \
6860                  -Wl,--wrap,avcodec_send_packet        \
6861                  -Wl,--wrap,avcodec_receive_packet     \
6862                  -Wl,--wrap,avcodec_send_frame         \
6863                  -Wl,--wrap,avcodec_receive_frame      \
6864                  -Wl,--wrap,swr_convert                \
6865                  -Wl,--wrap,avresample_convert ||
6866    disable neon_clobber_test
6867
6868enabled xmm_clobber_test &&
6869    check_ldflags -Wl,--wrap,avcodec_open2              \
6870                  -Wl,--wrap,avcodec_decode_audio4      \
6871                  -Wl,--wrap,avcodec_decode_video2      \
6872                  -Wl,--wrap,avcodec_decode_subtitle2   \
6873                  -Wl,--wrap,avcodec_encode_audio2      \
6874                  -Wl,--wrap,avcodec_encode_video2      \
6875                  -Wl,--wrap,avcodec_encode_subtitle    \
6876                  -Wl,--wrap,avcodec_send_packet        \
6877                  -Wl,--wrap,avcodec_receive_packet     \
6878                  -Wl,--wrap,avcodec_send_frame         \
6879                  -Wl,--wrap,avcodec_receive_frame      \
6880                  -Wl,--wrap,swr_convert                \
6881                  -Wl,--wrap,avresample_convert         \
6882                  -Wl,--wrap,sws_scale ||
6883    disable xmm_clobber_test
6884
6885check_ld "cc" proper_dce <<EOF
6886extern const int array[512];
6887static inline int func(void) { return array[0]; }
6888int main(void) { return 0; }
6889EOF
6890
6891if enabled proper_dce; then
6892    echo "X { local: *; };" > $TMPV
6893    if test_ldflags -Wl,${version_script},$TMPV; then
6894        append SHFLAGS '-Wl,${version_script},\$(SUBDIR)lib\$(NAME).ver'
6895        quotes='""'
6896        test_cc <<EOF && enable symver_asm_label
6897void ff_foo(void) __asm__ ("av_foo@VERSION");
6898void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
6899EOF
6900        test_cc <<EOF && enable symver_gnu_asm
6901__asm__(".symver ff_foo,av_foo@VERSION");
6902void ff_foo(void) {}
6903EOF
6904    fi
6905fi
6906
6907if [ -z "$optflags" ]; then
6908    if enabled small; then
6909        optflags=$cflags_size
6910    elif enabled optimizations; then
6911        optflags=$cflags_speed
6912    else
6913        optflags=$cflags_noopt
6914    fi
6915fi
6916
6917check_optflags(){
6918    check_cflags "$@"
6919    enabled lto && check_ldflags "$@"
6920}
6921
6922check_optflags $optflags
6923check_optflags -fno-math-errno
6924check_optflags -fno-signed-zeros
6925
6926if enabled lto; then
6927    test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
6928    check_cflags  -flto
6929    check_ldflags -flto $cpuflags
6930    disable inline_asm_direct_symbol_refs
6931fi
6932
6933enabled ftrapv && check_cflags -ftrapv
6934
6935test_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
6936int x;
6937EOF
6938
6939
6940if enabled icc; then
6941    # Just warnings, no remarks
6942    check_cflags -w1
6943    # -wd: Disable following warnings
6944    # 144, 167, 556: -Wno-pointer-sign
6945    # 188: enumerated type mixed with another type
6946    # 1292: attribute "foo" ignored
6947    # 1419: external declaration in primary source file
6948    # 10006: ignoring unknown option -fno-signed-zeros
6949    # 10148: ignoring unknown option -Wno-parentheses
6950    # 10156: ignoring option '-W'; no argument required
6951    # 13200: No EMMS instruction before call to function
6952    # 13203: No EMMS instruction before return from function
6953    check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203
6954    # 11030: Warning unknown option --as-needed
6955    # 10156: ignoring option '-export'; no argument required
6956    check_ldflags -wd10156,11030
6957    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
6958    enable ebp_available
6959    # The test above does not test linking
6960    enabled lto && disable symver_asm_label
6961    if enabled x86_32; then
6962        icc_version=$($cc -dumpversion)
6963        test ${icc_version%%.*} -ge 11 &&
6964            check_cflags -falign-stack=maintain-16-byte ||
6965            disable aligned_stack
6966    fi
6967elif enabled gcc; then
6968    check_optflags -fno-tree-vectorize
6969    check_cflags -Werror=format-security
6970    check_cflags -Werror=implicit-function-declaration
6971    check_cflags -Werror=missing-prototypes
6972    check_cflags -Werror=return-type
6973    check_cflags -Werror=vla
6974    check_cflags -Wformat
6975    check_cflags -fdiagnostics-color=auto
6976    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
6977    if enabled x86_32; then
6978        case $target_os in
6979        *bsd*)
6980            # BSDs don't guarantee a 16 byte aligned stack, but we can
6981            # request GCC to try to maintain 16 byte alignment throughout
6982            # function calls. Library entry points that might call assembly
6983            # functions align the stack. (The parameter means 2^4 bytes.)
6984            check_cflags -mpreferred-stack-boundary=4
6985            ;;
6986        esac
6987    fi
6988elif enabled llvm_gcc; then
6989    check_cflags -mllvm -stack-alignment=16
6990elif enabled clang; then
6991    if enabled x86_32; then
6992        # Clang doesn't support maintaining alignment without assuming the
6993        # same alignment in every function. If 16 byte alignment would be
6994        # enabled, one would also have to either add attribute_align_arg on
6995        # every single entry point into the libraries or enable -mstackrealign
6996        # (doing stack realignment in every single function).
6997        case $target_os in
6998        mingw32|win32|*bsd*)
6999            disable aligned_stack
7000            ;;
7001        *)
7002            check_cflags -mllvm -stack-alignment=16
7003            check_cflags -mstack-alignment=16
7004            ;;
7005        esac
7006    else
7007        check_cflags -mllvm -stack-alignment=16
7008        check_cflags -mstack-alignment=16
7009    fi
7010    check_cflags -Qunused-arguments
7011    check_cflags -Werror=implicit-function-declaration
7012    check_cflags -Werror=missing-prototypes
7013    check_cflags -Werror=return-type
7014elif enabled cparser; then
7015    add_cflags -Wno-missing-variable-declarations
7016    add_cflags -Wno-empty-statement
7017elif enabled armcc; then
7018    add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
7019    add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
7020    # 2523: use of inline assembly is deprecated
7021    add_cflags -W${armcc_opt},--diag_suppress=2523
7022    add_cflags -W${armcc_opt},--diag_suppress=1207
7023    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
7024    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
7025    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
7026    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
7027elif enabled pathscale; then
7028    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
7029    disable inline_asm
7030elif enabled_any msvc icl; then
7031    enabled x86_32 && disable aligned_stack
7032    enabled_all x86_32 debug && add_cflags -Oy-
7033    enabled debug && add_ldflags -debug
7034    enable pragma_deprecated
7035    if enabled icl; then
7036        # -Qansi-alias is basically -fstrict-aliasing, but does not work
7037        # (correctly) on icl 13.x.
7038        test_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
7039            add_cflags -Qansi-alias
7040        # Some inline asm is not compilable in debug
7041        if enabled debug; then
7042            disable ebp_available
7043            disable ebx_available
7044        fi
7045    fi
7046    # msvcrt10 x64 incorrectly enables log2, only msvcrt12 (MSVC 2013) onwards actually has log2.
7047    check_cpp_condition log2 crtversion.h "_VC_CRT_MAJOR_VERSION >= 12"
7048    # The CRT headers contain __declspec(restrict) in a few places, but if redefining
7049    # restrict, this might break. MSVC 2010 and 2012 fail with __declspec(__restrict)
7050    # (as it ends up if the restrict redefine is done before including stdlib.h), while
7051    # MSVC 2013 and newer can handle it fine.
7052    # If this declspec fails, force including stdlib.h before the restrict redefinition
7053    # happens in config.h.
7054    if [ $restrict_keyword != restrict ]; then
7055        test_cc <<EOF || add_cflags -FIstdlib.h
7056__declspec($restrict_keyword) void *foo(int);
7057EOF
7058    fi
7059    # the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
7060    # Issue has been fixed in MSVC v19.00.24218.
7061    test_cpp_condition windows.h "_MSC_FULL_VER >= 190024218" ||
7062        check_cflags -d2SSAOptimizer-
7063    # enable utf-8 source processing on VS2015 U2 and newer
7064    test_cpp_condition windows.h "_MSC_FULL_VER >= 190023918" &&
7065        add_cflags -utf-8
7066fi
7067
7068for pfx in "" host_; do
7069    varname=${pfx%_}cc_type
7070    eval "type=\$$varname"
7071    if [ "$type" = "msvc" ]; then
7072        test_${pfx}cc <<EOF || add_${pfx}cflags -Dinline=__inline
7073static inline int foo(int a) { return a; }
7074EOF
7075    fi
7076done
7077
7078case $as_type in
7079    clang)
7080        add_asflags -Qunused-arguments
7081    ;;
7082esac
7083
7084case $ld_type in
7085    clang)
7086        check_ldflags -Qunused-arguments
7087    ;;
7088esac
7089
7090enable frame_thread_encoder
7091
7092enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
7093
7094check_deps $CONFIG_LIST       \
7095           $CONFIG_EXTRA      \
7096           $HAVE_LIST         \
7097           $ALL_COMPONENTS    \
7098
7099enabled 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"
7100enabled avresample && warn "Building with deprecated library libavresample"
7101
7102case $target_os in
7103haiku)
7104    disable memalign
7105    disable posix_memalign
7106    ;;
7107*-dos|freedos|opendos)
7108    if test_cpp_condition sys/version.h "defined(__DJGPP__) && __DJGPP__ == 2 && __DJGPP_MINOR__ == 5"; then
7109        disable memalign
7110    fi
7111    ;;
7112esac
7113
7114flatten_extralibs(){
7115    nested_entries=
7116    list_name=$1
7117    eval list=\$${1}
7118    for entry in $list; do
7119        entry_copy=$entry
7120        resolve entry_copy
7121        flat_entries=
7122        for e in $entry_copy; do
7123            case $e in
7124                *_extralibs) nested_entries="$nested_entries$e ";;
7125                          *) flat_entries="$flat_entries$e ";;
7126            esac
7127        done
7128        eval $entry="\$flat_entries"
7129    done
7130    append $list_name "$nested_entries"
7131
7132    resolve nested_entries
7133    if test -n "$(filter '*_extralibs' $nested_entries)"; then
7134        flatten_extralibs $list_name
7135    fi
7136}
7137
7138flatten_extralibs_wrapper(){
7139    list_name=$1
7140    flatten_extralibs $list_name
7141    unique $list_name
7142    resolve $list_name
7143    eval $list_name=\$\(\$ldflags_filter \$$list_name\)
7144    eval printf \''%s'\' \""\$$list_name"\"
7145}
7146
7147for linkunit in $LIBRARY_LIST; do
7148    unset current_extralibs
7149    eval components=\$$(toupper ${linkunit})_COMPONENTS_LIST
7150    for comp in ${components}; do
7151        enabled $comp || continue
7152        comp_extralibs="${comp}_extralibs"
7153        append current_extralibs $comp_extralibs
7154    done
7155    eval prepend ${linkunit}_extralibs $current_extralibs
7156done
7157
7158for linkunit in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
7159    eval ${linkunit}_extralibs=\$\(flatten_extralibs_wrapper ${linkunit}_extralibs\)
7160done
7161
7162map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST
7163
7164for thread in $THREADS_LIST; do
7165    if enabled $thread; then
7166        test -n "$thread_type" &&
7167            die "ERROR: Only one thread type must be selected." ||
7168            thread_type="$thread"
7169    fi
7170done
7171
7172if disabled stdatomic; then
7173    if enabled atomics_gcc; then
7174        add_cppflags '-I\$(SRC_PATH)/compat/atomics/gcc'
7175    elif enabled atomics_win32; then
7176        add_cppflags '-I\$(SRC_PATH)/compat/atomics/win32'
7177    elif enabled atomics_suncc; then
7178        add_cppflags '-I\$(SRC_PATH)/compat/atomics/suncc'
7179    elif enabled pthreads; then
7180        add_compat atomics/pthread/stdatomic.o
7181        add_cppflags '-I\$(SRC_PATH)/compat/atomics/pthread'
7182    else
7183        enabled threads && die "Threading is enabled, but no atomics are available"
7184        add_cppflags '-I\$(SRC_PATH)/compat/atomics/dummy'
7185    fi
7186fi
7187
7188# Check if requested libraries were found.
7189for lib in $AUTODETECT_LIBS; do
7190    requested $lib && ! enabled $lib && die "ERROR: $lib requested but not found";
7191done
7192
7193enabled zlib && add_cppflags -DZLIB_CONST
7194
7195# conditional library dependencies, in any order
7196enabled afftdn_filter       && prepend avfilter_deps "avcodec"
7197enabled afftfilt_filter     && prepend avfilter_deps "avcodec"
7198enabled afir_filter         && prepend avfilter_deps "avcodec"
7199enabled amovie_filter       && prepend avfilter_deps "avformat avcodec"
7200enabled aresample_filter    && prepend avfilter_deps "swresample"
7201enabled atempo_filter       && prepend avfilter_deps "avcodec"
7202enabled bm3d_filter         && prepend avfilter_deps "avcodec"
7203enabled cover_rect_filter   && prepend avfilter_deps "avformat avcodec"
7204enabled convolve_filter     && prepend avfilter_deps "avcodec"
7205enabled deconvolve_filter   && prepend avfilter_deps "avcodec"
7206enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
7207enabled elbg_filter         && prepend avfilter_deps "avcodec"
7208enabled fftfilt_filter      && prepend avfilter_deps "avcodec"
7209enabled find_rect_filter    && prepend avfilter_deps "avformat avcodec"
7210enabled firequalizer_filter && prepend avfilter_deps "avcodec"
7211enabled mcdeint_filter      && prepend avfilter_deps "avcodec"
7212enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
7213enabled pan_filter          && prepend avfilter_deps "swresample"
7214enabled pp_filter           && prepend avfilter_deps "postproc"
7215enabled removelogo_filter   && prepend avfilter_deps "avformat avcodec swscale"
7216enabled resample_filter && prepend avfilter_deps "avresample"
7217enabled sab_filter          && prepend avfilter_deps "swscale"
7218enabled scale_filter    && prepend avfilter_deps "swscale"
7219enabled scale2ref_filter    && prepend avfilter_deps "swscale"
7220enabled sofalizer_filter    && prepend avfilter_deps "avcodec"
7221enabled showcqt_filter      && prepend avfilter_deps "avformat avcodec swscale"
7222enabled showfreqs_filter    && prepend avfilter_deps "avcodec"
7223enabled showspectrum_filter && prepend avfilter_deps "avcodec"
7224enabled signature_filter    && prepend avfilter_deps "avcodec avformat"
7225enabled smartblur_filter    && prepend avfilter_deps "swscale"
7226enabled spectrumsynth_filter && prepend avfilter_deps "avcodec"
7227enabled spp_filter          && prepend avfilter_deps "avcodec"
7228enabled sr_filter           && prepend avfilter_deps "avformat swscale"
7229enabled subtitles_filter    && prepend avfilter_deps "avformat avcodec"
7230enabled uspp_filter         && prepend avfilter_deps "avcodec"
7231enabled zoompan_filter      && prepend avfilter_deps "swscale"
7232
7233enabled lavfi_indev         && prepend avdevice_deps "avfilter"
7234
7235#FIXME
7236enabled_any sdl2_outdev opengl_outdev && enabled sdl2 &&
7237    add_cflags $(filter_out '-Dmain=SDL_main' $sdl2_cflags)
7238
7239enabled opus_decoder    && prepend avcodec_deps "swresample"
7240
7241# reorder the items at var $1 to align with the items order at var $2 .
7242# die if an item at $1 is not at $2 .
7243reorder_by(){
7244    eval rb_in=\$$1
7245    eval rb_ordered=\$$2
7246
7247    for rb in $rb_in; do
7248        is_in $rb $rb_ordered || die "$rb at \$$1 is not at \$$2"
7249    done
7250
7251    rb_out=
7252    for rb in $rb_ordered; do
7253        is_in $rb $rb_in && rb_out="$rb_out$rb "
7254    done
7255    eval $1=\$rb_out
7256}
7257
7258# deps-expand fflib $1:  N x {append all expanded deps; unique}
7259# within a set of N items, N expansions are enough to expose a cycle.
7260expand_deps(){
7261    unique ${1}_deps  # required for the early break test.
7262    for dummy in $LIBRARY_LIST; do  # N iteratios
7263        eval deps=\$${1}_deps
7264        append ${1}_deps $(map 'eval echo \$${v}_deps' $deps)
7265        unique ${1}_deps
7266        eval '[ ${#deps} = ${#'${1}_deps'} ]' && break  # doesn't expand anymore
7267    done
7268
7269    eval is_in $1 \$${1}_deps && die "Dependency cycle at ${1}_deps"
7270    reorder_by ${1}_deps LIBRARY_LIST  # linking order is expected later
7271}
7272
7273#we have to remove gpl from the deps here as some code assumes all lib deps are libs
7274postproc_deps="$(filter_out 'gpl' $postproc_deps)"
7275
7276map 'expand_deps $v' $LIBRARY_LIST
7277
7278if test "$quiet" != "yes"; then
7279
7280echo "install prefix            $prefix"
7281echo "source path               $source_path"
7282echo "C compiler                $cc"
7283echo "C library                 $libc_type"
7284if test "$host_cc" != "$cc"; then
7285    echo "host C compiler           $host_cc"
7286    echo "host C library            $host_libc_type"
7287fi
7288echo "ARCH                      $arch ($cpu)"
7289if test "$build_suffix" != ""; then
7290    echo "build suffix              $build_suffix"
7291fi
7292if test "$progs_suffix" != ""; then
7293    echo "progs suffix              $progs_suffix"
7294fi
7295if test "$extra_version" != ""; then
7296    echo "version string suffix     $extra_version"
7297fi
7298echo "big-endian                ${bigendian-no}"
7299echo "runtime cpu detection     ${runtime_cpudetect-no}"
7300if enabled x86; then
7301    echo "standalone assembly       ${x86asm-no}"
7302    echo "x86 assembler             ${x86asmexe}"
7303    echo "MMX enabled               ${mmx-no}"
7304    echo "MMXEXT enabled            ${mmxext-no}"
7305    echo "3DNow! enabled            ${amd3dnow-no}"
7306    echo "3DNow! extended enabled   ${amd3dnowext-no}"
7307    echo "SSE enabled               ${sse-no}"
7308    echo "SSSE3 enabled             ${ssse3-no}"
7309    echo "AESNI enabled             ${aesni-no}"
7310    echo "AVX enabled               ${avx-no}"
7311    echo "AVX2 enabled              ${avx2-no}"
7312    echo "AVX-512 enabled           ${avx512-no}"
7313    echo "XOP enabled               ${xop-no}"
7314    echo "FMA3 enabled              ${fma3-no}"
7315    echo "FMA4 enabled              ${fma4-no}"
7316    echo "i686 features enabled     ${i686-no}"
7317    echo "CMOV is fast              ${fast_cmov-no}"
7318    echo "EBX available             ${ebx_available-no}"
7319    echo "EBP available             ${ebp_available-no}"
7320fi
7321if enabled aarch64; then
7322    echo "NEON enabled              ${neon-no}"
7323    echo "VFP enabled               ${vfp-no}"
7324fi
7325if enabled arm; then
7326    echo "ARMv5TE enabled           ${armv5te-no}"
7327    echo "ARMv6 enabled             ${armv6-no}"
7328    echo "ARMv6T2 enabled           ${armv6t2-no}"
7329    echo "VFP enabled               ${vfp-no}"
7330    echo "NEON enabled              ${neon-no}"
7331    echo "THUMB enabled             ${thumb-no}"
7332fi
7333if enabled mips; then
7334    echo "MIPS FPU enabled          ${mipsfpu-no}"
7335    echo "MIPS DSP R1 enabled       ${mipsdsp-no}"
7336    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
7337    echo "MIPS MSA enabled          ${msa-no}"
7338    echo "MIPS MSA2 enabled         ${msa2-no}"
7339    echo "LOONGSON MMI enabled      ${mmi-no}"
7340fi
7341if enabled ppc; then
7342    echo "AltiVec enabled           ${altivec-no}"
7343    echo "VSX enabled               ${vsx-no}"
7344    echo "POWER8 enabled            ${power8-no}"
7345    echo "PPC 4xx optimizations     ${ppc4xx-no}"
7346    echo "dcbzl available           ${dcbzl-no}"
7347fi
7348echo "debug symbols             ${debug-no}"
7349echo "strip symbols             ${stripping-no}"
7350echo "optimize for size         ${small-no}"
7351echo "optimizations             ${optimizations-no}"
7352echo "static                    ${static-no}"
7353echo "shared                    ${shared-no}"
7354echo "postprocessing support    ${postproc-no}"
7355echo "network support           ${network-no}"
7356echo "threading support         ${thread_type-no}"
7357echo "safe bitstream reader     ${safe_bitstream_reader-no}"
7358echo "texi2html enabled         ${texi2html-no}"
7359echo "perl enabled              ${perl-no}"
7360echo "pod2man enabled           ${pod2man-no}"
7361echo "makeinfo enabled          ${makeinfo-no}"
7362echo "makeinfo supports HTML    ${makeinfo_html-no}"
7363test -n "$random_seed" &&
7364    echo "random seed               ${random_seed}"
7365echo
7366
7367echo "External libraries:"
7368print_enabled '' $EXTERNAL_LIBRARY_LIST $EXTERNAL_AUTODETECT_LIBRARY_LIST | print_in_columns
7369echo
7370
7371echo "External libraries providing hardware acceleration:"
7372print_enabled '' $HWACCEL_LIBRARY_LIST $HWACCEL_AUTODETECT_LIBRARY_LIST | print_in_columns
7373echo
7374
7375echo "Libraries:"
7376print_enabled '' $LIBRARY_LIST | print_in_columns
7377echo
7378
7379echo "Programs:"
7380print_enabled '' $PROGRAM_LIST | print_in_columns
7381echo
7382
7383for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
7384    echo "Enabled ${type}s:"
7385    eval list=\$$(toupper $type)_LIST
7386    print_enabled '_*' $list | print_in_columns
7387    echo
7388done
7389
7390if test -n "$ignore_tests"; then
7391    ignore_tests=$(echo $ignore_tests | tr ',' ' ')
7392    echo "Ignored FATE tests:"
7393    echo $ignore_tests | print_in_columns
7394    echo
7395fi
7396
7397echo "License: $license"
7398
7399fi # test "$quiet" != "yes"
7400
7401if test -n "$WARN_IF_GETS_DISABLED_LIST"; then
7402    for cfg in $WARN_IF_GETS_DISABLED_LIST; do
7403        if disabled $cfg; then
7404            varname=${cfg}_disable_reason
7405            eval "warn \"Disabled $cfg because \$$varname\""
7406        fi
7407    done
7408fi
7409
7410if test -n "$WARNINGS"; then
7411    printf "\n%s%s$WARNINGS%s" "$warn_color" "$bold_color" "$reset_color"
7412    enabled fatal_warnings && exit 1
7413fi
7414
7415test -e Makefile || echo "include $source_path/Makefile" > Makefile
7416
7417esc(){
7418    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
7419}
7420
7421echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" > ffbuild/config.fate
7422
7423enabled stripping || strip="echo skipping strip"
7424enabled stripping || striptype=""
7425
7426config_files="$TMPH ffbuild/config.mak doc/config.texi"
7427
7428cat > ffbuild/config.mak <<EOF
7429# Automatically generated by configure - do not modify!
7430ifndef FFMPEG_CONFIG_MAK
7431FFMPEG_CONFIG_MAK=1
7432FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
7433prefix=$prefix
7434LIBDIR=\$(DESTDIR)$libdir
7435SHLIBDIR=\$(DESTDIR)$shlibdir
7436INCDIR=\$(DESTDIR)$incdir
7437BINDIR=\$(DESTDIR)$bindir
7438DATADIR=\$(DESTDIR)$datadir
7439DOCDIR=\$(DESTDIR)$docdir
7440MANDIR=\$(DESTDIR)$mandir
7441PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir
7442INSTALL_NAME_DIR=$install_name_dir
7443SRC_PATH=$source_path
7444SRC_LINK=$source_link
7445ifndef MAIN_MAKEFILE
7446SRC_PATH:=\$(SRC_PATH:.%=..%)
7447endif
7448CC_IDENT=$cc_ident
7449ARCH=$arch
7450INTRINSICS=$intrinsics
7451EXTERN_PREFIX=$extern_prefix
7452CC=$cc
7453CXX=$cxx
7454AS=$as
7455OBJCC=$objcc
7456LD=$ld
7457DEPCC=$dep_cc
7458DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
7459DEPAS=$as
7460DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
7461X86ASM=$x86asmexe
7462DEPX86ASM=$x86asmexe
7463DEPX86ASMFLAGS=\$(X86ASMFLAGS)
7464AR=$ar
7465ARFLAGS=$arflags
7466AR_O=$ar_o
7467AR_CMD=$ar
7468NM_CMD=$nm
7469RANLIB=$ranlib
7470STRIP=$strip
7471STRIPTYPE=$striptype
7472NVCC=$nvcc
7473CP=cp -p
7474LN_S=$ln_s
7475CPPFLAGS=$CPPFLAGS
7476CFLAGS=$CFLAGS
7477CXXFLAGS=$CXXFLAGS
7478OBJCFLAGS=$OBJCFLAGS
7479ASFLAGS=$ASFLAGS
7480NVCCFLAGS=$nvccflags
7481AS_C=$AS_C
7482AS_O=$AS_O
7483OBJCC_C=$OBJCC_C
7484OBJCC_E=$OBJCC_E
7485OBJCC_O=$OBJCC_O
7486CC_C=$CC_C
7487CC_E=$CC_E
7488CC_O=$CC_O
7489CXX_C=$CXX_C
7490CXX_O=$CXX_O
7491NVCC_C=$NVCC_C
7492NVCC_O=$NVCC_O
7493LD_O=$LD_O
7494X86ASM_O=$X86ASM_O
7495LD_LIB=$LD_LIB
7496LD_PATH=$LD_PATH
7497DLLTOOL=$dlltool
7498WINDRES=$windres
7499DOXYGEN=$doxygen
7500LDFLAGS=$LDFLAGS
7501LDEXEFLAGS=$LDEXEFLAGS
7502LDSOFLAGS=$LDSOFLAGS
7503SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
7504ASMSTRIPFLAGS=$ASMSTRIPFLAGS
7505X86ASMFLAGS=$X86ASMFLAGS
7506MSAFLAGS=$MSAFLAGS
7507MMIFLAGS=$MMIFLAGS
7508BUILDSUF=$build_suffix
7509PROGSSUF=$progs_suffix
7510FULLNAME=$FULLNAME
7511LIBPREF=$LIBPREF
7512LIBSUF=$LIBSUF
7513LIBNAME=$LIBNAME
7514SLIBPREF=$SLIBPREF
7515SLIBSUF=$SLIBSUF
7516EXESUF=$EXESUF
7517EXTRA_VERSION=$extra_version
7518CCDEP=$CCDEP
7519CXXDEP=$CXXDEP
7520CCDEP_FLAGS=$CCDEP_FLAGS
7521ASDEP=$ASDEP
7522ASDEP_FLAGS=$ASDEP_FLAGS
7523X86ASMDEP=$X86ASMDEP
7524X86ASMDEP_FLAGS=$X86ASMDEP_FLAGS
7525CC_DEPFLAGS=$CC_DEPFLAGS
7526AS_DEPFLAGS=$AS_DEPFLAGS
7527X86ASM_DEPFLAGS=$X86ASM_DEPFLAGS
7528HOSTCC=$host_cc
7529HOSTLD=$host_ld
7530HOSTCFLAGS=$host_cflags
7531HOSTCPPFLAGS=$host_cppflags
7532HOSTEXESUF=$HOSTEXESUF
7533HOSTLDFLAGS=$host_ldflags
7534HOSTEXTRALIBS=$host_extralibs
7535DEPHOSTCC=$host_cc
7536DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
7537HOSTCCDEP=$HOSTCCDEP
7538HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
7539HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
7540HOSTCC_C=$HOSTCC_C
7541HOSTCC_O=$HOSTCC_O
7542HOSTLD_O=$HOSTLD_O
7543TARGET_EXEC=$target_exec $target_exec_args
7544TARGET_PATH=$target_path
7545TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
7546CFLAGS-ffplay=${sdl2_cflags}
7547CFLAGS_HEADERS=$CFLAGS_HEADERS
7548LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
7549EXTRALIBS=$extralibs
7550COMPAT_OBJS=$compat_objs
7551INSTALL=$install
7552LIBTARGET=${LIBTARGET}
7553SLIBNAME=${SLIBNAME}
7554SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
7555SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
7556SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
7557SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
7558SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
7559SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
7560SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
7561SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
7562VERSION_SCRIPT_POSTPROCESS_CMD=${VERSION_SCRIPT_POSTPROCESS_CMD}
7563SAMPLES:=${samples:-\$(FATE_SAMPLES)}
7564NOREDZONE_FLAGS=$noredzone_flags
7565LIBFUZZER_PATH=$libfuzzer_path
7566IGNORE_TESTS=$ignore_tests
7567EOF
7568
7569map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> ffbuild/config.mak' $LIBRARY_LIST
7570
7571for entry in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
7572    eval echo "EXTRALIBS-${entry}=\$${entry}_extralibs" >> ffbuild/config.mak
7573done
7574
7575cat > $TMPH <<EOF
7576/* Automatically generated by configure - do not modify! */
7577#ifndef FFMPEG_CONFIG_H
7578#define FFMPEG_CONFIG_H
7579#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
7580#define FFMPEG_LICENSE "$(c_escape $license)"
7581#define CONFIG_THIS_YEAR 2021
7582#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
7583#define AVCONV_DATADIR "$(eval c_escape $datadir)"
7584#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
7585#define OS_NAME $target_os
7586#define av_restrict $restrict_keyword
7587#define EXTERN_PREFIX "${extern_prefix}"
7588#define EXTERN_ASM ${extern_prefix}
7589#define BUILDSUF "$build_suffix"
7590#define SLIBSUF "$SLIBSUF"
7591#define HAVE_MMX2 HAVE_MMXEXT
7592#define SWS_MAX_FILTER_SIZE $sws_max_filter_size
7593EOF
7594
7595test -n "$assert_level" &&
7596    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
7597
7598test -n "$malloc_prefix" &&
7599    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
7600
7601if enabled x86asm; then
7602    append config_files $TMPASM
7603    cat > $TMPASM <<EOF
7604; Automatically generated by configure - do not modify!
7605EOF
7606fi
7607
7608enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
7609
7610
7611mkdir -p doc
7612mkdir -p tests
7613mkdir -p tests/api
7614echo "@c auto-generated by configure - do not modify! " > doc/config.texi
7615
7616print_config ARCH_   "$config_files" $ARCH_LIST
7617print_config HAVE_   "$config_files" $HAVE_LIST
7618print_config CONFIG_ "$config_files" $CONFIG_LIST       \
7619                                     $CONFIG_EXTRA      \
7620                                     $ALL_COMPONENTS    \
7621
7622echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
7623echo "endif # FFMPEG_CONFIG_MAK" >> ffbuild/config.mak
7624
7625# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
7626cp_if_changed $TMPH config.h
7627touch ffbuild/.config
7628
7629enabled x86asm && cp_if_changed $TMPASM config.asm
7630
7631cat > $TMPH <<EOF
7632/* Generated by ffmpeg configure */
7633#ifndef AVUTIL_AVCONFIG_H
7634#define AVUTIL_AVCONFIG_H
7635EOF
7636
7637print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
7638
7639echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
7640
7641cp_if_changed $TMPH libavutil/avconfig.h
7642
7643# full_filter_name_foo=vf_foo
7644# full_filter_name_bar=asrc_bar
7645# ...
7646eval "$(sed -n "s/^extern AVFilter ff_\([avfsinkrc]\{2,5\}\)_\(.*\);/full_filter_name_\2=\1_\2/p" $source_path/libavfilter/allfilters.c)"
7647
7648# generate the lists of enabled components
7649print_enabled_components(){
7650    file=$1
7651    struct_name=$2
7652    name=$3
7653    shift 3
7654    echo "static const $struct_name * const $name[] = {" > $TMPH
7655    for c in $*; do
7656        if enabled $c; then
7657            case $name in
7658                filter_list)
7659                    eval c=\$full_filter_name_${c%_filter}
7660                ;;
7661                indev_list)
7662                    c=${c%_indev}_demuxer
7663                ;;
7664                outdev_list)
7665                    c=${c%_outdev}_muxer
7666                ;;
7667            esac
7668            printf "    &ff_%s,\n" $c >> $TMPH
7669        fi
7670    done
7671    if [ "$name" = "filter_list" ]; then
7672        for c in asrc_abuffer vsrc_buffer asink_abuffer vsink_buffer; do
7673            printf "    &ff_%s,\n" $c >> $TMPH
7674        done
7675    fi
7676    echo "    NULL };" >> $TMPH
7677    cp_if_changed $TMPH $file
7678}
7679
7680print_enabled_components libavfilter/filter_list.c AVFilter filter_list $FILTER_LIST
7681print_enabled_components libavcodec/codec_list.c AVCodec codec_list $CODEC_LIST
7682print_enabled_components libavcodec/parser_list.c AVCodecParser parser_list $PARSER_LIST
7683print_enabled_components libavcodec/bsf_list.c AVBitStreamFilter bitstream_filters $BSF_LIST
7684print_enabled_components libavformat/demuxer_list.c AVInputFormat demuxer_list $DEMUXER_LIST
7685print_enabled_components libavformat/muxer_list.c AVOutputFormat muxer_list $MUXER_LIST
7686print_enabled_components libavdevice/indev_list.c AVInputFormat indev_list $INDEV_LIST
7687print_enabled_components libavdevice/outdev_list.c AVOutputFormat outdev_list $OUTDEV_LIST
7688print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $PROTOCOL_LIST
7689
7690# Settings for pkg-config files
7691
7692cat > $TMPH <<EOF
7693# Automatically generated by configure - do not modify!
7694shared=$shared
7695build_suffix=$build_suffix
7696prefix=$prefix
7697libdir=$libdir
7698incdir=$incdir
7699rpath=$(enabled rpath && echo "-Wl,-rpath,\${libdir}")
7700source_path=${source_path}
7701LIBPREF=${LIBPREF}
7702LIBSUF=${LIBSUF}
7703extralibs_avutil="$avutil_extralibs"
7704extralibs_avcodec="$avcodec_extralibs"
7705extralibs_avformat="$avformat_extralibs"
7706extralibs_avdevice="$avdevice_extralibs"
7707extralibs_avfilter="$avfilter_extralibs"
7708extralibs_avresample="$avresample_extralibs"
7709extralibs_postproc="$postproc_extralibs"
7710extralibs_swscale="$swscale_extralibs"
7711extralibs_swresample="$swresample_extralibs"
7712EOF
7713
7714for lib in $LIBRARY_LIST; do
7715    lib_deps="$(eval echo \$${lib}_deps)"
7716    echo ${lib}_deps=\"$lib_deps\" >> $TMPH
7717done
7718
7719cp_if_changed $TMPH ffbuild/config.sh
7720