#!/bin/bash

ROOT_DIR=~/ffmpeg #abspath! rootdir will be mentioned in ffmpeg configuration
SRC_DIR=${ROOT_DIR}/src
BUILD_DIR=${ROOT_DIR}/build
BIN_DIR=${ROOT_DIR}/bin
OUT_DIR=${ROOT_DIR}/output

PATH=$BIN_DIR:$PATH

V_NASM=2.15.05
V_YASM=1.3.0
V_OPENH264=2.4.1
V_LIBVPX=1.14.0
V_FFMPEG=6.1
# prereqs
#sudo yum install -y autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel || exit 1
mkdir -p $SRC_DIR

echo "Building assemblers..."
# nasm
if [ ! -f "$BIN_DIR/nasm" ]; then
	cd $SRC_DIR
	if [ ! -d "nasm-${V_NASM}" ]; then
		curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/${V_NASM}/nasm-${V_NASM}.tar.bz2 || exit 1
		tar xjvf nasm-${V_NASM}.tar.bz2 || exit 2
	fi
	cd nasm-${V_NASM} 
	./autogen.sh && ./configure --prefix="$BUILD_DIR" --bindir="$BIN_DIR" || exit 3
	make -j`nproc` && make install || exit 4
else
	echo "NASM: $BIN_DIR/nasm already built, skipping."
fi
# yasm
if [ ! -f "$BIN_DIR/yasm" ]; then
	cd $SRC_DIR 
	if [ ! -d "yasm-${V_YASM}" ]; then
		curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-${V_YASM}.tar.gz || exit 5
		tar xzvf yasm-${V_YASM}.tar.gz || exit 6
	fi
	cd yasm-${V_YASM}
	./configure --prefix="${BUILD_DIR}" --bindir="${BIN_DIR}" || exit 7
	make -j`nproc` && make install || exit 8
else
	echo "YASM: $BIN_DIR/yasm already built, skipping."
fi

echo "Building dependencies..."
echo "Building libvpx..."
# libvpx
if [ ! -f "$BUILD_DIR/lib/libvpx.a" ]; then
	cd ${SRC_DIR}
	if [ ! -d "libvpx-${V_LIBVPX}" ]; then
		curl -o libvpx-${V_LIBVPX}.tar.gz -L https://github.com/webmproject/libvpx/archive/refs/tags/v${V_LIBVPX}.tar.gz
		tar xzvf libvpx-${V_LIBVPX}.tar.gz || exit 9
		#git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
	fi
	cd libvpx-${V_LIBVPX}
	make distclean
	./configure --prefix="${BUILD_DIR}" --disable-examples --disable-unit-tests \
		--enable-vp9 --enable-vp9-highbitdepth \
		--enable-shared --as=yasm || exit 10
	make -j`nproc` && make install || exit 11 //PATH!
else
	echo "LIBVPX: $BUILD_DIR/lib/libvpx.so already built, skipping."
fi

# libopenh264
echo "Building libopenh264..."
if [ ! -f "$BUILD_DIR/lib/libopenh264.a" ]; then
	cd $SRC_DIR
	if [ ! -d "openh264-${V_OPENH264}" ]; then
		curl -o openh264-${V_OPENH264}.tar.gz -L https://github.com/cisco/openh264/archive/refs/tags/v${V_OPENH264}.tar.gz || exit 12
		tar xzvf openh264-${V_OPENH264}.tar.gz || exit 13
	# 	git clone https://github.com/cisco/openh264.git
	fi
	cd openh264-${V_OPENH264}
	make all install -j`nproc` PREFIX="${BUILD_DIR}" || exit 14 //PATH!
	#cp -v libopenh264.so libopenh264.so.7 libopenh264.so.2.4.1 libopenh264.a $BUILD_DIR/lib/
	#cp -v openh264.pc $BUILD_DIR/
	#cp -rv codec/api/wels $BUILD_DIR/include/
else
	echo "OPENH264: $BUILD_DIR/lib/libopenh264.so already built, skipping."
fi

#### FFmpeg
echo Building FFmpeg...
cd ${SRC_DIR}
if [ ! -d ffmpeg-${V_FFMPEG} ]; then
	curl -O -L https://ffmpeg.org/releases/ffmpeg-${V_FFMPEG}.tar.bz2 || exit 15
	tar xjvf ffmpeg-${V_FFMPEG}.tar.bz2 || exit 16
fi
cd ffmpeg-${V_FFMPEG}
make distclean
#PATH!
PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure \
	--prefix="${BUILD_DIR}" \
	--extra-cflags="-I${BUILD_DIR}/include" \
	--extra-ldflags="-L${BUILD_DIR}/lib" \
	--bindir="${BIN_DIR}" \
	--disable-all \
	--disable-gpl \
	--disable-static \
	--enable-shared \
	--disable-autodetect \
	\
	--enable-avcodec \
	--enable-avdevice \
	--enable-avfilter \
	--enable-avformat \
	--enable-swresample \
	--enable-swscale \
	--enable-ffmpeg \
	\
	--enable-libopenh264 \
	--enable-libvpx \
	\
	--enable-protocol=file \
	--enable-encoder=libvpx_vp9,libopenh264,gif \
	--enable-decoder=libvpx_vp9,libopenh264,gif,mjpeg \
	--enable-muxer=mov,mp4,avi,gif \
	--enable-demuxer=mov,mp4,avi,gif \
	--enable-filter=scale,split,palettegen,paletteuse \
	|| exit 17

make -j`nproc` || exit 18 #PATH!
make install || exit 19
hash -d ./ffmpeg

if [ ! -f "$OUT_DIR/ffmpeg" ]; then
	mkdir -p $OUT_DIR
	cd $BUILD_DIR/lib
	cp libopenh264.so.7 libvpx.so.9 \
		libavcodec.so.60 libavdevice.so.60 \
		libavfilter.so.9 libavformat.so.60 \
		libavutil.so.58 libswresample.so.4 \
		libswscale.so.7 \
		$OUT_DIR
	cp $BIN_DIR/ffmpeg $OUT_DIR
fi
printf "\n=========================================\n\n"
LD_LIBRARY_PATH=$OUT_DIR $OUT_DIR/ffmpeg -L
printf "\n=========================================\n\n"
LD_LIBRARY_PATH=$OUT_DIR $OUT_DIR/ffmpeg -buildconf
printf "\n=========================================\n\n"
LD_LIBRARY_PATH=$OUT_DIR ldd $OUT_DIR/ffmpeg