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