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