#!/bin/sh
#
#  high bitrate -a224 -b6500 -q2 if it underruns
#  medium bitrate -a224 -b6000 -q3 if it underruns
#  low bitrate -a192 -b5500 -q4 if it underruns
#  very low bitrate -a96 -b5000 -q4 if it underruns
#
# quantizer values are essentially half that of mjpegtools
#
def_denoise=0
def_interlace=2
def_ratio=2
def_signal=1
def_tools=0
def_quality=2
def_sound=1

help(){
    cat <<END
Usage: $0 [options] <filename.[avi|dv|mov|mpg|qt|mp4|ts]>
Options:
    -d n      denoise, n=0 none ... n=2 strong      ($def_denoise)
    -i n      n=0 prog, n=1 top, n=2 bot, n=3 deint ($def_interlace)
    -q n      quality, n=1 highest ... n=4 lowest   ($def_quality)
    -r n      aspect ratio, n=1 4:3, n=2 16:9       ($def_ratio)
              n=3 pillarbox 4:3 in 16:9 aspect
    -s n      audio, n=0 mp2enc, n=1 toolame        ($def_sound)
    -t n      video, n=0 mjpegtools, n=1 ffmpeg,    ($def_tools)
              n=3 mencoder with lavc
    -v n      norm, n=1 ntsc n=2 pal                ($def_signal)
    -h        Print this help message
END
    exit 0
}

denoise=$def_denoise
interlace=$def_interlace
ratio=$def_ratio
signal=$def_signal
tools=$def_tools
quality=$def_quality
sound=$def_sound

while getopts d:i:q:r:s:t:v:h name "$@"
do
    case $name in
d)
	denoise=$OPTARG ;;
i)  
    interlace=$OPTARG ;;
q)
    quality=$OPTARG ;;
r)
    ratio=$OPTARG ;;
s)
    sound=$OPTARG ;;
t)
    tools=$OPTARG ;;
v)
    signal=$OPTARG ;;
*)
    help ;;
    esac
done
let shiftind=$OPTIND-1
shift $shiftind
if test "$#" != "1"
then
    help
fi
case $1 in
*.ts)
    input="$1"
    base=`echo $input | sed "s/\.ts$//"` ;;
*.qt)
    input="$1"
    base=`echo $input | sed "s/\.qt$//"` ;;
*.mov)
    input="$1"
    base=`echo $input | sed "s/\.mov$//"` ;;
*.avi)
    input="$1"
    base=`echo $input | sed "s/\.avi$//"` ;;
*.mp4)
    input="$1"
    base=`echo $input | sed "s/\.mp4$//"` ;;
*.dv)
    input="$1"
    base=`echo $input | sed "s/\.dv$//"` ;;
*.mpg)
    input="$1"
    base=`echo $input | sed "s/\.mpg$//"`-dvd ;;
*)
    help ;;
esac

case $quality in
1) 
    abitrate=224
    bitrate=7500
    quant_m=8
    quant_f=4 ;;
3)
    abitrate=192
    bitrate=6500
    quant_m=10
    quant_f=6 ;;
4)
    abitrate=96
    bitrate=5500
    quant_m=12
    quant_f=7 ;;
*)
    abitrate=224
    bitrate=7000
    quant_m=9
    quant_f=5 ;;
esac
case $signal in
2)
    nflag_f="-r pal"
    nflag_m="-np" ;;
*)
    nflag_f="-r ntsc"
    nflag_m="-nn" ;;
esac
case $interlace in
0)
    iflag_e=""
    iflag_f="-interlace 0"
    iflag_m=NOT_INTERLACED ;;
1)
    iflag_e=""
    iflag_f="-interlace 1 -ildct -ilme -top 1"
    iflag_m=INTERLACED_TOP_FIRST ;;
3)
    iflag_e="kerndeint,"
    iflag_f="-deinterlace"
    iflag_m=NOT_INTERLACED ;;
