#!/bin/bash
# see http://stackoverflow.com/questions/10695029/why-isnt-the-case-statement-case-sensitive-when-nocasematch-is-off
LC_ALL=C
# shopt -u nocasematch

_help () {
cat << EOF
Usage: vgrade     {OPTIONS}  { test | extract | histo | { autocolor | ac | color } | preview | process } VIDEO

Options:
   -s SCRIPTFILE               # default: dir of the video/default.vs
   -fps FRAMERATE              # default: 25
   -from TIME                  # default: 0   ; example: 00:03:00
   -dur  TIME                  # default: 999 ; example: 00:05:20
   -pdir DIR                   # default: $PWD
   -odir DIR                   # default: $PWD
   -oname NAME                 # default: basename of VIDEO
   -mjpeg | -dnx | -mp4        # default: mjpeg
   -h | -help | --help
EOF
}

#if [ "`hostname`" != "rpc1" -a "`hostname`" != "rx" -a "`hostname`" != "rmov" -a "`hostname`" != "fhrpc1" -a "`hostname`" != "rtosh" ]; then
#   _help
#   exit 0
#fi

# FFMPEG="ffmpeg"
# CONVERT="echo convert"
# GMIC="echo gmic"

if [ -f "$VGRADEUTILS" ]; then
   source "$VGRADEUTILS" || exit 17
else
   source /usr/share/vgrade/lib/vgradeutils || exit 17
fi

########## Settings #####################

LOGLEVELP=warning
LOGLEVELV=info
#LOGLEVELV=debug

########## Parameters ###################

# VIDEOCOMMAND=`basename $0`

PREVIEWDIR=$PWD
OUTPUTDIR=$PWD
OUTPUTNAME=""
ACTIONLIST=""
SCRIPTFILE=""
FRAMERATE=""
EXTRACTFACTOR=100 # may later be 1000
VFROM=""
VDURATION=""

OUTPUTQUAL=mjpeg

end=0
while [ $end = 0 ]; do
  case $1 in
     -h)
       _help; exit 1
       ;;
     -help)
       _help; exit 1
       ;;
     --help)
       _help; exit 1
       ;;
     -mjpeg)
       OUTPUTQUAL=mjpeg
       shift
       ;;
     -dnx)
       OUTPUTQUAL=dnx
       shift
       ;;
     -mp4)
       OUTPUTQUAL=mp4
       shift
       ;;
#     -hq)
#       OUTPUTQUAL=high
#       shift
#       ;;
     -pdir)
       PREVIEWDIR=$2
       shift;shift
       ;;
     -odir)
       OUTPUTDIR=$2
       shift;shift
       ;;
     -oname)
       OUTPUTNAME=$2
       shift;shift
       ;;
     -s)
       SCRIPTFILE=$2
       shift;shift
       ;;
     -fps)
       FRAMERATE="$2"
       shift;shift
       ;;
     -from)
       VFROM=$2
       shift;shift
       ;; 
     -dur)
       VDURATION=$2
       shift;shift
       ;; 
     test)
       ACTIONLIST="$ACTIONLIST test"
       shift
       ;;
     extract)
       ACTIONLIST="$ACTIONLIST extract"
       shift
       ;;
     histo)
       ACTIONLIST="$ACTIONLIST histo"
       shift
       ;;
     autocolor)
       ACTIONLIST="$ACTIONLIST autocolor"
       shift
       ;;
     ac)
       ACTIONLIST="$ACTIONLIST autocolor"
       shift
       ;;
     color)
       ACTIONLIST="$ACTIONLIST autocolor"
       shift
       ;;
     preview)
       ACTIONLIST="$ACTIONLIST preview"
       shift
       ;;
     process)
       ACTIONLIST="$ACTIONLIST process"
       shift
       ;;
     *)
       end=1
       ;;
  esac
done

if [ $# != 1 ]; then
    _help
    exit 1
fi

_Vintfile () {
   echo "$PREVIEWDIR/$VIDEONAME/intfile.j.mov"
}

_Vintopt () {
#  echo "-f mov -vcodec yuv4 -pix_fmt yuv420p -q:v 2 -b:v 240M -acodec pcm_s16le"
  echo "-f mov -vcodec yuv4 -pix_fmt yuv420p -q:v 2 -b:v 240M"
	#   echo "-f mov -vcodec yuv4 -pix_fmt yuv420p -b:v 240M -acodec pcm_s16le"
	#   echo "-f mov -vcodec mjpeg -q:v 2 -pix_fmt yuvj420p -r $FRAMERATE -acodec pcm_s16le"
}

_Voutopt () {
   if [ $OUTPUTQUAL = mp4 ]; then
      echo "-f mp4 -q:v 0 -vcodec mpeg4 -r $FRAMERATE"
   elif [ $OUTPUTQUAL = dnx ]; then
#      echo "-vcodec dnxhd -r $FRAMERATE -b:v 185M -acodec pcm_s16le"
#      echo "-f mov -vcodec dnxhd -r $FRAMERATE -b:v 240M -acodec pcm_s16le"
      echo "-f mov -vcodec dnxhd -r $FRAMERATE -b:v 240M"
   elif [ $OUTPUTQUAL = mjpeg ]; then
#      echo "-f mov -vcodec mjpeg -q:v 2 -b:v 240M -pix_fmt yuvj420p -r $FRAMERATE -acodec pcm_s16le"
      echo "-f mov -vcodec mjpeg -q:v 2 -b:v 240M -pix_fmt yuvj420p -r $FRAMERATE"
   else
      echo "Unknown output method $OMETHOD" >&2
   fi
}

_Voutfile () {
   if [ $OUTPUTQUAL = mp4 ]; then
      echo "$OUTPUTDIR/$VIDEONAME.mp4"
   elif [ $OUTPUTQUAL = dnx ]; then
      echo "$OUTPUTDIR/$VIDEONAME.d.mov"
   elif [ $OUTPUTQUAL = mjpeg ]; then
      echo "$OUTPUTDIR/$VIDEONAME.j.mov"
   else
      echo "Unknown output method $OMETHOD" >&2
   fi
}

_Vdirectories () {
  mkdir -vp $PREVIEWDIR/$VIDEONAME/raw
  mkdir -vp $PREVIEWDIR/$VIDEONAME/hist
  mkdir -vp $PREVIEWDIR/$VIDEONAME/color
  mkdir -vp $PREVIEWDIR/$VIDEONAME/lut
  mkdir -vp $PREVIEWDIR/$VIDEONAME/prev
  mkdir -vp $PREVIEWDIR/$VIDEONAME/post
  mkdir -vp $PREVIEWDIR/$VIDEONAME/tmp/1
  mkdir -vp $PREVIEWDIR/$VIDEONAME/tmp/2
#   if [ ! -l $PREVIEWDIR/p$VIDEONAME ]; then    
}


###### identify source

# Cat can be: mov, dng, avi, tif, png, ...

if [ -f $1 ]; then
    VIDEOSOURCE=$1
    case $VIDEOSOURCE in
      *.mov)
        VIDEOCAT=mov
        ;;
      *.MOV)
        VIDEOCAT=mov
        ;;
      *.AVI)
        VIDEOCAT=avi
        ;;
      *.avi)
        VIDEOCAT=avi
        ;;
      *.mp4)
        VIDEOCAT=mp4
        ;;
      *.MP4)
        VIDEOCAT=mp4
        ;;
      *)
        echo "Error: Source Video not recognized"
        exit 17
        ;;
     esac
    VIDEOSOURCEDIR=`dirname $1`
    f=`basename $1`
    if [ ! -z $OUTPUTNAME ]; then
       VIDEONAME=$OUTPUTNAME
    else
       VIDEONAME=${f%%.*}
    fi
elif [ -f $1.mov ]; then
    VIDEOSOURCE=$1.mov
    VIDEOCAT=mov
    VIDOESOURCEDIR=`dirname $1.mov`
    if [ ! -z $OUTPUTNAME ]; then
       VIDEONAME=$OUTPUTNAME
    else
       VIDEONAME=`basename $1`
    fi
elif [ -f $1.avi ]; then
    VIDEOSOURCE=$1.avi
    VIDEOCAT=avi
    VIDOESOURCEDIR=`dirname $1.avi`
    if [ ! -z $OUTPUTNAME ]; then
       VIDEONAME=$OUTPUTNAME
    else
       VIDEONAME=`basename $1`
    fi
elif [ -f $1/`basename $1`_000000.dng ]; then
    VIDEOSOURCE=$1
    VIDEOCAT=dng
    VIDEOSOURCEDIR=`dirname $1`
    VIDEONAME=`basename $1`
else
   echo "Video $1 missing"
   exit 9
fi


