#!/bin/bash


FRAME_INTERVAL=90
THUMBNAIL_WIDTH_PX=160
SPRITE_SHEET_ROWS=5
SPRITE_SHEET_COLUMNS=5
FORMAT="MONO_FLAT"


for i in "$@"
do
case $i in
    -i=*|--input=*)
    INPUT_FILE="${i#*=}"
    shift # past argument=value
    ;;
    -f=*|--frame_interval=*)
    FRAME_INTERVAL="${i#*=}"
    shift # past argument=value
    ;;
    -w=*|--thumbnail_width=*)
    THUMBNAIL_WIDTH_PX="${i#*=}"
    shift # past argument=value
    ;;
    -r=*|--sprite_sheet_rows=*)
    SPRITE_SHEET_ROWS="${i#*=}"
    shift # past argument=value
    ;;
    -c=*|--sprite_sheet_columns=*)
    SPRITE_SHEET_COLUMNS="${i#*=}"
    shift # past argument=value
    ;;
     -F=*|--format=*)
    FORMAT="${i#*=}"
    shift # past argument=value
    ;;
    *)
            # unknown option
    ;;
esac
done

if [ -z $INPUT_FILE ]; then
  echo "Delight VR Sprite Sheet Generator v1.0.0"
  echo "Usage: $0 -i=,--input=<input-file>"
  echo ""
  echo "Possible Arguments."
  echo "  -i=, --input=	The input video file. (Mandatory)"
  echo "  -f=, --frame_interval=	The interval between frames to snapshot. (Default is 90)"
  echo "  -w=, --thumbnail_width=	The width in pixel of each thumbnail. (Default is 160)"
  echo "  -r=, --sprite_sheet_rows=	The number of rows in each sprite sheet. (Default is 5)"
  echo "  -c=, --sprite_sheet_columns=	The number of colums in each sprite sheet. (Default is 5)"
  echo "  -F=, --format=	The VR format to use. (Default is MONO_FLAT)"
  exit
fi

FRAMES=$(ffprobe -i $INPUT_FILE -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1)
ASPECT=$(ffprobe -i $INPUT_FILE -show_streams 2>&1 | grep display_aspect_ratio | sed -E "s/display_aspect_ratio=(.+)/\1/")
THUMBS_PER_SHEET=$(($SPRITE_SHEET_ROWS*$SPRITE_SHEET_COLUMNS))
TOTAL_THUMBS=$(echo "($FRAMES + $FRAME_INTERVAL - 1)/$FRAME_INTERVAL" | bc)
TOTAL_SHEETS=$(echo "($TOTAL_THUMBS + $THUMBS_PER_SHEET - 1) / $THUMBS_PER_SHEET" | bc)
THUMBNAIL_HEIGHT_PX=$(($THUMBNAIL_WIDTH_PX / 2))

if [ "$FORMAT" == "STEREO_360_TB" ]; then
  CROP="iw*.5:ih*.3:iw*.25:ih*.1"
elif [ "$FORMAT" == "STEREO_360_LR" ]; then
  CROP="iw*.25:ih*.6:iw*.25:ih*.125"
elif [ "$FORMAT" == "MONO_360" ]; then
  CROP="iw*.5:ih*.6:iw*.25:ih*.2"
elif [ "$FORMAT" == "STEREO_180_LR" ]; then
  CROP="iw*.4:ih*.5:iw*.05:ih*.25"
elif [ "$FORMAT" == "STEREO_180_LR_SPHERICAL" ]; then
  CROP="iw*.4:ih*.5:iw*.05:ih*.25"
elif [ "$FORMAT" == "STEREO_180_TB" ]; then
  CROP="iw:ih*.5:0:0"
elif [ "$FORMAT" == "STEREO_180_TB_SPHERICAL" ]; then
  CROP="iw:ih*.5:0:0"
elif [ "$FORMAT" == "STEREO_FLAT_TB" ]; then
  CROP="iw:ih*.5:0:0"
elif [ "$FORMAT" == "STEREO_FLAT_LR" ]; then
  CROP="iw*.5:ih:0:0"
else
  CROP="iw:ih:0:0"
fi

ffmpeg -loglevel quiet -i $INPUT_FILE -vf select="not(mod(n\,$FRAME_INTERVAL)),crop="$CROP", scale=$THUMBNAIL_WIDTH_PX:-1,tile=""$SPRITE_SHEET_ROWS""x""$SPRITE_SHEET_COLUMNS" -vsync 0 "$INPUT_FILE"-%d.jpg

echo "<dl8-video-preview-sprite frame-aspect=\"$ASPECT\">"
x=$TOTAL_THUMBS
for i in `seq 1 $TOTAL_SHEETS`; do
  let x=x-$THUMBS_PER_SHEET
  if [ $x -lt 0 ]; then
    REMAIN=$(($THUMBS_PER_SHEET + $x))
    echo "  <dl8-video-preview-sprite-sheet src=\"$INPUT_FILE-$i.jpg\" columns=\"$SPRITE_SHEET_COLUMNS\" rows=\"$SPRITE_SHEET_ROWS\" frames=\"$REMAIN\"></dl8-video-preview-sprite-sheet>"
  else
    echo "  <dl8-video-preview-sprite-sheet src=\"$INPUT_FILE-$i.jpg\" columns=\"$SPRITE_SHEET_COLUMNS\" rows=\"$SPRITE_SHEET_ROWS\" frames=\"$THUMBS_PER_SHEET\"></dl8-video-preview-sprite-sheet>"
  fi
done
echo '</dl8-video-preview-sprite>'