*)
    iflag_e=""
    iflag_f="-interlace 1 -ildct -ilme -top 0"
    iflag_m=INTERLACED_BOTTOM_FIRST ;;
esac
case $ratio in
2)
    aflag_f="-aspect 16:9" 
    aflag_e="16/9"
    aflag_m="-a3" ;;
3)
    aflag_f="-s 540x480 -padleft 90 -padright 90 -aspect 16:9" 
    aflag_e="16/9"
    aflag_m="-a3" ;;
*)
    aflag_f="-aspect 4:3"
    aflag_e="4/3"
    aflag_m="-a2"  ;;
esac
case $denoise in
1)
	dnprog="yuvdenoise -g 0,0,0 -t 4,6,6 -M 0,0,0" ;;
2)
	dnprog="yuvdenoise -g 0,0,0 -t 8,12,12 -M 0,0,0" ;;
*)
	dnprog="cat" ;;
esac

echo "Encoding $input to $base.mpg"
echo "    video bitrate $bitrate"
echo "    audio bitrate $abitrate"
sleep 5

# To resize 16:9 NTSC to 4:3 PAL (missing aspect ratio?)
#    -s 800x480 -padtop 48 -padbottom 48 -cropright 40 -cropleft 40 \
# To resize 4:3 NTSC to 4:3 PAL (or 16:9 NTSC to 16:9 PAL)
#    -s 600x480 -padtop 48 -padbottom 48 -padleft 60 -padright 60 \
# To pillarbox 4:3 NTSC to 16:9 NTSC
#    -s 540x480 -padleft 90 -padright 90 \

case $tools in
3)
	echo mencoder $input -oac lavc -ovc lavc \
	-lavcopts acodec=ac3:abitrate=$abitrate:vcodec=mpeg2video:vbitrate=$bitrate:vqmin=$quant_f:vrc_maxrate=7500:vrc_buf_size=1835:aspect=$aflag_e \
	-vf harddup,${iflag_e}scale=720:480,dsize=$aflag_e \
	-of mpeg -mpegopts format=dvd:tsaf:vaspect=$aflag_e \
	-o $base.mpg
    mencoder $input -oac lavc -ovc lavc \
	-lavcopts acodec=ac3:abitrate=$abitrate:vcodec=mpeg2video:vbitrate=$bitrate:vqmin=$quant_f:vrc_maxrate=7500:vrc_buf_size=1835:aspect=$aflag_e \
	-vf harddup,${iflag_e}scale=720:480,dsize=$aflag_e \
	-of mpeg -mpegopts format=dvd:tsaf:vaspect=$aflag_e \
	-o $base.mpg ;;
1)
    echo ffmpeg -i $input $iflag_f $nflag_f -target dvd $aflag_f \
        -qmin $quant_f -b ${bitrate}000 -ab ${abitrate}000 -y $base.mpg
    ffmpeg -i $input $iflag_f $nflag_f -target dvd $aflag_f \
        -qmin $quant_f -b ${bitrate}000 -ab ${abitrate}000 -y $base.mpg ;;
*)
#    ffmpeg -i $input -f wav -y $base.wav
    lav2wav $input > $base.wav
case $sound in
1)
	
        echo sox -V $base.wav -r48000 $base-48.wav
        toolame -b$abitrate -s48 $base-48.wav $base.m2a
        sox -V $base.wav -r48000 $base-48.wav
        toolame -b$abitrate -s48 $base-48.wav $base.m2a ;;
*)
        mp2enc < $base.wav -r48000 -b$abitrate -o $base.m2a ;;
esac
    lav2yuv $input |
    yuvcorrect -T $iflag_m |
    yuvscaler $nflag_m -O DVD |
	$dnprog |
    mpeg2enc -M0 $nflag_m $aflag_m -f8 -G18 -b$bitrate \
        -V230 -q$quant_m -o $base.m2v
    mplex -f8 $base.m2v $base.m2a -o $base.mpg ;;
esac
