Skip to content

Instantly share code, notes, and snippets.

@jrbergen
Last active August 22, 2022 18:56
Show Gist options
  • Save jrbergen/b7471f659d487fd216259b142be8dffb to your computer and use it in GitHub Desktop.
Save jrbergen/b7471f659d487fd216259b142be8dffb to your computer and use it in GitHub Desktop.
Downloads, compiles & installs FFmpeg + some dependencies (mostly march native + O3)
#!/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