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