#!/bin/bash

##################################################################
#
# This script is a wrapper of Mencoder. It uses to transcode 
# the video file to h.264 format. Also it can generate videos that 
# fit PSP and IPod Touch.
#
# Usage:
# rip2pmp.sh -i input.anyformat -o output.mp4 -f [psp|psptv|ps3|ipod] -p [1|2]
#
# ex1:rip a file in one pass for psp 
# rip2pmp.sh -i input.anyformat -o output.mp4 -f psp 
#
# ex2:rip a file in two pass for ipod
# rip2pmp.sh -i input.anyformat -o output.mp4 -f ipod -p 2
#
# ex3: rip a file in standard h.264
# rip2pmp.sh -i input.anyformat -o output.mp4 
# 
# ex4: pass options to Mencoder
# rip2pmp.sh -i input.anyformat -o output.mp4 -M "-sid 0 -slang zh"
#
# Any comments, please mail to ashoyeh@gmail.com
#
# ChangeLog:
# v0.5.1
# Use libx264 to encode in psp format.
# Tested in PSP2000.
#
# v0.5
# Add x264 support
#
#
# v0.4.1
# Add better THM file naming.
#
# v0.4 
# add psptv. the resolution is set to 640:480
# vbitrate change to 800.
# add "[-D dvd-root]: dvd node path or dvd iso file. e.g. /dev/scd0 or dvd.iso"
#
# v0.3
# fix the mencoder and ffmpeg path.
#
# v0.2
# fix generating a thumbnail when format is PSP
#
# v0.1 
# supports video format for PSP, PS3 and IPOD Touch.
#
##################################################################

test -z $MENCODER && MENCODER=`which mencoder`
test -z $FFMPEG && FFMPEG=`which ffmpeg`

# mpeg4
#OVC_OPT="-ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vhq:vbitrate=1000"

# h264
#OVC_OPT="-sws 10 -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=libx264:vhq:vrc_maxrate=4000:vrc_buf_size=4000"
OVC_OPT=""

# audio 
#OAC_OPT="-oac lavc -lavcopts acodec=libfaac:abitrate=128"
OAC_OPT=""


# audio sample rate
#AF="-af resample=48000,volume=10"
AF=""


# file format
LAVF_OPT="-of lavf -lavfopts format=mp4"

# FrameRate
OFPS=""

INPUT=""
OUTPUT=""
THM_OUTPUT=""
PASS=""
FORMAT=""
OPT=""
FFMPEG_CMD=""
DVDROOT=""
TITLE=""

if [ $# == 0 ]
then
	echo "Usage:"
	echo "-o: output filename"
	echo "-i: input filename"
	echo "[-p pass_time]: 1 pass or 2 pass transcoding. Default is 1 pass"
	echo "[-f format]: "psp", rip to psp; "ipod", rip to ipod; "mp4", rip to normal mp4. Default is mp4"
	echo "[-M opt]: options passes to Mencoder"
	echo "[-D dvd-root]: dvd node path or dvd iso file. e.g. /dev/scd0 or dvd.iso"
	exit 1
fi

while getopts "p:i:o:f:M:D:" option
do
	case "$option" in
		i) INPUT=$OPTARG;;
		o) OUTPUT=$OPTARG;;
		p) PASS=$OPTARG;;
		f) FORMAT=$OPTARG;;
		M) OPT="$OPTARG";;
		D) DVDROOT=$OPTARG;;
	esac
done

if [ -z "$DVDROOT" ]; then
	if [ -z $INPUT ]; then
		echo "no input file"
		exit 1;
	fi
else
	TITLE="dvd://`lsdvd -v "$DVDROOT" | grep "Longest track" | cut -f2 -d":" | sed -e"s/ //"`"
	DVDROOT="-dvd-device $DVDROOT"
fi

test -z $OUTPUT && echo "no output file" && exit 1;


THM_OUTPUT=`basename $OUTPUT .mp4`.THM

case $FORMAT in
#        psp) 
#        LAVF_OPT="-of lavf -lavfopts format=psp"
#        OVC_OPT="-sws 10 -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=libx264:coder=1:level=21:vbitrate=800"
#        VF="-vf scale=480:272,harddup"
#        OFPS=""
#        OAC_OPT="-oac lavc -lavcopts acodec=libfaac:abitrate=128"
#        AF="-af resample=48000,volume=10"
	 #grab a thumbnail
