From 5eefdf1cfcc7e4982706ea958aeac38cc0a19e59 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 10:53:02 +0000 Subject: [PATCH 01/22] Update script --- .gitignore | 2 + README.md | 21 ++-- build-debian.sh | 271 ++++++++++++++++++++++++++++++------------------ 3 files changed, 181 insertions(+), 113 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bea433 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/README.md b/README.md index 37bd41e..686bc06 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Highlights - 32 and 64 bit support - libfdk-aac (Installed via the platform's package manager, or will build from source as a fallback if not available) - libx264 (Installed via the platform's package manager, or will build from source as a fallback if not available) -- h264_omx (32Bit only, Raspberry Pi only, deprecated) +- libx265 (Installed via the platform's package manager, or will build from source as a fallback if not available) - h264_v4l2m2m (replaces h264_omx) - Ability to add extra compile flags - Automate with command line arguments. @@ -17,32 +17,31 @@ Highlights Tested systems - **Alpine** + - Apple M1 (Virtual) (64 Bit) - Raspberry Pi 3B (32 Bit) - **Bullseye** + - Raspberry Pi Zero W1 (32 Bit) - Raspberry Pi Zero W2 (64 Bit) - - Raspberry Pi 4 (64 Bit) - - Raspberry Pi 3A+ (64 Bit) + - Raspberry Pi 4 (64 Bit) + - Raspberry Pi 3A+ (64 Bit) - **Buster** + - Raspberry Pi 4 (32 Bit) - Raspberry Pi 3B+ (32 Bit) - Raspberry Pi 3B (32 Bit) - **macOS Monterey** + - Apple M1 (64 Bit) - **Ubuntu** - Intel (64 Bit) - Apple M1 (Virtual) (64 Bit) - - - - - ![image](./Menu1.png) # How to Install @@ -50,15 +49,13 @@ Tested systems Copy the below and paste it in your terminal. Note: If your OS is Alpine, install curl and bash first. + ``` apk add curl bash ``` + Then ``` bash <(curl -sL https://raw.githubusercontent.com/NRCHKB/nrchkb-ffmpeg-build/main/build-bootstrap.sh) ``` - - - - diff --git a/build-debian.sh b/build-debian.sh index ca3545d..18ecbcb 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -1,6 +1,6 @@ #!/bin/bash -# nrchkb-ffmpeg-build Version 1.1 +# nrchkb-ffmpeg-build Version 2.0 # MIT License @@ -33,10 +33,12 @@ End=$'\e[0m' # Defaults JOBS=3 # Jobs Value JOBSPARAM=false # Arg provided -OMX="n" # OMX Choice Value -OMXPARAM=false # Arg provided FDK="y" # FDK Choice Value FDKPARAM=false # Arg provided +L264="y" # 264 Choice Value +L264ARAM=false # Arg provided +L265="y" # 265 Choice Value +L265ARAM=false # Arg provided FLAGSYN="n" # Flags Choice Value FLAGS="" # Flasg Value FLAGSPARAM=false # Arg provided @@ -61,19 +63,24 @@ CHECK() { apt info $1 } +# Package Names +DEPX264="libx264-dev" +DEPX265="libx265-dev" +DEPAAC="libfdk-aac-dev" + # Print Header printHeader() { printf "\033c" echo echo " ---------------------------------------------------------" - echo " | 1.1 |" + echo " | 2.0 |" echo " | P&M FFmpeg Build Script (Debian) |" echo " | An FFmpeg build & installation utility for NRCHKB |" echo " | |" echo " ---------------------------------------------------------" echo - echo " ${Red}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" + echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" echo } @@ -83,17 +90,22 @@ menu() { echo " ${Yellow}What would you like to do:${End}" echo - echo " 1 - Install build tools (dependencies from apt)" - echo " 2 - Build/install libfdk-aac (AAC encoder, needed for HomeKit audio)" - echo " 3 - Build/install FFmpeg (video processor, builds from source)" - echo " 4 - All of the above" - echo " 5 - Cleanup build directories" + echo " 1 - Install build tools (Dependencies from apt)" + echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" + echo " 3 - Build/install libx264 (x264 Video Encoder)" + echo " 4 - Build/install libx265 (x265 Video Encoder)" + echo " 5 - Build FFmpeg (Biulds from source only)" + echo " 6 - All of the above" + echo " 7 - Purge build directories" echo " q - Quit" echo - echo " Note: this script will download and compile these software packages from source code." - echo " This will take a long time. Option 4 will take over 6 hours on a Pi Zero W." + echo " Note: This script will download and compile these software packages from source code," + echo " unless they happen to be available from your systems repository." + echo " Where necessary, libaries will be built as shared libs." + echo + echo " This excludes FFMPEG which will always be built for source." echo - echo " If you have previously run this script, running it again will update your software." + echo " If you have previously run this script, running it again will update your software." echo printf " Choice: " read -r @@ -103,7 +115,7 @@ menu() { MODE=$REPLY - if [[ $MODE -gt 5 || $MODE -lt 1 ]]; then + if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then printHeader menu fi @@ -136,24 +148,13 @@ installDependencies() { echo " | |" echo " ---------------------------------------------------------" echo - INSTALL pkg-config autoconf automake libtool git wget make g++ gcc nasm yasm - - CHECK libx264-dev - - if [[ $? -gt 0 ]]; then - installLibx264 - else - INSTALL libx264-dev - fi + INSTALL pkg-config autoconf automake libtool git wget make g++ gcc nasm yasm build-essential cmake-curses-gui cmake } # Install Libx264 installLibx264() { - cd ~ || { - echo "cd failed, aborting at installLibx264:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -161,31 +162,61 @@ installLibx264() { echo " | |" echo " ---------------------------------------------------------" echo - REMOVE libx264-dev + + CHECK $DEPX264 + if [[ $? = 0 ]]; then + INSTALL $DEPX264 + return + fi + + + REMOVE $DEPX264 git clone https://code.videolan.org/videolan/x264.git - cd x264 || { - echo "cd failed, aborting at installLibx264:02" - exit 1 - } - ./configure --prefix=$PREFIX --enable-static --enable-pic + cd x264 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError sudo make install checkForError sudo ldconfig - cd ~ || { - echo "cd failed, aborting at installLibx264:03" - exit 1 - } + cd ~ +} + +# Install Libx265 +installLibx265() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx265 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + CHECK $DEPX265 + if [[ $? = 0 ]]; then + INSTALL $DEPX265 + return + fi + + + REMOVE $DEPX265 + git clone https://bitbucket.org/multicoreware/x265_git.git + cd x265 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ } # Install Libfdk installLibfdk() { - cd ~ || { - echo "cd failed, aborting at installLibfdk:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -194,38 +225,29 @@ installLibfdk() { echo " ---------------------------------------------------------" echo - CHECK libfdk-aac-dev + CHECK $DEPAAC if [[ $? = 0 ]]; then - INSTALL libfdk-aac-dev + INSTALL $DEPAAC return fi - REMOVE libfdk-aac-dev + REMOVE $DEPAAC git clone https://github.com/mstorsjo/fdk-aac.git - cd fdk-aac || { - echo "cd failed, aborting at installLibfdk:02" - exit 1 - } + cd fdk-aac ./autogen.sh - ./configure --prefix=$PREFIX --enable-static --disable-shared + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError sudo make install checkForError sudo ldconfig - cd ~ || { - echo "cd failed, aborting at installLibfdk:03" - exit 1 - } + cd ~ } # Install FFmpeg installFFmpeg() { - cd ~ || { - echo "cd failed, aborting at installFFmpeg:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -237,21 +259,20 @@ installFFmpeg() { wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 echo "Extracting source code..." tar xjf ffmpeg-snapshot.tar.bz2 - cd ffmpeg || { - echo "cd failed, aborting at installFFmpeg:02" - exit 1 - } + cd ffmpeg - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-libx264" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs=\"-lpthread -lm\"" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" fi - if [[ "$OMX" = "y" ]]; then - CMD="$CMD --enable-mmal" - CMD="$CMD --enable-omx" - CMD="$CMD --enable-omx-rpi" + if [[ "$L264" = "y" ]]; then + CMD="$CMD --enable-libx264" + fi + + if [[ "$L265" = "y" ]]; then + CMD="$CMD --enable-libx265" fi if [[ "$FLAGSYN" = "y" ]]; then @@ -264,10 +285,7 @@ installFFmpeg() { checkForError sudo make install checkForError - cd ~ || { - echo "cd failed, aborting at installFFmpeg:03" - exit 1 - } + cd ~ } # Clear Up @@ -275,6 +293,7 @@ cleanDirectory() { rm -rf ffmpeg rm -rf fdk-aac rm -rf x264 + rm -rf x265 rm -f ffmpeg-snapshot.tar.bz2 } @@ -296,39 +315,57 @@ getJobsCount() { fi } -# Ask for omx -getOMX() { +# Ask for FDK +getFDK() { - if [[ $OMXPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $FDKPARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}Would you like to enable 'h264_omx'?${End}" + echo " ${Yellow}Would you like to enable 'libfdk-aac'?${End}" echo - echo " Note: 'h264_omx' is deprecated and should not be used on new installs." - printf " If you already use it, choose yes here. Enter (y/n): " + echo " Note: 'libfdk-aac' is needed for HomeKit audio. We recommend enabling libfdk-aac." + printf " If you are running Option 5, you can enable this lib. Enter (y/n): " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - OMX="$REPLY" + FDK="$REPLY" fi } -# Ask for FDK -getFDK() { +# Ask for X264 +getX624() { - if [[ $FDKPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $L264ARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}Would you like to enable 'libfdk-aac'?${End}" + echo " ${Yellow}Would you like to enable 'libx264'?${End}" echo - echo " Note: 'libfdk-aac' is needed for HomeKit audio. We recommend enabling libfdk-aac." - printf " If you are running Option 4, you can enable this lib. Enter (y/n): " + echo " Note: 'libx264' is needed for HomeKit video, as that is the only codc is will support." + printf " If you are running Option 5, you can enable this lib. Enter (y/n): " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FDK="$REPLY" + L264="$REPLY" + fi +} + +# Ask for X265 +getX625() { + + if [[ $L265ARAM = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + echo + echo " ${Yellow}Would you like to enable 'libx265'?${End}" + echo + echo " Whilst not strictly requied, will add support never the less." + printf " If you are running Option 5, you can enable this lib. Enter (y/n): " + read -r + if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then + L265="$REPLY" fi } @@ -342,8 +379,8 @@ getFlags() { echo echo " ${Yellow}Would you like to add any extra FFmpeg compile flags?" echo - echo " ADVANCED: ${End}Compile flags could be added to enable libx265 or the countless others" - printf " You are responsible for ensuring any required parts are installed (y/n): " + echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." + printf " You are responsible for ensuring any requied dev/header files are installed (y/n): " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then FLAGSYN="$REPLY" @@ -351,7 +388,7 @@ getFlags() { echo echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" echo - printf " Example '--enable-libx265 --enable-libopus' : " + printf " Example '--enable-vaapi --enable-libopus' : " read -r if [[ ${#REPLY} -gt 0 ]]; then FLAGS="$REPLY" @@ -389,7 +426,6 @@ processOptions() { case $1 in 1) - getJobsCount stopWatch "start" installDependencies stopWatch "stop" @@ -416,9 +452,31 @@ processOptions() { 3) getJobsCount - getOMX - getFDK - getFlags + stopWatch "start" + installLibx264 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + 4) + getJobsCount + stopWatch "start" + installLibx265 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 5) + getJobsCount stopWatch "start" installFFmpeg stopWatch "stop" @@ -430,17 +488,23 @@ processOptions() { fi ;; - 4) - cleanDirectory + 6) getJobsCount - getOMX getFDK + getX624 + getX625 getFlags stopWatch "start" installDependencies if [[ "$FDK" = "y" ]]; then installLibfdk fi + if [[ "$L264" = "y" ]]; then + installLibx264 + fi + if [[ "$L265" = "y" ]]; then + installLibx265 + fi installFFmpeg cleanDirectory stopWatch "stop" @@ -452,7 +516,7 @@ processOptions() { fi ;; - 5) + 7) stopWatch "start" cleanDirectory stopWatch "stop" @@ -480,10 +544,11 @@ while [ $# -gt 0 ]; do echo "Options:" echo echo " --interactive -i [y|n] Default: y Disables interactive mode" - echo " --mode -m [1|2|3|4|5] Sets the mode (requires --interactive 0, ignored otherwise)" + echo " --mode -m [1|2|3|4|5|6|7] Sets the mode (requires --interactive 0, ignored otherwise)" echo " --max-jobs -j [#] Default: 3 Set maximum number of builds jobs" echo " --libfdk-aac -a [y|n] Default: y Compile/enable libfdk-aac" - echo " --h264-omx -x [y|n] Default: n Enable h264-omx" + echo " --libx264 -4 [y|n] Default: y Compile/enable libx264" + echo " --libx265 -5 [y|n] Default: y Compile/enable libx265" echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" echo echo " Example: ./build-debian.sh --interactive n --max-jobs 2 --mode 4" @@ -501,14 +566,18 @@ while [ $# -gt 0 ]; do JOBS=$2 JOBSPARAM=true ;; - --h264-omx | -x) - OMX="$2" - OMXPARAM=true - ;; --libfdk-aac | -a) FDK="$2" FDKPARAM=true ;; + --libx264 | -4) + L264="$2" + L264ARAM=true + ;; + --libx265 | -5) + L265="$2" + L265ARAM=true + ;; --extra-flags | -f) FLAGSYN="y" FLAGS="$2" From dce2bc54186bbea7eeb2f76500e5751eab70320b Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 10:57:01 +0000 Subject: [PATCH 02/22] Update build-debian.sh --- build-debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-debian.sh b/build-debian.sh index 18ecbcb..926a912 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -261,7 +261,7 @@ installFFmpeg() { tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs=\"-lpthread -lm\"" + CMD='--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm"' if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" From 0623b28b1e66655a0e5314d70256286a4f95d1f2 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 10:59:53 +0000 Subject: [PATCH 03/22] Update build-debian.sh --- build-debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-debian.sh b/build-debian.sh index 926a912..004505f 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -261,7 +261,7 @@ installFFmpeg() { tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg - CMD='--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm"' + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs='-lpthread -lm'" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" From fd9baac9d897e0b0f1bd0ab1d12520d719776ae4 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 11:00:35 +0000 Subject: [PATCH 04/22] Update build-debian.sh --- build-debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-debian.sh b/build-debian.sh index 004505f..e15b656 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -261,7 +261,7 @@ installFFmpeg() { tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs='-lpthread -lm'" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm"" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" From 6051a44a802221471d72470e295381042be0edf9 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 11:01:54 +0000 Subject: [PATCH 05/22] Update build-debian.sh --- build-debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-debian.sh b/build-debian.sh index e15b656..4c79ee8 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -261,7 +261,7 @@ installFFmpeg() { tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm"" + CMD=--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" From a115d2084b1e3e4a50b796d27b78e6e5e85bdf39 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 11:26:07 +0000 Subject: [PATCH 06/22] Update build-debian.sh --- build-debian.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build-debian.sh b/build-debian.sh index 4c79ee8..b192c0e 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -260,8 +260,9 @@ installFFmpeg() { echo "Extracting source code..." tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg + - CMD=--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared --extra-libs="-lpthread -lm" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" @@ -279,7 +280,7 @@ installFFmpeg() { CMD="$CMD $FLAGS" fi - ./configure $CMD + ./configure $CMD --extra-libs="-lpthread -lm" checkForError make -j"$JOBS" checkForError From bb9c8a9a9b1d09ec51f031c8b899c4cf0f408c8e Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 16:59:36 +0000 Subject: [PATCH 07/22] Script updates --- README.md | 2 + build-debian.sh | 265 +++++++++++++++++++++++++++++++----------------- 2 files changed, 174 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index 686bc06..757c579 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Highlights - libfdk-aac (Installed via the platform's package manager, or will build from source as a fallback if not available) - libx264 (Installed via the platform's package manager, or will build from source as a fallback if not available) - libx265 (Installed via the platform's package manager, or will build from source as a fallback if not available) +- libvpx (Installed via the platform's package manager, or will build from source as a fallback if not available) +- libopus (Installed via the platform's package manager, or will build from source as a fallback if not available) - h264_v4l2m2m (replaces h264_omx) - Ability to add extra compile flags - Automate with command line arguments. diff --git a/build-debian.sh b/build-debian.sh index b192c0e..fea20d8 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -32,18 +32,30 @@ End=$'\e[0m' # Defaults JOBS=3 # Jobs Value -JOBSPARAM=false # Arg provided +JOBS_PARAM=false # Arg provided + FDK="y" # FDK Choice Value -FDKPARAM=false # Arg provided +FDK_PARAM=false # Arg provided + L264="y" # 264 Choice Value -L264ARAM=false # Arg provided -L265="y" # 265 Choice Value -L265ARAM=false # Arg provided +L264_PARAM=false # Arg provided + +L265="n" # 265 Choice Value +L265_PARAM=false # Arg provided + +LVPX="n" # VPX Choice Value +LVPX_PARAM=false # Arg provided + +LOPUS="n" # Opus Choice Value +LOPUS_PARAM=false # Arg provided + FLAGSYN="n" # Flags Choice Value FLAGS="" # Flasg Value -FLAGSPARAM=false # Arg provided +FLAGS_PARAM=false # Arg provided + MODE=0 # Mode Value -MODEPARAM=false # Arg provided +MODE_PARAM=false # Arg provided + INTERACTIVE="y" # Interactive # Prefix @@ -64,9 +76,11 @@ CHECK() { } # Package Names -DEPX264="libx264-dev" -DEPX265="libx265-dev" -DEPAAC="libfdk-aac-dev" +DEP_X264="libx264-dev" +DEP_X265="libx265-dev" +DEP_VPX="libvpx-dev" +DEP_OPUS="libopus-dev" +DEP_AAC="libfdk-aac-dev" # Print Header printHeader() { @@ -94,9 +108,11 @@ menu() { echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" echo " 3 - Build/install libx264 (x264 Video Encoder)" echo " 4 - Build/install libx265 (x265 Video Encoder)" - echo " 5 - Build FFmpeg (Biulds from source only)" - echo " 6 - All of the above" - echo " 7 - Purge build directories" + echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" + echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" + echo " 7 - Build FFmpeg (Builds from source only)" + echo " 8 - Guided Install" + echo " 9 - Purge build directories" echo " q - Quit" echo echo " Note: This script will download and compile these software packages from source code," @@ -163,14 +179,14 @@ installLibx264() { echo " ---------------------------------------------------------" echo - CHECK $DEPX264 + CHECK $DEP_X264 if [[ $? = 0 ]]; then - INSTALL $DEPX264 + INSTALL $DEP_X264 return fi - REMOVE $DEPX264 + REMOVE $DEP_X264 git clone https://code.videolan.org/videolan/x264.git cd x264 ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic @@ -194,14 +210,14 @@ installLibx265() { echo " ---------------------------------------------------------" echo - CHECK $DEPX265 + CHECK $DEP_X265 if [[ $? = 0 ]]; then - INSTALL $DEPX265 + INSTALL $DEP_X265 return fi - REMOVE $DEPX265 + REMOVE $DEP_X265 git clone https://bitbucket.org/multicoreware/x265_git.git cd x265 ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic @@ -225,13 +241,13 @@ installLibfdk() { echo " ---------------------------------------------------------" echo - CHECK $DEPAAC + CHECK $DEP_AAC if [[ $? = 0 ]]; then - INSTALL $DEPAAC + INSTALL $DEP_AAC return fi - REMOVE $DEPAAC + REMOVE $DEP_AAC git clone https://github.com/mstorsjo/fdk-aac.git cd fdk-aac ./autogen.sh @@ -245,6 +261,68 @@ installLibfdk() { cd ~ } +# Install VPX +installLibvpx() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libvpx-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi + + REMOVE $DEP_VPX + git clone https://chromium.googlesource.com/webm/libvpx.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibopus() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libopus-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi + + REMOVE $DEP_OPUS + git clone https://github.com/xiph/opus.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + # Install FFmpeg installFFmpeg() { cd ~ @@ -262,7 +340,7 @@ installFFmpeg() { cd ffmpeg - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" @@ -276,6 +354,14 @@ installFFmpeg() { CMD="$CMD --enable-libx265" fi + if [[ "$LVPX" = "y" ]]; then + CMD="$CMD --enable-libvpx" + fi + + if [[ "$LOPUS" = "y" ]]; then + CMD="$CMD --enable-libopus" + fi + if [[ "$FLAGSYN" = "y" ]]; then CMD="$CMD $FLAGS" fi @@ -286,6 +372,7 @@ installFFmpeg() { checkForError sudo make install checkForError + sudo ldconfig cd ~ } @@ -295,93 +382,54 @@ cleanDirectory() { rm -rf fdk-aac rm -rf x264 rm -rf x265 + rm -rf libvpx + rm -rf opus rm -f ffmpeg-snapshot.tar.bz2 } # Ask for Threads getJobsCount() { - if [[ $JOBSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed)${End}" - echo - echo " The more you specify - the higher chance of CPU throttling and memory constraints" - printf " we recommend no more than 3 for a Pi 4 (1-4): " + printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" read -r - if [[ $REPLY -lt 5 && $REPLY -gt 0 ]]; then + if [[ $REPLY -gt 0 ]]; then JOBS=$REPLY fi } -# Ask for FDK -getFDK() { - - if [[ $FDKPARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - echo " ${Yellow}Would you like to enable 'libfdk-aac'?${End}" - echo - echo " Note: 'libfdk-aac' is needed for HomeKit audio. We recommend enabling libfdk-aac." - printf " If you are running Option 5, you can enable this lib. Enter (y/n): " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FDK="$REPLY" - fi -} - -# Ask for X264 -getX624() { +# getLib L264_PARAM L264 "libx264" +getLib(){ - if [[ $L264ARAM = true || "$INTERACTIVE" = "n" ]]; then + + if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then return fi - echo - echo " ${Yellow}Would you like to enable 'libx264'?${End}" - echo - echo " Note: 'libx264' is needed for HomeKit video, as that is the only codc is will support." - printf " If you are running Option 5, you can enable this lib. Enter (y/n): " + printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - L264="$REPLY" - fi -} - -# Ask for X265 -getX625() { - - if [[ $L265ARAM = true || "$INTERACTIVE" = "n" ]]; then - return + eval $2="$REPLY" fi - echo - echo " ${Yellow}Would you like to enable 'libx265'?${End}" - echo - echo " Whilst not strictly requied, will add support never the less." - printf " If you are running Option 5, you can enable this lib. Enter (y/n): " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - L265="$REPLY" - fi } # Get Compile Flags getFlags() { - if [[ $FLAGSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}Would you like to add any extra FFmpeg compile flags?" + echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" echo echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." - printf " You are responsible for ensuring any requied dev/header files are installed (y/n): " + printf " You are responsible for ensuring any requied dev/header files are installed: " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then FLAGSYN="$REPLY" @@ -389,7 +437,7 @@ getFlags() { echo echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" echo - printf " Example '--enable-vaapi --enable-libopus' : " + printf " Example: --enable-vaapi --enable-libvorbis : " read -r if [[ ${#REPLY} -gt 0 ]]; then FLAGS="$REPLY" @@ -479,7 +527,7 @@ processOptions() { 5) getJobsCount stopWatch "start" - installFFmpeg + installLibvpx stopWatch "stop" if [ "$INTERACTIVE" = "y" ]; then echo " ${Yellow}All Done!${End} ...press enter" @@ -491,9 +539,37 @@ processOptions() { 6) getJobsCount - getFDK - getX624 - getX625 + stopWatch "start" + installLibopus + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 7) + getJobsCount + stopWatch "start" + installFFmpeg + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 8) + getJobsCount + getLib FDK_PARAM FDK "libfdk-aac" + getLib L264_PARAM L264 "libx264" + getLib L265_PARAM L265 "libx265" + getLib LVPX_PARAM LVPX "libvpx" + getLib LOPUS_PARAM LOPUS "libopus" getFlags stopWatch "start" installDependencies @@ -506,6 +582,12 @@ processOptions() { if [[ "$L265" = "y" ]]; then installLibx265 fi + if [[ "$LVPX" = "y" ]]; then + installLibvpx + fi + if [[ "$LOPUS" = "y" ]]; then + installLibopus + fi installFFmpeg cleanDirectory stopWatch "stop" @@ -517,7 +599,7 @@ processOptions() { fi ;; - 7) + 9) stopWatch "start" cleanDirectory stopWatch "stop" @@ -532,10 +614,7 @@ processOptions() { } # Entry Point -cd ~ || { - echo "cd failed, aborting" - exit 1 -} +cd ~ while [ $# -gt 0 ]; do @@ -550,7 +629,7 @@ while [ $# -gt 0 ]; do echo " --libfdk-aac -a [y|n] Default: y Compile/enable libfdk-aac" echo " --libx264 -4 [y|n] Default: y Compile/enable libx264" echo " --libx265 -5 [y|n] Default: y Compile/enable libx265" - echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" + echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" echo echo " Example: ./build-debian.sh --interactive n --max-jobs 2 --mode 4" echo @@ -561,28 +640,28 @@ while [ $# -gt 0 ]; do ;; --mode | -m) MODE=$2 - MODEPARAM=true + MODE_PARAM=true ;; --max-jobs | -j) JOBS=$2 - JOBSPARAM=true + JOBS_PARAM=true ;; --libfdk-aac | -a) FDK="$2" - FDKPARAM=true + FDK_PARAM=true ;; --libx264 | -4) L264="$2" - L264ARAM=true + L264_PARAM=true ;; --libx265 | -5) L265="$2" - L265ARAM=true + L265_PARAM=true ;; --extra-flags | -f) FLAGSYN="y" FLAGS="$2" - FLAGSPARAM=true + FLAGS_PARAM=true ;; esac shift From 58fd03789f85bd98905150576fa76781abaeadd8 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 20:31:11 +0000 Subject: [PATCH 08/22] Update build-debian.sh --- build-debian.sh | 110 ++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 42 deletions(-) diff --git a/build-debian.sh b/build-debian.sh index fea20d8..f56e1c2 100755 --- a/build-debian.sh +++ b/build-debian.sh @@ -63,6 +63,9 @@ PREFIX="/usr/local" export LDFLAGS="-L$PREFIX/lib" export CFLAGS="-I$PREFIX/include" +# Ignore Repository sources +FORCE_BUILD=false + # Specific package manager implemention INSTALL() { sudo apt install -y $@ @@ -179,10 +182,12 @@ installLibx264() { echo " ---------------------------------------------------------" echo - CHECK $DEP_X264 - if [[ $? = 0 ]]; then - INSTALL $DEP_X264 - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X264 + if [[ $? = 0 ]]; then + INSTALL $DEP_X264 + return + fi fi @@ -210,17 +215,19 @@ installLibx265() { echo " ---------------------------------------------------------" echo - CHECK $DEP_X265 - if [[ $? = 0 ]]; then - INSTALL $DEP_X265 - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X265 + if [[ $? = 0 ]]; then + INSTALL $DEP_X265 + return + fi fi REMOVE $DEP_X265 git clone https://bitbucket.org/multicoreware/x265_git.git - cd x265 - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + cd x265_git/build/linux + cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source checkForError make -j"$JOBS" checkForError @@ -241,10 +248,12 @@ installLibfdk() { echo " ---------------------------------------------------------" echo - CHECK $DEP_AAC - if [[ $? = 0 ]]; then - INSTALL $DEP_AAC - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_AAC + if [[ $? = 0 ]]; then + INSTALL $DEP_AAC + return + fi fi REMOVE $DEP_AAC @@ -272,10 +281,12 @@ installLibvpx() { echo " ---------------------------------------------------------" echo - CHECK $DEP_VPX - if [[ $? = 0 ]]; then - INSTALL $DEP_VPX - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi fi REMOVE $DEP_VPX @@ -303,15 +314,17 @@ installLibopus() { echo " ---------------------------------------------------------" echo - CHECK $DEP_OPUS - if [[ $? = 0 ]]; then - INSTALL $DEP_OPUS - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi fi REMOVE $DEP_OPUS git clone https://github.com/xiph/opus.git - cd libvpx + cd opus ./autogen.sh ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError @@ -381,7 +394,7 @@ cleanDirectory() { rm -rf ffmpeg rm -rf fdk-aac rm -rf x264 - rm -rf x265 + rm -rf x265_git rm -rf libvpx rm -rf opus rm -f ffmpeg-snapshot.tar.bz2 @@ -620,45 +633,58 @@ while [ $# -gt 0 ]; do case "$1" in - --help | -h) + --help) + printf "\033c" echo "Options:" echo - echo " --interactive -i [y|n] Default: y Disables interactive mode" - echo " --mode -m [1|2|3|4|5|6|7] Sets the mode (requires --interactive 0, ignored otherwise)" - echo " --max-jobs -j [#] Default: 3 Set maximum number of builds jobs" - echo " --libfdk-aac -a [y|n] Default: y Compile/enable libfdk-aac" - echo " --libx264 -4 [y|n] Default: y Compile/enable libx264" - echo " --libx265 -5 [y|n] Default: y Compile/enable libx265" - echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" - echo - echo " Example: ./build-debian.sh --interactive n --max-jobs 2 --mode 4" + echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" + echo " --none-interactive : Disables interactive mode" + echo " --mode [1-9] : Sets the operation. Requies --none-interactive" + echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" + echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" + echo " --libx264 [y:n] Default: y : Enable/Disable this lib" + echo " --libx265 [y:n] Default: n : Enable/Disable this lib" + echo " --libopus [y:n] Default: n : Enable/Disable this lib" + echo " --libvpx [y:n] Default: n : Enable/Disable this lib" + echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" echo exit 0 ;; - --interactive | -i) - INTERACTIVE="$2" + --force-build) + FORCE_BUILD=true + ;; + --none-interactive) + INTERACTIVE="n" ;; - --mode | -m) + --mode) MODE=$2 MODE_PARAM=true ;; - --max-jobs | -j) + --max-jobs) JOBS=$2 JOBS_PARAM=true ;; - --libfdk-aac | -a) + --libfdk-aac) FDK="$2" FDK_PARAM=true ;; - --libx264 | -4) + --libx264) L264="$2" L264_PARAM=true ;; - --libx265 | -5) + --libx265) L265="$2" L265_PARAM=true ;; - --extra-flags | -f) + --libopus) + LOPUS="$2" + LOPUS_PARAM=true + ;; + --libvpx) + LVPX="$2" + LVPX_PARAM=true + ;; + --extra-flags) FLAGSYN="y" FLAGS="$2" FLAGS_PARAM=true From 2183981364869c676479753b3214a5f7b3d62579 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:22:46 +0000 Subject: [PATCH 09/22] Create build-alpine-NEW.sh --- build-alpine-NEW.sh | 702 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 702 insertions(+) create mode 100755 build-alpine-NEW.sh diff --git a/build-alpine-NEW.sh b/build-alpine-NEW.sh new file mode 100755 index 0000000..2b2fd2e --- /dev/null +++ b/build-alpine-NEW.sh @@ -0,0 +1,702 @@ +#!/bin/bash + +# nrchkb-ffmpeg-build Version 2.0 + +# MIT License + +# Copyright (c) 2022 Marcus Davies +# Copyright (c) 2022 Garrett Porter + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Colors +Red=$'\e[0;31m' +Yellow=$'\e[1;33m' +End=$'\e[0m' + +# Defaults +JOBS=3 # Jobs Value +JOBS_PARAM=false # Arg provided + +FDK="y" # FDK Choice Value +FDK_PARAM=false # Arg provided + +L264="y" # 264 Choice Value +L264_PARAM=false # Arg provided + +L265="n" # 265 Choice Value +L265_PARAM=false # Arg provided + +LVPX="n" # VPX Choice Value +LVPX_PARAM=false # Arg provided + +LOPUS="n" # Opus Choice Value +LOPUS_PARAM=false # Arg provided + +FLAGSYN="n" # Flags Choice Value +FLAGS="" # Flasg Value +FLAGS_PARAM=false # Arg provided + +MODE=0 # Mode Value +MODE_PARAM=false # Arg provided + +INTERACTIVE="y" # Interactive + +# Prefix +PREFIX="/usr/local" +export LDFLAGS="-L$PREFIX/lib" +export CFLAGS="-I$PREFIX/include" + +# Ignore Repository sources +FORCE_BUILD=false + +# Specific package manager implemention +INSTALL() { + apk add $@ +} +REMOVE() { + apk del $1 +} +CHECK() { + apk info $1 +} + +# Package Names +DEP_X264="x264-dev" +DEP_X265="x265-dev" +DEP_VPX="libvpx-dev" +DEP_OPUS="opus-dev" +DEP_AAC="fdk-aac-dev" + +# Print Header +printHeader() { + + printf "\033c" + echo + echo " ---------------------------------------------------------" + echo " | 2.0 |" + echo " | P&M FFmpeg Build Script (Alpine) |" + echo " | An FFmpeg build & installation utility for NRCHKB |" + echo " | |" + echo " ---------------------------------------------------------" + echo + echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" + echo + +} + +# Print menu +menu() { + + echo " ${Yellow}What would you like to do:${End}" + echo + echo " 1 - Install build tools (Dependencies from apt)" + echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" + echo " 3 - Build/install libx264 (x264 Video Encoder)" + echo " 4 - Build/install libx265 (x265 Video Encoder)" + echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" + echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" + echo " 7 - Build FFmpeg (Builds from source only)" + echo " 8 - Guided Install" + echo " 9 - Purge build directories" + echo " q - Quit" + echo + echo " Note: This script will download and compile these software packages from source code," + echo " unless they happen to be available from your systems repository." + echo " Where necessary, libaries will be built as shared libs." + echo + echo " This excludes FFMPEG which will always be built for source." + echo + echo " If you have previously run this script, running it again will update your software." + echo + printf " Choice: " + read -r + if [[ "$REPLY" = "q" ]]; then + exit 0 + fi + + MODE=$REPLY + + if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then + printHeader + menu + fi + processOptions $MODE +} + +# Error Check +checkForError() { + if [[ $? -gt 0 ]]; then + stopWatch "stop" + echo "${Red}" + echo " ---------------------------------------------------------" + echo " | |" + echo " | Errors occurred |" + echo " | Please check the logs and try again |" + echo " | |" + echo " ---------------------------------------------------------" + echo "${End}" + echo + exit 1 + fi +} + +# Install Dependencies +installDependencies() { + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Installing Dependencies |" + echo " | |" + echo " ---------------------------------------------------------" + echo + INSTALL pkg-config autoconf automake libtool git wget make g++ gcc nasm yasm build-essential cmake-curses-gui cmake + +} + +# Install Libx264 +installLibx264() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx264 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X264 + if [[ $? = 0 ]]; then + INSTALL $DEP_X264 + return + fi + fi + + + REMOVE $DEP_X264 + git clone https://code.videolan.org/videolan/x264.git + cd x264 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install Libx265 +installLibx265() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx265 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X265 + if [[ $? = 0 ]]; then + INSTALL $DEP_X265 + return + fi + fi + + + REMOVE $DEP_X265 + git clone https://bitbucket.org/multicoreware/x265_git.git + cd x265_git/build/linux + cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install Libfdk +installLibfdk() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libfdk-aac |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_AAC + if [[ $? = 0 ]]; then + INSTALL $DEP_AAC + return + fi + fi + + REMOVE $DEP_AAC + git clone https://github.com/mstorsjo/fdk-aac.git + cd fdk-aac + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibvpx() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libvpx-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi + fi + + REMOVE $DEP_VPX + git clone https://chromium.googlesource.com/webm/libvpx.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibopus() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libopus-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi + fi + + REMOVE $DEP_OPUS + git clone https://github.com/xiph/opus.git + cd opus + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install FFmpeg +installFFmpeg() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing FFmpeg |" + echo " | |" + echo " ---------------------------------------------------------" + echo + REMOVE ffmpeg + wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 + echo "Extracting source code..." + tar xjf ffmpeg-snapshot.tar.bz2 + cd ffmpeg + + + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" + + if [[ "$FDK" = "y" ]]; then + CMD="$CMD --enable-libfdk-aac" + fi + + if [[ "$L264" = "y" ]]; then + CMD="$CMD --enable-libx264" + fi + + if [[ "$L265" = "y" ]]; then + CMD="$CMD --enable-libx265" + fi + + if [[ "$LVPX" = "y" ]]; then + CMD="$CMD --enable-libvpx" + fi + + if [[ "$LOPUS" = "y" ]]; then + CMD="$CMD --enable-libopus" + fi + + if [[ "$FLAGSYN" = "y" ]]; then + CMD="$CMD $FLAGS" + fi + + ./configure $CMD --extra-libs="-lpthread -lm" + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Clear Up +cleanDirectory() { + rm -rf ffmpeg + rm -rf fdk-aac + rm -rf x264 + rm -rf x265_git + rm -rf libvpx + rm -rf opus + rm -f ffmpeg-snapshot.tar.bz2 +} + +# Ask for Threads +getJobsCount() { + + if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + echo + printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" + read -r + if [[ $REPLY -gt 0 ]]; then + JOBS=$REPLY + fi +} + +# getLib L264_PARAM L264 "libx264" +getLib(){ + + + if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" + read -r + if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then + eval $2="$REPLY" + fi + +} + +# Get Compile Flags +getFlags() { + + if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + echo + echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" + echo + echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." + printf " You are responsible for ensuring any requied dev/header files are installed: " + read -r + if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then + FLAGSYN="$REPLY" + if [[ "$FLAGSYN" = "y" ]]; then + echo + echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" + echo + printf " Example: --enable-vaapi --enable-libvorbis : " + read -r + if [[ ${#REPLY} -gt 0 ]]; then + FLAGS="$REPLY" + else + FLAGSYN="n" + fi + + fi + fi + +} + +# Performance Stop Watch +stopWatch() { + if [[ "$1" = "stop" ]]; then + endEpoch=$(date +%s) + endTime=$(date) + durationEpoch=$((endEpoch - startEpoch)) + echo + echo " Start time: ${startTime}" + echo " End time: ${endTime}" + echo " Duration: ${durationEpoch} seconds" + echo " Max jobs: $JOBS" + echo " Option: $MODE" + echo + else + startEpoch=$(date +%s) + startTime=$(date) + fi +} + +# Command Processor +processOptions() { + + case $1 in + + 1) + stopWatch "start" + installDependencies + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 2) + getJobsCount + stopWatch "start" + installLibfdk + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 3) + getJobsCount + stopWatch "start" + installLibx264 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + 4) + getJobsCount + stopWatch "start" + installLibx265 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 5) + getJobsCount + stopWatch "start" + installLibvpx + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 6) + getJobsCount + stopWatch "start" + installLibopus + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 7) + getJobsCount + stopWatch "start" + installFFmpeg + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 8) + getJobsCount + getLib FDK_PARAM FDK "libfdk-aac" + getLib L264_PARAM L264 "libx264" + getLib L265_PARAM L265 "libx265" + getLib LVPX_PARAM LVPX "libvpx" + getLib LOPUS_PARAM LOPUS "libopus" + getFlags + stopWatch "start" + installDependencies + if [[ "$FDK" = "y" ]]; then + installLibfdk + fi + if [[ "$L264" = "y" ]]; then + installLibx264 + fi + if [[ "$L265" = "y" ]]; then + installLibx265 + fi + if [[ "$LVPX" = "y" ]]; then + installLibvpx + fi + if [[ "$LOPUS" = "y" ]]; then + installLibopus + fi + installFFmpeg + cleanDirectory + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 9) + stopWatch "start" + cleanDirectory + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + esac +} + +# Entry Point +cd ~ + +while [ $# -gt 0 ]; do + + case "$1" in + + --help) + printf "\033c" + echo "Options:" + echo + echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" + echo " --none-interactive : Disables interactive mode" + echo " --mode [1-9] : Sets the operation. Requies --none-interactive" + echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" + echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" + echo " --libx264 [y:n] Default: y : Enable/Disable this lib" + echo " --libx265 [y:n] Default: n : Enable/Disable this lib" + echo " --libopus [y:n] Default: n : Enable/Disable this lib" + echo " --libvpx [y:n] Default: n : Enable/Disable this lib" + echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" + echo + exit 0 + ;; + --force-build) + FORCE_BUILD=true + ;; + --none-interactive) + INTERACTIVE="n" + ;; + --mode) + MODE=$2 + MODE_PARAM=true + ;; + --max-jobs) + JOBS=$2 + JOBS_PARAM=true + ;; + --libfdk-aac) + FDK="$2" + FDK_PARAM=true + ;; + --libx264) + L264="$2" + L264_PARAM=true + ;; + --libx265) + L265="$2" + L265_PARAM=true + ;; + --libopus) + LOPUS="$2" + LOPUS_PARAM=true + ;; + --libvpx) + LVPX="$2" + LVPX_PARAM=true + ;; + --extra-flags) + FLAGSYN="y" + FLAGS="$2" + FLAGS_PARAM=true + ;; + esac + shift +done + +if [ "$INTERACTIVE" = "n" ]; then + printHeader + processOptions $MODE + +else + printHeader + menu +fi From 1d8073dbf3a14193d78032f3f3092d04688ac685 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:50:23 +0000 Subject: [PATCH 10/22] Update build-alpine-NEW.sh --- build-alpine-NEW.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-alpine-NEW.sh b/build-alpine-NEW.sh index 2b2fd2e..f2befd2 100755 --- a/build-alpine-NEW.sh +++ b/build-alpine-NEW.sh @@ -166,7 +166,7 @@ installDependencies() { echo " | |" echo " ---------------------------------------------------------" echo - INSTALL pkg-config autoconf automake libtool git wget make g++ gcc nasm yasm build-essential cmake-curses-gui cmake + INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm build-base cmake } From dfe81c1ab1ce12ba5c2ac39b4c66a2706ab05500 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:53:24 +0000 Subject: [PATCH 11/22] Update build-alpine-NEW.sh --- build-alpine-NEW.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/build-alpine-NEW.sh b/build-alpine-NEW.sh index f2befd2..6739536 100755 --- a/build-alpine-NEW.sh +++ b/build-alpine-NEW.sh @@ -197,9 +197,9 @@ installLibx264() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } @@ -230,9 +230,9 @@ installLibx265() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } @@ -263,9 +263,9 @@ installLibfdk() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } @@ -296,9 +296,9 @@ installLibvpx() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } @@ -329,9 +329,9 @@ installLibopus() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } @@ -382,9 +382,9 @@ installFFmpeg() { checkForError make -j"$JOBS" checkForError - sudo make install + make install checkForError - sudo ldconfig + ldconfig cd ~ } From 4bd337a23105f70a09697570a7b87d15843c9a03 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 00:04:39 +0000 Subject: [PATCH 12/22] Update build-alpine-NEW.sh --- build-alpine-NEW.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-alpine-NEW.sh b/build-alpine-NEW.sh index 6739536..503ef40 100755 --- a/build-alpine-NEW.sh +++ b/build-alpine-NEW.sh @@ -166,7 +166,7 @@ installDependencies() { echo " | |" echo " ---------------------------------------------------------" echo - INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm build-base cmake + INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm build-base cmake diffutils } From 1093472f35412ef05c3bfc7025ce2087b8338321 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 11:02:31 +0000 Subject: [PATCH 13/22] Alpine --- build-alpine-NEW.sh | 702 -------------------------------------------- build-alpine.sh | 475 ++++++++++++++++++++---------- 2 files changed, 325 insertions(+), 852 deletions(-) delete mode 100755 build-alpine-NEW.sh diff --git a/build-alpine-NEW.sh b/build-alpine-NEW.sh deleted file mode 100755 index 503ef40..0000000 --- a/build-alpine-NEW.sh +++ /dev/null @@ -1,702 +0,0 @@ -#!/bin/bash - -# nrchkb-ffmpeg-build Version 2.0 - -# MIT License - -# Copyright (c) 2022 Marcus Davies -# Copyright (c) 2022 Garrett Porter - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# Colors -Red=$'\e[0;31m' -Yellow=$'\e[1;33m' -End=$'\e[0m' - -# Defaults -JOBS=3 # Jobs Value -JOBS_PARAM=false # Arg provided - -FDK="y" # FDK Choice Value -FDK_PARAM=false # Arg provided - -L264="y" # 264 Choice Value -L264_PARAM=false # Arg provided - -L265="n" # 265 Choice Value -L265_PARAM=false # Arg provided - -LVPX="n" # VPX Choice Value -LVPX_PARAM=false # Arg provided - -LOPUS="n" # Opus Choice Value -LOPUS_PARAM=false # Arg provided - -FLAGSYN="n" # Flags Choice Value -FLAGS="" # Flasg Value -FLAGS_PARAM=false # Arg provided - -MODE=0 # Mode Value -MODE_PARAM=false # Arg provided - -INTERACTIVE="y" # Interactive - -# Prefix -PREFIX="/usr/local" -export LDFLAGS="-L$PREFIX/lib" -export CFLAGS="-I$PREFIX/include" - -# Ignore Repository sources -FORCE_BUILD=false - -# Specific package manager implemention -INSTALL() { - apk add $@ -} -REMOVE() { - apk del $1 -} -CHECK() { - apk info $1 -} - -# Package Names -DEP_X264="x264-dev" -DEP_X265="x265-dev" -DEP_VPX="libvpx-dev" -DEP_OPUS="opus-dev" -DEP_AAC="fdk-aac-dev" - -# Print Header -printHeader() { - - printf "\033c" - echo - echo " ---------------------------------------------------------" - echo " | 2.0 |" - echo " | P&M FFmpeg Build Script (Alpine) |" - echo " | An FFmpeg build & installation utility for NRCHKB |" - echo " | |" - echo " ---------------------------------------------------------" - echo - echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" - echo - -} - -# Print menu -menu() { - - echo " ${Yellow}What would you like to do:${End}" - echo - echo " 1 - Install build tools (Dependencies from apt)" - echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" - echo " 3 - Build/install libx264 (x264 Video Encoder)" - echo " 4 - Build/install libx265 (x265 Video Encoder)" - echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" - echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" - echo " 7 - Build FFmpeg (Builds from source only)" - echo " 8 - Guided Install" - echo " 9 - Purge build directories" - echo " q - Quit" - echo - echo " Note: This script will download and compile these software packages from source code," - echo " unless they happen to be available from your systems repository." - echo " Where necessary, libaries will be built as shared libs." - echo - echo " This excludes FFMPEG which will always be built for source." - echo - echo " If you have previously run this script, running it again will update your software." - echo - printf " Choice: " - read -r - if [[ "$REPLY" = "q" ]]; then - exit 0 - fi - - MODE=$REPLY - - if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then - printHeader - menu - fi - processOptions $MODE -} - -# Error Check -checkForError() { - if [[ $? -gt 0 ]]; then - stopWatch "stop" - echo "${Red}" - echo " ---------------------------------------------------------" - echo " | |" - echo " | Errors occurred |" - echo " | Please check the logs and try again |" - echo " | |" - echo " ---------------------------------------------------------" - echo "${End}" - echo - exit 1 - fi -} - -# Install Dependencies -installDependencies() { - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Installing Dependencies |" - echo " | |" - echo " ---------------------------------------------------------" - echo - INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm build-base cmake diffutils - -} - -# Install Libx264 -installLibx264() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libx264 |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_X264 - if [[ $? = 0 ]]; then - INSTALL $DEP_X264 - return - fi - fi - - - REMOVE $DEP_X264 - git clone https://code.videolan.org/videolan/x264.git - cd x264 - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Install Libx265 -installLibx265() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libx265 |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_X265 - if [[ $? = 0 ]]; then - INSTALL $DEP_X265 - return - fi - fi - - - REMOVE $DEP_X265 - git clone https://bitbucket.org/multicoreware/x265_git.git - cd x265_git/build/linux - cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Install Libfdk -installLibfdk() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libfdk-aac |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_AAC - if [[ $? = 0 ]]; then - INSTALL $DEP_AAC - return - fi - fi - - REMOVE $DEP_AAC - git clone https://github.com/mstorsjo/fdk-aac.git - cd fdk-aac - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Install VPX -installLibvpx() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libvpx-dev |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_VPX - if [[ $? = 0 ]]; then - INSTALL $DEP_VPX - return - fi - fi - - REMOVE $DEP_VPX - git clone https://chromium.googlesource.com/webm/libvpx.git - cd libvpx - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Install VPX -installLibopus() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libopus-dev |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_OPUS - if [[ $? = 0 ]]; then - INSTALL $DEP_OPUS - return - fi - fi - - REMOVE $DEP_OPUS - git clone https://github.com/xiph/opus.git - cd opus - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Install FFmpeg -installFFmpeg() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing FFmpeg |" - echo " | |" - echo " ---------------------------------------------------------" - echo - REMOVE ffmpeg - wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 - echo "Extracting source code..." - tar xjf ffmpeg-snapshot.tar.bz2 - cd ffmpeg - - - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" - - if [[ "$FDK" = "y" ]]; then - CMD="$CMD --enable-libfdk-aac" - fi - - if [[ "$L264" = "y" ]]; then - CMD="$CMD --enable-libx264" - fi - - if [[ "$L265" = "y" ]]; then - CMD="$CMD --enable-libx265" - fi - - if [[ "$LVPX" = "y" ]]; then - CMD="$CMD --enable-libvpx" - fi - - if [[ "$LOPUS" = "y" ]]; then - CMD="$CMD --enable-libopus" - fi - - if [[ "$FLAGSYN" = "y" ]]; then - CMD="$CMD $FLAGS" - fi - - ./configure $CMD --extra-libs="-lpthread -lm" - checkForError - make -j"$JOBS" - checkForError - make install - checkForError - ldconfig - cd ~ -} - -# Clear Up -cleanDirectory() { - rm -rf ffmpeg - rm -rf fdk-aac - rm -rf x264 - rm -rf x265_git - rm -rf libvpx - rm -rf opus - rm -f ffmpeg-snapshot.tar.bz2 -} - -# Ask for Threads -getJobsCount() { - - if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" - read -r - if [[ $REPLY -gt 0 ]]; then - JOBS=$REPLY - fi -} - -# getLib L264_PARAM L264 "libx264" -getLib(){ - - - if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - eval $2="$REPLY" - fi - -} - -# Get Compile Flags -getFlags() { - - if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" - echo - echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." - printf " You are responsible for ensuring any requied dev/header files are installed: " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FLAGSYN="$REPLY" - if [[ "$FLAGSYN" = "y" ]]; then - echo - echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" - echo - printf " Example: --enable-vaapi --enable-libvorbis : " - read -r - if [[ ${#REPLY} -gt 0 ]]; then - FLAGS="$REPLY" - else - FLAGSYN="n" - fi - - fi - fi - -} - -# Performance Stop Watch -stopWatch() { - if [[ "$1" = "stop" ]]; then - endEpoch=$(date +%s) - endTime=$(date) - durationEpoch=$((endEpoch - startEpoch)) - echo - echo " Start time: ${startTime}" - echo " End time: ${endTime}" - echo " Duration: ${durationEpoch} seconds" - echo " Max jobs: $JOBS" - echo " Option: $MODE" - echo - else - startEpoch=$(date +%s) - startTime=$(date) - fi -} - -# Command Processor -processOptions() { - - case $1 in - - 1) - stopWatch "start" - installDependencies - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 2) - getJobsCount - stopWatch "start" - installLibfdk - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 3) - getJobsCount - stopWatch "start" - installLibx264 - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - 4) - getJobsCount - stopWatch "start" - installLibx265 - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 5) - getJobsCount - stopWatch "start" - installLibvpx - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 6) - getJobsCount - stopWatch "start" - installLibopus - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 7) - getJobsCount - stopWatch "start" - installFFmpeg - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 8) - getJobsCount - getLib FDK_PARAM FDK "libfdk-aac" - getLib L264_PARAM L264 "libx264" - getLib L265_PARAM L265 "libx265" - getLib LVPX_PARAM LVPX "libvpx" - getLib LOPUS_PARAM LOPUS "libopus" - getFlags - stopWatch "start" - installDependencies - if [[ "$FDK" = "y" ]]; then - installLibfdk - fi - if [[ "$L264" = "y" ]]; then - installLibx264 - fi - if [[ "$L265" = "y" ]]; then - installLibx265 - fi - if [[ "$LVPX" = "y" ]]; then - installLibvpx - fi - if [[ "$LOPUS" = "y" ]]; then - installLibopus - fi - installFFmpeg - cleanDirectory - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 9) - stopWatch "start" - cleanDirectory - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - esac -} - -# Entry Point -cd ~ - -while [ $# -gt 0 ]; do - - case "$1" in - - --help) - printf "\033c" - echo "Options:" - echo - echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" - echo " --none-interactive : Disables interactive mode" - echo " --mode [1-9] : Sets the operation. Requies --none-interactive" - echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" - echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" - echo " --libx264 [y:n] Default: y : Enable/Disable this lib" - echo " --libx265 [y:n] Default: n : Enable/Disable this lib" - echo " --libopus [y:n] Default: n : Enable/Disable this lib" - echo " --libvpx [y:n] Default: n : Enable/Disable this lib" - echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" - echo - exit 0 - ;; - --force-build) - FORCE_BUILD=true - ;; - --none-interactive) - INTERACTIVE="n" - ;; - --mode) - MODE=$2 - MODE_PARAM=true - ;; - --max-jobs) - JOBS=$2 - JOBS_PARAM=true - ;; - --libfdk-aac) - FDK="$2" - FDK_PARAM=true - ;; - --libx264) - L264="$2" - L264_PARAM=true - ;; - --libx265) - L265="$2" - L265_PARAM=true - ;; - --libopus) - LOPUS="$2" - LOPUS_PARAM=true - ;; - --libvpx) - LVPX="$2" - LVPX_PARAM=true - ;; - --extra-flags) - FLAGSYN="y" - FLAGS="$2" - FLAGS_PARAM=true - ;; - esac - shift -done - -if [ "$INTERACTIVE" = "n" ]; then - printHeader - processOptions $MODE - -else - printHeader - menu -fi diff --git a/build-alpine.sh b/build-alpine.sh index 0eed22f..503ef40 100755 --- a/build-alpine.sh +++ b/build-alpine.sh @@ -1,6 +1,6 @@ #!/bin/bash -# nrchkb-ffmpeg-build Version 1.1 +# nrchkb-ffmpeg-build Version 2.0 # MIT License @@ -32,16 +32,30 @@ End=$'\e[0m' # Defaults JOBS=3 # Jobs Value -JOBSPARAM=false # Arg provided -OMX="n" # OMX Choice Value -OMXPARAM=false # Arg provided +JOBS_PARAM=false # Arg provided + FDK="y" # FDK Choice Value -FDKPARAM=false # Arg provided +FDK_PARAM=false # Arg provided + +L264="y" # 264 Choice Value +L264_PARAM=false # Arg provided + +L265="n" # 265 Choice Value +L265_PARAM=false # Arg provided + +LVPX="n" # VPX Choice Value +LVPX_PARAM=false # Arg provided + +LOPUS="n" # Opus Choice Value +LOPUS_PARAM=false # Arg provided + FLAGSYN="n" # Flags Choice Value FLAGS="" # Flasg Value -FLAGSPARAM=false # Arg provided +FLAGS_PARAM=false # Arg provided + MODE=0 # Mode Value -MODEPARAM=false # Arg provided +MODE_PARAM=false # Arg provided + INTERACTIVE="y" # Interactive # Prefix @@ -49,6 +63,9 @@ PREFIX="/usr/local" export LDFLAGS="-L$PREFIX/lib" export CFLAGS="-I$PREFIX/include" +# Ignore Repository sources +FORCE_BUILD=false + # Specific package manager implemention INSTALL() { apk add $@ @@ -60,19 +77,26 @@ CHECK() { apk info $1 } +# Package Names +DEP_X264="x264-dev" +DEP_X265="x265-dev" +DEP_VPX="libvpx-dev" +DEP_OPUS="opus-dev" +DEP_AAC="fdk-aac-dev" + # Print Header printHeader() { printf "\033c" echo echo " ---------------------------------------------------------" - echo " | 1.1 |" + echo " | 2.0 |" echo " | P&M FFmpeg Build Script (Alpine) |" echo " | An FFmpeg build & installation utility for NRCHKB |" echo " | |" echo " ---------------------------------------------------------" echo - echo " ${Red}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" + echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" echo } @@ -82,17 +106,24 @@ menu() { echo " ${Yellow}What would you like to do:${End}" echo - echo " 1 - Install build tools (dependencies from apk)" - echo " 2 - Build/install libfdk-aac (AAC encoder, needed for HomeKit audio)" - echo " 3 - Build/install FFmpeg (video processor, builds from source)" - echo " 4 - All of the above" - echo " 5 - Cleanup build directories" + echo " 1 - Install build tools (Dependencies from apt)" + echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" + echo " 3 - Build/install libx264 (x264 Video Encoder)" + echo " 4 - Build/install libx265 (x265 Video Encoder)" + echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" + echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" + echo " 7 - Build FFmpeg (Builds from source only)" + echo " 8 - Guided Install" + echo " 9 - Purge build directories" echo " q - Quit" echo - echo " Note: this script will download and compile these software packages from source code." - echo " This will take a long time. Option 4 will take over 6 hours on a Pi Zero W." + echo " Note: This script will download and compile these software packages from source code," + echo " unless they happen to be available from your systems repository." + echo " Where necessary, libaries will be built as shared libs." + echo + echo " This excludes FFMPEG which will always be built for source." echo - echo " If you have previously run this script, running it again will update your software." + echo " If you have previously run this script, running it again will update your software." echo printf " Choice: " read -r @@ -102,7 +133,7 @@ menu() { MODE=$REPLY - if [[ $MODE -gt 5 || $MODE -lt 1 ]]; then + if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then printHeader menu fi @@ -135,24 +166,13 @@ installDependencies() { echo " | |" echo " ---------------------------------------------------------" echo - INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm - - CHECK x264-dev - - if [[ $? -gt 0 ]]; then - installLibx264 - else - INSTALL x264-dev - fi + INSTALL pkgconfig autoconf automake libtool git wget make g++ gcc nasm yasm build-base cmake diffutils } # Install Libx264 installLibx264() { - cd ~ || { - echo "cd failed, aborting at installLibx264:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -160,31 +180,65 @@ installLibx264() { echo " | |" echo " ---------------------------------------------------------" echo - REMOVE x264-dev + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X264 + if [[ $? = 0 ]]; then + INSTALL $DEP_X264 + return + fi + fi + + + REMOVE $DEP_X264 git clone https://code.videolan.org/videolan/x264.git - cd x264 || { - echo "cd failed, aborting at installLibx264:02" - exit 1 - } - ./configure --prefix=$PREFIX --enable-static --enable-pic + cd x264 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError make install checkForError ldconfig - cd ~ || { - echo "cd failed, aborting at installLibx264:03" - exit 1 - } + cd ~ +} + +# Install Libx265 +installLibx265() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx265 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X265 + if [[ $? = 0 ]]; then + INSTALL $DEP_X265 + return + fi + fi + + + REMOVE $DEP_X265 + git clone https://bitbucket.org/multicoreware/x265_git.git + cd x265_git/build/linux + cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source + checkForError + make -j"$JOBS" + checkForError + make install + checkForError + ldconfig + cd ~ } # Install Libfdk installLibfdk() { - cd ~ || { - echo "cd failed, aborting at installLibfdk:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -193,38 +247,97 @@ installLibfdk() { echo " ---------------------------------------------------------" echo - CHECK fdk-aac-dev - if [[ $? = 0 ]]; then - apk add fdk-aac-dev - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_AAC + if [[ $? = 0 ]]; then + INSTALL $DEP_AAC + return + fi fi - REMOVE fdk-aac-dev + REMOVE $DEP_AAC git clone https://github.com/mstorsjo/fdk-aac.git - cd fdk-aac || { - echo "cd failed, aborting at installLibfdk:02" - exit 1 - } + cd fdk-aac ./autogen.sh - ./configure --prefix=$PREFIX --enable-static --disable-shared + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError make install checkForError ldconfig - cd ~ || { - echo "cd failed, aborting at installLibfdk:03" - exit 1 - } + cd ~ +} + +# Install VPX +installLibvpx() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libvpx-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi + fi + + REMOVE $DEP_VPX + git clone https://chromium.googlesource.com/webm/libvpx.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm + checkForError + make -j"$JOBS" + checkForError + make install + checkForError + ldconfig + cd ~ +} + +# Install VPX +installLibopus() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libopus-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi + fi + + REMOVE $DEP_OPUS + git clone https://github.com/xiph/opus.git + cd opus + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + make install + checkForError + ldconfig + cd ~ } # Install FFmpeg installFFmpeg() { - cd ~ || { - echo "cd failed, aborting at installFFmpeg:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -236,37 +349,43 @@ installFFmpeg() { wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 echo "Extracting source code..." tar xjf ffmpeg-snapshot.tar.bz2 - cd ffmpeg || { - echo "cd failed, aborting at installFFmpeg:02" - exit 1 - } + cd ffmpeg + - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-libx264" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" fi - if [[ "$OMX" = "y" ]]; then - CMD="$CMD --enable-mmal" - CMD="$CMD --enable-omx" - CMD="$CMD --enable-omx-rpi" + if [[ "$L264" = "y" ]]; then + CMD="$CMD --enable-libx264" + fi + + if [[ "$L265" = "y" ]]; then + CMD="$CMD --enable-libx265" + fi + + if [[ "$LVPX" = "y" ]]; then + CMD="$CMD --enable-libvpx" + fi + + if [[ "$LOPUS" = "y" ]]; then + CMD="$CMD --enable-libopus" fi if [[ "$FLAGSYN" = "y" ]]; then CMD="$CMD $FLAGS" fi - ./configure $CMD + ./configure $CMD --extra-libs="-lpthread -lm" checkForError make -j"$JOBS" checkForError make install checkForError - cd ~ || { - echo "cd failed, aborting at installFFmpeg:03" - exit 1 - } + ldconfig + cd ~ } # Clear Up @@ -274,75 +393,55 @@ cleanDirectory() { rm -rf ffmpeg rm -rf fdk-aac rm -rf x264 + rm -rf x265_git + rm -rf libvpx + rm -rf opus rm -f ffmpeg-snapshot.tar.bz2 } # Ask for Threads getJobsCount() { - if [[ $JOBSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed)${End}" - echo - echo " The more you specify - the higher chance of CPU throttling and memory constraints" - printf " we recommend no more than 3 for a Pi 4 (1-4): " + printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" read -r - if [[ $REPLY -lt 5 && $REPLY -gt 0 ]]; then + if [[ $REPLY -gt 0 ]]; then JOBS=$REPLY fi } -# Ask for omx -getOMX() { +# getLib L264_PARAM L264 "libx264" +getLib(){ - if [[ $OMXPARAM = true || "$INTERACTIVE" = "n" ]]; then + + if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then return fi - echo - echo " ${Yellow}Would you like to enable 'h264_omx'?${End}" - echo - echo " Note: 'h264_omx' is deprecated and should not be used on new installs." - printf " If you already use it, choose yes here. Enter (y/n): " + printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - OMX="$REPLY" + eval $2="$REPLY" fi -} -# Ask for FDK -getFDK() { - - if [[ $FDKPARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - echo " ${Yellow}Would you like to enable 'libfdk-aac'?${End}" - echo - echo " Note: 'libfdk-aac' is needed for HomeKit audio. We recommend enabling libfdk-aac." - printf " If you are running Option 4, you can enable this lib. Enter (y/n): " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FDK="$REPLY" - fi } # Get Compile Flags getFlags() { - if [[ $FLAGSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}Would you like to add any extra FFmpeg compile flags?" + echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" echo - echo " ADVANCED: ${End}Compile flags could be added to enable libx265 or the countless others" - printf " You are responsible for ensuring any required parts are installed (y/n): " + echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." + printf " You are responsible for ensuring any requied dev/header files are installed: " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then FLAGSYN="$REPLY" @@ -350,7 +449,7 @@ getFlags() { echo echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" echo - printf " Example '--enable-libx265 --enable-libopus' : " + printf " Example: --enable-vaapi --enable-libvorbis : " read -r if [[ ${#REPLY} -gt 0 ]]; then FLAGS="$REPLY" @@ -388,7 +487,6 @@ processOptions() { case $1 in 1) - getJobsCount stopWatch "start" installDependencies stopWatch "stop" @@ -415,9 +513,57 @@ processOptions() { 3) getJobsCount - getOMX - getFDK - getFlags + stopWatch "start" + installLibx264 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + 4) + getJobsCount + stopWatch "start" + installLibx265 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 5) + getJobsCount + stopWatch "start" + installLibvpx + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 6) + getJobsCount + stopWatch "start" + installLibopus + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 7) + getJobsCount stopWatch "start" installFFmpeg stopWatch "stop" @@ -429,17 +575,31 @@ processOptions() { fi ;; - 4) - cleanDirectory + 8) getJobsCount - getOMX - getFDK + getLib FDK_PARAM FDK "libfdk-aac" + getLib L264_PARAM L264 "libx264" + getLib L265_PARAM L265 "libx265" + getLib LVPX_PARAM LVPX "libvpx" + getLib LOPUS_PARAM LOPUS "libopus" getFlags stopWatch "start" installDependencies if [[ "$FDK" = "y" ]]; then installLibfdk fi + if [[ "$L264" = "y" ]]; then + installLibx264 + fi + if [[ "$L265" = "y" ]]; then + installLibx265 + fi + if [[ "$LVPX" = "y" ]]; then + installLibvpx + fi + if [[ "$LOPUS" = "y" ]]; then + installLibopus + fi installFFmpeg cleanDirectory stopWatch "stop" @@ -451,7 +611,7 @@ processOptions() { fi ;; - 5) + 9) stopWatch "start" cleanDirectory stopWatch "stop" @@ -466,52 +626,67 @@ processOptions() { } # Entry Point -cd ~ || { - echo "cd failed, aborting" - exit 1 -} +cd ~ while [ $# -gt 0 ]; do case "$1" in - --help | -h) + --help) + printf "\033c" echo "Options:" echo - echo " --interactive -i [y|n] Default: y Disables interactive mode" - echo " --mode -m [1|2|3|4|5] Sets the mode (requires --interactive 0, ignored otherwise)" - echo " --max-jobs -j [#] Default: 3 Set maximum number of builds jobs" - echo " --libfdk-aac -a [y|n] Default: y Compile/enable libfdk-aac" - echo " --h264-omx -x [y|n] Default: n Enable h264-omx" - echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" - echo - echo " Example: ./build-debian.sh --interactive n --max-jobs 2 --mode 4" + echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" + echo " --none-interactive : Disables interactive mode" + echo " --mode [1-9] : Sets the operation. Requies --none-interactive" + echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" + echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" + echo " --libx264 [y:n] Default: y : Enable/Disable this lib" + echo " --libx265 [y:n] Default: n : Enable/Disable this lib" + echo " --libopus [y:n] Default: n : Enable/Disable this lib" + echo " --libvpx [y:n] Default: n : Enable/Disable this lib" + echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" echo exit 0 ;; - --interactive | -i) - INTERACTIVE="$2" + --force-build) + FORCE_BUILD=true + ;; + --none-interactive) + INTERACTIVE="n" ;; - --mode | -m) + --mode) MODE=$2 - MODEPARAM=true + MODE_PARAM=true ;; - --max-jobs | -j) + --max-jobs) JOBS=$2 - JOBSPARAM=true + JOBS_PARAM=true ;; - --h264-omx | -x) - OMX="$2" - OMXPARAM=true - ;; - --libfdk-aac | -a) + --libfdk-aac) FDK="$2" - FDKPARAM=true + FDK_PARAM=true + ;; + --libx264) + L264="$2" + L264_PARAM=true + ;; + --libx265) + L265="$2" + L265_PARAM=true + ;; + --libopus) + LOPUS="$2" + LOPUS_PARAM=true + ;; + --libvpx) + LVPX="$2" + LVPX_PARAM=true ;; - --extra-flags | -f) + --extra-flags) FLAGSYN="y" FLAGS="$2" - FLAGSPARAM=true + FLAGS_PARAM=true ;; esac shift From 1f11909dbf407c50312b253c19283c97ca0af519 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 12:10:24 +0000 Subject: [PATCH 14/22] Create build-osx-NEW.sh --- build-osx-NEW.sh | 702 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 702 insertions(+) create mode 100755 build-osx-NEW.sh diff --git a/build-osx-NEW.sh b/build-osx-NEW.sh new file mode 100755 index 0000000..35dd766 --- /dev/null +++ b/build-osx-NEW.sh @@ -0,0 +1,702 @@ +#!/bin/bash + +# nrchkb-ffmpeg-build Version 2.0 + +# MIT License + +# Copyright (c) 2022 Marcus Davies +# Copyright (c) 2022 Garrett Porter + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Colors +Red=$'\e[0;31m' +Yellow=$'\e[1;33m' +End=$'\e[0m' + +# Defaults +JOBS=3 # Jobs Value +JOBS_PARAM=false # Arg provided + +FDK="y" # FDK Choice Value +FDK_PARAM=false # Arg provided + +L264="y" # 264 Choice Value +L264_PARAM=false # Arg provided + +L265="n" # 265 Choice Value +L265_PARAM=false # Arg provided + +LVPX="n" # VPX Choice Value +LVPX_PARAM=false # Arg provided + +LOPUS="n" # Opus Choice Value +LOPUS_PARAM=false # Arg provided + +FLAGSYN="n" # Flags Choice Value +FLAGS="" # Flasg Value +FLAGS_PARAM=false # Arg provided + +MODE=0 # Mode Value +MODE_PARAM=false # Arg provided + +INTERACTIVE="y" # Interactive + +# Prefix +PREFIX="/usr/local" +export LDFLAGS="-L$PREFIX/lib" +export CFLAGS="-I$PREFIX/include" + +# Ignore Repository sources +FORCE_BUILD=false + +# Specific package manager implemention +INSTALL() { + brew install $@ +} +REMOVE() { + brew remove $1 +} +CHECK() { + brew info $1 +} + +# Package Names +DEP_X264="x264" +DEP_X265="x265" +DEP_VPX="libvpx" +DEP_OPUS="opus" +DEP_AAC="fdk-aac" + +# Print Header +printHeader() { + + printf "\033c" + echo + echo " ---------------------------------------------------------" + echo " | 2.0 |" + echo " | P&M FFmpeg Build Script (OSX) |" + echo " | An FFmpeg build & installation utility for NRCHKB |" + echo " | |" + echo " ---------------------------------------------------------" + echo + echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" + echo + +} + +# Print menu +menu() { + + echo " ${Yellow}What would you like to do:${End}" + echo + echo " 1 - Install build tools (Dependencies from apt)" + echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" + echo " 3 - Build/install libx264 (x264 Video Encoder)" + echo " 4 - Build/install libx265 (x265 Video Encoder)" + echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" + echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" + echo " 7 - Build FFmpeg (Builds from source only)" + echo " 8 - Guided Install" + echo " 9 - Purge build directories" + echo " q - Quit" + echo + echo " Note: This script will download and compile these software packages from source code," + echo " unless they happen to be available from your systems repository." + echo " Where necessary, libaries will be built as shared libs." + echo + echo " This excludes FFMPEG which will always be built for source." + echo + echo " If you have previously run this script, running it again will update your software." + echo + printf " Choice: " + read -r + if [[ "$REPLY" = "q" ]]; then + exit 0 + fi + + MODE=$REPLY + + if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then + printHeader + menu + fi + processOptions $MODE +} + +# Error Check +checkForError() { + if [[ $? -gt 0 ]]; then + stopWatch "stop" + echo "${Red}" + echo " ---------------------------------------------------------" + echo " | |" + echo " | Errors occurred |" + echo " | Please check the logs and try again |" + echo " | |" + echo " ---------------------------------------------------------" + echo "${End}" + echo + exit 1 + fi +} + +# Install Dependencies +installDependencies() { + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Installing Dependencies |" + echo " | |" + echo " ---------------------------------------------------------" + echo + INSTALL pkg-config autoconf automake libtool git wget make gcc nasm yasm cmake + +} + +# Install Libx264 +installLibx264() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx264 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X264 + if [[ $? = 0 ]]; then + INSTALL $DEP_X264 + return + fi + fi + + + REMOVE $DEP_X264 + git clone https://code.videolan.org/videolan/x264.git + cd x264 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install Libx265 +installLibx265() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx265 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X265 + if [[ $? = 0 ]]; then + INSTALL $DEP_X265 + return + fi + fi + + + REMOVE $DEP_X265 + git clone https://bitbucket.org/multicoreware/x265_git.git + cd x265_git/build/xcode + cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install Libfdk +installLibfdk() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libfdk-aac |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_AAC + if [[ $? = 0 ]]; then + INSTALL $DEP_AAC + return + fi + fi + + REMOVE $DEP_AAC + git clone https://github.com/mstorsjo/fdk-aac.git + cd fdk-aac + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibvpx() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libvpx-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi + fi + + REMOVE $DEP_VPX + git clone https://chromium.googlesource.com/webm/libvpx.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibopus() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libopus-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi + fi + + REMOVE $DEP_OPUS + git clone https://github.com/xiph/opus.git + cd opus + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install FFmpeg +installFFmpeg() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing FFmpeg |" + echo " | |" + echo " ---------------------------------------------------------" + echo + REMOVE ffmpeg + wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 + echo "Extracting source code..." + tar xjf ffmpeg-snapshot.tar.bz2 + cd ffmpeg + + + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" + + if [[ "$FDK" = "y" ]]; then + CMD="$CMD --enable-libfdk-aac" + fi + + if [[ "$L264" = "y" ]]; then + CMD="$CMD --enable-libx264" + fi + + if [[ "$L265" = "y" ]]; then + CMD="$CMD --enable-libx265" + fi + + if [[ "$LVPX" = "y" ]]; then + CMD="$CMD --enable-libvpx" + fi + + if [[ "$LOPUS" = "y" ]]; then + CMD="$CMD --enable-libopus" + fi + + if [[ "$FLAGSYN" = "y" ]]; then + CMD="$CMD $FLAGS" + fi + + ./configure $CMD --extra-libs="-lpthread -lm" + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Clear Up +cleanDirectory() { + rm -rf ffmpeg + rm -rf fdk-aac + rm -rf x264 + rm -rf x265_git + rm -rf libvpx + rm -rf opus + rm -f ffmpeg-snapshot.tar.bz2 +} + +# Ask for Threads +getJobsCount() { + + if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + echo + printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" + read -r + if [[ $REPLY -gt 0 ]]; then + JOBS=$REPLY + fi +} + +# getLib L264_PARAM L264 "libx264" +getLib(){ + + + if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" + read -r + if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then + eval $2="$REPLY" + fi + +} + +# Get Compile Flags +getFlags() { + + if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then + return + fi + + echo + echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" + echo + echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." + printf " You are responsible for ensuring any requied dev/header files are installed: " + read -r + if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then + FLAGSYN="$REPLY" + if [[ "$FLAGSYN" = "y" ]]; then + echo + echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" + echo + printf " Example: --enable-vaapi --enable-libvorbis : " + read -r + if [[ ${#REPLY} -gt 0 ]]; then + FLAGS="$REPLY" + else + FLAGSYN="n" + fi + + fi + fi + +} + +# Performance Stop Watch +stopWatch() { + if [[ "$1" = "stop" ]]; then + endEpoch=$(date +%s) + endTime=$(date) + durationEpoch=$((endEpoch - startEpoch)) + echo + echo " Start time: ${startTime}" + echo " End time: ${endTime}" + echo " Duration: ${durationEpoch} seconds" + echo " Max jobs: $JOBS" + echo " Option: $MODE" + echo + else + startEpoch=$(date +%s) + startTime=$(date) + fi +} + +# Command Processor +processOptions() { + + case $1 in + + 1) + stopWatch "start" + installDependencies + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 2) + getJobsCount + stopWatch "start" + installLibfdk + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 3) + getJobsCount + stopWatch "start" + installLibx264 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + 4) + getJobsCount + stopWatch "start" + installLibx265 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 5) + getJobsCount + stopWatch "start" + installLibvpx + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 6) + getJobsCount + stopWatch "start" + installLibopus + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 7) + getJobsCount + stopWatch "start" + installFFmpeg + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 8) + getJobsCount + getLib FDK_PARAM FDK "libfdk-aac" + getLib L264_PARAM L264 "libx264" + getLib L265_PARAM L265 "libx265" + getLib LVPX_PARAM LVPX "libvpx" + getLib LOPUS_PARAM LOPUS "libopus" + getFlags + stopWatch "start" + installDependencies + if [[ "$FDK" = "y" ]]; then + installLibfdk + fi + if [[ "$L264" = "y" ]]; then + installLibx264 + fi + if [[ "$L265" = "y" ]]; then + installLibx265 + fi + if [[ "$LVPX" = "y" ]]; then + installLibvpx + fi + if [[ "$LOPUS" = "y" ]]; then + installLibopus + fi + installFFmpeg + cleanDirectory + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 9) + stopWatch "start" + cleanDirectory + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + esac +} + +# Entry Point +cd ~ + +while [ $# -gt 0 ]; do + + case "$1" in + + --help) + printf "\033c" + echo "Options:" + echo + echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" + echo " --none-interactive : Disables interactive mode" + echo " --mode [1-9] : Sets the operation. Requies --none-interactive" + echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" + echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" + echo " --libx264 [y:n] Default: y : Enable/Disable this lib" + echo " --libx265 [y:n] Default: n : Enable/Disable this lib" + echo " --libopus [y:n] Default: n : Enable/Disable this lib" + echo " --libvpx [y:n] Default: n : Enable/Disable this lib" + echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" + echo + exit 0 + ;; + --force-build) + FORCE_BUILD=true + ;; + --none-interactive) + INTERACTIVE="n" + ;; + --mode) + MODE=$2 + MODE_PARAM=true + ;; + --max-jobs) + JOBS=$2 + JOBS_PARAM=true + ;; + --libfdk-aac) + FDK="$2" + FDK_PARAM=true + ;; + --libx264) + L264="$2" + L264_PARAM=true + ;; + --libx265) + L265="$2" + L265_PARAM=true + ;; + --libopus) + LOPUS="$2" + LOPUS_PARAM=true + ;; + --libvpx) + LVPX="$2" + LVPX_PARAM=true + ;; + --extra-flags) + FLAGSYN="y" + FLAGS="$2" + FLAGS_PARAM=true + ;; + esac + shift +done + +if [ "$INTERACTIVE" = "n" ]; then + printHeader + processOptions $MODE + +else + printHeader + menu +fi From f9b762ffdad2c3229160f088d304343568d9f6ed Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 13:37:41 +0000 Subject: [PATCH 15/22] Update build-bootstrap.sh --- build-bootstrap.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build-bootstrap.sh b/build-bootstrap.sh index a21d7c5..0167cea 100755 --- a/build-bootstrap.sh +++ b/build-bootstrap.sh @@ -14,9 +14,10 @@ if [[ "$OSTYPE" == "darwin"* ]]; then bash <(curl -sL https://raw.githubusercontent.com/NRCHKB/nrchkb-ffmpeg-build/$BRANCH_NAME/build-osx.sh) "$@" else echo - echo " ----------------------------------------------------------------------------------------------------" - echo " | OSX environments require 'brew' to be installed, and for it to be included in the PATH variable. |" - echo " ----------------------------------------------------------------------------------------------------" + echo " ----------------------------------------------------------------------------------------" + echo " | OSX environments require 'brew' to be installed, |" + echo " | and for it's path to be included in the PATH variable'. |" + echo " ----------------------------------------------------------------------------------------" echo exit 0 fi From b7dd99ac1e44ccf844370b07d66248eb3733525b Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 14:11:06 +0000 Subject: [PATCH 16/22] OSX --- .github/workflows/test.yml | 16 +- build-osx-NEW.sh | 702 ------------------------------------- build-osx.sh | 479 +++++++++++++++++-------- 3 files changed, 338 insertions(+), 859 deletions(-) delete mode 100755 build-osx-NEW.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 98aa39b..c707115 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,20 +2,24 @@ name: Test builds on various OS and configurations on: pull_request: - branches: [ main ] + branches: [main] env: BRANCH_NAME: ${{ github.event.pull_request.head.ref }} - + jobs: test_build: strategy: matrix: - os: [ubuntu-latest, macos-latest, ARM] - max-jobs: [3] - libfdk-aac: [y, n] + os: [ubuntu-latest, macos-latest] + max-jobs: [4, 4] + mode: [8, 8] + libx265: [y, y] + libopus: [y, y] + libvpx: [y, y] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 - name: Build - run: bash build-bootstrap.sh --interactive n --mode 4 --max-jobs ${{ matrix.max-jobs }} --libfdk-aac ${{ matrix.libfdk-aac }} --h264-omx n + run: bash build-bootstrap.sh --none-interactive --mode ${{ matrix.mode }} --max-jobs ${{ matrix.max-jobs }} --libx265 ${{ matrix.libx265 }} --libopus ${{ matrix.libopus }} --libvpx ${{ matrix.libvpx }} diff --git a/build-osx-NEW.sh b/build-osx-NEW.sh deleted file mode 100755 index 35dd766..0000000 --- a/build-osx-NEW.sh +++ /dev/null @@ -1,702 +0,0 @@ -#!/bin/bash - -# nrchkb-ffmpeg-build Version 2.0 - -# MIT License - -# Copyright (c) 2022 Marcus Davies -# Copyright (c) 2022 Garrett Porter - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# Colors -Red=$'\e[0;31m' -Yellow=$'\e[1;33m' -End=$'\e[0m' - -# Defaults -JOBS=3 # Jobs Value -JOBS_PARAM=false # Arg provided - -FDK="y" # FDK Choice Value -FDK_PARAM=false # Arg provided - -L264="y" # 264 Choice Value -L264_PARAM=false # Arg provided - -L265="n" # 265 Choice Value -L265_PARAM=false # Arg provided - -LVPX="n" # VPX Choice Value -LVPX_PARAM=false # Arg provided - -LOPUS="n" # Opus Choice Value -LOPUS_PARAM=false # Arg provided - -FLAGSYN="n" # Flags Choice Value -FLAGS="" # Flasg Value -FLAGS_PARAM=false # Arg provided - -MODE=0 # Mode Value -MODE_PARAM=false # Arg provided - -INTERACTIVE="y" # Interactive - -# Prefix -PREFIX="/usr/local" -export LDFLAGS="-L$PREFIX/lib" -export CFLAGS="-I$PREFIX/include" - -# Ignore Repository sources -FORCE_BUILD=false - -# Specific package manager implemention -INSTALL() { - brew install $@ -} -REMOVE() { - brew remove $1 -} -CHECK() { - brew info $1 -} - -# Package Names -DEP_X264="x264" -DEP_X265="x265" -DEP_VPX="libvpx" -DEP_OPUS="opus" -DEP_AAC="fdk-aac" - -# Print Header -printHeader() { - - printf "\033c" - echo - echo " ---------------------------------------------------------" - echo " | 2.0 |" - echo " | P&M FFmpeg Build Script (OSX) |" - echo " | An FFmpeg build & installation utility for NRCHKB |" - echo " | |" - echo " ---------------------------------------------------------" - echo - echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" - echo - -} - -# Print menu -menu() { - - echo " ${Yellow}What would you like to do:${End}" - echo - echo " 1 - Install build tools (Dependencies from apt)" - echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" - echo " 3 - Build/install libx264 (x264 Video Encoder)" - echo " 4 - Build/install libx265 (x265 Video Encoder)" - echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" - echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" - echo " 7 - Build FFmpeg (Builds from source only)" - echo " 8 - Guided Install" - echo " 9 - Purge build directories" - echo " q - Quit" - echo - echo " Note: This script will download and compile these software packages from source code," - echo " unless they happen to be available from your systems repository." - echo " Where necessary, libaries will be built as shared libs." - echo - echo " This excludes FFMPEG which will always be built for source." - echo - echo " If you have previously run this script, running it again will update your software." - echo - printf " Choice: " - read -r - if [[ "$REPLY" = "q" ]]; then - exit 0 - fi - - MODE=$REPLY - - if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then - printHeader - menu - fi - processOptions $MODE -} - -# Error Check -checkForError() { - if [[ $? -gt 0 ]]; then - stopWatch "stop" - echo "${Red}" - echo " ---------------------------------------------------------" - echo " | |" - echo " | Errors occurred |" - echo " | Please check the logs and try again |" - echo " | |" - echo " ---------------------------------------------------------" - echo "${End}" - echo - exit 1 - fi -} - -# Install Dependencies -installDependencies() { - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Installing Dependencies |" - echo " | |" - echo " ---------------------------------------------------------" - echo - INSTALL pkg-config autoconf automake libtool git wget make gcc nasm yasm cmake - -} - -# Install Libx264 -installLibx264() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libx264 |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_X264 - if [[ $? = 0 ]]; then - INSTALL $DEP_X264 - return - fi - fi - - - REMOVE $DEP_X264 - git clone https://code.videolan.org/videolan/x264.git - cd x264 - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Install Libx265 -installLibx265() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libx265 |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_X265 - if [[ $? = 0 ]]; then - INSTALL $DEP_X265 - return - fi - fi - - - REMOVE $DEP_X265 - git clone https://bitbucket.org/multicoreware/x265_git.git - cd x265_git/build/xcode - cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Install Libfdk -installLibfdk() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libfdk-aac |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_AAC - if [[ $? = 0 ]]; then - INSTALL $DEP_AAC - return - fi - fi - - REMOVE $DEP_AAC - git clone https://github.com/mstorsjo/fdk-aac.git - cd fdk-aac - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Install VPX -installLibvpx() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libvpx-dev |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_VPX - if [[ $? = 0 ]]; then - INSTALL $DEP_VPX - return - fi - fi - - REMOVE $DEP_VPX - git clone https://chromium.googlesource.com/webm/libvpx.git - cd libvpx - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Install VPX -installLibopus() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing libopus-dev |" - echo " | |" - echo " ---------------------------------------------------------" - echo - - if [[ $FORCE_BUILD = false ]]; then - CHECK $DEP_OPUS - if [[ $? = 0 ]]; then - INSTALL $DEP_OPUS - return - fi - fi - - REMOVE $DEP_OPUS - git clone https://github.com/xiph/opus.git - cd opus - ./autogen.sh - ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Install FFmpeg -installFFmpeg() { - cd ~ - echo - echo " ---------------------------------------------------------" - echo " | |" - echo " | Building/Installing FFmpeg |" - echo " | |" - echo " ---------------------------------------------------------" - echo - REMOVE ffmpeg - wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 - echo "Extracting source code..." - tar xjf ffmpeg-snapshot.tar.bz2 - cd ffmpeg - - - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" - - if [[ "$FDK" = "y" ]]; then - CMD="$CMD --enable-libfdk-aac" - fi - - if [[ "$L264" = "y" ]]; then - CMD="$CMD --enable-libx264" - fi - - if [[ "$L265" = "y" ]]; then - CMD="$CMD --enable-libx265" - fi - - if [[ "$LVPX" = "y" ]]; then - CMD="$CMD --enable-libvpx" - fi - - if [[ "$LOPUS" = "y" ]]; then - CMD="$CMD --enable-libopus" - fi - - if [[ "$FLAGSYN" = "y" ]]; then - CMD="$CMD $FLAGS" - fi - - ./configure $CMD --extra-libs="-lpthread -lm" - checkForError - make -j"$JOBS" - checkForError - sudo make install - checkForError - sudo ldconfig - cd ~ -} - -# Clear Up -cleanDirectory() { - rm -rf ffmpeg - rm -rf fdk-aac - rm -rf x264 - rm -rf x265_git - rm -rf libvpx - rm -rf opus - rm -f ffmpeg-snapshot.tar.bz2 -} - -# Ask for Threads -getJobsCount() { - - if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" - read -r - if [[ $REPLY -gt 0 ]]; then - JOBS=$REPLY - fi -} - -# getLib L264_PARAM L264 "libx264" -getLib(){ - - - if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - eval $2="$REPLY" - fi - -} - -# Get Compile Flags -getFlags() { - - if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then - return - fi - - echo - echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" - echo - echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." - printf " You are responsible for ensuring any requied dev/header files are installed: " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FLAGSYN="$REPLY" - if [[ "$FLAGSYN" = "y" ]]; then - echo - echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" - echo - printf " Example: --enable-vaapi --enable-libvorbis : " - read -r - if [[ ${#REPLY} -gt 0 ]]; then - FLAGS="$REPLY" - else - FLAGSYN="n" - fi - - fi - fi - -} - -# Performance Stop Watch -stopWatch() { - if [[ "$1" = "stop" ]]; then - endEpoch=$(date +%s) - endTime=$(date) - durationEpoch=$((endEpoch - startEpoch)) - echo - echo " Start time: ${startTime}" - echo " End time: ${endTime}" - echo " Duration: ${durationEpoch} seconds" - echo " Max jobs: $JOBS" - echo " Option: $MODE" - echo - else - startEpoch=$(date +%s) - startTime=$(date) - fi -} - -# Command Processor -processOptions() { - - case $1 in - - 1) - stopWatch "start" - installDependencies - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 2) - getJobsCount - stopWatch "start" - installLibfdk - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 3) - getJobsCount - stopWatch "start" - installLibx264 - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - 4) - getJobsCount - stopWatch "start" - installLibx265 - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 5) - getJobsCount - stopWatch "start" - installLibvpx - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 6) - getJobsCount - stopWatch "start" - installLibopus - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 7) - getJobsCount - stopWatch "start" - installFFmpeg - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 8) - getJobsCount - getLib FDK_PARAM FDK "libfdk-aac" - getLib L264_PARAM L264 "libx264" - getLib L265_PARAM L265 "libx265" - getLib LVPX_PARAM LVPX "libvpx" - getLib LOPUS_PARAM LOPUS "libopus" - getFlags - stopWatch "start" - installDependencies - if [[ "$FDK" = "y" ]]; then - installLibfdk - fi - if [[ "$L264" = "y" ]]; then - installLibx264 - fi - if [[ "$L265" = "y" ]]; then - installLibx265 - fi - if [[ "$LVPX" = "y" ]]; then - installLibvpx - fi - if [[ "$LOPUS" = "y" ]]; then - installLibopus - fi - installFFmpeg - cleanDirectory - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - - 9) - stopWatch "start" - cleanDirectory - stopWatch "stop" - if [ "$INTERACTIVE" = "y" ]; then - echo " ${Yellow}All Done!${End} ...press enter" - read -r - printHeader - menu - fi - ;; - esac -} - -# Entry Point -cd ~ - -while [ $# -gt 0 ]; do - - case "$1" in - - --help) - printf "\033c" - echo "Options:" - echo - echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" - echo " --none-interactive : Disables interactive mode" - echo " --mode [1-9] : Sets the operation. Requies --none-interactive" - echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" - echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" - echo " --libx264 [y:n] Default: y : Enable/Disable this lib" - echo " --libx265 [y:n] Default: n : Enable/Disable this lib" - echo " --libopus [y:n] Default: n : Enable/Disable this lib" - echo " --libvpx [y:n] Default: n : Enable/Disable this lib" - echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" - echo - exit 0 - ;; - --force-build) - FORCE_BUILD=true - ;; - --none-interactive) - INTERACTIVE="n" - ;; - --mode) - MODE=$2 - MODE_PARAM=true - ;; - --max-jobs) - JOBS=$2 - JOBS_PARAM=true - ;; - --libfdk-aac) - FDK="$2" - FDK_PARAM=true - ;; - --libx264) - L264="$2" - L264_PARAM=true - ;; - --libx265) - L265="$2" - L265_PARAM=true - ;; - --libopus) - LOPUS="$2" - LOPUS_PARAM=true - ;; - --libvpx) - LVPX="$2" - LVPX_PARAM=true - ;; - --extra-flags) - FLAGSYN="y" - FLAGS="$2" - FLAGS_PARAM=true - ;; - esac - shift -done - -if [ "$INTERACTIVE" = "n" ]; then - printHeader - processOptions $MODE - -else - printHeader - menu -fi diff --git a/build-osx.sh b/build-osx.sh index 66cddd0..35dd766 100755 --- a/build-osx.sh +++ b/build-osx.sh @@ -1,6 +1,6 @@ #!/bin/bash -# nrchkb-ffmpeg-build Version 1.1 +# nrchkb-ffmpeg-build Version 2.0 # MIT License @@ -32,16 +32,30 @@ End=$'\e[0m' # Defaults JOBS=3 # Jobs Value -JOBSPARAM=false # Arg provided -OMX="n" # OMX Choice Value -OMXPARAM=false # Arg provided +JOBS_PARAM=false # Arg provided + FDK="y" # FDK Choice Value -FDKPARAM=false # Arg provided +FDK_PARAM=false # Arg provided + +L264="y" # 264 Choice Value +L264_PARAM=false # Arg provided + +L265="n" # 265 Choice Value +L265_PARAM=false # Arg provided + +LVPX="n" # VPX Choice Value +LVPX_PARAM=false # Arg provided + +LOPUS="n" # Opus Choice Value +LOPUS_PARAM=false # Arg provided + FLAGSYN="n" # Flags Choice Value FLAGS="" # Flasg Value -FLAGSPARAM=false # Arg provided +FLAGS_PARAM=false # Arg provided + MODE=0 # Mode Value -MODEPARAM=false # Arg provided +MODE_PARAM=false # Arg provided + INTERACTIVE="y" # Interactive # Prefix @@ -49,6 +63,9 @@ PREFIX="/usr/local" export LDFLAGS="-L$PREFIX/lib" export CFLAGS="-I$PREFIX/include" +# Ignore Repository sources +FORCE_BUILD=false + # Specific package manager implemention INSTALL() { brew install $@ @@ -60,19 +77,26 @@ CHECK() { brew info $1 } +# Package Names +DEP_X264="x264" +DEP_X265="x265" +DEP_VPX="libvpx" +DEP_OPUS="opus" +DEP_AAC="fdk-aac" + # Print Header printHeader() { printf "\033c" echo echo " ---------------------------------------------------------" - echo " | 1.1 |" - echo " | P&M FFmpeg Build Script (OSX) |" + echo " | 2.0 |" + echo " | P&M FFmpeg Build Script (OSX) |" echo " | An FFmpeg build & installation utility for NRCHKB |" echo " | |" echo " ---------------------------------------------------------" echo - echo " ${Red}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" + echo " ${Yellow}Note: This script will install into $PREFIX/bin and $PREFIX/lib respectively.${End}" echo } @@ -82,17 +106,24 @@ menu() { echo " ${Yellow}What would you like to do:${End}" echo - echo " 1 - Install build tools (dependencies from brew)" - echo " 2 - Build/install libfdk-aac (AAC encoder, needed for HomeKit audio)" - echo " 3 - Build/install FFmpeg (video processor, builds from source)" - echo " 4 - All of the above" - echo " 5 - Cleanup build directories" + echo " 1 - Install build tools (Dependencies from apt)" + echo " 2 - Build/install libfdk-aac (AAC Audio Encoder)" + echo " 3 - Build/install libx264 (x264 Video Encoder)" + echo " 4 - Build/install libx265 (x265 Video Encoder)" + echo " 5 - Build/install libvpx (VP8/VP9 video Encoder/Decoder)" + echo " 6 - Build/install libopus (Opus Audio Encoder/Decoder)" + echo " 7 - Build FFmpeg (Builds from source only)" + echo " 8 - Guided Install" + echo " 9 - Purge build directories" echo " q - Quit" echo - echo " Note: this script will download and compile these software packages from source code." - echo " This will take a long time. Option 4 will take over 6 hours on a Pi Zero W." + echo " Note: This script will download and compile these software packages from source code," + echo " unless they happen to be available from your systems repository." + echo " Where necessary, libaries will be built as shared libs." + echo + echo " This excludes FFMPEG which will always be built for source." echo - echo " If you have previously run this script, running it again will update your software." + echo " If you have previously run this script, running it again will update your software." echo printf " Choice: " read -r @@ -102,7 +133,7 @@ menu() { MODE=$REPLY - if [[ $MODE -gt 5 || $MODE -lt 1 ]]; then + if [[ $MODE -gt 8 || $MODE -lt 1 ]]; then printHeader menu fi @@ -135,24 +166,13 @@ installDependencies() { echo " | |" echo " ---------------------------------------------------------" echo - INSTALL pkg-config autoconf automake libtool git wget make nasm yasm - - CHECK x264 - - if [[ $? -gt 0 ]]; then - installLibx264 - else - INSTALL x264 - fi + INSTALL pkg-config autoconf automake libtool git wget make gcc nasm yasm cmake } # Install Libx264 installLibx264() { - cd ~ || { - echo "cd failed, aborting at installLibx264:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -160,30 +180,65 @@ installLibx264() { echo " | |" echo " ---------------------------------------------------------" echo - REMOVE x264 + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X264 + if [[ $? = 0 ]]; then + INSTALL $DEP_X264 + return + fi + fi + + + REMOVE $DEP_X264 git clone https://code.videolan.org/videolan/x264.git - cd x264 || { - echo "cd failed, aborting at installLibx264:02" - exit 1 - } - ./configure --prefix=$PREFIX --enable-static --enable-pic + cd x264 + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError sudo make install checkForError - cd ~ || { - echo "cd failed, aborting at installLibx264:03" - exit 1 - } + sudo ldconfig + cd ~ +} + +# Install Libx265 +installLibx265() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libx265 |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_X265 + if [[ $? = 0 ]]; then + INSTALL $DEP_X265 + return + fi + fi + + + REMOVE $DEP_X265 + git clone https://bitbucket.org/multicoreware/x265_git.git + cd x265_git/build/xcode + cmake -G "Unix Makefiles" -DLIB_INSTALL_DIR="$PREFIX/lib" -DENABLE_SHARED=on -DENABLE_PIC=on ../../source + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ } # Install Libfdk installLibfdk() { - cd ~ || { - echo "cd failed, aborting at installLibfdk:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -192,37 +247,97 @@ installLibfdk() { echo " ---------------------------------------------------------" echo - CHECK fdk-aac - if [[ $? = 0 ]]; then - INSTALL fdk-aac - return + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_AAC + if [[ $? = 0 ]]; then + INSTALL $DEP_AAC + return + fi fi - REMOVE fdk-aac + REMOVE $DEP_AAC git clone https://github.com/mstorsjo/fdk-aac.git - cd fdk-aac || { - echo "cd failed, aborting at installLibfdk:02" - exit 1 - } + cd fdk-aac ./autogen.sh - ./configure --prefix=$PREFIX --enable-static --disable-shared + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic checkForError make -j"$JOBS" checkForError sudo make install checkForError - cd ~ || { - echo "cd failed, aborting at installLibfdk:03" - exit 1 - } + sudo ldconfig + cd ~ +} + +# Install VPX +installLibvpx() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libvpx-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_VPX + if [[ $? = 0 ]]; then + INSTALL $DEP_VPX + return + fi + fi + + REMOVE $DEP_VPX + git clone https://chromium.googlesource.com/webm/libvpx.git + cd libvpx + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ +} + +# Install VPX +installLibopus() { + cd ~ + echo + echo " ---------------------------------------------------------" + echo " | |" + echo " | Building/Installing libopus-dev |" + echo " | |" + echo " ---------------------------------------------------------" + echo + + if [[ $FORCE_BUILD = false ]]; then + CHECK $DEP_OPUS + if [[ $? = 0 ]]; then + INSTALL $DEP_OPUS + return + fi + fi + + REMOVE $DEP_OPUS + git clone https://github.com/xiph/opus.git + cd opus + ./autogen.sh + ./configure --prefix=$PREFIX --disable-static --enable-shared --enable-pic + checkForError + make -j"$JOBS" + checkForError + sudo make install + checkForError + sudo ldconfig + cd ~ } # Install FFmpeg installFFmpeg() { - cd ~ || { - echo "cd failed, aborting at installFFmpeg:01" - exit 1 - } + cd ~ echo echo " ---------------------------------------------------------" echo " | |" @@ -234,37 +349,43 @@ installFFmpeg() { wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 echo "Extracting source code..." tar xjf ffmpeg-snapshot.tar.bz2 - cd ffmpeg || { - echo "cd failed, aborting at installFFmpeg:02" - exit 1 - } + cd ffmpeg + - CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --enable-hardcoded-tables --disable-ffprobe --disable-ffplay --enable-libx264" + CMD="--prefix=$PREFIX --enable-nonfree --enable-gpl --disable-ffprobe --disable-ffplay --enable-pic --disable-static --enable-shared" if [[ "$FDK" = "y" ]]; then CMD="$CMD --enable-libfdk-aac" fi - if [[ "$OMX" = "y" ]]; then - CMD="$CMD --enable-mmal" - CMD="$CMD --enable-omx" - CMD="$CMD --enable-omx-rpi" + if [[ "$L264" = "y" ]]; then + CMD="$CMD --enable-libx264" + fi + + if [[ "$L265" = "y" ]]; then + CMD="$CMD --enable-libx265" + fi + + if [[ "$LVPX" = "y" ]]; then + CMD="$CMD --enable-libvpx" + fi + + if [[ "$LOPUS" = "y" ]]; then + CMD="$CMD --enable-libopus" fi if [[ "$FLAGSYN" = "y" ]]; then CMD="$CMD $FLAGS" fi - ./configure $CMD + ./configure $CMD --extra-libs="-lpthread -lm" checkForError make -j"$JOBS" checkForError sudo make install checkForError - cd ~ || { - echo "cd failed, aborting at installFFmpeg:03" - exit 1 - } + sudo ldconfig + cd ~ } # Clear Up @@ -272,75 +393,55 @@ cleanDirectory() { rm -rf ffmpeg rm -rf fdk-aac rm -rf x264 + rm -rf x265_git + rm -rf libvpx + rm -rf opus rm -f ffmpeg-snapshot.tar.bz2 } # Ask for Threads getJobsCount() { - if [[ $JOBSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $JOBS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed)${End}" - echo - echo " The more you specify - the higher chance of CPU throttling and memory constraints" - printf " we recommend no more than 3 for a Pi 4 (1-4): " + printf " ${Yellow}How many simultaneous jobs would you like to use for build processes (if needed) Default: $JOBS (#):${End}" read -r - if [[ $REPLY -lt 5 && $REPLY -gt 0 ]]; then + if [[ $REPLY -gt 0 ]]; then JOBS=$REPLY fi } -# Ask for omx -getOMX() { +# getLib L264_PARAM L264 "libx264" +getLib(){ - if [[ $OMXPARAM = true || "$INTERACTIVE" = "n" ]]; then + + if [[ ${!1} = true || "$INTERACTIVE" = "n" ]]; then return fi - echo - echo " ${Yellow}Would you like to enable 'h264_omx'?${End}" - echo - echo " Note: 'h264_omx' is deprecated and should not be used on new installs." - printf " If you already use it, choose yes here. Enter (y/n): " + printf " ${Yellow}Would you like to enable '$3'? Default: ${!2} (y/n):${End}" read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - OMX="$REPLY" - fi -} - -# Ask for FDK -getFDK() { - - if [[ $FDKPARAM = true || "$INTERACTIVE" = "n" ]]; then - return + eval $2="$REPLY" fi - echo - echo " ${Yellow}Would you like to enable 'libfdk-aac'?${End}" - echo - echo " Note: 'libfdk-aac' is needed for HomeKit audio. We recommend enabling libfdk-aac." - printf " If you are running Option 4, you can enable this lib. Enter (y/n): " - read -r - if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then - FDK="$REPLY" - fi } # Get Compile Flags getFlags() { - if [[ $FLAGSPARAM = true || "$INTERACTIVE" = "n" ]]; then + if [[ $FLAGS_PARAM = true || "$INTERACTIVE" = "n" ]]; then return fi echo - echo " ${Yellow}Would you like to add any extra FFmpeg compile flags?" + echo " ${Yellow}Would you like to add any extra FFmpeg compile flags? Default: $FLAGSYN (y/n)" echo - echo " ADVANCED: ${End}Compile flags could be added to enable libx265 or the countless others" - printf " You are responsible for ensuring any required parts are installed (y/n): " + echo " ADVANCED: ${End}Compile flags could be added to the build process, to ensure ffmpeg is compiled with more features." + printf " You are responsible for ensuring any requied dev/header files are installed: " read -r if [[ "$REPLY" = "y" || "$REPLY" = "n" ]]; then FLAGSYN="$REPLY" @@ -348,7 +449,7 @@ getFlags() { echo echo " ${Yellow}Please enter your compile flags below, separated by a space${End}" echo - printf " Example '--enable-libx265 --enable-libopus' : " + printf " Example: --enable-vaapi --enable-libvorbis : " read -r if [[ ${#REPLY} -gt 0 ]]; then FLAGS="$REPLY" @@ -386,7 +487,6 @@ processOptions() { case $1 in 1) - getJobsCount stopWatch "start" installDependencies stopWatch "stop" @@ -413,9 +513,57 @@ processOptions() { 3) getJobsCount - getOMX - getFDK - getFlags + stopWatch "start" + installLibx264 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + 4) + getJobsCount + stopWatch "start" + installLibx265 + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 5) + getJobsCount + stopWatch "start" + installLibvpx + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 6) + getJobsCount + stopWatch "start" + installLibopus + stopWatch "stop" + if [ "$INTERACTIVE" = "y" ]; then + echo " ${Yellow}All Done!${End} ...press enter" + read -r + printHeader + menu + fi + ;; + + 7) + getJobsCount stopWatch "start" installFFmpeg stopWatch "stop" @@ -427,17 +575,31 @@ processOptions() { fi ;; - 4) - cleanDirectory + 8) getJobsCount - getOMX - getFDK + getLib FDK_PARAM FDK "libfdk-aac" + getLib L264_PARAM L264 "libx264" + getLib L265_PARAM L265 "libx265" + getLib LVPX_PARAM LVPX "libvpx" + getLib LOPUS_PARAM LOPUS "libopus" getFlags stopWatch "start" installDependencies if [[ "$FDK" = "y" ]]; then installLibfdk fi + if [[ "$L264" = "y" ]]; then + installLibx264 + fi + if [[ "$L265" = "y" ]]; then + installLibx265 + fi + if [[ "$LVPX" = "y" ]]; then + installLibvpx + fi + if [[ "$LOPUS" = "y" ]]; then + installLibopus + fi installFFmpeg cleanDirectory stopWatch "stop" @@ -449,7 +611,7 @@ processOptions() { fi ;; - 5) + 9) stopWatch "start" cleanDirectory stopWatch "stop" @@ -464,52 +626,67 @@ processOptions() { } # Entry Point -cd ~ || { - echo "cd failed, aborting" - exit 1 -} +cd ~ while [ $# -gt 0 ]; do case "$1" in - --help | -h) + --help) + printf "\033c" echo "Options:" echo - echo " --interactive -i [y|n] Default: y Disables interactive mode" - echo " --mode -m [1|2|3|4|5] Sets the mode (requires --interactive 0, ignored otherwise)" - echo " --max-jobs -j [#] Default: 3 Set maximum number of builds jobs" - echo " --libfdk-aac -a [y|n] Default: y Compile/enable libfdk-aac" - echo " --h264-omx -x [y|n] Default: n Enable h264-omx" - echo " --extra-flags -f [\"--*-* --*-*\"] Default: empty Provides compile flags for ffmpeg" - echo - echo " Example: ./build-debian.sh --interactive n --max-jobs 2 --mode 4" + echo " --force-build : Forces the build of required libs, regaldess of their availability with the systems repository sources" + echo " --none-interactive : Disables interactive mode" + echo " --mode [1-9] : Sets the operation. Requies --none-interactive" + echo " --max-jobs [1-#] Default: 3 : Sets the number of build threads" + echo " --libfdk-aac [y:n] Default: y : Enable/Disable this lib" + echo " --libx264 [y:n] Default: y : Enable/Disable this lib" + echo " --libx265 [y:n] Default: n : Enable/Disable this lib" + echo " --libopus [y:n] Default: n : Enable/Disable this lib" + echo " --libvpx [y:n] Default: n : Enable/Disable this lib" + echo " --extra-flags [*] Default: None : Adds extra build args to the ffmpeg build" echo exit 0 ;; - --interactive | -i) - INTERACTIVE="$2" + --force-build) + FORCE_BUILD=true + ;; + --none-interactive) + INTERACTIVE="n" ;; - --mode | -m) + --mode) MODE=$2 - MODEPARAM=true + MODE_PARAM=true ;; - --max-jobs | -j) + --max-jobs) JOBS=$2 - JOBSPARAM=true + JOBS_PARAM=true ;; - --h264-omx | -x) - OMX="$2" - OMXPARAM=true - ;; - --libfdk-aac | -a) + --libfdk-aac) FDK="$2" - FDKPARAM=true + FDK_PARAM=true + ;; + --libx264) + L264="$2" + L264_PARAM=true + ;; + --libx265) + L265="$2" + L265_PARAM=true + ;; + --libopus) + LOPUS="$2" + LOPUS_PARAM=true + ;; + --libvpx) + LVPX="$2" + LVPX_PARAM=true ;; - --extra-flags | -f) + --extra-flags) FLAGSYN="y" FLAGS="$2" - FLAGSPARAM=true + FLAGS_PARAM=true ;; esac shift From 0754a70eec625a8067052bde9136156d1bb79c2e Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 14:20:05 +0000 Subject: [PATCH 17/22] Update README.md --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 757c579..61afcb2 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,7 @@ Tested systems - **Alpine** - - Apple M1 (Virtual) (64 Bit) - - Raspberry Pi 3B (32 Bit) + - 64Bit ARM - **Bullseye** @@ -36,13 +35,13 @@ Tested systems - Raspberry Pi 3B+ (32 Bit) - Raspberry Pi 3B (32 Bit) -- **macOS Monterey** +- **macOS Ventura** - - Apple M1 (64 Bit) + - 64Bit ARM - **Ubuntu** - - Intel (64 Bit) - - Apple M1 (Virtual) (64 Bit) + + - 64Bit ARM ![image](./Menu1.png) From 5e299c7a7e05b573168eed58f6e86945e9eeb8bb Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 14:24:02 +0000 Subject: [PATCH 18/22] Update Menu1.png --- Menu1.png | Bin 129847 -> 100785 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Menu1.png b/Menu1.png index a9b9a50f1de7adedc267b33422b07a2a7a6ef8ea..1dc4a6e7868dbd73b75e25d884bb9596bb71f407 100644 GIT binary patch literal 100785 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¥!|=?ddU_pDX|q9>$GA6qFndMUDPr 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 z�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
`ZLn-*K)!bWIapdlKrz5 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

(;u%E|XtZDu1c_u}gD$b%RQ}#fV?CjzoT+SE8 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�wKf?jPh9CN#D_yw6c+z7og)xr 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 j?0@`kO^g33j* From 5b9f8330c782f41176009369908fd1ec5cf0dde5 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 16:39:24 +0000 Subject: [PATCH 19/22] Update README.md --- README.md | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 61afcb2..2c06f27 100644 --- a/README.md +++ b/README.md @@ -16,32 +16,24 @@ Highlights - Ability to add extra compile flags - Automate with command line arguments. -Tested systems +Tested Environments - **Alpine** - - 64Bit ARM + - 64Bit ARM (VMware Fusion, Apple M1) -- **Bullseye** +- **RPI Bullseye** - - Raspberry Pi Zero W1 (32 Bit) - - Raspberry Pi Zero W2 (64 Bit) - - Raspberry Pi 4 (64 Bit) - - Raspberry Pi 3A+ (64 Bit) - -- **Buster** - - - Raspberry Pi 4 (32 Bit) - - Raspberry Pi 3B+ (32 Bit) - - Raspberry Pi 3B (32 Bit) + - 32Bit ARM (RPI Zero W1) + - 64Bit ARM (RPI Zero W2) - **macOS Ventura** - - 64Bit ARM + - 64Bit ARM (Apple Mac Mini M1) - **Ubuntu** - - 64Bit ARM + - 64Bit ARM (VMware Fusion, Apple M1) ![image](./Menu1.png) From c8e28a135f878bd0e9728b177aa73d534a87118f Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 21:35:59 +0000 Subject: [PATCH 20/22] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c06f27..d576f95 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ Tested Environments - **RPI Bullseye** - - 32Bit ARM (RPI Zero W1) - 64Bit ARM (RPI Zero W2) - **macOS Ventura** @@ -41,7 +40,7 @@ Tested Environments Copy the below and paste it in your terminal. -Note: If your OS is Alpine, install curl and bash first. +Note: If your OS is Alpine, install `curl` and `bash` first. ``` apk add curl bash From d700b7faab2b211d01862bda4a1c7a5f376a9550 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 22:38:23 +0000 Subject: [PATCH 21/22] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d576f95..c6bbd8a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Tested Environments - **Ubuntu** - 64Bit ARM (VMware Fusion, Apple M1) + - 64BIT AMD/INTEL ![image](./Menu1.png) From 1cd8a87e9e2029cb3abd7af822a28c3258f7f193 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Sun, 19 Feb 2023 22:39:08 +0000 Subject: [PATCH 22/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6bbd8a..635f1d8 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Tested Environments - **Ubuntu** - 64Bit ARM (VMware Fusion, Apple M1) - - 64BIT AMD/INTEL + - 64Bit AMD/INTEL ![image](./Menu1.png)