#!/bin/sh # # FFmpeg configure script # # Copyright (c) 2000-2002 Fabrice Bellard # Copyright (c) 2005-2008 Diego Biurrun # Copyright (c) 2005-2008 Mans Rullgard # # Prevent locale nonsense from breaking basic text processing. LC_ALL=C export LC_ALL # make sure we are running under a compatible shell # try to make this part work with most shells try_exec(){ echo "Trying shell $1" type "$1" > /dev/null 2>&1 && exec "$@" } unset foo (: ${foo%%bar}) 2> /dev/null E1="$?" (: ${foo?}) 2> /dev/null E2="$?" if test "$E1" != 0 || test "$E2" = 0; then echo "Broken shell detected. Trying alternatives." export FF_CONF_EXEC if test "0$FF_CONF_EXEC" -lt 1; then FF_CONF_EXEC=1 try_exec bash "$0" "$@" fi if test "0$FF_CONF_EXEC" -lt 2; then FF_CONF_EXEC=2 try_exec ksh "$0" "$@" fi if test "0$FF_CONF_EXEC" -lt 3; then FF_CONF_EXEC=3 try_exec /usr/xpg4/bin/sh "$0" "$@" fi echo "No compatible shell script interpreter found." echo "This configure script requires a POSIX-compatible shell" echo "such as bash or ksh." echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH." echo "Instead, install a working POSIX-compatible shell." echo "Disabling this configure test will create a broken FFmpeg." if test "$BASH_VERSION" = '2.04.0(1)-release'; then echo "This bash version ($BASH_VERSION) is broken on your platform." echo "Upgrade to a later version if available." fi exit 1 fi show_help(){ cat <> $logfile } log_file(){ log BEGIN $1 pr -n -t $1 >> $logfile log END $1 } echolog(){ log "$@" echo "$@" } warn(){ log "WARNING: $*" WARNINGS="${WARNINGS}WARNING: $*\n" } die(){ echolog "$@" cat <>$f done done } print_enabled(){ test "$1" = -n && end=" " && shift || end="\n" suf=$1 shift for v; do enabled $v && printf "%s$end" ${v%$suf}; done } append(){ var=$1 shift eval "$var=\"\$$var $*\"" } prepend(){ var=$1 shift eval "$var=\"$* \$$var\"" } add_cppflags(){ append CPPFLAGS $($filter_cppflags "$@") } add_cflags(){ append CFLAGS $($filter_cflags "$@") } add_cxxflags(){ append CXXFLAGS $($filter_cflags "$@") } add_asflags(){ append ASFLAGS $($filter_asflags "$@") } add_ldflags(){ append LDFLAGS "$@" } add_extralibs(){ prepend extralibs "$@" } check_cmd(){ log "$@" "$@" >> $logfile 2>&1 } check_cc(){ log check_cc "$@" cat > $TMPC log_file $TMPC check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC } check_cxx(){ log check_cxx "$@" cat > $TMPCPP log_file $TMPCPP check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" -c -o $TMPO $TMPCPP } check_cpp(){ log check_cpp "$@" cat > $TMPC log_file $TMPC check_cmd $cc $CPPFLAGS $CFLAGS "$@" -E -o $TMPO $TMPC } check_as(){ log check_as "$@" cat > $TMPC log_file $TMPC check_cmd $as $CPPFLAGS $ASFLAGS "$@" -c -o $TMPO $TMPC } check_asm(){ log check_asm "$@" name="$1" code="$2" shift 2 disable $name check_as "$@" < $TMPS log_file $TMPS shift 1 check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS } check_ld(){ log check_ld "$@" type=$1 shift 1 flags='' libs='' for f; do test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f" done check_$type $($filter_cflags $flags) || return check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs } check_cppflags(){ log check_cppflags "$@" set -- $($filter_cppflags "$@") check_cc "$@" < int x; EOF } check_func(){ log check_func "$@" func=$1 shift disable $func check_ld "cc" "$@" < float foo(float f) { return $func(f); } int main(void){ return (int) foo; } EOF } check_func_headers(){ log check_func_headers "$@" headers=$1 funcs=$2 shift 2 { for hdr in $headers; do echo "#include <$hdr>" done for func in $funcs; do echo "long check_$func(void) { return (long) $func; }" done echo "int main(void) { return 0; }" } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers } check_class_headers_cpp(){ log check_class_headers_cpp "$@" headers=$1 classes=$2 shift 2 { for hdr in $headers; do echo "#include <$hdr>" done echo "int main(void) { " i=1 for class in $classes; do echo "$class obj$i;" i=$(expr $i + 1) done echo "return 0; }" } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers } check_cpp_condition(){ log check_cpp_condition "$@" header=$1 condition=$2 shift 2 check_cpp $($filter_cppflags "$@") < #if !($condition) #error "unsatisfied condition: $condition" #endif EOF } check_lib(){ log check_lib "$@" header="$1" func="$2" shift 2 check_header $header && check_func $func "$@" && add_extralibs "$@" } check_lib2(){ log check_lib2 "$@" headers="$1" funcs="$2" shift 2 check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@" } check_lib_cpp(){ log check_lib_cpp "$@" headers="$1" classes="$2" shift 2 check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@" } check_pkg_config(){ log check_pkg_config "$@" pkg="$1" headers="$2" funcs="$3" shift 3 $pkg_config --exists $pkg 2>/dev/null || return pkg_cflags=$($pkg_config --cflags $pkg) pkg_libs=$($pkg_config --libs $pkg) check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" && set_safe ${pkg}_cflags $pkg_cflags && set_safe ${pkg}_libs $pkg_libs } check_exec(){ check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; } } check_exec_crash(){ code=$(cat) # exit() is not async signal safe. _Exit (C99) and _exit (POSIX) # are safe but may not be available everywhere. Thus we use # raise(SIGTERM) instead. The check is run in a subshell so we # can redirect the "Terminated" message from the shell. SIGBUS # is not defined by standard C so it is used conditionally. (check_exec "$@") >> $logfile 2>&1 < static void sighandler(int sig){ raise(SIGTERM); } int func(void){ $code } int (*func_ptr)(void) = func; int main(void){ signal(SIGILL, sighandler); signal(SIGFPE, sighandler); signal(SIGSEGV, sighandler); #ifdef SIGBUS signal(SIGBUS, sighandler); #endif return func_ptr(); } EOF } check_type(){ log check_type "$@" headers=$1 type=$2 shift 2 disable_safe "$type" incs="" for hdr in $headers; do incs="$incs #include <$hdr>" done check_cc "$@" <$member; EOF } require(){ name="$1" header="$2" func="$3" shift 3 check_lib $header $func "$@" || die "ERROR: $name not found" } require2(){ name="$1" headers="$2" func="$3" shift 3 check_lib2 "$headers" $func "$@" || die "ERROR: $name not found" } require_cpp(){ name="$1" headers="$2" classes="$3" shift 3 check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found" } require_pkg_config(){ pkg="$1" check_pkg_config "$@" || die "ERROR: $pkg not found" add_cflags $(get_safe ${pkg}_cflags) add_extralibs $(get_safe ${pkg}_libs) } check_host_cc(){ log check_host_cc "$@" cat > $TMPC log_file $TMPC check_cmd $host_cc $host_cflags "$@" -c -o $TMPO $TMPC } check_host_cflags(){ log check_host_cflags "$@" check_host_cc "$@" < "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp" } cp_if_changed(){ cmp -s "$1" "$2" && echo "$2 is unchanged" && return mkdir -p "$(dirname $2)" cp -f "$1" "$2" } # CONFIG_LIST contains configurable options, while HAVE_LIST is for # system-dependent things. COMPONENT_LIST=" bsfs decoders demuxers encoders filters hwaccels indevs muxers outdevs parsers protocols " PROGRAM_LIST=" ffplay ffprobe ffserver ffmpeg " CONFIG_LIST=" $COMPONENT_LIST $PROGRAM_LIST ac3dsp avcodec avdevice avfilter avformat avresample avisynth bzlib crystalhd dct doc dwt dxva2 fast_unaligned fastdiv fft fontconfig frei0r gnutls gpl gray hardcoded_tables libaacplus libass libbluray libcdio libcelt libdc1394 libfaac libfreetype libgsm libiec61883 libilbc libmodplug libmp3lame libnut libopencore_amrnb libopencore_amrwb libopencv libopenjpeg libpulse librtmp libschroedinger libspeex libstagefright_h264 libtheora libutvideo libv4l2 libvo_aacenc libvo_amrwbenc libvorbis libvpx libx264 libxavs libxvid lsp mdct memalign_hack memory_poisoning mpegaudiodsp network nonfree openal openssl pic postproc rdft rtpdec runtime_cpudetect safe_bitstream_reader shared sinewin small sram static swresample swscale swscale_alpha thumb vaapi vda vdpau version3 xmm_clobber_test x11grab zlib " THREADS_LIST=' pthreads w32threads os2threads ' ARCH_LIST=' alpha arm avr32 avr32_ap avr32_uc bfin ia64 m68k mips mips64 parisc ppc ppc64 s390 sh4 sparc sparc64 tomi x86 x86_32 x86_64 ' ARCH_EXT_LIST=' altivec amd3dnow amd3dnowext armv5te armv6 armv6t2 armvfp avx mmi mmx mmx2 neon ppc4xx sse ssse3 vfpv3 vis mipsfpu mips32r2 mipsdspr1 mipsdspr2 ' HAVE_LIST_PUB=' bigendian fast_unaligned ' HAVE_LIST=" $ARCH_EXT_LIST $HAVE_LIST_PUB $THREADS_LIST aligned_malloc aligned_stack alsa_asoundlib_h altivec_h arpa_inet_h asm_mod_y asm_types_h attribute_may_alias attribute_packed cbrtf clock_gettime closesocket cmov dcbzl dev_bktr_ioctl_bt848_h dev_bktr_ioctl_meteor_h dev_ic_bt8xx_h dev_video_bktr_ioctl_bt848_h dev_video_meteor_ioctl_meteor_h dlfcn_h dlopen dos_paths dxva_h ebp_available ebx_available exp2 exp2f fast_64bit fast_clz fast_cmov fcntl fork getaddrinfo gethrtime GetProcessAffinityMask GetProcessMemoryInfo GetProcessTimes GetSystemTimeAsFileTime getrusage gettimeofday glob gnu_as ibm_asm inet_aton inline_asm isatty isinf isnan jack_port_get_latency_range kbhit ldbrx libdc1394_1 libdc1394_2 llrint llrintf local_aligned_16 local_aligned_8 localtime_r log2 log2f loongson lrint lrintf lzo1x_999_compress machine_ioctl_bt848_h machine_ioctl_meteor_h makeinfo malloc_h MapViewOfFile memalign mkstemp mmap nanosleep netinet_sctp_h PeekNamedPipe poll_h posix_memalign pthread_cancel round roundf sched_getaffinity sdl sdl_video_size setmode setrlimit Sleep sndio_h socklen_t soundcard_h strerror_r strptime struct_addrinfo struct_group_source_req struct_ip_mreq_source struct_ipv6_mreq struct_pollfd struct_rusage_ru_maxrss struct_sockaddr_in6 struct_sockaddr_sa_len struct_sockaddr_storage struct_v4l2_frmivalenum_discrete symver symver_asm_label symver_gnu_asm sysconf sysctl sys_mman_h sys_param_h sys_resource_h sys_select_h sys_soundcard_h sys_time_h sys_videoio_h termios_h threads trunc truncf unistd_h usleep vfp_args VirtualAlloc windows_h winsock2_h xform_asm xmm_clobbers yasm " # options emitted with CONFIG_ prefix but not available on command line CONFIG_EXTRA=" aandct avutil golomb gplv3 h264chroma h264dsp h264pred h264qpel huffman lgplv3 lpc " CMDLINE_SELECT=" $ARCH_EXT_LIST $CONFIG_LIST $THREADS_LIST asm coverage cross_compile debug extra_warnings logging optimizations stripping symver yasm " PATHS_LIST=' bindir datadir incdir libdir mandir prefix shlibdir ' CMDLINE_SET=" $PATHS_LIST ar arch as assert_level build_suffix cc cpu cross_prefix cxx dep_cc extra_version host_cc host_cflags host_ldflags host_libs host_os install ld logfile malloc_prefix nm optflags pkg_config postproc_version progs_suffix random_seed samples strip sysinclude sysroot target_exec target_os target_path valgrind yasmexe " CMDLINE_APPEND=" extra_cflags extra_cxxflags " # code dependency declarations # architecture extensions armv5te_deps="arm" armv6_deps="arm" armv6t2_deps="arm" armvfp_deps="arm" neon_deps="arm" vfpv3_deps="armvfp" mipsfpu_deps="mips" mips32r2_deps="mips" mipsdspr1_deps="mips" mipsdspr2_deps="mips" mmi_deps="mips" altivec_deps="ppc" ppc4xx_deps="ppc" vis_deps="sparc" x86_64_suggest="cmov fast_cmov" amd3dnow_deps="mmx" amd3dnowext_deps="amd3dnow" mmx_deps="x86" mmx2_deps="mmx" sse_deps="mmx" ssse3_deps="sse" avx_deps="ssse3" aligned_stack_if_any="ppc x86" fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64" fast_clz_if_any="alpha armv5te avr32 mips ppc x86" fast_unaligned_if_any="armv6 ppc x86" inline_asm_deps="!tms470" need_memalign="altivec neon sse" symver_if_any="symver_asm_label symver_gnu_asm" # subsystems dct_select="rdft" mdct_select="fft" rdft_select="fft" mpegaudiodsp_select="dct" # decoders / encoders / hardware accelerators aac_decoder_select="mdct sinewin" aac_encoder_select="mdct sinewin" aac_latm_decoder_select="aac_decoder aac_latm_parser" ac3_decoder_select="mdct ac3dsp ac3_parser" ac3_encoder_select="mdct ac3dsp" ac3_fixed_encoder_select="mdct ac3dsp" alac_encoder_select="lpc" amrnb_decoder_select="lsp" amrwb_decoder_select="lsp" amv_encoder_select="aandct" atrac1_decoder_select="mdct sinewin" atrac3_decoder_select="mdct" binkaudio_dct_decoder_select="mdct rdft dct sinewin" binkaudio_rdft_decoder_select="mdct rdft sinewin" cavs_decoder_select="golomb" cook_decoder_select="mdct sinewin" cscd_decoder_suggest="zlib" dca_decoder_select="mdct" dirac_decoder_select="dwt golomb" dnxhd_encoder_select="aandct" dxa_decoder_select="zlib" eac3_decoder_select="ac3_decoder" eac3_encoder_select="mdct ac3dsp" eamad_decoder_select="aandct" eatgq_decoder_select="aandct" eatqi_decoder_select="aandct" ffv1_decoder_select="golomb" flac_decoder_select="golomb" flac_encoder_select="golomb lpc" flashsv_decoder_select="zlib" flashsv_encoder_select="zlib" flashsv2_encoder_select="zlib" flashsv2_decoder_select="zlib" flv_decoder_select="h263_decoder" flv_encoder_select="h263_encoder" fraps_decoder_select="huffman" h261_encoder_select="aandct" h263_decoder_select="h263_parser" h263_encoder_select="aandct" h263_vaapi_hwaccel_select="vaapi h263_decoder" h263i_decoder_select="h263_decoder" h263p_encoder_select="h263_encoder" h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser" h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel" h264_dxva2_hwaccel_deps="dxva2api_h" h264_dxva2_hwaccel_select="dxva2 h264_decoder" h264_vaapi_hwaccel_select="vaapi h264_decoder" h264_vda_hwaccel_deps="VideoDecodeAcceleration_VDADecoder_h pthreads" h264_vda_hwaccel_select="vda h264_decoder" h264_vdpau_decoder_select="vdpau h264_decoder" iac_decoder_select="fft mdct sinewin" imc_decoder_select="fft mdct sinewin" jpegls_decoder_select="golomb" jpegls_encoder_select="golomb" ljpeg_encoder_select="aandct" loco_decoder_select="golomb" mjpeg_encoder_select="aandct" mlp_decoder_select="mlp_parser" mp1_decoder_select="mpegaudiodsp" mp1float_decoder_select="mpegaudiodsp" mp2_decoder_select="mpegaudiodsp" mp2float_decoder_select="mpegaudiodsp" mp3_decoder_select="mpegaudiodsp" mp3adu_decoder_select="mpegaudiodsp" mp3adufloat_decoder_select="mpegaudiodsp" mp3float_decoder_select="mpegaudiodsp" mp3on4_decoder_select="mpegaudiodsp" mp3on4float_decoder_select="mpegaudiodsp" mpc7_decoder_select="mpegaudiodsp" mpc8_decoder_select="mpegaudiodsp" mpeg_vdpau_decoder_select="vdpau mpegvideo_decoder" mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h" mpeg_xvmc_decoder_select="mpegvideo_decoder" mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder" mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder" mpeg1video_encoder_select="aandct" mpeg2_crystalhd_decoder_select="crystalhd" mpeg2_dxva2_hwaccel_deps="dxva2api_h" mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder" mpeg2_vdpau_hwaccel_select="vdpau mpeg2video_decoder" mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder" mpeg2video_encoder_select="aandct" mpeg4_crystalhd_decoder_select="crystalhd" mpeg4_decoder_select="h263_decoder mpeg4video_parser" mpeg4_encoder_select="h263_encoder" mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder" mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder" msmpeg4_crystalhd_decoder_select="crystalhd" msmpeg4v1_decoder_select="h263_decoder" msmpeg4v1_encoder_select="h263_encoder" msmpeg4v2_decoder_select="h263_decoder" msmpeg4v2_encoder_select="h263_encoder" msmpeg4v3_decoder_select="h263_decoder" msmpeg4v3_encoder_select="h263_encoder" nellymoser_decoder_select="mdct sinewin" nellymoser_encoder_select="mdct sinewin" png_decoder_select="zlib" png_encoder_select="zlib" qcelp_decoder_select="lsp" qdm2_decoder_select="mdct rdft mpegaudiodsp" ra_144_encoder_select="lpc" ralf_decoder_select="golomb" rv10_decoder_select="h263_decoder" rv10_encoder_select="h263_encoder" rv20_decoder_select="h263_decoder" rv20_encoder_select="h263_encoder" rv30_decoder_select="golomb h264chroma h264pred h264qpel" rv40_decoder_select="golomb h264chroma h264pred h264qpel" shorten_decoder_select="golomb" sipr_decoder_select="lsp" snow_decoder_select="dwt" snow_encoder_select="aandct dwt" sonic_decoder_select="golomb" sonic_encoder_select="golomb" sonic_ls_encoder_select="golomb" svq1_encoder_select="aandct" svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel" svq3_decoder_suggest="zlib" theora_decoder_select="vp3_decoder" tiff_decoder_suggest="zlib" tiff_encoder_suggest="zlib" tscc_decoder_select="zlib" twinvq_decoder_select="mdct lsp sinewin" vc1_crystalhd_decoder_select="crystalhd" vc1_decoder_select="h263_decoder h264chroma h264qpel" vc1_dxva2_hwaccel_deps="dxva2api_h" vc1_dxva2_hwaccel_select="dxva2 vc1_decoder" vc1_vaapi_hwaccel_select="vaapi vc1_decoder" vc1_vdpau_decoder_select="vdpau vc1_decoder" vc1image_decoder_select="vc1_decoder" vorbis_decoder_select="mdct" vorbis_encoder_select="mdct" vp6_decoder_select="huffman" vp6a_decoder_select="vp6_decoder" vp6f_decoder_select="vp6_decoder" vp8_decoder_select="h264pred h264qpel" wmapro_decoder_select="mdct sinewin" wmav1_decoder_select="mdct sinewin" wmav1_encoder_select="mdct sinewin" wmav2_decoder_select="mdct sinewin" wmav2_encoder_select="mdct sinewin" wmavoice_decoder_select="lsp rdft dct mdct sinewin" wmv1_decoder_select="h263_decoder" wmv1_encoder_select="h263_encoder" wmv2_decoder_select="h263_decoder" wmv2_encoder_select="h263_encoder" wmv3_decoder_select="vc1_decoder" wmv3_crystalhd_decoder_select="crystalhd" wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel" wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel" wmv3_vdpau_decoder_select="vc1_vdpau_decoder" wmv3image_decoder_select="wmv3_decoder" zerocodec_decoder_select="zlib" zlib_decoder_select="zlib" zlib_encoder_select="zlib" zmbv_decoder_select="zlib" zmbv_encoder_select="zlib" crystalhd_deps="libcrystalhd_libcrystalhd_if_h" vaapi_deps="va_va_h" vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads" vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" # parsers h264_parser_select="golomb h264dsp h264pred" # external libraries libaacplus_encoder_deps="libaacplus" libcelt_decoder_deps="libcelt" libfaac_encoder_deps="libfaac" libgsm_decoder_deps="libgsm" libgsm_encoder_deps="libgsm" libgsm_ms_decoder_deps="libgsm" libgsm_ms_encoder_deps="libgsm" libilbc_decoder_deps="libilbc" libilbc_encoder_deps="libilbc" libmodplug_demuxer_deps="libmodplug" libmp3lame_encoder_deps="libmp3lame" libopencore_amrnb_decoder_deps="libopencore_amrnb" libopencore_amrnb_encoder_deps="libopencore_amrnb" libopencore_amrwb_decoder_deps="libopencore_amrwb" libopenjpeg_decoder_deps="libopenjpeg" libopenjpeg_encoder_deps="libopenjpeg" libschroedinger_decoder_deps="libschroedinger" libschroedinger_encoder_deps="libschroedinger" libspeex_decoder_deps="libspeex" libspeex_encoder_deps="libspeex" libstagefright_h264_decoder_deps="libstagefright_h264" libtheora_encoder_deps="libtheora" libvo_aacenc_encoder_deps="libvo_aacenc" libvo_amrwbenc_encoder_deps="libvo_amrwbenc" libvorbis_decoder_deps="libvorbis" libvorbis_encoder_deps="libvorbis" libvpx_decoder_deps="libvpx" libvpx_encoder_deps="libvpx" libx264_encoder_deps="libx264" libx264rgb_encoder_deps="libx264" libxavs_encoder_deps="libxavs" libxvid_encoder_deps="libxvid" libutvideo_decoder_deps="libutvideo" libutvideo_encoder_deps="libutvideo" # demuxers / muxers ac3_demuxer_select="ac3_parser" asf_stream_muxer_select="asf_muxer" avisynth_demuxer_deps="avisynth" dirac_demuxer_select="dirac_parser" eac3_demuxer_select="ac3_parser" flac_demuxer_select="flac_parser" ipod_muxer_select="mov_muxer" libnut_demuxer_deps="libnut" libnut_muxer_deps="libnut" matroska_audio_muxer_select="matroska_muxer" matroska_demuxer_suggest="zlib bzlib" mov_demuxer_suggest="zlib" mp3_demuxer_select="mpegaudio_parser" mp4_muxer_select="mov_muxer" mpegts_muxer_select="adts_muxer latm_muxer" mpegtsraw_demuxer_select="mpegts_demuxer" mxf_d10_muxer_select="mxf_muxer" ogg_demuxer_select="golomb" psp_muxer_select="mov_muxer" rtp_demuxer_select="sdp_demuxer" rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer" rtsp_demuxer_select="http_protocol rtpdec" rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol" sap_demuxer_select="sdp_demuxer" sap_muxer_select="rtp_muxer rtp_protocol" sdp_demuxer_select="rtpdec" spdif_muxer_select="aac_parser" tg2_muxer_select="mov_muxer" tgp_muxer_select="mov_muxer" w64_demuxer_deps="wav_demuxer" # indevs / outdevs alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp" alsa_outdev_deps="alsa_asoundlib_h" bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" dshow_indev_deps="IBaseFilter" dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid" dv1394_indev_deps="dv1394 dv_demuxer" fbdev_indev_deps="linux_fb_h" iec61883_indev_deps="libiec61883" jack_indev_deps="jack_jack_h sem_timedwait" lavfi_indev_deps="avfilter" libcdio_indev_deps="libcdio" libdc1394_indev_deps="libdc1394" libv4l2_indev_deps="libv4l2" openal_indev_deps="openal" oss_indev_deps_any="soundcard_h sys_soundcard_h" oss_outdev_deps_any="soundcard_h sys_soundcard_h" pulse_indev_deps="libpulse" sdl_outdev_deps="sdl" sndio_indev_deps="sndio_h" sndio_outdev_deps="sndio_h" v4l_indev_deps="linux_videodev_h" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines" vfwcap_indev_extralibs="-lavicap32" x11_grab_device_indev_deps="x11grab XShmCreateImage" # protocols bluray_protocol_deps="libbluray" gopher_protocol_deps="network" httpproxy_protocol_deps="network" httpproxy_protocol_select="tcp_protocol" http_protocol_deps="network" http_protocol_select="tcp_protocol" https_protocol_select="tls_protocol" librtmp_protocol_deps="librtmp" librtmpe_protocol_deps="librtmp" librtmps_protocol_deps="librtmp" librtmpt_protocol_deps="librtmp" librtmpte_protocol_deps="librtmp" mmsh_protocol_select="http_protocol" mmst_protocol_deps="network" rtmp_protocol_deps="!librtmp_protocol" rtmp_protocol_select="tcp_protocol" rtmphttp_protocol_deps="!librtmp_protocol" rtmphttp_protocol_select="http_protocol" rtmpt_protocol_deps="!librtmp_protocol" rtmpt_protocol_select="rtmphttp_protocol" rtp_protocol_select="udp_protocol" sctp_protocol_deps="network netinet_sctp_h" tcp_protocol_deps="network" tls_protocol_deps_any="openssl gnutls" tls_protocol_select="tcp_protocol" udp_protocol_deps="network" # filters aconvert_filter_deps="swresample" amovie_filter_deps="avcodec avformat" aresample_filter_deps="swresample" ass_filter_deps="libass" asyncts_filter_deps="avresample" atempo_filter_deps="avcodec rdft" blackframe_filter_deps="gpl" boxblur_filter_deps="gpl" colormatrix_filter_deps="gpl" cropdetect_filter_deps="gpl" delogo_filter_deps="gpl" deshake_filter_deps="avcodec" drawtext_filter_deps="libfreetype" frei0r_filter_deps="frei0r dlopen" frei0r_filter_extralibs='$ldl' frei0r_src_filter_deps="frei0r dlopen" frei0r_src_filter_extralibs='$ldl' hqdn3d_filter_deps="gpl" movie_filter_deps="avcodec avformat" mp_filter_deps="gpl avcodec swscale postproc" mptestsrc_filter_deps="gpl" negate_filter_deps="lut_filter" resample_filter_deps="avresample" ocv_filter_deps="libopencv" pan_filter_deps="swresample" removelogo_filter_deps="avcodec avformat swscale" scale_filter_deps="swscale" select_filter_deps="avcodec" super2xsai_filter_deps="gpl" tinterlace_filter_deps="gpl" yadif_filter_deps="gpl" # libraries avdevice_deps="avcodec avformat" avformat_deps="avcodec" postproc_deps="gpl" # programs ffmpeg_deps="avcodec avfilter avformat swscale swresample" ffmpeg_select="buffersink_filter format_filter aformat_filter setpts_filter null_filter anull_filter abuffersink_filter" ffplay_deps="avcodec avformat swscale swresample sdl" ffplay_select="buffersink_filter rdft" ffprobe_deps="avcodec avformat" ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer" ffserver_extralibs='$ldl' doc_deps="texi2html" # tests test_deps(){ suf1=$1 suf2=$2 shift 2 for v; do dep=${v%=*} tests=${v#*=} for name in ${tests}; do append ${name}_test_deps ${dep}$suf1 ${dep}$suf2 done done } mxf_d10_test_deps="avfilter" seek_lavf_mxf_d10_test_deps="mxf_d10_test" test_deps _muxer _demuxer \ aiff \ pcm_alaw=alaw \ asf \ au \ avi \ dv=dv_fmt \ ffm \ flv=flv_fmt \ gxf \ matroska=mkv \ mmf \ mov="mov ismv" \ pcm_mulaw=mulaw \ mxf="mxf mxf_d10" \ nut \ ogg="ogg ogg_vp3" \ rawvideo=pixfmt \ rm \ swf \ mpegts=ts \ voc \ wav \ yuv4mpegpipe=yuv4mpeg \ colormatrix1_test_deps="colormatrix_filter" colormatrix2_test_deps="colormatrix_filter" flashsv2_test_deps="zlib" mpg_test_deps="mpeg1system_muxer mpegps_demuxer" mpng_test_deps="zlib" pp_test_deps="mp_filter" pp2_test_deps="mp_filter" pp3_test_deps="mp_filter" pp4_test_deps="mp_filter" pp5_test_deps="mp_filter" pp6_test_deps="mp_filter" zlib_test_deps="zlib" zmbv_test_deps="zlib" # default parameters logfile="config.log" # installation paths prefix_default="/usr/local" bindir_default='${prefix}/bin' datadir_default='${prefix}/share/ffmpeg' incdir_default='${prefix}/include' libdir_default='${prefix}/lib' mandir_default='${prefix}/share/man' shlibdir_default="$libdir_default" postproc_version_default="current" # toolchain ar_default="ar" cc_default="gcc" cxx_default="g++" cc_version=\"unknown\" host_cc_default="gcc" install="install" ln_s="ln -sf" nm_default="nm" objformat="elf" pkg_config_default=pkg-config ranlib="ranlib" strip_default="strip" yasmexe_default="yasm" nm_opts='-g' nogas=":" # machine arch_default=$(uname -m) cpu="generic" # OS target_os_default=$(tolower $(uname -s)) host_os=$target_os_default # alternative libpostproc version ALT_PP_VER_MAJOR=51 ALT_PP_VER_MINOR=2 ALT_PP_VER_MICRO=101 ALT_PP_VER=$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO # configurable options enable $PROGRAM_LIST enable avcodec enable avdevice enable avfilter enable avformat enable avutil enable postproc enable stripping enable swresample enable swscale enable asm enable debug enable doc enable fastdiv enable network enable optimizations enable safe_bitstream_reader enable static enable swscale_alpha # build settings SHFLAGS='-shared -Wl,-soname,$$(@F)' FFSERVERLDFLAGS=-Wl,-E LIBPREF="lib" LIBSUF=".a" FULLNAME='$(NAME)$(BUILDSUF)' LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)' SLIBPREF="lib" SLIBSUF=".so" SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)' SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)' SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)' AS_O='-o $@' CC_O='-o $@' CXX_O='-o $@' host_cflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600 -O3 -g' host_libs='-lm' target_path='$(CURDIR)' # since the object filename is not given with the -MM flag, the compiler # is only able to print the basename, and we must add the path ourselves DEPEND_CMD='$(DEPCC) $(DEPFLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)' DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -MM' # find source path if test -f configure; then source_path=. else source_path=$(cd $(dirname "$0"); pwd) echo "$source_path" | grep -q '[[:blank:]]' && die "Out of tree builds are impossible with whitespace in source path." test -e "$source_path/config.h" && die "Out of tree builds are impossible with config.h in source dir." fi for v in "$@"; do r=${v#*=} l=${v%"$r"} r=$(sh_quote "$r") FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}" done find_things(){ thing=$1 pattern=$2 file=$source_path/$3 sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file" } ENCODER_LIST=$(find_things encoder ENC libavcodec/allcodecs.c) DECODER_LIST=$(find_things decoder DEC libavcodec/allcodecs.c) HWACCEL_LIST=$(find_things hwaccel HWACCEL libavcodec/allcodecs.c) PARSER_LIST=$(find_things parser PARSER libavcodec/allcodecs.c) BSF_LIST=$(find_things bsf BSF libavcodec/allcodecs.c) MUXER_LIST=$(find_things muxer _MUX libavformat/allformats.c) DEMUXER_LIST=$(find_things demuxer DEMUX libavformat/allformats.c) OUTDEV_LIST=$(find_things outdev OUTDEV libavdevice/alldevices.c) INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c) PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c) FILTER_LIST=$(find_things filter FILTER libavfilter/allfilters.c) ALL_COMPONENTS=" $BSF_LIST $DECODER_LIST $DEMUXER_LIST $ENCODER_LIST $FILTER_LIST $HWACCEL_LIST $INDEV_LIST $MUXER_LIST $OUTDEV_LIST $PARSER_LIST $PROTOCOL_LIST " find_tests(){ map "echo ${2}\${v}_test" $(ls "$source_path"/tests/ref/$1 | grep -v '[^-a-z0-9_]') } LAVF_FATE_TESTS=$(find_tests lavf-fate) LAVF_TESTS=$(find_tests lavf) LAVFI_TESTS=$(find_tests lavfi) SEEK_TESTS=$(find_tests seek seek_) ALL_TESTS="$LAVF_FATE_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS" for n in $COMPONENT_LIST; do v=$(toupper ${n%s})_LIST eval enable \$$v eval ${n}_if_any="\$$v" done enable $ARCH_EXT_LIST $ALL_TESTS die_unknown(){ echo "Unknown option \"$1\"." echo "See $0 --help for available options." exit 1 } show_list() { suffix=_$1 shift echo $* | sed s/$suffix//g | tr ' ' '\n' | sort | pr -3 -t exit 0 } rand_list(){ IFS=', ' set -- $* unset IFS for thing; do comp=${thing%:*} prob=${thing#$comp} prob=${prob#:} is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST echo "prob ${prob:-0.5}" printf '%s\n' $comp done } do_random(){ action=$1 shift random_seed=$(awk "BEGIN { srand($random_seed); print srand() }") $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }") } for opt do optval="${opt#*=}" case "$opt" in --extra-ldflags=*) add_ldflags $optval ;; --extra-libs=*) add_extralibs $optval ;; --disable-devices) disable $INDEV_LIST $OUTDEV_LIST ;; --enable-debug=*) debuglevel="$optval" ;; --disable-everything) map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST ;; --enable-random|--disable-random) action=${opt%%-random} do_random ${action#--} $COMPONENT_LIST ;; --enable-random=*|--disable-random=*) action=${opt%%-random=*} do_random ${action#--} $optval ;; --enable-*=*|--disable-*=*) eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/') is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt" eval list=\$$(toupper $thing)_LIST name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing} $action $(filter "$name" $list) ;; --enable-?*|--disable-?*) eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g') if is_in $option $COMPONENT_LIST; then test $action = disable && action=unset eval $action \$$(toupper ${option%s})_LIST elif is_in $option $CMDLINE_SELECT; then $action $option else die_unknown $opt fi ;; --list-*) NAME="${opt#--list-}" is_in $NAME $COMPONENT_LIST || die_unknown $opt NAME=${NAME%s} eval show_list $NAME \$$(toupper $NAME)_LIST ;; --help|-h) show_help ;; *) optname="${opt%%=*}" optname="${optname#--}" optname=$(echo "$optname" | sed 's/-/_/g') if is_in $optname $CMDLINE_SET; then eval $optname='$optval' elif is_in $optname $CMDLINE_APPEND; then append $optname "$optval" else die_unknown $opt fi ;; esac done disabled logging && logfile=/dev/null echo "# $0 $FFMPEG_CONFIGURATION" > $logfile set >> $logfile test -n "$cross_prefix" && enable cross_compile if enabled cross_compile; then test -n "$arch" && test -n "$target_os" || die "Must specify target arch and OS when cross-compiling" fi set_default arch target_os postproc_version # Check if we should build alternative libpostproc version instead of current if test "$postproc_version" = $ALT_PP_VER; then LIBPOSTPROC_VERSION=$ALT_PP_VER LIBPOSTPROC_VERSION_MAJOR=$ALT_PP_VER_MAJOR LIBPOSTPROC_VERSION_MINOR=$ALT_PP_VER_MINOR LIBPOSTPROC_VERSION_MICRO=$ALT_PP_VER_MICRO elif test "$postproc_version" != current; then die "Invalid argument to --postproc-version. See --help output." fi ar_default="${cross_prefix}${ar_default}" cc_default="${cross_prefix}${cc_default}" cxx_default="${cross_prefix}${cxx_default}" nm_default="${cross_prefix}${nm_default}" pkg_config_default="${cross_prefix}${pkg_config_default}" ranlib="${cross_prefix}${ranlib}" strip_default="${cross_prefix}${strip_default}" sysinclude_default="${sysroot}/usr/include" set_default cc cxx nm pkg_config strip sysinclude yasmexe enabled cross_compile || host_cc_default=$cc set_default host_cc if ! $pkg_config --version >/dev/null 2>&1; then warn "$pkg_config not found, library detection may fail." pkg_config=false fi exesuf() { case $1 in mingw32*|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;; esac } EXESUF=$(exesuf $target_os) HOSTEXESUF=$(exesuf $host_os) # set temporary file name : ${TMPDIR:=$TEMPDIR} : ${TMPDIR:=$TMP} : ${TMPDIR:=/tmp} if ! check_cmd mktemp -u XXXXXX; then # simple replacement for missing mktemp # NOT SAFE FOR GENERAL USE mktemp(){ echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" } fi tmpfile(){ tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 && (set -C; exec > $tmp) 2>/dev/null || die "Unable to create temporary file in $TMPDIR." append TMPFILES $tmp eval $1=$tmp } trap 'rm -f -- $TMPFILES' EXIT tmpfile TMPASM .asm tmpfile TMPC .c tmpfile TMPCPP .cpp tmpfile TMPE $EXESUF tmpfile TMPH .h tmpfile TMPO .o tmpfile TMPS .S tmpfile TMPSH .sh tmpfile TMPV .ver unset -f mktemp chmod +x $TMPE # make sure we can execute files in $TMPDIR cat > $TMPSH 2>> $logfile <> $logfile 2>&1 if ! $TMPSH >> $logfile 2>&1; then cat <&1 | grep -q '^gcc.*LLVM'; then cc_type=llvm_gcc cc_version=__VERSION__ gcc_extra_ver=$(expr "$($cc --version | head -n1)" : '.*\((.*)\)') cc_ident="llvm-gcc $($cc -dumpversion) $gcc_extra_ver" CC_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' AS_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' speed_cflags='-O3' size_cflags='-Os' elif $cc -v 2>&1 | grep -qi ^gcc; then cc_type=gcc cc_version=__VERSION__ gcc_version=$($cc --version | head -n1) gcc_basever=$($cc -dumpversion) gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)') gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)") cc_ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver") if ! $cc -dumpversion | grep -q '^2\.'; then CC_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' AS_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' fi speed_cflags='-O3' size_cflags='-Os' elif $cc --version 2>/dev/null | grep -q Intel; then cc_type=icc cc_version="AV_STRINGIFY(__INTEL_COMPILER)" cc_ident=$($cc --version | head -n1) icc_version=$($cc -dumpversion) CC_DEPFLAGS='-MMD' AS_DEPFLAGS='-MMD' speed_cflags='-O3' size_cflags='-Os' noopt_cflags='-O1' elif $cc -v 2>&1 | grep -q xlc; then cc_type=xlc cc_version="AV_STRINGIFY(__IBMC__)" cc_ident=$($cc -qversion 2>/dev/null | head -n1) speed_cflags='-O5' size_cflags='-O5 -qcompact' elif $cc -V 2>/dev/null | grep -q Compaq; then cc_type=ccc cc_version="AV_STRINGIFY(__DECC_VER)" cc_ident=$($cc -V | head -n1 | cut -d' ' -f1-3) DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -M' debuglevel=3 add_ldflags -Wl,-z,now # calls to libots crash without this speed_cflags='-fast' size_cflags='-O1' elif $cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then test -d "$sysroot" || die "No valid sysroot specified." cc_type=armcc cc_version="AV_STRINGIFY(__ARMCC_VERSION)" cc_ident=$($cc --vsn | head -n1) armcc_conf="$PWD/armcc.conf" $cc --arm_linux_configure \ --arm_linux_config_file="$armcc_conf" \ --configure_sysroot="$sysroot" \ --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 || die "Error creating armcc configuration file." $cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc cc="$cc --arm_linux_config_file=$armcc_conf --translate_gcc" as_default="${cross_prefix}gcc" CC_DEPFLAGS='-MMD' AS_DEPFLAGS='-MMD' speed_cflags='-O3' size_cflags='-Os' filter_asflags="filter_out -W${armcc_opt}*" elif $cc -version 2>/dev/null | grep -q TMS470; then cc_type=tms470 cc_version="AV_STRINGIFY(__TI_COMPILER_VERSION__)" cc_ident=$($cc -version | head -n1 | tr -s ' ') cc="$cc --gcc --abi=eabi -eo=.o -mc -me" CC_O='-fr=$(@D)' as_default="${cross_prefix}gcc" ld_default="${cross_prefix}gcc" TMPO=$(basename $TMPC .c).o append TMPFILES $TMPO add_cflags -D__gnuc_va_list=va_list -D__USER_LABEL_PREFIX__= CC_DEPFLAGS='-ppa -ppd=$(@:.o=.d)' AS_DEPFLAGS='-MMD' speed_cflags='-O3 -mf=5' size_cflags='-O3 -mf=2' filter_cflags=tms470_flags tms470_flags(){ for flag; do case $flag in -march=*|-mcpu=*) case "${flag#*=}" in armv7-a|cortex-a*) echo -mv=7a8 ;; armv7-r|cortex-r*) echo -mv=7r4 ;; armv7-m|cortex-m*) echo -mv=7m3 ;; armv6*|arm11*) echo -mv=6 ;; armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) echo -mv=5e ;; armv4*|arm7*|arm9[24]*) echo -mv=4 ;; esac ;; -mfpu=neon) echo --float_support=vfpv3 --neon ;; -mfpu=vfp) echo --float_support=vfpv2 ;; -mfpu=vfpv3) echo --float_support=vfpv3 ;; -msoft-float) echo --float_support=vfplib ;; -O[0-3]|-mf=*) echo $flag ;; -g) echo -g -mn ;; -pds=*) echo $flag ;; esac done } elif $cc -v 2>&1 | grep -q clang; then cc_type=clang $cc -dM -E $TMPC | grep -q __clang_version__ && cc_version=__clang_version__ || cc_version=__VERSION__ cc_ident=$($cc --version | head -n1) CC_DEPFLAGS='-MMD' AS_DEPFLAGS='-MMD' speed_cflags='-O3' size_cflags='-Os' elif $cc -V 2>&1 | grep -q Sun; then cc_type=suncc cc_version="AV_STRINGIFY(__SUNPRO_C)" cc_ident=$($cc -V 2>&1 | head -n1 | cut -d' ' -f 2-) DEPEND_CMD='$(DEPCC) $(DEPFLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)' DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -xM1' add_ldflags -xc99 speed_cflags='-O5' size_cflags='-O5 -xspace' filter_cflags=suncc_flags suncc_flags(){ for flag; do case $flag in -march=*|-mcpu=*) case "${flag#*=}" in native) echo -xtarget=native ;; v9|niagara) echo -xarch=sparc ;; ultrasparc) echo -xarch=sparcvis ;; ultrasparc3|niagara2) echo -xarch=sparcvis2 ;; i586|pentium) echo -xchip=pentium ;; i686|pentiumpro|pentium2) echo -xtarget=pentium_pro ;; pentium3*|c3-2) echo -xtarget=pentium3 ;; pentium-m) echo -xarch=sse2 -xchip=pentium3 ;; pentium4*) echo -xtarget=pentium4 ;; prescott|nocona) echo -xarch=sse3 -xchip=pentium4 ;; *-sse3) echo -xarch=sse3 ;; core2) echo -xarch=ssse3 -xchip=core2 ;; amdfam10|barcelona) echo -xarch=sse4_1 ;; athlon-4|athlon-[mx]p) echo -xarch=ssea ;; k8|opteron|athlon64|athlon-fx) echo -xarch=sse2a ;; athlon*) echo -xarch=pentium_proa ;; esac ;; -std=c99) echo -xc99 ;; -fomit-frame-pointer) echo -xregs=frameptr ;; -fPIC) echo -KPIC -xcode=pic32 ;; -W*,*) echo $flag ;; -f*-*|-W*) ;; *) echo $flag ;; esac done } elif $cc -v 2>&1 | grep -q 'PathScale\|Path64'; then cc_type=pathscale cc_version=__PATHSCALE__ cc_ident=$($cc -v 2>&1 | head -n1 | tr -d :) CC_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' AS_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' speed_cflags='-O2' size_cflags='-Os' filter_cflags='filter_out -Wdisabled-optimization' elif $cc -v 2>&1 | grep -q Open64; then cc_type=open64 cc_version=__OPEN64__ cc_ident=$($cc -v 2>&1 | head -n1 | tr -d :) CC_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' AS_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@' speed_cflags='-O2' size_cflags='-Os' filter_cflags='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros' elif $cc -V 2>&1 | grep -q Portland; then cc_type=pgi cc_version='AV_STRINGIFY(__PGIC__.__PGIC_MINOR__.__PGIC_PATCHLEVEL__)' cc_ident="PGI $($cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')" opt_common='-alias=ansi -Mlre -Mpre' speed_cflags="-O3 -Mautoinline -Munroll=c:4 $opt_common" size_cflags="-O2 -Munroll=c:1 $opt_common" noopt_cflags="-O1" filter_cflags=pgi_flags pgi_flags(){ for flag; do case $flag in -fomit-frame-pointer) echo -Mnoframe ;; -g) echo -gopt ;; *) echo $flag ;; esac done } fi test -n "$cc_type" && enable $cc_type || warn "Unknown C compiler $cc, unable to select optimal CFLAGS" : ${as_default:=$cc} : ${dep_cc_default:=$cc} : ${ld_default:=$cc} set_default ar as dep_cc ld test -n "$CC_DEPFLAGS" || CCDEP=$DEPEND_CMD test -n "$CXX_DEPFLAGS" || CXXDEP=$DEPEND_CMD test -n "$AS_DEPFLAGS" || ASDEP=$DEPEND_CMD add_cflags $extra_cflags add_cxxflags $extra_cxxflags add_asflags $extra_cflags if test -n "$sysroot"; then case "$cc_type" in gcc|llvm_gcc|clang) add_cppflags --sysroot="$sysroot" add_ldflags --sysroot="$sysroot" ;; tms470) add_cppflags -I"$sysinclude" add_ldflags --sysroot="$sysroot" ;; esac fi if test "$cpu" = host; then enabled cross_compile && die "--cpu=host makes no sense when cross-compiling." case "$cc_type" in gcc|llvm_gcc) check_native(){ $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return sed -n "/cc1.*$1=/{ s/.*$1=\\([^ ]*\\).*/\\1/ p q }" $TMPE } cpu=$(check_native -march || check_native -mcpu) ;; esac test "${cpu:-host}" = host && die "--cpu=host not supported with compiler $cc" fi # Deal with common $arch aliases case "$arch" in arm*|iPad*) arch="arm" ;; mips|mipsel|IP*) arch="mips" ;; mips64*) arch="mips" subarch="mips64" ;; parisc|hppa) arch="parisc" ;; parisc64|hppa64) arch="parisc" subarch="parisc64" ;; "Power Macintosh"|ppc|powerpc|ppc64|powerpc64) arch="ppc" ;; s390|s390x) arch="s390" ;; sh4|sh) arch="sh4" ;; sun4u|sparc64) arch="sparc" subarch="sparc64" ;; i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64) arch="x86" ;; esac is_in $arch $ARCH_LIST || warn "unknown architecture $arch" enable $arch # Add processor-specific flags if test "$cpu" = generic; then : do nothing elif enabled ppc; then case $(tolower $cpu) in 601|ppc601|powerpc601) cpuflags="-mcpu=601" disable altivec ;; 603*|ppc603*|powerpc603*) cpuflags="-mcpu=603" disable altivec ;; 604*|ppc604*|powerpc604*) cpuflags="-mcpu=604" disable altivec ;; g3|75*|ppc75*|powerpc75*) cpuflags="-mcpu=750 -mpowerpc-gfxopt" disable altivec ;; g4|745*|ppc745*|powerpc745*) cpuflags="-mcpu=7450 -mpowerpc-gfxopt" ;; 74*|ppc74*|powerpc74*) cpuflags="-mcpu=7400 -mpowerpc-gfxopt" ;; g5|970|ppc970|powerpc970) cpuflags="-mcpu=970 -mpowerpc-gfxopt -mpowerpc64" ;; power[3-7]*) cpuflags="-mcpu=$cpu -mpowerpc-gfxopt -mpowerpc64" ;; cell) cpuflags="-mcpu=cell" enable ldbrx ;; e500v2) cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double" disable altivec ;; e500) cpuflags="-mcpu=8540 -mhard-float" disable altivec ;; esac elif enabled x86; then case $cpu in i[345]86|pentium) cpuflags="-march=$cpu" disable mmx ;; # targets that do NOT support conditional mov (cmov) pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3) cpuflags="-march=$cpu" disable cmov ;; # targets that do support conditional mov (cmov) i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|amdfam10|barcelona|atom) cpuflags="-march=$cpu" enable cmov enable fast_cmov ;; # targets that do support conditional mov but on which it's slow pentium4|pentium4m|prescott|nocona) cpuflags="-march=$cpu" enable cmov disable fast_cmov ;; esac elif enabled sparc; then case $cpu in niagara) cpuflags="-mcpu=$cpu" disable vis ;; sparc64) cpuflags="-mcpu=v9" ;; esac elif enabled arm; then case $cpu in armv*) cpuflags="-march=$cpu" subarch=$(echo $cpu | sed 's/[^a-z0-9]//g') ;; *) cpuflags="-mcpu=$cpu" case $cpu in cortex-a*) subarch=armv7a ;; cortex-r*) subarch=armv7r ;; cortex-m*) enable thumb; subarch=armv7m ;; arm11*) subarch=armv6 ;; arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;; armv4*|arm7*|arm9[24]*) subarch=armv4 ;; esac ;; esac elif enabled alpha; then enabled ccc && cpuflags="-arch $cpu" || cpuflags="-mcpu=$cpu" elif enabled bfin; then cpuflags="-mcpu=$cpu" elif enabled mips; then cpuflags="-march=$cpu" case $cpu in 24kc) disable mipsfpu disable mipsdspr1 disable mipsdspr2 ;; 24kf*) disable mipsdspr1 disable mipsdspr2 ;; 24kec|34kc|1004kc) disable mipsfpu disable mipsdspr2 ;; 24kef*|34kf*|1004kf*) disable mipsdspr2 ;; 74kc) disable mipsfpu ;; esac elif enabled avr32; then case $cpu in ap7[02]0[0-2]) subarch="avr32_ap" cpuflags="-mpart=$cpu" ;; ap) subarch="avr32_ap" cpuflags="-march=$cpu" ;; uc3[ab]*) subarch="avr32_uc" cpuflags="-mcpu=$cpu" ;; uc) subarch="avr32_uc" cpuflags="-march=$cpu" ;; esac fi add_cflags $cpuflags add_asflags $cpuflags # compiler sanity check check_exec < EOF check_cc -D_LARGEFILE_SOURCE < EOF check_host_cflags -std=c99 check_host_cflags -Wall case "$arch" in alpha|ia64|mips|parisc|sparc) spic=$shared ;; x86) subarch="x86_32" check_cc < mapfile && add_ldflags -Wl,-M,mapfile nm_opts='-P -g' ;; netbsd) disable symver oss_indev_extralibs="-lossaudio" oss_outdev_extralibs="-lossaudio" ;; openbsd|bitrig) # On OpenBSD 4.5. the compiler does not use PIC unless # explicitly using -fPIC. FFmpeg builds fine without PIC, # however the generated executable will not do anything # (simply quits with exit-code 1, no crash, no output). # Thus explicitly enable PIC here. enable pic disable symver SHFLAGS='-shared' SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBVERSION)' oss_indev_extralibs="-lossaudio" oss_outdev_extralibs="-lossaudio" ;; dragonfly) disable symver ;; freebsd) ;; bsd/os) add_extralibs -lpoll -lgnugetopt strip="strip -d" ;; darwin) gas="gas-preprocessor.pl $cc" enabled ppc && add_asflags -force_cpusubtype_ALL SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)' enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress strip="${strip} -x" add_ldflags -Wl,-dynamic,-search_paths_first SLIBSUF=".dylib" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)' FFSERVERLDFLAGS=-Wl,-bind_at_load objformat="macho" enabled x86_64 && objformat="macho64" enabled_any pic shared || { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; } ;; mingw32*) if test $target_os = "mingw32ce"; then disable network else target_os=mingw32 fi LIBTARGET=i386 if enabled x86_64; then LIBTARGET=x64 elif enabled arm; then LIBTARGET=arm-wince fi shlibdir_default="$bindir_default" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS= SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)' SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base' objformat="win32" enable dos_paths check_cflags -fno-common check_cpp_condition _mingw.h "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) \ || (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" || die "ERROR: MinGW runtime version must be >= 3.15." add_cppflags -U__STRICT_ANSI__ ;; cygwin*) target_os=cygwin shlibdir_default="$bindir_default" SLIBPREF="cyg" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' SHFLAGS='-shared -Wl,--enable-auto-image-base' objformat="win32" enable dos_paths check_cflags -fno-common add_cppflags -U__STRICT_ANSI__ ;; *-dos|freedos|opendos) network_extralibs="-lsocket" objformat="coff" enable dos_paths add_cppflags -U__STRICT_ANSI__ ;; linux) add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 enable dv1394 ;; irix*) target_os=irix ranlib="echo ignoring ranlib" ;; os/2*) strip="lxlite -CS" ln_s="cp -f" objformat="aout" add_cppflags -D_GNU_SOURCE add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf' FFSERVERLDFLAGS="" LIBSUF="_s.a" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)' SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \ echo PROTMODE >> $(SUBDIR)$(NAME).def; \ echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \ echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \ echo EXPORTS >> $(SUBDIR)$(NAME).def; \ emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def' SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \ emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;' SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib' enable dos_paths enable_weak os2threads ;; gnu/kfreebsd) add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_BSD_SOURCE ;; gnu) add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 ;; qnx) add_cppflags -D_QNX_SOURCE network_extralibs="-lsocket" ;; symbian) SLIBSUF=".dll" enable dos_paths add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS add_ldflags -Wl,--target1-abs,--no-undefined \ -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \ -Wl,--entry=_E32Startup -Wl,-u,_E32Startup add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \ -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \ -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib ;; none) ;; *) die "Unknown OS '$target_os'." ;; esac esc(){ echo "$*" | sed 's/%/%25/g;s/:/%3a/g' } echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic set_default $PATHS_LIST # we need to build at least one lib type if ! enabled_any static shared; then cat <= 2.0.0" aacplus.h aacplusEncOpen -laacplus enabled libass && require_pkg_config libass ass/ass.h ass_library_init enabled libbluray && require libbluray libbluray/bluray.h bd_open -lbluray enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 && { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 || die "ERROR: libcelt version must be >= 0.11.0."; } enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType enabled libgsm && require libgsm gsm/gsm.h gsm_create -lgsm enabled libilbc && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc enabled libmodplug && require libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame enabled libnut && require libnut libnut.h nut_demuxer_init -lnut enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb enabled libopencv && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex enabled libstagefright_h264 && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg enabled libutvideo && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++ enabled libv4l2 && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl enabled libvo_aacenc && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg enabled libvpx && { enabled libvpx_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx || die "ERROR: libvpx decoder version must be >=0.9.1"; } enabled libvpx_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx || die "ERROR: libvpx encoder version must be >=0.9.7"; } } enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 && { check_cpp_condition x264.h "X264_BUILD >= 118" || die "ERROR: libx264 version must be >= 0.118."; } enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled openal && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } || die "ERROR: openal not found"; } && { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" || die "ERROR: openal version must be 1.1 or compatible"; } enabled openssl && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto || check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 || check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 || die "ERROR: openssl not found"; } # libdc1394 check if enabled libdc1394; then { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 && enable libdc1394_2; } || { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 && enable libdc1394_1; } || die "ERROR: No version of libdc1394 found " fi SDL_CONFIG="${cross_prefix}sdl-config" if check_pkg_config sdl SDL_events.h SDL_PollEvent; then check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags && enable sdl && check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size else if "${SDL_CONFIG}" --version > /dev/null 2>&1; then sdl_cflags=$("${SDL_CONFIG}" --cflags) sdl_libs=$("${SDL_CONFIG}" --libs) check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs && check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags && enable sdl && check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size fi fi enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html makeinfo --version > /dev/null 2>&1 && enable makeinfo || disable makeinfo check_header linux/fb.h check_header linux/videodev.h check_header linux/videodev2.h check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete check_header sys/videoio.h check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs" # check that WM_CAP_DRIVER_CONNECT is defined to the proper value # w32api 3.12 had it defined wrong check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines check_type "dshow.h" IBaseFilter # check for ioctl_meteor.h, ioctl_bt848.h and alternatives { check_header dev/bktr/ioctl_meteor.h && check_header dev/bktr/ioctl_bt848.h; } || { check_header machine/ioctl_meteor.h && check_header machine/ioctl_bt848.h; } || { check_header dev/video/meteor/ioctl_meteor.h && check_header dev/video/bktr/ioctl_bt848.h; } || check_header dev/ic/bt8xx.h check_header sndio.h if check_struct sys/soundcard.h audio_buf_info bytes; then enable_safe sys/soundcard.h else check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE < audio_buf_info abc; EOF fi check_header soundcard.h enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait && check_func jack_port_get_latency_range -ljack enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio enabled libcdio && check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open "-lcdio_paranoia -lcdio_cdda -lcdio" enabled x11grab && require X11 X11/Xlib.h XOpenDisplay -lX11 && require Xext X11/extensions/XShm.h XShmCreateImage -lXext && require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes if ! disabled vaapi; then check_lib va/va.h vaInitialize -lva && { check_cpp_condition va/va_version.h "VA_CHECK_VERSION(0,32,0)" || warn "Please upgrade to VA-API >= 0.32 if you would like full VA-API support."; } || disable vaapi fi if ! disabled vdpau && enabled vdpau_vdpau_h; then check_cpp_condition \ vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" || { echolog "Please upgrade to libvdpau >= 0.2 if you would like vdpau support." && disable vdpau; } fi enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel" enabled coverage && add_cflags "-fprofile-arcs -ftest-coverage" && add_ldflags "-fprofile-arcs -ftest-coverage" test -n "$valgrind" && target_exec="$valgrind --error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp" # add some useful compiler flags if supported check_cflags -Wdeclaration-after-statement check_cflags -Wall check_cflags -Wno-parentheses check_cflags -Wno-switch check_cflags -Wno-format-zero-length check_cflags -Wdisabled-optimization check_cflags -Wpointer-arith check_cflags -Wredundant-decls check_cflags -Wno-pointer-sign check_cflags -Wwrite-strings check_cflags -Wtype-limits check_cflags -Wundef check_cflags -Wmissing-prototypes check_cflags -Wno-pointer-to-int-cast check_cflags -Wstrict-prototypes enabled extra_warnings && check_cflags -Winline # add some linker flags check_ldflags -Wl,--warn-common check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic enabled xmm_clobber_test && \ check_ldflags -Wl,--wrap,avcodec_open2 \ -Wl,--wrap,avcodec_decode_audio4 \ -Wl,--wrap,avcodec_decode_video2 \ -Wl,--wrap,avcodec_decode_subtitle2 \ -Wl,--wrap,avcodec_encode_audio2 \ -Wl,--wrap,avcodec_encode_video \ -Wl,--wrap,avcodec_encode_subtitle \ -Wl,--wrap,sws_scale || \ disable xmm_clobber_test echo "X{};" > $TMPV if test_ldflags -Wl,--version-script,$TMPV; then append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver' check_cc < enable ${lib}_deps_${dep} # -> add $dep to ${lib}_deps only once add_dep() { lib=$1 dep=$2 enabled "${lib}_deps_${dep}" && return 0 enable "${lib}_deps_${dep}" prepend "${lib}_deps" $dep } # merge deps lib components # merge all ${component}_deps into ${lib}_deps and ${lib}_deps_* merge_deps() { lib=$1 shift for comp in $*; do enabled $comp || continue eval "dep=\"\$${comp}_deps\"" for d in $dep; do add_dep $lib $d done done } merge_deps libavfilter $FILTER_LIST echo "install prefix $prefix" echo "source path $source_path" echo "C compiler $cc" echo "ARCH $arch ($cpu)" if test "$build_suffix" != ""; then echo "build suffix $build_suffix" fi if test "$progs_suffix" != ""; then echo "progs suffix $progs_suffix" fi if test "$extra_version" != ""; then echo "version string suffix $extra_version" fi echo "big-endian ${bigendian-no}" echo "runtime cpu detection ${runtime_cpudetect-no}" if enabled x86; then echo "${yasmexe} ${yasm-no}" echo "MMX enabled ${mmx-no}" echo "MMX2 enabled ${mmx2-no}" echo "3DNow! enabled ${amd3dnow-no}" echo "3DNow! extended enabled ${amd3dnowext-no}" echo "SSE enabled ${sse-no}" echo "SSSE3 enabled ${ssse3-no}" echo "AVX enabled ${avx-no}" echo "CMOV enabled ${cmov-no}" echo "CMOV is fast ${fast_cmov-no}" echo "EBX available ${ebx_available-no}" echo "EBP available ${ebp_available-no}" fi if enabled arm; then echo "ARMv5TE enabled ${armv5te-no}" echo "ARMv6 enabled ${armv6-no}" echo "ARMv6T2 enabled ${armv6t2-no}" echo "ARM VFP enabled ${armvfp-no}" echo "NEON enabled ${neon-no}" fi if enabled mips; then echo "MMI enabled ${mmi-no}" echo "MIPS FPU enabled ${mipsfpu-no}" echo "MIPS32R2 enabled ${mips32r2-no}" echo "MIPS DSP R1 enabled ${mipsdspr1-no}" echo "MIPS DSP R2 enabled ${mipsdspr2-no}" fi if enabled ppc; then echo "AltiVec enabled ${altivec-no}" echo "PPC 4xx optimizations ${ppc4xx-no}" echo "dcbzl available ${dcbzl-no}" fi if enabled sparc; then echo "VIS enabled ${vis-no}" fi echo "debug symbols ${debug-no}" echo "strip symbols ${stripping-no}" echo "optimize for size ${small-no}" echo "optimizations ${optimizations-no}" echo "static ${static-no}" echo "shared ${shared-no}" echo "postprocessing support ${postproc-no}" echo "new filter support ${avfilter-no}" echo "network support ${network-no}" echo "threading support ${thread_type-no}" echo "safe bitstream reader ${safe_bitstream_reader-no}" echo "SDL support ${sdl-no}" echo "libdxva2 enabled ${dxva2-no}" echo "libva enabled ${vaapi-no}" echo "libvdpau enabled ${vdpau-no}" echo "AVISynth enabled ${avisynth-no}" echo "frei0r enabled ${frei0r-no}" echo "gnutls enabled ${gnutls-no}" echo "libaacplus enabled ${libaacplus-no}" echo "libass enabled ${libass-no}" echo "libcdio support ${libcdio-no}" echo "libcelt enabled ${libcelt-no}" echo "libdc1394 support ${libdc1394-no}" echo "libfaac enabled ${libfaac-no}" echo "libgsm enabled ${libgsm-no}" echo "libiec61883 support ${libiec61883-no}" echo "libilbc enabled ${libilbc-no}" echo "libmodplug enabled ${libmodplug-no}" echo "libmp3lame enabled ${libmp3lame-no}" echo "libnut enabled ${libnut-no}" echo "libopencore-amrnb support ${libopencore_amrnb-no}" echo "libopencore-amrwb support ${libopencore_amrwb-no}" echo "libopencv support ${libopencv-no}" echo "libopenjpeg enabled ${libopenjpeg-no}" echo "libpulse enabled ${libpulse-no}" echo "librtmp enabled ${librtmp-no}" echo "libschroedinger enabled ${libschroedinger-no}" echo "libspeex enabled ${libspeex-no}" echo "libstagefright-h264 enabled ${libstagefright_h264-no}" echo "libtheora enabled ${libtheora-no}" echo "libutvideo enabled ${libutvideo-no}" echo "libv4l2 enabled ${libv4l2-no}" echo "libvo-aacenc support ${libvo_aacenc-no}" echo "libvo-amrwbenc support ${libvo_amrwbenc-no}" echo "libvorbis enabled ${libvorbis-no}" echo "libvpx enabled ${libvpx-no}" echo "libx264 enabled ${libx264-no}" echo "libxavs enabled ${libxavs-no}" echo "libxvid enabled ${libxvid-no}" echo "openal enabled ${openal-no}" echo "openssl enabled ${openssl-no}" echo "zlib enabled ${zlib-no}" echo "bzlib enabled ${bzlib-no}" test -n "$random_seed" && echo "random seed ${random_seed}" echo for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do echo "Enabled ${type}s:" eval list=\$$(toupper $type)_LIST print_enabled '_*' $list | sort | pr -r -3 -t echo done license="LGPL version 2.1 or later" if enabled nonfree; then license="nonfree and unredistributable" elif enabled gplv3; then license="GPL version 3 or later" elif enabled lgplv3; then license="LGPL version 3 or later" elif enabled gpl; then license="GPL version 2 or later" fi echo "License: $license" echo "Creating config.mak and config.h..." test -e Makefile || $ln_s "$source_path/Makefile" . enabled stripping || strip="echo skipping strip" config_files="$TMPH config.mak" cat > config.mak <> config.mak eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak } get_version_old(){ name=$1 file=$source_path/$2 # This condition will be removed when we stop supporting old libpostproc versions if ! test "$name" = LIBPOSTPROC || test "$postproc_version" = current; then eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }') eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO fi lcname=$(tolower $name) eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak } get_version_old LIBPOSTPROC libpostproc/postprocess.h get_version_old LIBSWRESAMPLE libswresample/swresample.h get_version libavcodec get_version libavdevice get_version libavfilter get_version libavformat get_version libavresample get_version libavutil get_version libswscale cat > $TMPH <>$TMPH test -n "$malloc_prefix" && echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH if enabled yasm; then append config_files $TMPASM printf '' >$TMPASM fi print_config ARCH_ "$config_files" $ARCH_LIST print_config HAVE_ "$config_files" $HAVE_LIST print_config CONFIG_ "$config_files" $CONFIG_LIST \ $CONFIG_EXTRA \ $ALL_COMPONENTS \ cat >>config.mak <> $TMPH echo "endif # FFMPEG_CONFIG_MAK" >> config.mak # Do not overwrite an unchanged config.h to avoid superfluous rebuilds. cp_if_changed $TMPH config.h touch .config enabled yasm && cp_if_changed $TMPASM config.asm cat > $TMPH <> $TMPH <> $TMPH cp_if_changed $TMPH libavutil/avconfig.h test -n "$WARNINGS" && printf "\n$WARNINGS" # build pkg-config files pkgconfig_generate(){ name=$1 shortname=${name#lib}${build_suffix} comment=$2 version=$3 libs=$4 requires=$5 enabled ${name#lib} || return 0 mkdir -p $name cat < $name/$name.pc prefix=$prefix exec_prefix=\${prefix} libdir=$libdir includedir=$incdir Name: $name Description: $comment Version: $version Requires: $(enabled shared || echo $requires) Requires.private: $(enabled shared && echo $requires) Conflicts: Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs) Libs.private: $(enabled shared && echo $libs) Cflags: -I\${includedir} EOF cat < $name/$name-uninstalled.pc prefix= exec_prefix= libdir=\${pcfiledir} includedir=${source_path} Name: $name Description: $comment Version: $version Requires: $requires Conflicts: Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs Cflags: -I\${includedir} EOF } libavfilter_pc_deps="" enabled libavfilter_deps_avcodec && prepend libavfilter_pc_deps "libavcodec = $LIBAVCODEC_VERSION," enabled libavfilter_deps_avformat && prepend libavfilter_pc_deps "libavformat = $LIBAVFORMAT_VERSION," enabled libavfilter_deps_swscale && prepend libavfilter_pc_deps "libswscale = $LIBSWSCALE_VERSION," enabled libavfilter_deps_swresample && prepend libavfilter_pc_deps "libswresample = $LIBSWRESAMPLE_VERSION," enabled libavfilter_deps_postproc && prepend libavfilter_pc_deps "libpostproc = $LIBPOSTPROC_VERSION," libavfilter_pc_deps=${libavfilter_pc_deps%, } libavdevice_pc_deps="libavformat = $LIBAVFORMAT_VERSION" enabled lavfi_indev && prepend libavdevice_pc_deps "libavfilter = $LIBAVFILTER_VERSION," pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBM" pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION" pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION" pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "$libavdevice_pc_deps" pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "$libavfilter_pc_deps" pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" "libavutil = $LIBAVUTIL_VERSION" pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$extralibs" pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION" pkgconfig_generate libswresample "FFmpeg audio rescaling library" "$LIBSWRESAMPLE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"