#        FFMPEG_CMD="$FFMPEG -y -i "$OUTPUT" -f image2 -ss 180 -vframes 1 -s 160x120 $THM_OUTPUT"
#        ;;
	psp)
	LAVF_OPT="-of lavf -lavfopts format=psp"
	OVC_OPT="-sws 10 -ovc x264 -x264encopts bitrate=800:global_header:frameref=2:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=30:threads=0:partitions=p8x8,b8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct=no:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=4000:vbv_bufsize=2500"
	VF="-vf scale=480:272,harddup"
	#OFPS="-ofps 30000/1001"
	OFPS=""
	OAC_OPT="-oac faac -faacopts br=128:object=2"
	AF="-af resample=48000,volume=10"
	# grab a thumbnail
	FFMPEG_CMD="$FFMPEG -y -i "$OUTPUT" -f image2 -ss 180 -vframes 1 -s 160x120 $THM_OUTPUT"
	;;
	psptv) 
	LAVF_OPT="-of lavf -lavfopts format=psp"
	OVC_OPT="-sws 10 -ovc x264 -x264encopts bitrate=800:global_header:frameref=2:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=30:threads=0:partitions=p8x8,b8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct=no:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=4000:vbv_bufsize=2500"
	VF="-vf harddup,scale=640:480"
	OFPS=""
	OAC_OPT="-oac faac -faacopts br=128:object=2"
	AF="-af resample=48000,volume=10"
	# grab a thumbnail
	FFMPEG_CMD="$FFMPEG -y -i "$OUTPUT" -f image2 -ss 180 -vframes 1 -s 160x120 $THM_OUTPUT"
	;;
	ps3)
	LAVF_OPT="-of lavf -lavfopts format=mp4"
	OVC_OPT="-sws 10 -ovc x264 -x264encopts bitrate=1500:global_header:frameref=3:mixed_refs:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=41:threads=0:partitions=p8x8,b8x8,i8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=2000:vbv_bufsize=2000"
	VF="-vf harddup"
	OFPS=""
	OAC_OPT="-oac faac -faacopts br=128:object=2"
	AF="-af resample=48000,volume=10"
	# grab a thumbnail
	FFMPEG_CMD="$FFMPEG -y -i "$OUTPUT" -f image2 -ss 180 -vframes 1 -s 160x120 $THM_OUTPUT"
	;;
	ipod) 
	LAVF_OPT="-of lavf -lavfopts format=mp4"
	OVC_OPT="-sws 10 -ovc x264 -x264encopts bitrate=800:global_header:frameref=1:mixed_refs:bframes=0:nob_adapt:b_pyramid=none:noweight_b:me_range=16:subq=8:psy-rd=0.8,0.0:me=umh:level_idc=30:threads=0:partitions=p8x8,i4x4:trellis=0:nocabac:aq_mode=1:no8x8dct:chroma_me:nofast_pskip:dct_decimate"
	VF="-vf harddup,scale=480:320" # for ipod touch
	OFPS=""
	OAC_OPT="-oac faac -faacopts br=128:object=2"
	AF="-af resample=48000,volume=10"
	;;
	*)
	LAVF_OPT="-of lavf -lavfopts format=mp4"
	OVC_OPT=""
	VF=""
	OFPS=""
	OAC_OPT=""
	AF=""
	;;
esac

echo "input file: $INPUT"
echo "output filename: $OUTPUT"
echo "dvdroot: $DVDROOT"
echo "option pass to Mencoder: $OPT"
echo "THM file: $THM_OUTPUT"

case $PASS in
	2)
	$MENCODER $OVC_OPT:pass=1:turbo=2 $OAC_OPT $LAVF_OPT $OFPS $INPUT \
	$VF $AF -o /dev/null $OPT $DVDROOT $TITLE
	$MENCODER $OVC_OPT:pass=2 $OAC_OPT $LAVF_OPT $OFPS $VF $AF $INPUT \
	-o $OUTPUT $OPT $DVDROOT $TITLE 
	rm -f divx2pass.log*
	;;
	*)
	# one pass only
	$MENCODER $OVC_OPT $OAC_OPT $LAVF_OPT $OFPS $INPUT $VF $AF -o $OUTPUT $OPT $DVDROOT $TITLE
	;;

esac

#grab a thumbnail if supported format
$FFMPEG_CMD

