The following libraries provide various hardware acceleration features:
--disable-audiotoolbox disable Apple AudioToolbox code [autodetect]
- --enable-cuda enable dynamically linked Nvidia CUDA code [no]
- --enable-cuvid enable Nvidia CUVID support [autodetect]
+ --disable-cuda disable dynamically linked Nvidia CUDA code [autodetect]
+ --disable-cuvid disable Nvidia CUVID support [autodetect]
--disable-d3d11va disable Microsoft Direct3D 11 video acceleration code [autodetect]
--disable-dxva2 disable Microsoft DirectX 9 video acceleration code [autodetect]
--enable-libmfx enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no]
done
}
+request(){
+ for var in $*; do
+ eval ${var}_requested=yes
+ eval $var=
+ done
+}
+
enable(){
set_all yes $*
}
done
}
+requested(){
+ test "${1#!}" = "$1" && op='=' || op=!=
+ eval test "x\$${1#!}_requested" $op "xyes"
+}
+
enabled(){
test "${1#!}" = "$1" && op='=' || op=!=
eval test "x\$${1#!}" $op "xyes"
[ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
[ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
- enabled_all $dep_all || disable $cfg
- enabled_any $dep_any || disable $cfg
- disabled_any $dep_sel && disable $cfg
+ enabled_all $dep_all || { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but not all dependencies are satisfied: $dep_all"; }
+ enabled_any $dep_any || { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but not any dependency is satisfied: $dep_any"; }
+ disabled_any $dep_sel && { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but some selected dependency is unsatisfied: $dep_sel"; }
if enabled $cfg; then
enable_deep $dep_sel
EOF
}
+test_cflags_cpp(){
+ log test_cflags_cpp "$@"
+ flags=$1
+ condition=$2
+ shift 2
+ set -- $($cflags_filter "$flags")
+ check_cpp "$@" <<EOF
+#if !($condition)
+#error "unsatisfied condition: $condition"
+#endif
+EOF
+}
+
check_lib(){
log check_lib "$@"
header="$1"
transcode_aac_example
transcoding_example
"
+EXTERNAL_AUTODETECT_LIBRARY_LIST="
+ bzlib
+ iconv
+ libxcb
+ libxcb_shm
+ libxcb_shape
+ libxcb_xfixes
+ lzma
+ schannel
+ sdl
+ sdl2
+ securetransport
+ xlib
+ zlib
+"
EXTERNAL_LIBRARY_LIST="
+ $EXTERNAL_AUTODETECT_LIBRARY_LIST
avisynth
- bzlib
chromaprint
crystalhd
decklink
gcrypt
gmp
gnutls
- iconv
jni
ladspa
libass
libx264
libx265
libxavs
- libxcb
- libxcb_shm
- libxcb_shape
- libxcb_xfixes
libxvid
libzimg
libzmq
libzvbi
- lzma
mediacodec
netcdf
openal
opencl
opengl
openssl
- schannel
- sdl
- sdl2
- securetransport
videotoolbox
x11grab
- xlib
- zlib
"
-
-HWACCEL_LIBRARY_LIST="
+HWACCEL_AUTODETECT_LIBRARY_LIST="
audiotoolbox
cuda
cuvid
d3d11va
dxva2
- libmfx
- libnpp
- mmal
nvenc
- omx
vaapi
vda
vdpau
xvmc
"
+HWACCEL_LIBRARY_LIST="
+ $HWACCEL_AUTODETECT_LIBRARY_LIST
+ libmfx
+ libnpp
+ mmal
+ omx
+"
+
DOCUMENT_LIST="
doc
htmlpages
atomics_win32
"
+AUTODETECT_LIBS="
+ $EXTERNAL_AUTODETECT_LIBRARY_LIST
+ $HWACCEL_AUTODETECT_LIBRARY_LIST
+ $THREADS_LIST
+"
+
ARCH_LIST="
aarch64
alpha
asm_types_h
cdio_paranoia_h
cdio_paranoia_paranoia_h
+ cuda_h
dispatch_dispatch_h
dev_bktr_ioctl_bt848_h
dev_bktr_ioctl_meteor_h
poll_h
sndio_h
soundcard_h
+ stdatomic_h
sys_mman_h
sys_param_h
sys_resource_h
# hardware accelerators
crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
+cuda_deps_any="dlopen LoadLibrary"
cuvid_deps="cuda"
d3d11va_deps="d3d11_h dxva_h ID3D11VideoDecoder ID3D11VideoContext"
dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode"
+dxva2_extralibs="-luser32"
vaapi_deps="va_va_h"
vda_framework_deps="VideoDecodeAcceleration_VDADecoder_h"
vda_framework_extralibs="-framework VideoDecodeAcceleration"
vp9_dxva2_hwaccel_select="vp9_decoder"
vp9_mediacodec_decoder_deps="mediacodec"
vp9_mediacodec_hwaccel_deps="mediacodec"
-vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9"
+vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9_bit_depth"
vp9_vaapi_hwaccel_select="vp9_decoder"
wmv3_crystalhd_decoder_select="crystalhd"
wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel"
hwupload_cuda_filter_deps="cuda"
scale_npp_filter_deps="cuda libnpp"
+nvenc_deps="cuda"
nvenc_deps_any="dlopen LoadLibrary"
nvenc_encoder_deps="nvenc"
h264_cuvid_decoder_deps="cuda cuvid"
opus_muxer_select="ogg_muxer"
psp_muxer_select="mov_muxer"
rtp_demuxer_select="sdp_demuxer"
+rtp_muxer_select="golomb"
rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
rtsp_demuxer_select="http_protocol rtpdec"
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
delogo_filter_deps="gpl"
deshake_filter_select="pixelutils"
drawtext_filter_deps="libfreetype"
-ebur128_filter_deps="gpl"
eq_filter_deps="gpl"
fftfilt_filter_deps="avcodec"
fftfilt_filter_select="rdft"
sws_max_filter_size_default=256
set_default sws_max_filter_size
-# Enable platform codecs by default.
-enable audiotoolbox
-
-# Enable hwaccels by default.
-enable d3d11va dxva2 vaapi vda vdpau videotoolbox_hwaccel xvmc
-enable xlib
-
-enable nvenc vda_framework videotoolbox videotoolbox_encoder
-
# build settings
SHFLAGS='-shared -Wl,-soname,$$(@F)'
LIBPREF="lib"
eval "export $e"
done
+# Mark specifically enabled, but normally autodetected libraries as requested.
+for lib in $AUTODETECT_LIBS; do
+ enabled $lib && request $lib
+done
+
+# Enable platform codecs by default.
+enable_weak audiotoolbox
+
+# Enable hwaccels by default.
+enable_weak d3d11va dxva2 vaapi vda vdpau videotoolbox_hwaccel xvmc
+enable_weak xlib
+
+enable_weak cuda cuvid nvenc vda_framework videotoolbox videotoolbox_encoder
+
disabled logging && logfile=/dev/null
# Disable all the library-specific components if the library itself
;;
*-tsan)
cc_default="${toolchain%-tsan}"
- add_cflags -fsanitize=thread -pie
+ add_cflags -fsanitize=thread -fPIE
add_ldflags -fsanitize=thread -pie
case "$toolchain" in
gcc-tsan)
add_cppflags -D_ISOC99_SOURCE
add_cxxflags -D__STDC_CONSTANT_MACROS
add_cxxflags -std=c++98
-check_cflags -std=c99
+
+# some compilers silently accept -std=c11, so we also need to check that the
+# version macro is defined properly
+if test_cflags_cpp -std=c11 "__STDC_VERSION__ >= 201112L"; then
+ add_cflags -std=c11
+else
+ check_cflags -std=c99
+fi
+
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
#include <stdlib.h>
EOF
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab
-die_license_disabled nonfree cuda
-die_license_disabled nonfree cuvid
die_license_disabled nonfree libnpp
enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
enabled gpl && die_license_disabled_gpl nonfree openssl
fi
avisynth_demuxer_extralibs='$ldl'
+cuda_extralibs='$ldl'
decklink_outdev_extralibs="$decklink_outdev_extralibs $ldl"
decklink_indev_extralibs="$decklink_indev_extralibs $ldl"
frei0r_filter_extralibs='$ldl'
check_header X11/extensions/XvMClib.h
check_header asm/types.h
+# it seems there are versions of clang in some distros that try to use the
+# gcc headers, which explodes for stdatomic
+# so we also check that atomics actually work here
+check_builtin stdatomic_h stdatomic.h "atomic_int foo; atomic_store(&foo, 0)"
+
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602
check_type "va/va.h" "VAPictureParameterBufferHEVC"
-check_type "va/va.h" "VADecPictureParameterBufferVP9"
+check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
check_type "va/va.h va/va_vpp.h" "VAProcPipelineParameterBuffer"
check_type "va/va.h va/va_enc_h264.h" "VAEncPictureParameterBufferH264"
check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
eval check_complexfunc $func \${${func}_args:-1}
done
-# Enable CUVID by default if CUDA is enabled
-if enabled cuda && ! disabled cuvid; then
- enable cuvid
-fi
-
# these are off by default, so fail if requested and not available
enabled avfoundation_indev && { check_header_objcc AVFoundation/AVFoundation.h || disable avfoundation_indev; }
enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActiveDisplayList -framework CoreGraphics ||
check_lib2 ApplicationServices/ApplicationServices.h CGGetActiveDisplayList -framework ApplicationServices; }
-enabled cuda && { check_lib2 cuda.h cuInit -lcuda ||
- die "ERROR: CUDA not found"; }
-enabled cuvid && { add_cflags -I$source_path;
- check_lib2 "compat/cuda/cuviddec.h" cuvidCreateDecoder -lnvcuvid ||
- die "ERROR: CUVID not found"; } &&
- { enabled cuda ||
+enabled cuda && check_header cuda.h # this is not a dependency
+enabled cuvid && { enabled cuda ||
die "ERROR: CUVID requires CUDA"; }
enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
enabled coreimage_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimage_filter; }
die "ERROR: libx265 version must be >= 68."; }
enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs
enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore
-enabled libzimg && require_pkg_config zimg zimg.h zimg_get_api_version
+enabled libzimg && require_pkg_config "zimg >= 2.3.0" zimg.h zimg_get_api_version
enabled libzmq && require_pkg_config libzmq zmq.h zmq_ctx_new
enabled libzvbi && require libzvbi libzvbi.h vbi_decoder_new -lzvbi &&
{ check_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" ||
sdl2_libs="$sdl2_libs -mconsole"
fi
fi
-enabled sdl2 && add_cflags $sdl2_cflags && add_extralibs $sdl2_libs
+enabled sdl2 && enable sdl && add_cflags $sdl2_cflags && add_extralibs $sdl2_libs
disabled securetransport || { check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
check_lib2 "Security/SecureTransport.h Security/Security.h" "SSLCreateContext SecItemImport" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
mingw32*|mingw64*|win32|win64|linux|cygwin*)
;;
*)
- disable nvenc
+ disable cuda cuvid nvenc
;;
esac
else
- disable nvenc
+ disable cuda cuvid nvenc
fi
enabled nvenc &&
EOF
fi
check_func strtoll || add_cflags -Dstrtoll=_strtoi64
+ check_func strtoull || add_cflags -Dstrtoull=_strtoui64
# the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
# this flag should be re-checked on newer compiler releases and put under a
# version check once its fixed
fi
enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
- prepend ffmpeg_libs $($ldflags_filter "-lole32" "-luser32") &&
+ prepend ffmpeg_libs $($ldflags_filter "-lole32") &&
enable dxva2_lib
! enabled_any memalign posix_memalign aligned_malloc &&
fi
done
+if disabled stdatomic_h; then
+ if enabled atomics_gcc; then
+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/gcc'
+ elif enabled atomics_win32; then
+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/win32'
+ elif enabled atomics_suncc; then
+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/suncc'
+ elif enabled pthreads; then
+ add_compat atomics/pthread/stdatomic.o
+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/pthread'
+ else
+ enabled threads && die "Threading is enabled, but no atomics are available"
+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/dummy'
+ fi
+fi
+
+# Check if requested libraries were found.
+for lib in $AUTODETECT_LIBS; do
+ requested $lib && ! enabled $lib && die "ERROR: $lib requested but not found";
+done
+
enabled zlib && add_cppflags -DZLIB_CONST
# conditional library dependencies, in linking order