Skip to content

Instantly share code, notes, and snippets.

@furushchev
Created July 31, 2019 02:00
Show Gist options
  • Save furushchev/09cefa60daa950124ab356114846259f to your computer and use it in GitHub Desktop.
Save furushchev/09cefa60daa950124ab356114846259f to your computer and use it in GitHub Desktop.
Install FFmpeg with hardware acceleration
#!/bin/bash
set -ex
# COMMON BUILD TOOLS
DEBIAN_FRONTEND=noninteractive sudo apt-get update && sudo apt-get install -y -q --no-install-recommends build-essential autoconf make git wget pciutils cpio libtool lsb-release ca-certificates pkg-config bison flex libcurl4-gnutls-dev zlib1g-dev
# Build NASM
cd /tmp
export NASM_VER=2.13.03
export NASM_REPO=https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VER}/nasm-${NASM_VER}.tar.bz2
wget ${NASM_REPO} && \
tar -xaf nasm* && \
cd nasm-${NASM_VER} && \
./autogen.sh && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib && \
make -j8 && \
sudo make install
# Build YASM
cd /tmp
export YASM_VER=1.3.0
export YASM_REPO=https://www.tortall.net/projects/yasm/releases/yasm-${YASM_VER}.tar.gz
wget -O - ${YASM_REPO} | tar xz && \
cd yasm-${YASM_VER} && \
sed -i "s/) ytasm.*/)/" Makefile.in && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib && \
make -j8 && \
sudo make install
# Build ogg
cd /tmp
export OGG_VER=1.3.3
export OGG_REPO=https://downloads.xiph.org/releases/ogg/libogg-${OGG_VER}.tar.xz
wget -O - ${OGG_REPO} | tar xJ && \
cd libogg-${OGG_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared && \
make -j8 && \
sudo make install
# Build vorbis
cd /tmp
export VORBIS_VER=1.3.6
export VORBIS_REPO=https://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VER}.tar.xz
wget -O - ${VORBIS_REPO} | tar xJ && \
cd libvorbis-${VORBIS_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared && \
make -j8 && \
sudo make install
# Build mp3lame
cd /tmp
export MP3LAME_VER=3.100
export MP3LAME_REPO=https://sourceforge.net/projects/lame/files/lame/${MP3LAME_VER}/lame-${MP3LAME_VER}.tar.gz
wget -O - ${MP3LAME_REPO} | tar xz && \
cd lame-${MP3LAME_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared --enable-nasm && \
make -j8 && \
sudo make install
# Build fdk-aac
cd /tmp
export FDK_AAC_VER=v0.1.6
export FDK_AAC_REPO=https://github.com/mstorsjo/fdk-aac/archive/${FDK_AAC_VER}.tar.gz
wget -O - ${FDK_AAC_REPO} | tar xz && mv fdk-aac-${FDK_AAC_VER#v} fdk-aac && \
cd fdk-aac && \
autoreconf -fiv && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared && \
make -j8 && \
sudo make install
# Build opus
cd /tmp
export OPUS_VER=1.2.1
export OPUS_REPO=https://archive.mozilla.org/pub/opus/opus-${OPUS_VER}.tar.gz
wget -O - ${OPUS_REPO} | tar xz && \
cd opus-${OPUS_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared && \
make -j8 && \
sudo make install
# Build vpx
cd /tmp
export VPX_VER=tags/v1.7.0
export VPX_REPO=https://chromium.googlesource.com/webm/libvpx.git
git clone ${VPX_REPO} && \
cd libvpx && \
git checkout ${VPX_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=nasm && \
make -j8 && \
sudo make install
# Build AOM
cd /tmp
export AOM_VER=b6f1767eedbaddeb1ff5aa409a710ef61078640e
export AOM_REPO=https://aomedia.googlesource.com/aom
git clone ${AOM_REPO} && \
mkdir aom/aom_build && \
cd aom/aom_build && \
git checkout ${AOM_VER} && \
cmake -DBUILD_SHARED_LIBS=ON -DENABLE_NASM=ON -DENABLE_TESTS=OFF -DENABLE_DOCS=OFF -DCMAKE_INSTALL_PREFIX="/usr/local" -DLIB_INSTALL_DIR=lib .. && \
make -j8 && \
sudo make install
# Build x264
cd /tmp
export X264_VER=stable
export X264_REPO=https://github.com/mirror/x264
git clone ${X264_REPO} && \
cd x264 && \
git checkout ${X264_VER} && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --enable-shared && \
make -j8 && \
sudo make install
# Build x265
cd /tmp
export X265_VER=2.9
export X265_REPO=https://github.com/videolan/x265/archive/${X265_VER}.tar.gz
DEBIAN_FRONTEND=noninteractive sudo apt-get update && sudo apt-get install -y -q --no-install-recommends libnuma-dev
wget -O - ${X265_REPO} | tar xz && mv x265-${X265_VER} x265 && \
cd x265/build/linux && \
cmake -DBUILD_SHARED_LIBS=ON -DENABLE_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local -DLIB_INSTALL_DIR=lib ../../source && \
make -j8 && \
sudo make install
# Fetch SVT-HEVC
cd /tmp
export SVT_HEVC_VER=20a47b0d904e9d99e089d93d7c33af92788cbfdb
export SVT_HEVC_REPO=https://github.com/intel/SVT-HEVC
git clone ${SVT_HEVC_REPO} && \
cd SVT-HEVC/Build/linux && \
git checkout ${SVT_HEVC_VER} && \
mkdir -p ../../Bin/Release && \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_ASM_NASM_COMPILER=yasm ../.. && \
make -j8 && \
sudo make install
# Fetch SVT-AV1
cd /tmp
export SVT_AV1_VER=v0.6.0
export SVT_AV1_REPO=https://github.com/OpenVisualCloud/SVT-AV1
git clone ${SVT_AV1_REPO} && \
cd SVT-AV1/Build/linux && \
git checkout ${SVT_AV1_VER} && \
mkdir -p ../../Bin/Release && \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_ASM_NASM_COMPILER=yasm ../.. && \
make -j8 && \
sudo make install
#Remove build residue from SVT-AV1 build -- temp fix for bug
if [ -d "build/home/" ]; then rm -rf build/home/; fi
# Fetch SVT-VP9
cd /tmp
export SVT_VP9_VER=d18b4acf9139be2e83150e318ffd3dba1c432e74
export SVT_VP9_REPO=https://github.com/OpenVisualCloud/SVT-VP9
git clone ${SVT_VP9_REPO} && \
cd SVT-VP9/Build/linux && \
git checkout ${SVT_VP9_VER} && \
mkdir -p ../../Bin/Release && \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_ASM_NASM_COMPILER=yasm ../.. && \
make -j8 && \
sudo make install
#include(transform360.m4)
# Fetch gmmlib
cd /tmp
export GMMLIB_VER=intel-gmmlib-18.3.0
export GMMLIB_REPO=https://github.com/intel/gmmlib/archive/${GMMLIB_VER}.tar.gz
wget -O - ${GMMLIB_REPO} | tar xz && mv gmmlib-${GMMLIB_VER} gmmlib;
# Build libva
cd /tmp
export LIBVA_VER=2.4.0
export LIBVA_REPO=https://github.com/intel/libva/archive/${LIBVA_VER}.tar.gz
sudo apt-get remove libva*
DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq && sudo apt-get install -y -qq --no-install-recommends libdrm-dev libx11-dev xorg-dev libgl1-mesa-dev openbox
cd /tmp
wget -O - ${LIBVA_REPO} | tar xz && \
cd libva-${LIBVA_VER} && \
./autogen.sh --prefix=/usr/local --libdir=/usr/local/lib && \
make -j8 && \
sudo make install
# Build media driver
export MEDIA_DRIVER_VER=intel-media-kbl-19.1.0
export MEDIA_DRIVER_REPO=https://github.com/VCDP/media-driver/archive/${MEDIA_DRIVER_VER}.tar.gz
DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq && sudo apt-get install -y -q --no-install-recommends libdrm-dev libpciaccess-dev libx11-dev xorg-dev libgl1-mesa-dev
cd /tmp
wget -O - ${MEDIA_DRIVER_REPO} | tar xz && mv media-driver-${MEDIA_DRIVER_VER} /tmp/media-driver && \
mkdir -p /tmp/media-driver/build && \
cd /tmp/media-driver/build && \
cmake -DBUILD_TYPE=release -DBUILD_ALONG_WITH_CMRTLIB=1 -DMEDIA_VERSION="2.0.0" \
-DBS_DIR_GMMLIB=/tmp/gmmlib/Source/GmmLib -DBS_DIR_COMMON=/tmp/gmmlib/Source/Common \
-DBS_DIR_INC=/tmp/gmmlib/Source/inc -DBS_DIR_MEDIA=/tmp/media-driver -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
make -j8 && \
sudo make install
# Build Intel(R) Media SDK
export MSDK_VER=MSS-KBL-2019-R1
export MSDK_REPO=https://github.com/Intel-Media-SDK/MediaSDK/archive/${MSDK_VER}.tar.gz
cd /tmp
wget -O - ${MSDK_REPO} | tar xz && mv MediaSDK-${MSDK_VER} /tmp/MediaSDK && \
mkdir -p /tmp/MediaSDK/build && \
cd /tmp/MediaSDK/build && \
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_INCLUDEDIR=include -DBUILD_SAMPLES=OFF -DENABLE_OPENCL=OFF -Wno-dev .. && \
make -j8 && \
sudo make install
# Fetch FFmpeg source
export FFMPEG_VER=n4.1
export FFMPEG_REPO=https://github.com/FFmpeg/FFmpeg/archive/${FFMPEG_VER}.tar.gz
export FFMPEG_FLV_PATCH_REPO=https://raw.githubusercontent.com/VCDP/CDN/master/The-RTMP-protocol-extensions-for-H.265-HEVC.patch
export FFMPEG_1TN_PATCH_REPO=https://patchwork.ffmpeg.org/patch/11625/raw
export FFMPEG_THREAD_PATCH_REPO=https://patchwork.ffmpeg.org/patch/11035/raw
DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq && \
sudo apt-get install -y -q --no-install-recommends libass-dev libfreetype6-dev libvdpau-dev libsdl2-dev \
libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev zlib1g-dev libssl-dev
cd /tmp
wget -O - ${FFMPEG_REPO} | tar xz && mv FFmpeg-${FFMPEG_VER} /tmp/FFmpeg && \
cd /tmp/FFmpeg && \
wget -O - ${FFMPEG_FLV_PATCH_REPO} | patch -p1 && \
wget -O - ${FFMPEG_1TN_PATCH_REPO} | patch -p1 && \
wget -O - ${FFMPEG_THREAD_PATCH_REPO} | patch -p1 ;
# Patch FFmpeg source for SVT-HEVC
cd /tmp/FFmpeg && \
patch -p1 < ../SVT-HEVC/ffmpeg_plugin/0001-lavc-svt_hevc-add-libsvt-hevc-encoder-wrapper.patch;
# Patch FFmpeg source for SVT-AV1
cd /tmp/FFmpeg; \
patch -p1 < ../SVT-AV1/ffmpeg_plugin/0001-Add-ability-for-ffmpeg-to-run-svt-av1-with-svt-hevc.patch;
# Compile FFmpeg
export LIBVA_DRIVERS_PATH=/usr/local/lib/dri
export LIBVA_DRIVER_NAME=iHD
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
cd /tmp/FFmpeg && \
./configure --prefix="/usr/local" --libdir=/usr/local/lib --extra-libs="-lpthread -lm" --enable-shared --enable-gpl --enable-libass \
--enable-libfreetype --enable-openssl --enable-nonfree --enable-libdrm --enable-libmfx \
--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
--enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx \
--enable-libx264 --enable-libx265 --enable-libaom --enable-libsvthevc --enable-libsvtav1 && \
make -j8 && \
sudo make install
# Prerequisites
DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq && sudo apt-get install -y -q --no-install-recommends libxv1 libxcb-shm0 libxcb-shape0 libxcb-xfixes0 libsdl2-2.0-0 libasound2 libvdpau1 libnuma1 libass5 libssl1.0.0 libdrm2
# Install
cat <<EOF >> ~/.bashrc
# Intel Hardware Encoding
export LIBVA_DRIVERS_PATH=/usr/local/lib/dri
export LIBVA_DRIVER_NAME=iHD
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment