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