Last active
August 22, 2022 18:56
-
-
Save jrbergen/b7471f659d487fd216259b142be8dffb to your computer and use it in GitHub Desktop.
Downloads, compiles & installs FFmpeg + some dependencies (mostly march native + O3)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/bash | |
clear | |
USRN=$(whoami) | |
SRCDIRNAME="ffmpeg-sources" | |
BLDDIRNAME="ffmpeg-build" | |
SRCDIR="/home/$USRN/opthome/$SRCDIRNAME" | |
BUILDDIR="/home/$USRN/opthome/$BLDDIRNAME" | |
NTHREADS="32" | |
SLEEPTIME="1.5" | |
CFLAGS_DEFAULT="-march=native -O3 -pipe" | |
export CFLAGS="${CFLAGS_DEFAULT}" | |
export CXXFLAGS="${CFLAGS}" | |
CFLAGS_FFMPEG="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBOPUS="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBAOM="${CFLAGS_DEFAULT}" | |
CFLAGS_NASM="${CFLAGS_DEFAULT}" | |
CFLAGS_YASM="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBSVTAV1="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBX264="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBX265="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBVPX="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBFDK_AAC="${CFLAGS_DEFAULT}" | |
CFLAGS_LIBVPX="${CFLAGS_DEFAULT}" | |
echo "Source dir: $SRCDIR" | |
echo "Build dir: $BUILDDIR" | |
echo "N compilation threads: $NTHREADS" | |
echo "Removing sourcedir if present..." | |
rm -rf ${SRCDIR} | |
echo "Removing build dir if presenet..." | |
rm -rf ${BUILDDIR} | |
mkdir -p ${SRCDIR}; | |
mkdir -p ${BUILDDIR}; | |
# libopus | |
echo "Cloning, compiling & installing libopus" && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf opus && \ | |
git -C opus pull 2> /dev/null || git clone --depth 1 https://github.com/xiph/opus.git && \ | |
cd opus && \ | |
echo 'Updating build configuration files, please wait....' && \ | |
cmake -S . -B "$BUILDDIR/opus" && \ | |
cmake --build "$BUILDDIR/opus" --config Release -- -j $NTHREADS || { echo 'libopus installation failed... exiting' ; exit 1; }; | |
# Install NASM | |
NASM_VERSION="2.15.05" | |
NASM_DIR="nasm-${NASM_VERSION}" | |
echo "Cloning, compiling & installing NASM ($NASM_VERSION)..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf "$NASM_DIR" && \ | |
wget "https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/${NASM_DIR}.tar.bz2" && \ | |
tar xjvf "${NASM_DIR}.tar.bz2" && \ | |
cd ${NASM_DIR} && \ | |
./autogen.sh && \ | |
echo "CFLAGS+=$CFLAGS_NASM" >> Makefile && \ | |
echo "CXXFLAGS+=$CFLAGS_NASM" >> Makefile && \ | |
PATH="$HOME/bin:$PATH" ./configure --prefix="$BUILDDIR" --bindir="$HOME/bin" && \ | |
make -j $NTHREADS CFLAGS="$CFLAGS_NASM" CXXFLAGS="$CFLAGS_NASM" && \ | |
make install -j $NTHREADS && \ | |
cd $SRCDIR && \ | |
rm -rf "${NASM_DIR}.tar.bz2" || { echo 'NASM installation failed... exiting' ; exit 1; } | |
# Install libsvtav1 | |
echo "Cloning, compiling & installing libstav1..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf SVT-AV1 && \ | |
git -C SVT-AV1 pull 2> /dev/null || git clone https://gitlab.com/AOMediaCodec/SVT-AV1.git && \ | |
mkdir -p SVT-AV1/build && \ | |
cd SVT-AV1/build && \ | |
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$BUILDDIR" -DCMAKE_BUILD_TYPE=Release -DBUILD_DEC=OFF -DBUILD_SHARED_LIBS=OFF .. && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS CFLAGS="$CFLAGS_LIBSVTAV1" CXXFLAGS="$CFLAGS_LIBSVTAV1" && \ | |
make install -j $NTHREADS || { echo 'libsvtav1 installation failed... exiting' ; exit 1; } | |
# libx264 | |
echo "Cloning, compiling & installing libx264..." && \ | |
sleep $SLEEPTIME && \ | |
cd $HOMEPATH/ffmpeg_source && \ | |
rm -rf x264 && \ | |
git -C x264 pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/x264.git && \ | |
echo "CFLAGS+=$CFLAGS_LIBX264" >> Makefile && \ | |
echo "CXXFLAGS+=$CFLAGS_LIBX264" >> Makefile && \ | |
cd x264 && \ | |
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$BUILDDIR/lib/pkgconfig" ./configure --prefix="$BUILDDIR" --bindir="$HOME/bin" --enable-static --enable-pic && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS && \ | |
make install -j $NTHREADS || { echo 'libx264 installation failed... exiting' ; exit 1; } | |
# libx265 | |
echo "Cloning, compiling & installing libx265..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf multicoreware* && \ | |
wget -O x265.tar.bz2 https://bitbucket.org/multicoreware/x265_git/get/master.tar.bz2 && \ | |
tar xjvf x265.tar.bz2 && \ | |
cd multicoreware*/build/linux && \ | |
echo "CFLAGS+=$CFLAGS_LIBX265" >> Makefile && \ | |
echo "CXXFLAGS+=$CFLAGS_LIBX265" >> Makefile && \ | |
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$BUILDDIR" -DENABLE_SHARED=off ../../source && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS && \ | |
make install -j $NTHREADS && \ | |
cd $SRCDIR && | |
rm -f x265.tar.bz2 || { echo 'libx265 installation failed... exiting' ; exit 1; } | |
# libvpx | |
echo "Cloning, compiling & installing libvpx..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf libvpx && \ | |
git -C libvpx pull 2> /dev/null || git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git && \ | |
cd libvpx && \ | |
echo "CFLAGS+=$CFLAGS_LIBVPX" >> Makefile && \ | |
echo "CXXFLAGS+=$CFLAGS_LIBVPX" >> Makefile && \ | |
PATH="$HOME/bin:$PATH" ./configure --prefix="$BUILDDIR" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS && \ | |
make install -j $NTHREADS || { echo 'libvpx installation failed... exiting' ; exit 1; } | |
# libfdk-aac | |
echo "Cloning, compiling & installing libfdk-aac..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf fdk-aac && \ | |
git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac && \ | |
cd fdk-aac && \ | |
autoreconf -fiv && \ | |
./configure --prefix="$BUILDDIR" --disable-shared && \ | |
echo "CFLAGS+=$CFLAGS_LIBFDK_AAC" >> Makefile && \ | |
echo "CXXFLAGS+=$CFLAGS_LIBFDK_AAC" >> Makefile && \ | |
make -j $NTHREADS && \ | |
make install -j $NTHREADS || { echo 'libfdk-aac installation failed... exiting' ; exit 1; } | |
# libaom | |
echo "Cloning, compiling & installing libaom..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
rm -rf aom_build && \ | |
rm -rf aom | |
git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom && \ | |
mkdir -p aom_build && \ | |
cd aom_build && \ | |
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$BUILDDIR" -DENABLE_TESTS=OFF -DENABLE_NASM=on ../aom && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS CFLAGS="$CFLAGS_LIBAOM" && \ | |
make install -j $NTHREADS || { echo 'libaom installation failed... exiting' ; exit 1; } | |
# libdav1d | |
echo "Cloning, compiling & installing libdav1d..." && \ | |
sleep $SLEEPTIME && \ | |
cd $SRCDIR && \ | |
pip3 install --user meson && \ | |
git -C dav1d pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/dav1d.git && \ | |
mkdir -p dav1d/build && \ | |
cd dav1d/build && \ | |
meson setup -Denable_tools=false -Denable_tests=false --default-library=static .. --prefix "$BUILDDIR" --libdir="$BUILDDIR/lib" --optimization=3 && \ | |
ninja -j $NTHREADS && \ | |
ninja -j $NTHREADS install || { echo 'libdav1d installation failed... exiting' ; exit 1; } | |
# VMAF | |
echo "Cloning, compiling & installing VMAF..."g | |
sleep $SLEEPTIME | |
cd $SRCDIR && \ | |
wget https://github.com/Netflix/vmaf/archive/v2.1.1.tar.gz && \ | |
tar xvf v2.1.1.tar.gz && \ | |
mkdir -p vmaf-2.1.1/libvmaf/build &&\ | |
cd vmaf-2.1.1/libvmaf/build && \ | |
meson setup -Denable_tests=false -Denable_docs=false --buildtype=release --default-library=static .. --prefix "$BUILDDIR" --bindir="$HOME/bin" --libdir="$BUILDDIR/lib" --optimization=3 && \ | |
ninja -j $NTHREADS && \ | |
ninja -j $NTHREADS install || { echo 'VMAF installation failed... exiting' ; exit 1; } | |
# FFmpeg | |
echo "Cloning, compiling & installing FFmpeg..." | |
sleep $SLEEPTIME | |
cd $SRCDIR && \ | |
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \ | |
tar xjvf ffmpeg-snapshot.tar.bz2 && \ | |
cd ffmpeg && \ | |
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$BUILDDIR/lib/pkgconfig" ./configure \ | |
--prefix="$BUILDDIR" \ | |
--pkg-config-flags="--static" \ | |
--extra-cflags="-I$BUILDDIR/include -march=native -O3 -pipe" \ | |
--extra-ldflags="-L$BUILDDIR/lib" \ | |
--extra-libs="-lpthread -lm" \ | |
--ld="g++" \ | |
--bindir="$HOME/bin" \ | |
--enable-gpl \ | |
--enable-gnutls \ | |
--enable-libaom \ | |
--enable-libass \ | |
--enable-libfdk-aac \ | |
--enable-libfreetype \ | |
--enable-libmp3lame \ | |
--enable-libopus \ | |
--enable-libsvtav1 \ | |
--enable-libdav1d \ | |
--enable-libvorbis \ | |
--enable-libvpx \ | |
--enable-libx264 \ | |
--enable-libx265 \ | |
--enable-hardcoded-tables \ | |
--enable-nonfree && \ | |
PATH="$HOME/bin:$PATH" make -j $NTHREADS && \ | |
make install -j $NTHREADS && \ | |
hash -r || { echo 'FFmpeg installation failed... exiting' ; exit 1; } | |
echo "Installing FFmpeg documentation locally (manpages)..." | |
echo "MANPATH_MAP $HOME/bin $BUILDDIR/share/man" >> ~/.manpath | |
echo "Sourcing .profile..." | |
source ~/.profile | |
echo "FFmpeg installation script DONE!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment