#!/bin/sh


# ------------------------------------------------------------------------------
# Author: Fulup Ar Foll
# Date:   jun-2008
# Object: Move from a DVD VOB to an MP4 streamable by quicktime
# Syntax: vov-2-mp4.sh --rates=150:350 MyVideo.mpg
# Documentation http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html#menc-feat-dvd-mpeg4
#  
#   VideoCodec=x264
#   AudioCodex=faac [object=2(LOW) to get sound on quicktime]
# ------------------------------------------------------------------------------


#SKIPSTART="-ss 32"                       ;# skip first X seconds
#FRAMES="-frames 1000"                    ;# only process 1000 1st frames
RATES="150"                               ;# default rates values

# WARNING SSH should configure passwd less to work in batch
  #SSH_HOST=movies.fridu.org               ;# remote destination for final file
  #SSH_DEST=root@$REMOTEHOST:/srv/www/fridu.movies/.

# Add here or in $HOME/etc/VideoEncoding.conf your FTP config
  #FTP_HOST    ="MyFtpHost"
  #FTP_LOGIN   ="MyFtpLogin"
  #FTP_PASSWD  ="MyFtpPasswd"
  #FTP_DEST    ="MyFtpDirectory"

if test -f $HOME/etc/VideoEncoding.conf
then
 source $HOME/etc/VideoEncoding.conf
else
 echo "WARNING: No $HOME/etc/VideoEncoding.conf [default used]"
fi

# We need a file as input parameter
# ----------------------------
if test $# -eq 0
then
   echo --------------------------------------------------------------------------
   echo "ERROR: Syntaxe $0 [--help] [--rates=150,350,900] infile.vob|mpeg"
   echo --------------------------------------------------------------------------
   exit 1
fi

# process every -- argument before anything else
# ----------------------------------------------
for PRM in $*
do
case "$PRM" in 

--frames=*)
  FRAMES="-frames ${PRM#*=}"
  shift
  ;;

--skipstart=*)
  SKIPSTART="-ss ${PRM#*=}"
  shift
  ;;

--size=*) 
  CROP="scale=${PRM#*=}:0:0"
  shift
  ;;

--rates=*)
  shift
  RATES=""
  for SLOT in `echo ${PRM#*=} | sed 's/:/ /'`
  do
  case "$SLOT" in

  150*)
     RATES+="150 "
     ;;
 
  350*)
     RATES+="350 "
     ;;

  900*)
     RATES+="900 "
     ;;

  *)
     echo ERROR: $PRM [RATE=$SLOT] not supported should 150,350,900 
     exit
  esac ;# END case "$SLOT"
 done  ;# END for SLOT in `echo ${PRM#*=}
 ;;

--*)
  echo "ERROR: option=$PRM unknow [should be --frames=xxx --skipstart=xxs --rates=150:350:900 --size=xxx:yyy]"
  shift
  exit 1
  ;; 

esac ;# end case "$PRM"
done ;# end for $PRM


# ------------- All Parameters processed -----------------

if test ! -f $1
then
   echo --------------------------------------------------------------------------
   echo ERROR: Cannot open file $1
   echo --------------------------------------------------------------------------
   exit
else
  # Get Crop from Vob
  # ------------------
  echo mplayer -frames 100 $1 -vf cropdetect=:2
fi

# Search for valid input file extention
# ----------------------------
DIRBASE=`dirname $1`
for EXTENTION in vob VOB avi mp2 mpg mpeg none
do
  NAMEBASE=`basename $1 .$EXTENTION`
  if test -f $DIRBASE/$NAMEBASE.$EXTENTION
  then
     break
  fi
done ;# END for extention

if test $EXTENTION = "none"
then
   echo ------------------------------------------------------------------------------
   echo ERROR: extention for $1 unsupported check for LOWERCASE vob avi mp2 mpg mpeg
   echo ------------------------------------------------------------------------------
   exit 1
else
INFILE=$1
OUTFILE=$NAMEBASE
fi

echo "`date` -- start encoding RATES=$RATES" >>./vob-2-mp4-$LOGNAME.log
for RATE in $RATES
do

case "$RATE" in

900)
# DiVX quality cannot be streamed
# --------------------------------
VIDEORATE=900 
CROP="scale=704:576:0:0"
SOUNDHZ=48000
SOUNDRATE=190
;;

350)
# DSL streaming
# --------------
VIDEORATE=350
CROP="scale=560:448:0:0"
SOUNDHZ=22050
SOUNDRATE=128
;;

150)
# Slow speed streaming
# --------------------
VIDEORATE=150
CROP="scale=352:288:0:0"
SOUNDHZ=22050
SOUNDRATE=60
;;
esac

