Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/scripts/deps/build-ffmpeg-linux.sh
4212 views
1
#!/usr/bin/env bash
2
3
set -e
4
5
if [ "$#" -lt 1 ]; then
6
echo "Syntax: $0 <output director>"
7
exit 1
8
fi
9
10
for arg in "$@"; do
11
if [ "$arg" == "-skip-download" ]; then
12
echo "Not downloading sources."
13
SKIP_DOWNLOAD=true
14
shift
15
elif [ "$arg" == "-skip-cleanup" ]; then
16
echo "Not removing build directory."
17
SKIP_CLEANUP=true
18
shift
19
elif [ "$arg" == "" ]; then
20
# Eat empty args.
21
shift
22
fi
23
done
24
25
SCRIPTDIR=$(realpath $(dirname "${BASH_SOURCE[0]}"))
26
NPROCS="$(getconf _NPROCESSORS_ONLN)"
27
INSTALLDIR="$1"
28
if [ "${INSTALLDIR:0:1}" != "/" ]; then
29
INSTALLDIR="$PWD/$INSTALLDIR"
30
fi
31
32
mkdir -p deps-build
33
cd deps-build
34
35
DEPSINSTALLDIR="$PWD/ffmpeg-deps"
36
echo "Installation directory is $INSTALLDIR"
37
echo "FFmpeg dependencies directory is $DEPSINSTALLDIR"
38
39
source "$SCRIPTDIR/versions"
40
41
LAME=3.100
42
LIBVPX=1.15.0
43
FDK_AAC=0fc0e0e0b89de3becd5f099eae725f13eeecc0d1
44
LIBAOM=fc5cf6a132697487fbaa9965b249012e0238768f
45
LIBOGG=1.3.5
46
LIBVORBIS=1.3.7
47
LIBTHEORA=1.1.1
48
FLAC=1.5.0
49
SPEEX=1.2.0
50
AMF=1.4.34
51
OPUS=1.5.2
52
SVT_AV1=2.3.0
53
GLSLANG=15.3.0
54
VULKAN_HEADERS=1.4.315
55
56
# Encoder list from freedesktop SDK, which apparently came from Fedora.
57
# Disabled list: av1_qsv h264_qsv hevc_qsv mjpeg_qsv mpeg2_qsv vc1_qsv vp8_qsv vp9_qsv
58
# av1_nvenc h264_nvenc hevc_nvenc libxvid libtwolame libopenh264 libgsm libgsm_ms
59
# ilbc libilbc libopencore_amrnb libopenjpeg libvo_amrwbenc libjxl libcodec2 hap librav1e
60
FFMPEG_ENCODER_LIST=""\
61
"a64multi a64multi5 aac libfdk_aac ac3 adpcm_adx "\
62
"adpcm_argo adpcm_g722 adpcm_g726 adpcm_g726le adpcm_ima_alp adpcm_ima_amv "\
63
"adpcm_ima_apm adpcm_ima_qt adpcm_ima_ssi adpcm_ima_wav adpcm_ima_ws adpcm_ms "\
64
"adpcm_swf adpcm_yamaha alac alias_pix amv anull "\
65
"apng ass asv1 asv2 av1_amf "\
66
"av1_vaapi ayuv bitpacked bmp cinepak "\
67
"cljr dca dfpwm dnxhd dpx dvbsub "\
68
"dvdsub dvvideo exr ffv1 ffvhuff flac "\
69
"flashsv flashsv2 flv g723_1 gif h261 "\
70
"h263 h263_v4l2m2m h263p h264_amf "\
71
"h264_v4l2m2m h264_vaapi h264_vulkan hdr hevc_amf "\
72
"hevc_v4l2m2m hevc_vaapi hevc_vulkan huffyuv jpegls "\
73
"jpeg2000 libaom libaom_av1 libmp3lame "\
74
"libopus libschroedinger libspeex libsvtav1 libtheora "\
75
"libvorbis libvpx_vp8 libvpx_vp9 libwebp "\
76
"libwebp_anim mjpeg mjpeg_vaapi mlp "\
77
"mp2 mp2fixed mpeg1video mpeg2video mpeg2_vaapi "\
78
"mpeg4 mpeg4_v4l2m2m msmpeg4v2 msmpeg4v3 msvideo1 nellymoser "\
79
"opus pam pbm pcm_alaw pcm_f32be pcm_f32le "\
80
"pcm_f64be pcm_f64le pcm_mulaw pcm_s16be pcm_s16be_planar pcm_s16le "\
81
"pcm_s16le_planar pcm_s24be pcm_s24le pcm_s24le_planar pcm_s32be pcm_s32le "\
82
"pcm_s32le_planar pcm_s8 pcm_s8_planar pcm_u16be pcm_u16le pcm_u24be "\
83
"pcm_u24le pcm_u32be pcm_u32le pcm_u8 pcx pgm "\
84
"pgmyuv phm png ppm qoi qtrle "\
85
"r10k r210 ra_144 rawvideo roq roq_dpcm "\
86
"rpza rv10 rv20 s302m sbc sgi "\
87
"smc snow sonic sonic_ls speedhq srt "\
88
"ssa subrip sunrast svq1 targa text "\
89
"tiff truehd tta ttml utvideo v210 "\
90
"v308 v408 v410 vc1_v4l2m2m vc2 "\
91
"vnull vorbis vp8_v4l2m2m vp8_vaapi "\
92
"vp9_vaapi wavpack wbmp webvtt wmav1 wmav2 "\
93
"wmv1 wmv2 wrapped_avframe xbm xface xsub "\
94
"xwd y41p yuv4 zlib zmbv"
95
FFMPEG_ENCODERS=""
96
for encoder in $FFMPEG_ENCODER_LIST; do
97
if [ -z "$FFMPEG_ENCODERS" ]; then
98
FFMPEG_ENCODERS="--enable-encoder=$encoder"
99
else
100
FFMPEG_ENCODERS="$FFMPEG_ENCODERS,$encoder"
101
fi
102
done
103
104
if [ "$SKIP_DOWNLOAD" != true ]; then
105
if [ ! -f "ffmpeg-$FFMPEG.tar.xz" ]; then
106
curl -C - -L -O "https://ffmpeg.org/releases/ffmpeg-$FFMPEG.tar.xz"
107
fi
108
if [ ! -f "lame-$LAME.tar.gz" ]; then
109
curl -C - -L -o "lame-$LAME.tar.gz" "https://sourceforge.net/projects/lame/files/lame/$LAME/lame-$LAME.tar.gz/download"
110
fi
111
if [ ! -f "libvpx-$LIBVPX.tar.gz" ]; then
112
curl -C - -L -o "libvpx-$LIBVPX.tar.gz" "https://github.com/webmproject/libvpx/archive/refs/tags/v$LIBVPX.tar.gz"
113
fi
114
if [ ! -f "fdk-aac-stripped-$FDK_AAC.tar.gz" ]; then
115
curl -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"
116
fi
117
if [ ! -d "aom" ]; then
118
git clone https://aomedia.googlesource.com/aom
119
cd aom
120
git checkout "$LIBAOM"
121
cd ..
122
fi
123
if [ ! -f "libogg-$LIBOGG.tar.gz" ]; then
124
curl -C - -L -O "https://downloads.xiph.org/releases/ogg/libogg-$LIBOGG.tar.gz"
125
fi
126
if [ ! -f "libvorbis-$LIBVORBIS.tar.gz" ]; then
127
curl -C - -L -O "https://github.com/xiph/vorbis/releases/download/v$LIBVORBIS/libvorbis-$LIBVORBIS.tar.gz"
128
fi
129
if [ ! -f "libtheora-$LIBTHEORA.tar.bz2" ]; then
130
curl -C - -L -O "https://downloads.xiph.org/releases/theora/libtheora-$LIBTHEORA.tar.bz2"
131
fi
132
if [ ! -f "flac-$FLAC.tar.xz" ]; then
133
curl -C - -L -O "https://downloads.xiph.org/releases/flac/flac-$FLAC.tar.xz"
134
fi
135
if [ ! -f "speex-$SPEEX.tar.gz" ]; then
136
curl -C - -L -O "https://downloads.xiph.org/releases/speex/speex-$SPEEX.tar.gz"
137
fi
138
if [ ! -f "AMF-headers.tar.gz" ]; then
139
curl -C - -L -O "https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v$AMF/AMF-headers.tar.gz"
140
fi
141
if [ ! -f "opus-$OPUS.tar.gz" ]; then
142
curl -C - -L -O "https://downloads.xiph.org/releases/opus/opus-$OPUS.tar.gz"
143
fi
144
if [ ! -f "SVT-AV1-$SVT_AV1.tar.gz" ]; then
145
curl -C - -L -O "https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v$SVT_AV1/SVT-AV1-$SVT_AV1.tar.gz"
146
fi
147
if [ ! -f "glslang-$GLSLANG.tar.gz" ]; then
148
curl -C - -L -o "glslang-$GLSLANG.tar.gz" "https://github.com/KhronosGroup/glslang/archive/refs/tags/$GLSLANG.tar.gz"
149
fi
150
if [ ! -f "Vulkan-Headers-$VULKAN_HEADERS.tar.gz" ]; then
151
curl -C - -L -o "Vulkan-Headers-$VULKAN_HEADERS.tar.gz" "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v$VULKAN_HEADERS.tar.gz"
152
fi
153
fi
154
155
cat > SHASUMS <<EOF
156
$FFMPEG_XZ_HASH ffmpeg-$FFMPEG.tar.xz
157
5393759308f6d7bc9eb1ed8013c954e03aadb85f0ed6e96f969a5df447b0f79c AMF-headers.tar.gz
158
7322744f239a0d8460fde84e92cca77f2fe9d7e25a213789659df9e86b696b42 fdk-aac-stripped-$FDK_AAC.tar.gz
159
f2c1c76592a82ffff8413ba3c4a1299b6c7ab06c734dee03fd88630485c2b920 flac-$FLAC.tar.xz
160
ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e lame-$LAME.tar.gz
161
0eb4b4b9420a0f51db142ba3f9c64b333f826532dc0f48c6410ae51f4799b664 libogg-$LIBOGG.tar.gz
162
b6ae1ee2fa3d42ac489287d3ec34c5885730b1296f0801ae577a35193d3affbc libtheora-$LIBTHEORA.tar.bz2
163
0e982409a9c3fc82ee06e08205b1355e5c6aa4c36bca58146ef399621b0ce5ab libvorbis-$LIBVORBIS.tar.gz
164
b6ae1ee2fa3d42ac489287d3ec34c5885730b1296f0801ae577a35193d3affbc libtheora-$LIBTHEORA.tar.bz2
165
e935eded7d81631a538bfae703fd1e293aad1c7fd3407ba00440c95105d2011e libvpx-$LIBVPX.tar.gz
166
65c1d2f78b9f2fb20082c38cbe47c951ad5839345876e46941612ee87f9a7ce1 opus-$OPUS.tar.gz
167
eaae8af0ac742dc7d542c9439ac72f1f385ce838392dc849cae4536af9210094 speex-$SPEEX.tar.gz
168
d4a77bb13a0a2d75c9a17c60260fc7dd3cb48ee8e9ad3a60071f87a923275e93 SVT-AV1-$SVT_AV1.tar.gz
169
c6c21fe1873c37e639a6a9ac72d857ab63a5be6893a589f34e09a6c757174201 glslang-$GLSLANG.tar.gz
170
77e3a78db853f8b9c5bc3ddef04e637bef9744e01d6a8c90ebe0ddcd916c0c50 Vulkan-Headers-$VULKAN_HEADERS.tar.gz
171
EOF
172
173
shasum -a 256 --check SHASUMS
174
175
export PKG_CONFIG_PATH="$INSTALLDIR/lib/pkgconfig:$INSTALLDIR/lib64/pkgconfig:$DEPSINSTALLDIR/lib/pkgconfig:$DEPSINSTALLDIR/lib64/pkgconfig:$PKG_CONFIG_PATH"
176
177
echo "Building LAME"
178
rm -fr "lame-$LAME"
179
tar xf "lame-$LAME.tar.gz"
180
cd "lame-$LAME"
181
mkdir build
182
cd build
183
../configure --prefix="$DEPSINSTALLDIR" --disable-shared --enable-static --with-pic --disable-frontend
184
make -j "$NPROCS"
185
make install
186
cd ../..
187
188
echo "Building libvpx..."
189
rm -fr "libvpx-$LIBVPX"
190
tar xf "libvpx-$LIBVPX.tar.gz"
191
cd "libvpx-$LIBVPX"
192
mkdir build-ds
193
cd build-ds
194
../configure --prefix="$DEPSINSTALLDIR" --disable-shared --enable-static --enable-pic --disable-examples --disable-tools --disable-docs --enable-vp8 --enable-vp9
195
make -j "$NPROCS"
196
make install
197
cd ../..
198
199
echo "Building fdk-aac..."
200
rm -fr "fdk-aac-stripped-$FDK_AAC"
201
tar xf "fdk-aac-stripped-$FDK_AAC.tar.gz"
202
cd "fdk-aac-stripped-$FDK_AAC"
203
./autogen.sh
204
mkdir build
205
cd build
206
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic
207
make -j "$NPROCS"
208
make install
209
cd ../..
210
211
echo "Building libaom..."
212
cd aom
213
rm -fr build-ds
214
cmake -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=OFF
215
cmake --build build-ds --parallel
216
cmake --install build-ds
217
cd ..
218
219
echo "Building libogg..."
220
rm -fr "libogg-$LIBOGG"
221
tar xf "libogg-$LIBOGG.tar.gz"
222
cd "libogg-$LIBOGG"
223
mkdir build-ds
224
cd build-ds
225
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic
226
make -j "$NPROCS"
227
make install
228
cd ../..
229
230
echo "Building libvorbis..."
231
rm -fr "libvorbis-$LIBVORBIS"
232
tar xf "libvorbis-$LIBVORBIS.tar.gz"
233
cd "libvorbis-$LIBVORBIS"
234
mkdir build-ds
235
cd build-ds
236
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic
237
make -j "$NPROCS"
238
make install
239
cd ../..
240
241
echo "Building libtheora..."
242
rm -fr "libtheora-$LIBTHEORA"
243
tar xf "libtheora-$LIBTHEORA.tar.bz2"
244
cd "libtheora-$LIBTHEORA"
245
mkdir build-ds
246
cd build-ds
247
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-examples --disable-sdltest --disable-vorbistest --disable-oggtest
248
make -j "$NPROCS"
249
make install
250
cd ../..
251
252
echo "Building speex..."
253
rm -fr "speex-$SPEEX"
254
tar xf "speex-$SPEEX.tar.gz"
255
cd "speex-$SPEEX"
256
mkdir build-ds
257
cd build-ds
258
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic
259
make -j "$NPROCS"
260
make install
261
cd ../..
262
263
echo "Building flac..."
264
rm -fr "flac-$FLAC"
265
tar xf "flac-$FLAC.tar.xz"
266
cd "flac-$FLAC"
267
mkdir build-ds
268
cd build-ds
269
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-examples --disable-programs
270
make -j "$NPROCS"
271
make install
272
cd ../..
273
274
echo "Installing AMF..."
275
rm -fr "AMF"
276
tar xf "AMF-headers.tar.gz"
277
cd "AMF"
278
mkdir -p "$DEPSINSTALLDIR/include/AMF"
279
cp -a core components "$DEPSINSTALLDIR/include/AMF"
280
cd ..
281
282
echo "Building libopus..."
283
rm -fr "opus-$OPUS"
284
tar xf "opus-$OPUS.tar.gz"
285
cd "opus-$OPUS"
286
mkdir build
287
cd build
288
../configure --prefix="$DEPSINSTALLDIR" --enable-static --disable-shared --with-pic --disable-doc
289
make -j "$NPROCS"
290
make install
291
cd ../..
292
293
echo "Building SVT-AV1..."
294
rm -fr SVT-AV1-v$SVT_AV1-*
295
tar xf "SVT-AV1-$SVT_AV1.tar.gz"
296
cd SVT-AV1-v$SVT_AV1-*
297
cmake -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=OFF
298
cmake --build build-ds --parallel
299
cmake --install build-ds
300
cd ..
301
302
echo "Building Vulkan-Headers..."
303
rm -fr "Vulkan-Headers-$VULKAN_HEADERS"
304
tar xf "Vulkan-Headers-$VULKAN_HEADERS.tar.gz"
305
cd "Vulkan-Headers-$VULKAN_HEADERS"
306
cmake -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
307
cmake --build build-ds --parallel
308
cmake --install build-ds
309
cd ..
310
311
echo "Building glslang..."
312
rm -fr "glslang-$GLSLANG"
313
tar xf "glslang-$GLSLANG.tar.gz"
314
cd "glslang-$GLSLANG"
315
./update_glslang_sources.py
316
cmake -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=OFF
317
cmake --build build-ds --parallel
318
cmake --install build-ds
319
cd ..
320
321
echo "Building ffmpeg..."
322
rm -fr "ffmpeg-$FFMPEG"
323
tar xf "ffmpeg-$FFMPEG.tar.xz"
324
cd "ffmpeg-$FFMPEG"
325
mkdir build
326
cd build
327
../configure --prefix="$INSTALLDIR" --disable-static --enable-shared \
328
--pkg-config-flags="--static" \
329
--extra-cflags="-I$DEPSINSTALLDIR/include" \
330
--extra-ldflags="-L$DEPSINSTALLDIR/lib" --extra-ldflags="-L$DEPSINSTALLDIR/lib64" \
331
--extra-ldsoflags="-Wl,-rpath,XORIGIN" \
332
--disable-all --disable-autodetect --enable-libmp3lame --enable-libvpx --enable-zlib --enable-libwebp \
333
--enable-libfdk-aac --enable-libaom --enable-libvorbis --enable-libtheora --enable-libspeex \
334
--enable-v4l2-m2m --enable-vaapi --enable-amf --enable-libopus --enable-libsvtav1 --enable-vulkan --enable-libglslang \
335
--enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale \
336
--enable-muxer=avi,matroska,mov,mp3,mp4,wav \
337
--enable-protocol=file \
338
$FFMPEG_ENCODERS
339
340
make -j "$NPROCS"
341
make install
342
343
# Fix up rpath to point to current directory.
344
find "$INSTALLDIR" -name 'libavcodec.so' -exec patchelf --set-rpath '$ORIGIN' {} \;
345
find "$INSTALLDIR" -name 'libavformat.so' -exec patchelf --set-rpath '$ORIGIN' {} \;
346
find "$INSTALLDIR" -name 'libavutil.so' -exec patchelf --set-rpath '$ORIGIN' {} \;
347
find "$INSTALLDIR" -name 'libswresample.so' -exec patchelf --set-rpath '$ORIGIN' {} \;
348
find "$INSTALLDIR" -name 'libswscale.so' -exec patchelf --set-rpath '$ORIGIN' {} \;
349
350
cd ../..
351
352
if [ "$SKIP_CLEANUP" != true ]; then
353
echo "Cleaning up..."
354
cd ..
355
rm -fr deps-build
356
fi
357
358