#!/bin/bash set -e ### ====================================================================== ### ## ## ## Serviio install codecs ## ## ## Actively used on TS-269 Pro (x86 atom) ### ====================================================================== ### # Example usage: # ssh on to qnap (ssh admin@192.168.1.x) # > cd /share/MD0_DATA/Public # > git clone https://gist.github.com/5324815.git updating_codecs # > sh /share/MD0_DATA/Public/updating_codecs/install_codecs.sh # TODO : Make this script optionally update all git repos and rerun if any updates exist # TODO : Determine which codecs are installed on system + version, only install if > current # TODO : Make script handle errors when running repeatedly # [code]curl -L https://gist.github.com/tommeier/5324815/raw/install_codecs.sh | CLEAN=true bash[/code] ## Codec compile support URL_AUTOMAKE="http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz" URL_WHICH='http://www.xs4all.nl/~carlo17/which/which-2.20.tar.gz' ## Codec download locations URL_NASM='http://www.nasm.us/pub/nasm/releasebuilds/2.10.09/nasm-2.10.09.tar.gz' URL_YASM='http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz' URL_XVID='http://downloads.xvid.org/downloads/xvidcore-1.3.1.tar.gz' URL_FAAC='http://downloads.sourceforge.net/faac/faac-1.28.tar.gz' URL_LIBVPX='https://webm.googlecode.com/files/libvpx-v1.1.0.tar.bz2' #1.2.0 has compile issues URL_FREETYPE='http://downloads.sourceforge.net/project/freetype/freetype2/2.5.0/freetype-2.5.0.1.tar.bz2' URL_OGG='http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.gz' URL_VORBIS='http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz' URL_THEORA='http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2' URL_FRIBIDI='http://fribidi.org/download/fribidi-0.19.5.tar.bz2' URL_LIBASS='http://libass.googlecode.com/files/libass-0.10.1.tar.gz' URL_OPENSSL='http://www.openssl.org/source/openssl-1.0.1e.tar.gz' URL_FDK='http://downloads.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.2.tar.gz' URL_OPENCORE='http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.3.tar.gz' URL_SERVIIO_LAME='http://download.serviio.org/opensource/lame-3.99.5.tar.gz' #URL_SERVIIO_RTMPDUMP='http://download.serviio.org/opensource/rtmpdump.tar.gz' #URL_SERVIIO_FFMPEG='http://download.serviio.org/opensource/ffmpeg-N-54096-ge41bf19.tar.gz' ## Git updatable codecs #EDGE_YASM='git://github.com/yasm/yasm.git' EDGE_ENCA='git://github.com/nijel/enca.git' EDGE_X264='git://git.videolan.org/x264.git' EDGE_RTMPDUMP='git://git.ffmpeg.org/rtmpdump' EDGE_FFMPEG='git://source.ffmpeg.org/ffmpeg.git' create_symlink() { local symlink="$1" local symlink_source="$2" echo ">>> Creating symlink: ${symlink} -> ${symlink_source}" ln -f -s $symlink_source $symlink } if [[ $CLEAN = 'true' ]]; then echo '--> Cleaning existing directory' rm -rf $CODEC_DIRECTORY fi; echo ">>> Processing codec installation: " echo ">>> Installing required iPkg dependencies" ipkg update ipkg install optware-devel ipkg install bash ipkg install util-linux ipkg install gcc ipkg install glib ipkg install gawk ipkg install sed ipkg install coreutils ipkg install autoconf ipkg install automake ipkg install git ipkg install make ipkg install perl ipkg install openssl-dev ipkg install pkgconfig ipkg install fontconfig ipkg install libstdc++ create_symlink '/bin/bash' '/opt/bin/bash' ## Required on every run CODEC_DIRECTORY='/share/MD0_DATA/.codecs' PREFIX='/opt' export PATH=/opt/bin:/opt/sbin:$PATH export LD_LIBRARY_PATH=/opt/lib # Only works with LD_LIBRARY_PATH=/opt/lib ./ffmpeg (or adding /opt/lib to /etc/ld.so.conf with running ldconfig after) if [[ $(grep -q "/opt/lib" "/etc/ld.so.conf" && echo $?) = 0 ]]; then echo ' --> /opt/lib already loaded in /etc/ls.so.conf' else echo "/opt/lib" >> /etc/ld.so.conf fi; ldconfig echo ">> Loading codecs into ${CODEC_DIRECTORY}" mkdir -p $CODEC_DIRECTORY cd $CODEC_DIRECTORY if [ ! -d "automake-1.14" ]; then echo ">>> Installing Automake" curl -C - -L -O $URL_AUTOMAKE tar -xvzf automake-1.14.tar.gz cd automake-1.14 ./configure --prefix=$PREFIX make make install cd $CODEC_DIRECTORY rm -f automake-1.14.tar.gz else echo "--- Skipping Automake" fi; if [ ! -d "which-2.20" ]; then echo ">>> Installing Which" curl -C - -L -O $URL_WHICH tar -xvzf which-2.20.tar.gz cd which-2.20 ./configure --prefix=$PREFIX make make install cd $CODEC_DIRECTORY rm -f which-2.20.tar.gz else echo "--- Skipping which" fi; if [ ! -d "yasm-1.2.0" ]; then echo ">>> Installing YASM" curl -C - -L -O $URL_YASM tar -xvzf yasm-1.2.0.tar.gz cd yasm-1.2.0 ./configure --prefix=$PREFIX make make install cd $CODEC_DIRECTORY rm -f yasm-1.2.0.tar.gz else echo "--- Skipping Yasm" fi; URL_NASM='http://www.nasm.us/pub/nasm/releasebuilds/2.10.09/nasm-2.10.09.tar.gz' if [ ! -d "nasm-2.10.09" ]; then echo ">>> Installing NASM" curl -C - -L -O $URL_NASM tar -xvzf nasm-2.10.09.tar.gz cd nasm-2.10.09 ./configure --prefix=$PREFIX make make install cd $CODEC_DIRECTORY rm -f nasm-2.10.09.tar.gz else echo "--- Skipping Nasm" fi; if [ ! -d "libvpx-v1.1.0" ]; then echo ">>> Installing libvpx" curl -C - -L -O $URL_LIBVPX tar -xjvf libvpx-v1.1.0.tar.bz2 cd libvpx-v1.1.0 #make clean ./configure --prefix=$PREFIX --enable-shared \ --disable-static make make prefix=$PREFIX install cd $CODEC_DIRECTORY rm -rf libvpx-v1.1.0.tar.bz2 else echo "--- Skipping libvpx" fi; if [ ! -d "x264" ]; then echo ">>> Installing x264" git clone $EDGE_X264 x264 cd x264 #make distclean #make clean ./configure --prefix=$PREFIX --host=i686-unknown-linux-gnu --enable-shared make make install cd $CODEC_DIRECTORY else echo "--- Skipping x264" fi; if [ ! -d "xvidcore" ]; then echo ">>> Installing XVid Core" curl -C - -L -O $URL_XVID tar -xvzf xvidcore-1.3.1.tar.gz cd xvidcore/build/generic ./configure --prefix=$PREFIX --build=i386-pc-linux-gnu --host=i686-unknown-linux-gnu --target=i686-unknown-linux-gnu make make install cd $CODEC_DIRECTORY rm -f xvidcore-1.3.1.tar.gz else echo "--- Skipping Xvid Core" fi; if [ ! -d "lame-3.99.5" ]; then echo ">>> Compiling LAME" curl -C - -L -O $URL_SERVIIO_LAME tar -xvzf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix=$PREFIX --disable-frontend --enable-shared make make install cd $CODEC_DIRECTORY rm -f lame-3.99.5.tar.gz else echo "--- Skipping LAME" fi; if [ ! -d "faac-1.28" ]; then echo ">>> Installing Faac" curl -L -O $URL_FAAC tar -xvzf faac-1.28.tar.gz cd faac-1.28 create_symlink '/usr/lib/libstdc++.so' '/opt/lib/libstdc++.so' ./configure --prefix=$PREFIX --enable-shared make make install cd $CODEC_DIRECTORY rm -f faac-1.28.tar.gz else echo "--- Skipping faac" fi; if [ ! -d "freetype-2.5.0.1" ]; then echo ">>> Installing freetype" curl -C - -L -O $URL_FREETYPE tar -xjvf freetype-2.5.0.1.tar.bz2 cd freetype-2.5.0.1 ./configure --prefix=$PREFIX --enable-shared --without-png make make install cd $CODEC_DIRECTORY rm -f freetype-2.5.0.1.tar.bz2 else echo "--- Skipping freetype" fi; if [ ! -d "libogg-1.3.1" ]; then echo ">>> Installing libogg" curl -C - -L -O $URL_OGG tar -xvzf libogg-1.3.1.tar.gz cd libogg-1.3.1 ./configure --prefix=$PREFIX --enable-shared make make install cd $CODEC_DIRECTORY rm -f libogg-1.3.1.tar.gz else echo "--- Skipping libogg" fi; if [ ! -d "libvorbis-1.3.3" ]; then echo ">>> Installing libvorbis" curl -C - -L -O $URL_VORBIS tar -xzvf libvorbis-1.3.3.tar.gz cd libvorbis-1.3.3 ./configure --prefix=$PREFIX --enable-shared make make install cd $CODEC_DIRECTORY rm -f libvorbis-1.3.3.tar.gz else echo "--- Skipping libvorbis" fi; if [ ! -d "libtheora-1.1.1" ]; then echo ">>> Installing libtheora" curl -C - -L -O $URL_THEORA tar -xjvf libtheora-1.1.1.tar.bz2 cd libtheora-1.1.1 ./configure --prefix=$PREFIX --enable-shared --with-ogg=$PREFIX --with-vorbis=$PREFIX --build=i386-pc-linux-gnu --host=i686-unknown-linux-gnu --target=i686-unknown-linux-gnu make make install cd $CODEC_DIRECTORY rm -f libtheora-1.1.1.tar.bz2 else echo "--- Skipping libtheora" fi; if [ ! -d "fribidi-0.19.5" ]; then echo ">>> Installing fribidi" curl -C - -L -O $URL_FRIBIDI tar -xjvf fribidi-0.19.5.tar.bz2 cd fribidi-0.19.5 ./configure --prefix=$PREFIX --enable-shared make make install cd $CODEC_DIRECTORY rm -f fribidi-0.19.5.tar.bz2 else echo "--- Skipping fribidi" fi; if [ ! -d "enca" ]; then echo ">>> Installing enca" rm -f /opt/bin/enconv rm -f /opt/share/man/man1/enconv.1 git clone $EDGE_ENCA cd enca #make distclean #make clean ./configure --prefix=$PREFIX --enable-shared make make check make install cd $CODEC_DIRECTORY else echo "--- Skipping enca" fi; if [ ! -d "libass-0.10.1" ]; then echo ">>> Installing libass" curl -C - -L -O $URL_LIBASS tar -xzvf libass-0.10.1.tar.gz cd libass-0.10.1 ./configure --prefix=$PREFIX --enable-shared make make install cd $CODEC_DIRECTORY rm -f libass-0.10.1.tar.gz else echo "--- Skipping libass" fi; if [ ! -d "openssl-1.0.1e" ]; then echo ">>> Compiling OpenSSL" curl -C - -L -O $URL_OPENSSL tar -xzvf openssl-1.0.1e.tar.gz cd openssl-1.0.1e ./Configure linux-generic32 make rm -f openssl-1.0.1e.tar.gz cd $CODEC_DIRECTORY else echo "--- Skipping OpenSSL" fi; if [ ! -d "fdk-aac-0.1.2" ]; then echo ">>> Installing FDK-AAC" curl -C - -L -O $URL_FDK tar -xvzf fdk-aac-0.1.2.tar.gz cd fdk-aac-0.1.2 ./configure --prefix=$PREFIX make prefix=$PREFIX make prefix=$PREFIX install ldconfig cd $CODEC_DIRECTORY rm -f fdk-aac-0.1.2.tar.gz else echo "--- Skipping FDK-AAC" fi; if [ ! -d "opencore-amr-0.1.3" ]; then echo ">>> Installing Opencore AMR" curl -L -O $URL_OPENCORE tar -xvzf opencore-amr-0.1.3.tar.gz cd opencore-amr-0.1.3 ./configure --prefix=$PREFIX make prefix=$PREFIX make prefix=$PREFIX install ldconfig cd $CODEC_DIRECTORY rm -f opencore-amr-0.1.3.tar.gz else echo "--- Skipping Opencore AMR" fi; if [ ! -d "rtmpdump" ]; then echo ">>> Compiling libRTMP" git clone $EDGE_RTMPDUMP cd rtmpdump #make distclean #make clean make SYS=posix prefix=$PREFIX make SYS=posix prefix=$PREFIX install cd librtmp sed -i'.bak' '/URL/d' librtmp.pc cd $CODEC_DIRECTORY else echo "--- Skipping libRTMP" fi; export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$CODEC_DIRECTORY/openssl-1.0.1e:$CODEC_DIRECTORY/rtmpdump/librtmp pkg-config --exists --print-errors librtmp if [ ! -d "ffmpeg" ]; then echo ">>> Installing FFMPeg" git clone $EDGE_FFMPEG ffmpeg cd ffmpeg ldconfig if [ -e 'ffmpeg' ]; then #existing install make clean fi; ./configure --prefix=/share/MD0_DATA/.qpkg/Serviio/opt \ --libdir=/share/MD0_DATA/.qpkg/Serviio/opt/lib \ --disable-shared \ --disable-ffserver \ --disable-ffplay \ --enable-static \ --enable-pthreads \ --enable-libmp3lame \ --enable-libfaac \ --enable-libfreetype \ --enable-libtheora \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-libxvid \ --enable-librtmp \ --enable-fontconfig \ --enable-hardcoded-tables \ --enable-avresample \ --enable-libass \ --enable-libfdk-aac \ --enable-libopencore-amrnb \ --enable-libopencore-amrwb \ --enable-gpl \ --enable-postproc \ --enable-version3 \ --enable-nonfree \ --extra-cflags='-I/opt/include' --extra-ldflags='-L/opt/lib' make prefix='/share/MD0_DATA/.qpkg/Serviio/opt' make prefix='/share/MD0_DATA/.qpkg/Serviio/opt' install rm -f /opt/bin/ffmpeg create_symlink '/opt/bin/ffmpeg' '/share/MD0_DATA/.qpkg/Serviio/opt/bin/ffmpeg' create_symlink '/opt/bin/ffprobe' '/share/MD0_DATA/.qpkg/Serviio/opt/bin/ffprobe' cd $CODEC_DIRECTORY else echo "--- Skipping FFMpeg" fi; echo " >>> Done ;)" ##### KNOWN ISSUES ## 1. Unable to compile libvpx 1.2.0: # [/share/MD0_DATA/.codecs/libvpx-v1.2.0] # make install # [INSTALL] /opt/lib/libvpx.so.1.2.0 # [LN] /opt/lib/libvpx.so # [INSTALL] /opt/lib/pkgconfig/vpx.pc # [LD] test_libvpx # test/altref_test.cc.o: In function `testing::internal::linked_ptr::TestInfo>::depart()': # altref_test.cc:(.text+0x873): undefined reference to `__sync_fetch_and_add_4' # altref_test.cc:(.text+0x887): undefined reference to `__sync_fetch_and_add_4' # altref_test.cc:(.text+0x944): undefined reference to `__sync_fetch_and_add_4' # altref_test.cc:(.text+0x958): undefined reference to `__sync_fetch_and_add_4' # test/altref_test.cc.o: In function `(anonymous namespace)::AltRefTest::PreEncodeFrameHook(libvpx_test::VideoSource*, libvpx_test::Encoder*)': # altref_test.cc:(.text+0x1b9c): undefined reference to `__sync_fetch_and_add_4' # test/altref_test.cc.o:altref_test.cc:(.text+0x1da7): more undefined references to `__sync_fetch_and_add_4' follow # collect2: ld returned 1 exit status # make[1]: *** [test_libvpx] Error 1 # make: *** [.DEFAULT] Error 2 ## 2. Unable to run autogen.sh for edge YASM: # if [ ! -d "yasm" ]; then # Issues found : # [/share/MD0_DATA/.codecs/yasm] # make prefix=$PREFIX # make: *** No rule to make target `x86insns.c', needed by `all'. Stop. # echo ">>> Installing Edge YASM" # git clone $EDGE_YASM yasm # cd yasm # ./autogen.sh # ./configure --prefix=$PREFIX # make --always-make # make install # cd $CODEC_DIRECTORY # else # echo "--- Skipping YASM" # fi;