# Start Encoding work
# --------------------
echo infile=$INFILE outfile=$OUTFILE-${VIDEORATE}kbit.mp4 videorate=$VIDEORATE crop=$CROP
echo `date` infile=$INFILE outfile=$OUTFILE-${VIDEORATE}kbit.mp4 videorate=$VIDEORATE crop=$CROP \
      >>./vob-2-mp4-$LOGNAME.log

# Encode using x264 codec at 900kbits/s
# ---------------------------------------
rm -f $OUTFILE-tmp.avi

for SLOT in "1:/dev/null" "2:$OUTFILE-tmp.avi"
do

PASS="${SLOT%:*}"
OUTF="${SLOT##*:}"

echo "** info ** mencoder INFILE=$INFILE PASS=$PASS OUTFILE=$OUTF"
echo "-----------------------------------------------------------"
echo "`date` $PASS $OUTFILE-${VIDEORATE}kbit.mp4 done" >>./vob-2-mp4-$LOGNAME.log
mencoder $FRAMES $INFILE -o $OUTF $SKIPSTART -ovc x264  -x264encopts \
 pass=$PASS:turbo:bitrate=$VIDEORATE:bframes=1:threads=auto:me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 \
 -vf $CROP,scale=-10:-1,harddup -oac faac -faacopts br=$SOUNDRATE:mpeg=4:object=2 -channels 2 -srate $SOUNDHZ \
 -ofps 24000/1001

done  ; # pass 1-2

if test ! -f $OUTFILE-tmp.avi
then
  echo ERROR: encoding failed
  exit 1
fi

# Extract Sound and Video in order to remux to MPEG4
# ---------------------------------------------------
  rm $OUTFILE.acc $OUTFILE.h264
  nice mplayer $OUTFILE-tmp.avi -dumpaudio -dumpfile $OUTFILE.aac
  nice mplayer $OUTFILE-tmp.avi -dumpvideo -dumpfile $OUTFILE.h264

# Remux in a Mpeg4 Quicktime compatible format
# --------------------------------------------
  rm -f $OUTFILE.mp4
  nice mp4creator -create=$OUTFILE.aac   $OUTFILE.mp4
  nice mp4creator -create=$OUTFILE.h264 -rate=23.976 $OUTFILE.mp4

# Make this file playable before fill load completion
# ----------------------------------------------------
  nice mp4creator -hint=1 $OUTFILE.mp4
  nice mp4creator -hint=2 $OUTFILE.mp4
  nice mp4creator -optimize $OUTFILE.mp4
 
# Check result
# -------------
  mp4creator -list $OUTFILE.mp4
  echo "`date` Encoding $OUTFILE-${VIDEORATE}kbit.mp4 done" >>./vob-2-mp4-$LOGNAME.log

# Add Meta Data for iTune
# -----------------------
  #http://atomicparsley.sourceforge.net/
  #AtomicParsley $OUTFILE.mp4 --metaEnema --title "The Chronicles of Narnia" \
  #              --year 2005 --stik Movie --freefree --overWrite

# SCP everything to fridu.vpn
# ---------------------------
  if test -f ${OUTFILE}.mp4
  then 
    mv  $OUTFILE.mp4 $OUTFILE-${VIDEORATE}kbit.mp4
    (
      if test "$FTP_HOST" != ""
      then
        echo "`date` transfering $OUTFILE-${VIDEORATE}kbit.mp4 to $FTPHOST" >>./vob-2-mp4-$LOGNAME.log
        /usr/bin/ftp -v ftp://$FTP_LOGIN:$FTP_PASSWD@$FTP_HOST <<!END
bin
cd $FTP_DEST
put $OUTFILE-${VIDEORATE}kbit.mp4
!END
        echo vlc rtsp://FTP_HOST:554/$OUTFILE-${VIDEORATE}kbit.mp4
      fi
   
      if test "$SSH_HOST" != ""
      then
        echo "`date` transfering $OUTFILE-${VIDEORATE}kbit.mp4 to $SSH_HOST" >>./vob-2-mp4-$LOGNAME.log
        scp $OUTFILE-${VIDEORATE}kbit.mp4  $SSH_HOST:$SSH_DEST
        echo "vlc rtsp://SSH_HOST:554/$OUTFILE-${VIDEORATE}kbit.mp4"
      fi
    ) &
  fi
  
# We're done
# -----------
  echo vlc ./$OUTFILE-${VIDEORATE}kbit.mp4
 
done

echo "`date` -- end encoding" >>./vob-2-mp4-$LOGNAME.log
echo ---------------------------------------------------
echo Done result in ./vob-2-mp4-$LOGNAME.log
echo ---------------------------------------------------