HISTFILE=$PREVIEWDIR/$VIDEONAME/histodata.txt

#VSRC=$VIDEOSOURCE
#VCAT=$VIDEOCAT

if [ -z "$SCRIPTFILE" -o ! -f "$SCRIPTFILE" ]; then
    if [ -f $VIDEOSOURCEDIR/$VIDEONAME.vs ]; then
        SCRIPTFILE=$VIDEOSOURCEDIR/$VIDEONAME.vs
    elif [ -f $VIDEOSOURCEDIR/default.vs ]; then
        SCRIPTFILE=$VIDEOSOURCEDIR/default.vs
#    elif [ -f $PWD/$VIDEONAME.vs ]; then
#        SCRIPTFILE=$PWD/$VIDEONAME.vs
#    elif [ -f $PWD/default.vs ]; then
#        SCRIPTFILE=$PWD/default.vs
    else
        echo "Scriptfile not found"
        exit 17
    fi
fi

# AUDIOFILE=$VIDEOSOURCEDIR/$VIDEONAME.m4a
AUDIOFILE=$VIDEOSOURCEDIR/$VIDEONAME.wav

if [ -z "$FRAMERATE" ]; then
  if [ $VIDEOCAT = mov ]; then
     # TODO: change this to $FFMPEG
     FRAMERATE=`ffmpeg -i $VIDEOSOURCE 2>&1 | grep Stream | grep Video | awk -F\, '{for (i=1;i<=NF;i++) printf "%s\n",$i;}' | grep fps | awk '{print $1}'`
  else
     FRAMERATE=25
  fi
fi

if [ -z "$VFROM" -a -z "$VDURATION" ]; then
  SFRAME=0
  DURATIONOPTS="1"
elif [ ! -z "$VFROM" -a -z "$VDURATION" ]; then
  VH=`echo $VFROM | cut -d : -f 1` ; VM=`echo $VFROM | cut -d : -f 2` ; VS=`echo $VFROM | cut -d : -f 3`
  SFRAME=`echo "$VH*60*60*$FRAMERATE+$VM*60*$FRAMERATE+$VS*$FRAMERATE" | bc`
  # DURATIONOPTS="-ss $VFROM"
  DURATIONOPTS="gte(n\,$SFRAME)"
elif [ -z "$VFROM" -a ! -z "$VDURATION" ]; then
  DH=`echo $VDURATION | cut -d : -f 1` ; DM=`echo $VDURATION | cut -d : -f 2` ; DS=`echo $VDURATION | cut -d : -f 3`
  EFRAME=`echo "$DH*60*60*$FRAMERATE+$DM*60*$FRAMERATE+$DS*$FRAMERATE-1" | bc`
  # DURATIONOPTS="-t $VDURATION"
  SFRAME=0
  DURATIONOPTS="lte(n\,$EFRAME)"
else 
  VH=`echo $VFROM | cut -d : -f 1` ; VM=`echo $VFROM | cut -d : -f 2` ; VS=`echo $VFROM | cut -d : -f 3`
  SFRAME=`echo "$VH*60*60*$FRAMERATE+$VM*60*$FRAMERATE+$VS*$FRAMERATE" | bc`
  DH=`echo $VDURATION | cut -d : -f 1` ; DM=`echo $VDURATION | cut -d : -f 2` ; DS=`echo $VDURATION | cut -d : -f 3`
  EFRAME=`echo "$DH*60*60*$FRAMERATE+$DM*60*$FRAMERATE+$DS*$FRAMERATE-1+$SFRAME" | bc`
  DURATIONOPTS="between(n\,$SFRAME\,$EFRAME)"
  # DURATIONOPTS="-ss $VFROM -t $VDURATION"
fi

# vvvvvvvvvvvvvvvvv Commands vvvvvvvvvvvvvv

#if [ $VIDEOCOMMAND = Vprepare ]; then
#     _Vprepare
#elif [ $VIDEOCOMMAND = Vhisto ]; then
#     _Vhisto
#elif [ $VIDEOCOMMAND = Vpreview ]; then
#     _Vpreview
#elif [ $VIDEOCOMMAND = Vprocess ]; then
#     _Vprocess
#elif [ $VIDEOCOMMAND = Video ]; then

export LC_ALL=C # such that awk et all are case sensitive!!!

for action in $ACTIONLIST; do
    echo "Doing _V$action"
    _V$action
done
#else
#     echo "Unknown Command $VIDEOCOMMAND"
#fi

