#!/bin/bash

#--- Functions ---------------------------------------------------------------

SetEncodeParam()
{
	# This sets the global variables used to configure the
	# RunEncode function.
	
	COMMAND="mencoder"
	SOURCE="-dvd-device . dvd://1 -chapter 2 -frames 1500"
	GENERAL="-ffourcc DIVX -mc 0 -noskip -skiplimit 0 -quiet"

	SUBTARGET0=""
	SUBTARGET1=""
	SUBTARGET2=""
	SUBTARGET3=""
	
	SOUND0=""
	SOUND1="-nosound"
	SOUND2="-nosound"
	SOUND3="-nosound"
	
	if [ -n "${1}" ]; then
		BITRATE=${1}
		TARGETSUF="-${1}"
	else
		BITRATE=800
		TARGETSUF="-800"
	fi

	VIDEOOPT="vmax_b_frames=1:mbd=2:v4mv:trell:precmp=2:cmp=2:subcmp=2:dia=-1:predia=1:last_pred=4:preme=2:cbp:mv0:vqmax=12"
	if [ "${BITRATE}" == "800" ]; then
		VIDEOOPT="$VIDEOOPT:vqcomp=0.6";
	fi

	TARGET="a$2$3$4${TARGETSUF}.avi"

	FILTER0=""
	FILTER1="-vf crop=688:560:18:8,scale=624:480,hqdn3d=$2:$3:$4"
	FILTER2=$FILTER1
	FILTER3=$FILTER1

	VIDEO0=""
	VIDEO1="-ovc lavc -lavcopts $VIDEOOPT:vpass=1:vbitrate=$BITRATE -o /dev/null"
	VIDEO2="-ovc lavc -lavcopts $VIDEOOPT:vpass=2:vbitrate=$BITRATE:autoaspect:psnr -o $TARGET"
	VIDEO3=""
}

RunEncode()
{
	# This function encode a movie in 4 pass according to
	# presets variables. The first pass is used to encode
	# sound and the subsequent 3 pass are used to encode
	# video. All 4 pass can be used to extract subtitles.
	# A given pass or extraction is only run if it has a
	# configured preset variable.
	
	if [ -n "$SOUND0" ]; then
		[ -f frameno.avi ] && rm frameno.avi
		if [ -n "$SUBTARGET0" ]; then
			SUBTTL0="-slang $SUBTARGET0 -vobsubout $SUBTARGET0 -vobsuboutid $SUBTARGET0 -vobsuboutindex 0";
			[ -f $SUBTARGET0.idx ] && rm $SUBTARGET0.idx
			[ -f $SUBTARGET0.sub ] && rm $SUBTARGET0.sub
		else
			SUBTTL0="";
		fi
		$COMMAND $SOURCE $GENERAL $SOUND0 $FILTER0 $VIDEO0 $SUBTTL0;
	fi
	
	if [ -n "$VIDEO1" ]; then
		[ -f divx2pass.log ] && rm divx2pass.log
		[ -f xvid-twopass.stats ] && rm xvid-twopass.stats
		[ -f old$TARGET ] && rm old$TARGET
		[ -f $TARGET ] && mv $TARGET old$TARGET 
		[ -f $TARGET ] && rm $TARGET
		rm psnr_*.log 2> /dev/null
		if [ -n "$SUBTARGET1" ]; then
			SUBTTL1="-slang $SUBTARGET1 -vobsubout $SUBTARGET1 -vobsuboutid $SUBTARGET1 -vobsuboutindex 0";
			[ -f $SUBTARGET1.idx ] && rm $SUBTARGET1.idx
			[ -f $SUBTARGET1.sub ] && rm $SUBTARGET1.sub
		else
			SUBTTL1="";
		fi
		$COMMAND $SOURCE $GENERAL $SOUND1 $FILTER1 $VIDEO1 $SUBTTL1;
	fi
	
	if [ -n "$VIDEO2" ]; then
		[ -f old$TARGET ] && rm old$TARGET
		[ -f $TARGET ] && mv $TARGET old$TARGET 
		[ -f $TARGET ] && rm $TARGET
		rm psnr_*.log 2> /dev/null
		if [ -n "$SUBTARGET2" ]; then
			SUBTTL2="-slang $SUBTARGET2 -vobsubout $SUBTARGET2 -vobsuboutid $SUBTARGET2 -vobsuboutindex 0";
			[ -f $SUBTARGET2.idx ] && rm $SUBTARGET2.idx
			[ -f $SUBTARGET2.sub ] && rm $SUBTARGET2.sub
		else
			SUBTTL2="";
		fi
		$COMMAND $SOURCE $GENERAL $SOUND2 $FILTER2 $VIDEO2 $SUBTTL2;
	fi
	
	if [ -n "$VIDEO3" ]; then
		[ -f old$TARGET ] && rm old$TARGET
		[ -f $TARGET ] && mv $TARGET old$TARGET 
		[ -f $TARGET ] && rm $TARGET
		rm psnr_*.log 2> /dev/null
		if [ -n "$SUBTARGET3" ]; then
			SUBTTL3="-slang $SUBTARGET3 -vobsubout $SUBTARGET3 -vobsuboutid $SUBTARGET3 -vobsuboutindex 0";
			[ -f $SUBTARGET3.idx ] && rm $SUBTARGET3.idx
			[ -f $SUBTARGET3.sub ] && rm $SUBTARGET3.sub
		else
			SUBTTL3="";
		fi
		$COMMAND $SOURCE $GENERAL $SOUND3 $FILTER3 $VIDEO3 $SUBTTL3;
	fi
}

#--- Main code ---------------------------------------------------------------

if [ "${1}" == "all" ] || [ "${1}" == "ALL" ]; then
	#[ -f results${2}.txt ] && rm results${2}.txt
	for (( i=0; i<7; i=$i+1 )); do
	for (( j=0; j<7; j=$j+1 )); do
	for (( k=0; k<10; k=$k+1 )); do
		echo "running encode $i $j $k"
		${0} $i $j $k ${2} >> results${2}.txt
	done
	done
	done
	
	[ -f tmpstats.txt ] && rm tmpstats.txt
	[ -f tmperrors.txt ] && rm tmperrors.txt
	[ -f tmptime.txt ] && rm tmptime.txt
	[ -f divx2pass.log ] && rm divx2pass.log
	[ -f xvid-twopass.stats ] && rm xvid-twopass.stats
	rm psnr_*.log 2> /dev/null
else
	[ -f tmpstats.txt ] && rm tmpstats.txt
	[ -f tmperrors.txt ] && rm tmperrors.txt
	[ -f tmptime.txt ] && rm tmptime.txt
	rm psnr_*.log 2> /dev/null
	
	SetEncodeParam ${4} ${1} ${2} ${3}
	if [ -f $TARGET ]; then
		echo "skip ${1} ${2} ${3}"
	else
		( time RunEncode > tmpstats.txt 2> tmperrors.txt ) 2> tmptime.txt
		cat psnr_*.log > psnr-${TARGET%%.*}.log
		
		echo "### ${1} ${2} ${3} @ ${4} kbit/s ####################################"
		grep "kbit" tmpstats.txt
		grep "PSNR" tmpstats.txt
		grep "user" tmptime.txt
	fi
fi