Path: blob/master/scripts/deps/build-ffmpeg-linux.sh
4212 views
#!/usr/bin/env bash12set -e34if [ "$#" -lt 1 ]; then5echo "Syntax: $0 <output director>"6exit 17fi89for arg in "$@"; do10if [ "$arg" == "-skip-download" ]; then11echo "Not downloading sources."12SKIP_DOWNLOAD=true13shift14elif [ "$arg" == "-skip-cleanup" ]; then15echo "Not removing build directory."16SKIP_CLEANUP=true17shift18elif [ "$arg" == "" ]; then19# Eat empty args.20shift21fi22done2324SCRIPTDIR=$(realpath $(dirname "${BASH_SOURCE[0]}"))25NPROCS="$(getconf _NPROCESSORS_ONLN)"26INSTALLDIR="$1"27if [ "${INSTALLDIR:0:1}" != "/" ]; then28INSTALLDIR="$PWD/$INSTALLDIR"29fi3031mkdir -p deps-build32cd deps-build3334DEPSINSTALLDIR="$PWD/ffmpeg-deps"35echo "Installation directory is $INSTALLDIR"36echo "FFmpeg dependencies directory is $DEPSINSTALLDIR"3738source "$SCRIPTDIR/versions"3940LAME=3.10041LIBVPX=1.15.042FDK_AAC=0fc0e0e0b89de3becd5f099eae725f13eeecc0d143LIBAOM=fc5cf6a132697487fbaa9965b249012e0238768f44LIBOGG=1.3.545LIBVORBIS=1.3.746LIBTHEORA=1.1.147FLAC=1.5.048SPEEX=1.2.049AMF=1.4.3450OPUS=1.5.251SVT_AV1=2.3.052GLSLANG=15.3.053VULKAN_HEADERS=1.4.3155455# Encoder list from freedesktop SDK, which apparently came from Fedora.56# Disabled list: av1_qsv h264_qsv hevc_qsv mjpeg_qsv mpeg2_qsv vc1_qsv vp8_qsv vp9_qsv57# av1_nvenc h264_nvenc hevc_nvenc libxvid libtwolame libopenh264 libgsm libgsm_ms58# ilbc libilbc libopencore_amrnb libopenjpeg libvo_amrwbenc libjxl libcodec2 hap librav1e59FFMPEG_ENCODER_LIST=""\60"a64multi a64multi5 aac libfdk_aac ac3 adpcm_adx "\61"adpcm_argo adpcm_g722 adpcm_g726 adpcm_g726le adpcm_ima_alp adpcm_ima_amv "\62"adpcm_ima_apm adpcm_ima_qt adpcm_ima_ssi adpcm_ima_wav adpcm_ima_ws adpcm_ms "\63"adpcm_swf adpcm_yamaha alac alias_pix amv anull "\64"apng ass asv1 asv2 av1_amf "\65"av1_vaapi ayuv bitpacked bmp cinepak "\66"cljr dca dfpwm dnxhd dpx dvbsub "\67"dvdsub dvvideo exr ffv1 ffvhuff flac "\68"flashsv flashsv2 flv g723_1 gif h261 "\69"h263 h263_v4l2m2m h263p h264_amf "\70"h264_v4l2m2m h264_vaapi h264_vulkan hdr hevc_amf "\71"hevc_v4l2m2m hevc_vaapi hevc_vulkan huffyuv jpegls "\72"jpeg2000 libaom libaom_av1 libmp3lame "\73"libopus libschroedinger libspeex libsvtav1 libtheora "\74"libvorbis libvpx_vp8 libvpx_vp9 libwebp "\75"libwebp_anim mjpeg mjpeg_vaapi mlp "\76"mp2 mp2fixed mpeg1video mpeg2video mpeg2_vaapi "\77"mpeg4 mpeg4_v4l2m2m msmpeg4v2 msmpeg4v3 msvideo1 nellymoser "\78"opus pam pbm pcm_alaw pcm_f32be pcm_f32le "\79"pcm_f64be pcm_f64le pcm_mulaw pcm_s16be pcm_s16be_planar pcm_s16le "\80"pcm_s16le_planar pcm_s24be pcm_s24le pcm_s24le_planar pcm_s32be pcm_s32le "\81"pcm_s32le_planar pcm_s8 pcm_s8_planar pcm_u16be pcm_u16le pcm_u24be "\82"pcm_u24le pcm_u32be pcm_u32le pcm_u8 pcx pgm "\83"pgmyuv phm png ppm qoi qtrle "\84"r10k r210 ra_144 rawvideo roq roq_dpcm "\85"rpza rv10 rv20 s302m sbc sgi "\86"smc snow sonic sonic_ls speedhq srt "\87"ssa subrip sunrast svq1 targa text "\88"tiff truehd tta ttml utvideo v210 "\89"v308 v408 v410 vc1_v4l2m2m vc2 "\90"vnull vorbis vp8_v4l2m2m vp8_vaapi "\91"vp9_vaapi wavpack wbmp webvtt wmav1 wmav2 "\92"wmv1 wmv2 wrapped_avframe xbm xface xsub "\93"xwd y41p yuv4 zlib zmbv"94FFMPEG_ENCODERS=""95for encoder in $FFMPEG_ENCODER_LIST; do96if [ -z "$FFMPEG_ENCODERS" ]; then97FFMPEG_ENCODERS="--enable-encoder=$encoder"98else99FFMPEG_ENCODERS="$FFMPEG_ENCODERS,$encoder"100fi101done102103if [ "$SKIP_DOWNLOAD" != true ]; then104if [ ! -f "ffmpeg-$FFMPEG.tar.xz" ]; then105curl -C - -L -O "https://ffmpeg.org/releases/ffmpeg-$FFMPEG.tar.xz"106fi107if [ ! -f "lame-$LAME.tar.gz" ]; then108curl -C - -L -o "lame-$LAME.tar.gz" "https://sourceforge.net/projects/lame/files/lame/$LAME/lame-$LAME.tar.gz/download"109fi110if [ ! -f "libvpx-$LIBVPX.tar.gz" ]; then111curl -C - -L -o "libvpx-$LIBVPX.tar.gz" "https://github.com/webmproject/libvpx/archive/refs/tags/v$LIBVPX.tar.gz"112fi113if [ ! -f "fdk-aac-stripped-$FDK_AAC.tar.gz" ]; then114curl -C - -L -o "fdk-aac-stripped-$FDK_AAC.tar.gz" "https://gitlab.freedesktop.org/wtaymans/fdk-aac-stripped/-/archive/$FDK_AAC/fdk-aac-stripped-$FDK_AAC.tar.gz"115fi116if [ ! -d "aom" ]; then117git clone https://aomedia.googlesource.com/aom118cd aom119git checkout "$LIBAOM"120cd ..121fi122if [ ! -f "libogg-$LIBOGG.tar.gz" ]; then123curl -C - -L -O "https://downloads.xiph.org/releases/ogg/libogg-$LIBOGG.tar.gz"124fi125if [ ! -f "libvorbis-$LIBVORBIS.tar.gz" ]; then126curl -C - -L -O "https://github.com/xiph/vorbis/releases/download/v$LIBVORBIS/libvorbis-$LIBVORBIS.tar.gz"127fi128if [ ! -f "libtheora-$LIBTHEORA.tar.bz2" ]; then129curl -C - -L -O "https://downloads.xiph.org/releases/theora/libtheora-$LIBTHEORA.tar.bz2"130fi131if [ ! -f "flac-$FLAC.tar.xz" ]; then132curl -C - -L -O "https://downloads.xiph.org/releases/flac/flac-$FLAC.tar.xz"133fi134if [ ! -f "speex-$SPEEX.tar.gz" ]; then135curl -C - -L -O "https://downloads.xiph.org/releases/speex/speex-$SPEEX.tar.gz"136fi137if [ ! -f "AMF-headers.tar.gz" ]; then138curl -C - -L -O "https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v$AMF/AMF-headers.tar.gz"139fi140if [ ! -f "opus-$OPUS.tar.gz" ]; then141curl -C - -L -O "https://downloads.xiph.org/releases/opus/opus-$OPUS.tar.gz"142fi143if [ ! -f "SVT-AV1-$SVT_AV1.tar.gz" ]; then144curl -C - -L -O "https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v$SVT_AV1/SVT-AV1-$SVT_AV1.tar.gz"145fi146if [ ! -f "glslang-$GLSLANG.tar.gz" ]; then147curl -C - -L -o "glslang-$GLSLANG.tar.gz" "https://github.com/KhronosGroup/glslang/archive/refs/tags/$GLSLANG.tar.gz"148fi149if [ ! -f "Vulkan-Headers-$VULKAN_HEADERS.tar.gz" ]; then150curl -C - -L -o "Vulkan-Headers-$VULKAN_HEADERS.tar.gz" "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v$VULKAN_HEADERS.tar.gz"151fi152fi153154cat > SHASUMS <<EOF155$FFMPEG_XZ_HASH ffmpeg-$FFMPEG.tar.xz1565393759308f6d7bc9eb1ed8013c954e03aadb85f0ed6e96f969a5df447b0f79c AMF-headers.tar.gz1577322744f239a0d8460fde84e92cca77f2fe9d7e25a213789659df9e86b696b42 fdk-aac-stripped-$FDK_AAC.tar.gz158f2c1c76592a82ffff8413ba3c4a1299b6c7ab06c734dee03fd88630485c2b920 flac-$FLAC.tar.xz159ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e lame-$LAME.tar.gz1600eb4b4b9420a0f51db142ba3f9c64b333f826532dc0f48c6410ae51f4799b664 libogg-$LIBOGG.tar.gz161b6ae1ee2fa3d42ac489287d3ec34c5885730b1296f0801ae577a35193d3affbc libtheora-$LIBTHEORA.tar.bz21620e982409a9c3fc82ee06e08205b1355e5c6aa4c36bca58146ef399621b0ce5ab libvorbis-$LIBVORBIS.tar.gz163b6ae1ee2fa3d42ac489287d3ec34c5885730b1296f0801ae577a35193d3affbc libtheora-$LIBTHEORA.tar.bz2164e935eded7d81631a538bfae703fd1e293aad1c7fd3407ba00440c95105d2011e libvpx-$LIBVPX.tar.gz16565c1d2f78b9f2fb20082c38cbe47c951ad5839345876e46941612ee87f9a7ce1 opus-$OPUS.tar.gz166eaae8af0ac742dc7d542c9439ac72f1f385ce838392dc849cae4536af9210094 speex-$SPEEX.tar.gz167d4a77bb13a0a2d75c9a17c60260fc7dd3cb48ee8e9ad3a60071f87a923275e93 SVT-AV1-$SVT_AV1.tar.gz168c6c21fe1873c37e639a6a9ac72d857ab63a5be6893a589f34e09a6c757174201 glslang-$GLSLANG.tar.gz16977e3a78db853f8b9c5bc3ddef04e637bef9744e01d6a8c90ebe0ddcd916c0c50 Vulkan-Headers-$VULKAN_HEADERS.tar.gz170EOF171172shasum -a 256 --check SHASUMS173174export PKG_CONFIG_PATH="$INSTALLDIR/lib/pkgconfig:$INSTALLDIR/lib64/pkgconfig:$DEPSINSTALLDIR/lib/pkgconfig:$DEPSINSTALLDIR/lib64/pkgconfig:$PKG_CONFIG_PATH"175176echo "Building LAME"177rm -fr "lame-$LAME"178tar xf "lame-$LAME.tar.gz"179cd "lame-$LAME"180mkdir build181cd build182../configure --prefix="$DEPSINSTALLDIR" --disable-shared --enable-static --with-pic --disable-frontend183make -j "$NPROCS"184make install185cd ../..186187echo "Building libvpx..."188rm -fr "libvpx-$LIBVPX"189tar xf "libvpx-$LIBVPX.tar.gz"190cd "libvpx-$LIBVPX"191mkdir build-ds192cd build-ds193../configure --prefix="$DEPSINSTALLDIR" --disable-shared --enable-static --enable-pic --disable-examples --disable-tools --disable-docs --enable-vp8 --enable-vp9194make -j "$NPROCS"195make install196cd ../..197198echo "Building fdk-aac..."199rm -fr "fdk-aac-stripped-$FDK_AAC"200tar xf "fdk-aac-stripped-$FDK_AAC.tar.gz"201cd "fdk-aac-stripped-$FDK_AAC"202./autogen.sh203mkdir build204cd build205../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic206make -j "$NPROCS"207make install208cd ../..209210echo "Building libaom..."211cd aom212rm -fr build-ds213cmake -B build-ds -G Ninja -DCMAKE_INSTALL_PREFIX="$DEPSINSTALLDIR" -DCMAKE_PREFIX_PATH="$DEPSINSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TESTDATA=OFF -DENABLE_TESTS=OFF -DENABLE_TOOLS=OFF214cmake --build build-ds --parallel215cmake --install build-ds216cd ..217218echo "Building libogg..."219rm -fr "libogg-$LIBOGG"220tar xf "libogg-$LIBOGG.tar.gz"221cd "libogg-$LIBOGG"222mkdir build-ds223cd build-ds224../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic225make -j "$NPROCS"226make install227cd ../..228229echo "Building libvorbis..."230rm -fr "libvorbis-$LIBVORBIS"231tar xf "libvorbis-$LIBVORBIS.tar.gz"232cd "libvorbis-$LIBVORBIS"233mkdir build-ds234cd build-ds235../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic236make -j "$NPROCS"237make install238cd ../..239240echo "Building libtheora..."241rm -fr "libtheora-$LIBTHEORA"242tar xf "libtheora-$LIBTHEORA.tar.bz2"243cd "libtheora-$LIBTHEORA"244mkdir build-ds245cd build-ds246../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-examples --disable-sdltest --disable-vorbistest --disable-oggtest247make -j "$NPROCS"248make install249cd ../..250251echo "Building speex..."252rm -fr "speex-$SPEEX"253tar xf "speex-$SPEEX.tar.gz"254cd "speex-$SPEEX"255mkdir build-ds256cd build-ds257../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic258make -j "$NPROCS"259make install260cd ../..261262echo "Building flac..."263rm -fr "flac-$FLAC"264tar xf "flac-$FLAC.tar.xz"265cd "flac-$FLAC"266mkdir build-ds267cd build-ds268../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-examples --disable-programs269make -j "$NPROCS"270make install271cd ../..272273echo "Installing AMF..."274rm -fr "AMF"275tar xf "AMF-headers.tar.gz"276cd "AMF"277mkdir -p "$DEPSINSTALLDIR/include/AMF"278cp -a core components "$DEPSINSTALLDIR/include/AMF"279cd ..280281echo "Building libopus..."282rm -fr "opus-$OPUS"283tar xf "opus-$OPUS.tar.gz"284cd "opus-$OPUS"285mkdir build286cd build287../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-doc288make -j "$NPROCS"289make install290cd ../..291292echo "Building SVT-AV1..."293rm -fr SVT-AV1-v$SVT_AV1-*294tar xf "SVT-AV1-$SVT_AV1.tar.gz"295cd SVT-AV1-v$SVT_AV1-*296cmake -B build-ds -G Ninja -DCMAKE_INSTALL_PREFIX="$DEPSINSTALLDIR" -DCMAKE_PREFIX_PATH="$DEPSINSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF297cmake --build build-ds --parallel298cmake --install build-ds299cd ..300301echo "Building Vulkan-Headers..."302rm -fr "Vulkan-Headers-$VULKAN_HEADERS"303tar xf "Vulkan-Headers-$VULKAN_HEADERS.tar.gz"304cd "Vulkan-Headers-$VULKAN_HEADERS"305cmake -B build-ds -G Ninja -DCMAKE_INSTALL_PREFIX="$DEPSINSTALLDIR" -DCMAKE_PREFIX_PATH="$DEPSINSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF306cmake --build build-ds --parallel307cmake --install build-ds308cd ..309310echo "Building glslang..."311rm -fr "glslang-$GLSLANG"312tar xf "glslang-$GLSLANG.tar.gz"313cd "glslang-$GLSLANG"314./update_glslang_sources.py315cmake -B build-ds -G Ninja -DCMAKE_INSTALL_PREFIX="$DEPSINSTALLDIR" -DCMAKE_PREFIX_PATH="$DEPSINSTALLDIR" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF -DGLSLANG_TESTS=OFF316cmake --build build-ds --parallel317cmake --install build-ds318cd ..319320echo "Building ffmpeg..."321rm -fr "ffmpeg-$FFMPEG"322tar xf "ffmpeg-$FFMPEG.tar.xz"323cd "ffmpeg-$FFMPEG"324mkdir build325cd build326../configure --prefix="$INSTALLDIR" --disable-static --enable-shared \327--pkg-config-flags="--static" \328--extra-cflags="-I$DEPSINSTALLDIR/include" \329--extra-ldflags="-L$DEPSINSTALLDIR/lib" --extra-ldflags="-L$DEPSINSTALLDIR/lib64" \330--extra-ldsoflags="-Wl,-rpath,XORIGIN" \331--disable-all --disable-autodetect --enable-libmp3lame --enable-libvpx --enable-zlib --enable-libwebp \332--enable-libfdk-aac --enable-libaom --enable-libvorbis --enable-libtheora --enable-libspeex \333--enable-v4l2-m2m --enable-vaapi --enable-amf --enable-libopus --enable-libsvtav1 --enable-vulkan --enable-libglslang \334--enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale \335--enable-muxer=avi,matroska,mov,mp3,mp4,wav \336--enable-protocol=file \337$FFMPEG_ENCODERS338339make -j "$NPROCS"340make install341342# Fix up rpath to point to current directory.343find "$INSTALLDIR" -name 'libavcodec.so' -exec patchelf --set-rpath '$ORIGIN' {} \;344find "$INSTALLDIR" -name 'libavformat.so' -exec patchelf --set-rpath '$ORIGIN' {} \;345find "$INSTALLDIR" -name 'libavutil.so' -exec patchelf --set-rpath '$ORIGIN' {} \;346find "$INSTALLDIR" -name 'libswresample.so' -exec patchelf --set-rpath '$ORIGIN' {} \;347find "$INSTALLDIR" -name 'libswscale.so' -exec patchelf --set-rpath '$ORIGIN' {} \;348349cd ../..350351if [ "$SKIP_CLEANUP" != true ]; then352echo "Cleaning up..."353cd ..354rm -fr deps-build355fi356357358