#!/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 <> $header echo "${pfx}${ucname}=yes" >> $makefile else echo "#define ${pfx}${ucname} 0" >> $header echo "!${pfx}${ucname}=yes" >> $makefile fi 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_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_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 "$@" flags='' libs='' for f; do test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f" done check_cc $($filter_cflags $flags) || return check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $extralibs $libs } 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 "$@" < float foo(float f) { return $func(f); } int main(void){ return 0; } EOF } check_func_headers(){ log check_func_headers "$@" headers=$1 func=$2 shift 2 disable $func incs="" for hdr in $headers; do incs="$incs #include <$hdr>" done check_ld "$@" < #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" func="$2" shift 2 check_func_headers "$headers" $func "$@" && add_extralibs "$@" } check_exec(){ check_ld "$@" && { 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 main(void){ signal(SIGILL, sighandler); signal(SIGFPE, sighandler); signal(SIGSEGV, sighandler); #ifdef SIGBUS signal(SIGBUS, sighandler); #endif { $code } } 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" } 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" || 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 " CONFIG_LIST=" $COMPONENT_LIST aandct avcodec avcore avdevice avfilter avformat avisynth bzlib dct doc dwt dxva2 fastdiv ffmpeg ffplay ffprobe ffserver fft golomb gpl gray h264dsp h264pred hardcoded_tables huffman libdc1394 libdirac libfaac libgsm libmp3lame libnut libopencore_amrnb libopencore_amrwb libopenjpeg librtmp libschroedinger libspeex libtheora libvorbis libvpx libx264 libxavs libxvid lpc lsp mdct memalign_hack mlib mpegaudio_hp network nonfree pic postproc rdft runtime_cpudetect shared small sram static swscale swscale_alpha vaapi vdpau version3 x11grab zlib " THREADS_LIST=' pthreads w32threads ' 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 iwmmxt mmi mmx mmx2 neon ppc4xx sse ssse3 vis ' HAVE_LIST_PUB=' bigendian fast_unaligned ' HAVE_LIST=" $ARCH_EXT_LIST $HAVE_LIST_PUB $THREADS_LIST alsa_asoundlib_h altivec_h arpa_inet_h attribute_may_alias attribute_packed bswap closesocket cmov conio_h dcbzl dev_bktr_ioctl_bt848_h dev_bktr_ioctl_meteor_h dev_ic_bt8xx_h dev_video_meteor_ioctl_meteor_h dev_video_bktr_ioctl_bt848_h dlfcn_h dlopen dos_paths ebp_available ebx_available exp2 exp2f fast_64bit fast_clz fast_cmov fcntl fork getaddrinfo gethrtime GetProcessMemoryInfo GetProcessTimes getrusage gnu_as struct_rusage_ru_maxrss ibm_asm inet_aton inline_asm isatty ldbrx libdc1394_1 libdc1394_2 llrint llrintf local_aligned_16 local_aligned_8 log2 log2f loongson lrint lrintf lzo1x_999_compress machine_ioctl_bt848_h machine_ioctl_meteor_h malloc_h memalign mkstemp pld posix_memalign round roundf sdl sdl_video_size setmode socklen_t soundcard_h poll_h setrlimit strerror_r struct_addrinfo struct_ipv6_mreq struct_sockaddr_in6 struct_sockaddr_sa_len struct_sockaddr_storage symver symver_gnu_asm symver_asm_label sys_mman_h sys_resource_h sys_select_h sys_soundcard_h sys_videoio_h ten_operands termios_h threads truncf vfp_args VirtualAlloc winsock2_h xform_asm yasm " # options emitted with CONFIG_ prefix but not available on command line CONFIG_EXTRA=" avutil gplv3 lgplv3 " CMDLINE_SELECT=" $ARCH_EXT_LIST $CONFIG_LIST $THREADS_LIST asm cross_compile debug extra_warnings logging optimizations stripping yasm " PATHS_LIST=' bindir datadir incdir libdir mandir prefix shlibdir ' CMDLINE_SET=" $PATHS_LIST ar arch as build_suffix cc cpu cross_prefix dep_cc extra_version host_cc host_cflags host_ldflags host_libs host_os ld logfile malloc_prefix nm samples source_path strip sysinclude sysroot target_exec target_os target_path " CMDLINE_APPEND=" extra_cflags " # code dependency declarations # architecture extensions armv5te_deps="arm" armv6_deps="arm" armv6t2_deps="arm" armvfp_deps="arm" iwmmxt_deps="arm" neon_deps="arm" 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" 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" need_memalign="altivec neon sse" inline_asm_deps="!tms470" symver_if_any="symver_asm_label symver_gnu_asm" # subsystems dct_select="rdft" mdct_select="fft" rdft_select="fft" # decoders / encoders / hardware accelerators aac_decoder_select="mdct rdft" aac_encoder_select="mdct" ac3_decoder_select="mdct ac3_parser" alac_encoder_select="lpc" amrnb_decoder_select="lsp" atrac1_decoder_select="mdct" atrac3_decoder_select="mdct" binkaudio_dct_decoder_select="mdct rdft dct" binkaudio_rdft_decoder_select="mdct rdft" cavs_decoder_select="golomb" cook_decoder_select="mdct" cscd_decoder_suggest="zlib" dca_decoder_select="mdct" dnxhd_encoder_select="aandct" dxa_decoder_select="zlib" eac3_decoder_select="ac3_decoder" 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" 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_decoder_select="golomb h264dsp h264pred" h264_dxva2_hwaccel_deps="dxva2api_h" h264_dxva2_hwaccel_select="dxva2 h264_decoder" h264_vaapi_hwaccel_select="vaapi" h264_vdpau_decoder_select="vdpau h264_decoder" imc_decoder_select="fft mdct" 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" mp1float_decoder_select="dct" mp2float_decoder_select="dct" mp3adufloat_decoder_select="dct" mp3float_decoder_select="dct" mp3on4float_decoder_select="dct" mpeg1video_encoder_select="aandct" mpeg2video_encoder_select="aandct" mpeg4_decoder_select="h263_decoder mpeg4video_parser" mpeg4_encoder_select="h263_encoder" mpeg_vdpau_decoder_select="vdpau mpegvideo_decoder" mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder" mpeg2_dxva2_hwaccel_deps="dxva2api_h" mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder" mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder" mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder" mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder" mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h" mpeg_xvmc_decoder_select="mpegvideo_decoder" 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" nellymoser_encoder_select="mdct" png_decoder_select="zlib" png_encoder_select="zlib" qcelp_decoder_select="lsp" qdm2_decoder_select="mdct rdft" ra_144_encoder_select="lpc" rv10_decoder_select="h263_decoder" rv10_encoder_select="h263_encoder" rv20_decoder_select="h263_decoder" rv20_encoder_select="h263_encoder" rv30_decoder_select="golomb h264pred" rv40_decoder_select="golomb h264pred" 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 h264dsp h264pred" svq3_decoder_suggest="zlib" theora_decoder_select="vp3_decoder" tiff_decoder_suggest="zlib" tiff_encoder_suggest="zlib" truehd_decoder_select="mlp_decoder" tscc_decoder_select="zlib" twinvq_decoder_select="mdct lsp" vc1_decoder_select="h263_decoder" vc1_dxva2_hwaccel_deps="dxva2api_h DXVA_PictureParameters_wDecodedPictureIndex" vc1_dxva2_hwaccel_select="dxva2 vc1_decoder" vc1_vaapi_hwaccel_select="vaapi vc1_decoder" vc1_vdpau_decoder_select="vdpau 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" wmapro_decoder_select="mdct" wmav1_decoder_select="mdct" wmav1_encoder_select="mdct" wmav2_decoder_select="mdct" wmav2_encoder_select="mdct" wmavoice_decoder_select="lsp rdft dct mdct" 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_dxva2_hwaccel_select="vc1_dxva2_hwaccel" wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel" wmv3_vdpau_decoder_select="vc1_vdpau_decoder" zlib_decoder_select="zlib" zlib_encoder_select="zlib" zmbv_decoder_select="zlib" zmbv_encoder_select="zlib" vaapi_deps="va_va_h" vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" # parsers h264_parser_select="golomb h264dsp h264pred" # external libraries libdirac_decoder_deps="libdirac !libschroedinger" libdirac_encoder_deps="libdirac" libfaac_encoder_deps="libfaac" libgsm_decoder_deps="libgsm" libgsm_encoder_deps="libgsm" libgsm_ms_decoder_deps="libgsm" libgsm_ms_encoder_deps="libgsm" 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" libschroedinger_decoder_deps="libschroedinger" libschroedinger_encoder_deps="libschroedinger" libspeex_decoder_deps="libspeex" libtheora_encoder_deps="libtheora" libvorbis_encoder_deps="libvorbis" libvpx_decoder_deps="libvpx" libvpx_encoder_deps="libvpx" libx264_encoder_deps="libx264" libxavs_encoder_deps="libxavs" libxvid_encoder_deps="libxvid" # demuxers / muxers ac3_demuxer_deps="ac3_parser" asf_stream_muxer_select="asf_muxer" avisynth_demuxer_deps="avisynth" dirac_demuxer_deps="dirac_parser" eac3_demuxer_select="ac3_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_deps="mpegaudio_parser" mp4_muxer_select="mov_muxer" mpegtsraw_demuxer_select="mpegts_demuxer" mxf_d10_muxer_select="mxf_muxer" ogg_demuxer_select="golomb" psp_muxer_select="mov_muxer" rtsp_demuxer_deps="sdp_demuxer" rtsp_muxer_deps="sdp_demuxer" rtsp_muxer_select="rtp_muxer" sdp_demuxer_deps="rtp_protocol mpegts_demuxer" sdp_demuxer_select="asf_demuxer rm_demuxer" 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" dv1394_indev_deps="dv1394 dv_demuxer" jack_indev_deps="jack_jack_h" libdc1394_indev_deps="libdc1394" oss_indev_deps_any="soundcard_h sys_soundcard_h" oss_outdev_deps_any="soundcard_h sys_soundcard_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" x11_grab_device_indev_extralibs="-lX11 -lXext -lXfixes" # protocols gopher_protocol_deps="network" http_protocol_deps="network" http_protocol_select="tcp_protocol" mmsh_protocol_select="http_protocol" mmst_protocol_deps="network" rtmp_protocol_select="tcp_protocol" rtp_protocol_select="udp_protocol" tcp_protocol_deps="network" udp_protocol_deps="network" # libraries avdevice_deps="avcodec avformat" avformat_deps="avcodec" # programs ffmpeg_deps="avcodec avformat swscale" ffmpeg_select="buffer_filter" ffplay_deps="avcodec avformat swscale sdl" ffplay_select="rdft" ffprobe_deps="avcodec avformat" ffserver_deps="avformat ffm_muxer 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 eval ${name}_test_deps="'${dep}$suf1 ${dep}$suf2'" done done } set_ne_test_deps(){ eval ${1}_be_test_deps="bigendian" eval ${1}_le_test_deps="!bigendian" } test_deps _encoder _decoder \ ac3 \ adpcm_g726=g726 \ adpcm_ima_qt \ adpcm_ima_wav \ adpcm_ms \ adpcm_swf \ adpcm_yamaha=adpcm_yam \ alac \ asv1 \ asv2 \ bmp \ dnxhd="dnxhd_1080i dnxhd_720p dnxhd_720p_rd" \ dvvideo="dv dv50" \ ffv1 \ flac \ flashsv \ flv \ gif \ h261 \ h263="h263 h263p" \ huffyuv \ jpegls \ mjpeg="jpg mjpeg ljpeg" \ mp2 \ mpeg1video="mpeg mpeg1b" \ mpeg2video="mpeg2 mpeg2thread" \ mpeg4="mpeg4 mpeg4adv mpeg4nr mpeg4thread error rc" \ msmpeg4v3=msmpeg4 \ msmpeg4v2 \ pbm=pbmpipe \ pcx \ pgm="pgm pgmpipe" \ ppm="ppm ppmpipe" \ rawvideo="rgb yuv" \ roq \ rv10 \ rv20 \ sgi \ snow="snow snowll" \ svq1 \ targa=tga \ tiff \ wmav1 \ wmav2 \ wmv1 \ wmv2 \ test_deps _muxer _demuxer \ aiff \ pcm_alaw=alaw \ asf \ au \ avi \ dv=dv_fmt \ ffm \ flv=flv_fmt \ gxf \ matroska=mkv \ mmf \ mov \ pcm_mulaw=mulaw \ mxf \ nut \ ogg \ rawvideo=pixfmt \ rm \ swf \ mpegts=ts \ voc \ wav \ yuv4mpegpipe=yuv4mpeg \ mpg_test_deps="mpeg1system_muxer mpegps_demuxer" set_ne_test_deps pixdesc set_ne_test_deps pixfmts_crop set_ne_test_deps pixfmts_hflip set_ne_test_deps pixfmts_null set_ne_test_deps pixfmts_pad set_ne_test_deps pixfmts_scale set_ne_test_deps pixfmts_vflip # 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" # toolchain ar_default="ar" cc_default="gcc" cc_version=\"unknown\" host_cc_default="gcc" ln_s="ln -sf" nm_default="nm" objformat="elf" ranlib="ranlib" strip_default="strip" yasmexe="yasm" nogas=":" nm_opts='-g' # machine arch_default=$(uname -m) cpu="generic" # OS target_os_default=$(tolower $(uname -s)) host_os=$target_os_default # configurable options enable avcodec enable avcore enable avdevice enable avfilter enable avformat enable avutil enable asm enable debug enable doc enable fastdiv enable ffmpeg enable ffplay enable ffprobe enable ffserver enable mpegaudio_hp enable network enable optimizations enable protocols enable static enable stripping enable swscale 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)"' CC_O='-o $@' host_cflags='-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -O3 -g -Wall' 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 source_path="$(dirname "$0")" enable source_path_used if test -f configure; then source_path="$(pwd)" disable source_path_used else source_path="$(cd "$source_path"; 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) find_tests(){ map "echo ${2}\${v}_test" $(ls "$source_path"/tests/ref/$1 | grep -v '[^-a-z0-9_]') } ACODEC_TESTS=$(find_tests acodec) VCODEC_TESTS=$(find_tests vsynth1) LAVF_TESTS=$(find_tests lavf) LAVFI_TESTS=$(find_tests lavfi) SEEK_TESTS=$(find_tests seek seek_) pcm_test_deps=$(map 'echo ${v%_*}_decoder $v' $(filter pcm_* $ENCODER_LIST)) for n in $COMPONENT_LIST; do v=$(toupper ${n%s})_LIST eval enable \$$v eval ${n}_if_any="\$$v" done enable $ARCH_EXT_LIST $ACODEC_TESTS $VCODEC_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_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 } 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-*=*|--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 ar_default="${cross_prefix}${ar_default}" cc_default="${cross_prefix}${cc_default}" nm_default="${cross_prefix}${nm_default}" ranlib="${cross_prefix}${ranlib}" strip_default="${cross_prefix}${strip_default}" sysinclude_default="${sysroot}/usr/include" set_default cc nm strip sysinclude enabled cross_compile || host_cc_default=$cc set_default host_cc exesuf() { case $1 in mingw32*|cygwin*|*-dos|freedos|opendos|os/2*) echo .exe ;; esac } EXESUF=$(exesuf $target_os) HOSTEXESUF=$(exesuf $host_os) # set temporary file name : ${TMPDIR:=$TEMPDIR} : ${TMPDIR:=$TMP} : ${TMPDIR:=/tmp} if ! check_cmd type mktemp; 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 trap exit HUP INT TERM tmpfile TMPC .c tmpfile TMPE $EXESUF tmpfile TMPH .h tmpfile TMPO .o tmpfile TMPS .S tmpfile TMPV .ver tmpfile TMPSH .sh unset -f mktemp # make sure we can execute files in $TMPDIR cat > $TMPSH 2>> $logfile <> $logfile 2>&1 if ! $TMPSH >> $logfile 2>&1; then cat <&1 | grep -qi ^gcc; then cc_type=gcc cc_version=__VERSION__ gcc_extra_ver=$(expr "$($cc --version | head -n1)" : '.*\((.*)\)') cc_ident="gcc $($cc -dumpversion) $gcc_extra_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) 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' 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' 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; 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' 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 "$AS_DEPFLAGS" || ASDEP=$DEPEND_CMD add_cflags $extra_cflags add_asflags $extra_cflags if test -n "$sysroot"; then case "$cc_type" in gcc) add_cppflags --sysroot="$sysroot" add_ldflags --sysroot="$sysroot" ;; tms470) add_cppflags -I"$sysinclude" add_ldflags --sysroot="$sysroot" ;; clang) add_cppflags -isysroot "$sysroot" add_ldflags -isysroot "$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) check_native(){ $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return sed -n "/$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*) 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) arch="ppc" ;; ppc64|powerpc64) arch="ppc" subarch="ppc64" ;; s390|s390x) arch="s390" ;; sh4|sh) arch="sh4" ;; sun4u|sparc64) arch="sparc" subarch="sparc64" ;; i[3-6]86|i86pc|BePC|x86_64|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|power4*) cpuflags="-mcpu=970 -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 ;; i686|pentiumpro) cpuflags="-march=$cpu" enable cmov enable fast_cmov disable mmx ;; # targets that do support conditional mov (cmov) 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*) 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" 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 case "$arch" in alpha|ia64|mips|parisc|sparc) spic=$shared ;; x86) subarch="x86_32" check_cc < 3) \ || (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" || die "ERROR: MinGW runtime version must be >= 3.15." ;; 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 ;; *-dos|freedos|opendos) disable ffplay ffserver disable $INDEV_LIST $OUTDEV_LIST network_extralibs="-lsocket" objformat="coff" enable dos_paths ;; linux) enable dv1394 ;; irix*) target_os=irix ranlib="echo ignoring ranlib" ;; os/2*) strip="lxlite" ln_s="cp -f" 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_CMD='install -m 644 $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib "$(LIBDIR)"' SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.a "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.lib' enable dos_paths ;; gnu/kfreebsd) ;; gnu) ;; none) ;; *) die "Unknown OS '$target_os'." ;; esac 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.2.f"; } enabled libschroedinger && add_cflags $(pkg-config --cflags schroedinger-1.0) && require libschroedinger schroedinger/schro.h schro_init $(pkg-config --libs schroedinger-1.0) enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg 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 -lvpx || die "ERROR: libvpx encoder version must be >=0.9.1"; } } enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 && { check_cpp_condition x264.h "X264_BUILD >= 98" || die "ERROR: libx264 version must be >= 0.98."; } enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled mlib && require mediaLib mlib_types.h mlib_VectorSub_S16_U8_Mod -lmlib # 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 "${SDL_CONFIG}" --version > /dev/null 2>&1; then sdl_cflags=$("${SDL_CONFIG}" --cflags) sdl_libs=$("${SDL_CONFIG}" --libs) check_func_headers SDL.h SDL_Init $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 texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html if enabled network; then check_type "sys/types.h sys/socket.h" socklen_t check_type netdb.h "struct addrinfo" check_type netinet/in.h "struct ipv6_mreq" check_type netinet/in.h "struct sockaddr_in6" check_type "sys/types.h sys/socket.h" "struct sockaddr_storage" check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len # Prefer arpa/inet.h over winsock2 if check_header arpa/inet.h ; then check_func closesocket elif check_header winsock2.h ; then check_func_headers winsock2.h closesocket -lws2 && \ network_extralibs="-lws2" || \ { check_func_headers winsock2.h closesocket -lws2_32 && \ network_extralibs="-lws2_32"; } check_type ws2tcpip.h socklen_t check_type ws2tcpip.h "struct addrinfo" check_type ws2tcpip.h "struct ipv6_mreq" check_type ws2tcpip.h "struct sockaddr_in6" check_type ws2tcpip.h "struct sockaddr_storage" check_struct winsock2.h "struct sockaddr" sa_len else disable network fi fi check_header linux/videodev.h check_header linux/videodev2.h 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 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 sys/soundcard.h 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 enabled x11grab && check_header X11/Xlib.h && check_header X11/extensions/XShm.h && check_header X11/extensions/Xfixes.h && check_func XOpenDisplay -lX11 && check_func XShmCreateImage -lX11 -lXext && check_func XFixesGetCursorImage -lX11 -lXext -lXfixes 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" # 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 -Wdisabled-optimization check_cflags -Wpointer-arith check_cflags -Wredundant-decls check_cflags -Wno-pointer-sign check_cflags -Wcast-qual check_cflags -Wwrite-strings check_cflags -Wtype-limits check_cflags -Wundef check_cflags -Wmissing-prototypes enabled extra_warnings && check_cflags -Winline # add some linker flags check_ldflags -Wl,--warn-common check_ldflags -Wl,--as-needed check_ldflags '-Wl,-rpath-link,\$(BUILD_ROOT)/libpostproc -Wl,-rpath-link,\$(BUILD_ROOT)/libswscale -Wl,-rpath-link,\$(BUILD_ROOT)/libavfilter -Wl,-rpath-link,\$(BUILD_ROOT)/libavdevice -Wl,-rpath-link,\$(BUILD_ROOT)/libavformat -Wl,-rpath-link,\$(BUILD_ROOT)/libavcodec -Wl,-rpath-link,\$(BUILD_ROOT)/libavcore -Wl,-rpath-link,\$(BUILD_ROOT)/libavutil' check_ldflags -Wl,-Bsymbolic echo "X{};" > $TMPV if test_ldflags -Wl,--version-script,$TMPV; then append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver' check_cc < config.mak <> config.mak eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak } get_version LIBSWSCALE libswscale/swscale.h get_version LIBPOSTPROC libpostproc/postprocess.h get_version LIBAVCODEC libavcodec/avcodec.h get_version LIBAVCORE libavcore/avcore.h get_version LIBAVDEVICE libavdevice/avdevice.h get_version LIBAVFORMAT libavformat/avformat.h get_version LIBAVUTIL libavutil/avutil.h get_version LIBAVFILTER libavfilter/avfilter.h cat > $TMPH <>$TMPH if enabled small || disabled optimizations; then echo "#undef av_always_inline" >> $TMPH echo "#define av_always_inline" >> $TMPH fi print_config ARCH_ $TMPH config.mak $ARCH_LIST print_config HAVE_ $TMPH config.mak $HAVE_LIST print_config CONFIG_ $TMPH config.mak $CONFIG_LIST \ $CONFIG_EXTRA \ $DECODER_LIST \ $ENCODER_LIST \ $HWACCEL_LIST \ $PARSER_LIST \ $BSF_LIST \ $DEMUXER_LIST \ $MUXER_LIST \ $FILTER_LIST \ $PROTOCOL_LIST \ $INDEV_LIST \ $OUTDEV_LIST \ 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 cat > $TMPH <> $TMPH cp_if_changed $TMPH libavutil/avconfig.h echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$FFMPEG_CONFIGURATION" >config.fate 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 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 } pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" pkgconfig_generate libavcore "FFmpeg multimedia shared core utilities library" "$LIBAVCORE_VERSION" "" "libavutil = $LIBAVUTIL_VERSION" pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavcore = $LIBAVCORE_VERSION" pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION" pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION" pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "libavcore = $LIBAVCORE_VERSION" pkgconfig_generate libpostproc "FFmpeg post processing library" "$LIBPOSTPROC_VERSION" pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"