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