#!/bin/bash

DEV=$1
DEVPATH=$2

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $DIR
. ../etc/webcam.conf

IFS=$'\n'

if [ "$DEV" == "" ]; then
    echo "No webcam defined in parameter"
    echo "mjpgStart pi : start pi webcam"
    echo "mjpgStart 0 : start usb webcam 0 = /dev/video0. 0 might also be 1-9"
    exit 1
fi
if [ "$DEV" == "pi" ]; then
  if [ "$IS_PI" == "yes" ]; then
    PICAM=$(/usr/bin/vcgencmd get_camera | /bin/grep "detected=1")
    if [ "$PICAM" == "" ]; then
        echo "No rasp webcam detected!"
        exit 1
    fi
    ${MJPG_STREAMER} -i "${MJPG_PLUGIN_DIR}/input_raspicam.so -fps ${WEBCAM_FRAMERATE} -x ${WEBCAM_WIDTH} -y ${WEBCAM_HEIGHT} -quality ${WEBCAM_QUALITY} ${WEBCAM_PICAM_PARAMS}" -o "${MJPG_PLUGIN_DIR}/output_http.so -p 9000 -w ${MJPG_WWW_DIR}" -b
    exit 0
  else
     echo "Raspicam support disabled in configuration!"
     exit 0
  fi
fi

if [ ! -d "../etc/webcam_ports" ]; then
  mkdir ../etc/webcam_ports
  echo "8079" > ../etc/webcam_ports/last_port
fi

if [ ! -e "${DEVPATH}" ]; then
    echo "Unknown webcam device ${DEVPATH}"
    exit 1
fi
VIDEO="$(readlink -f ${DEVPATH})"
VIDEO_TEST=$(/usr/bin/v4l2-ctl --list-formats-ext -d $VIDEO)
MJPG_TEST=$(echo "$VIDEO_TEST" | /bin/grep -P "Pixel Format: 'MJPG' \(compressed\)|Motion-JPEG, compressed")
MJPG_PARAM_YUYV=""
PIXEL_FORMAT="MJPG"
if [ "$MJPG_TEST" == "" ]; then
    MJPG_PARAM_YUYV=" -y"
    PIXEL_FORMAT="YUYV"
    echo "Webcam does not support MJPG - using slower YUYV instead!"
fi
BEST_WIDTH=0
BEST_HEIGHT=0
BEST_FRAMERATE=0
BEST_ERROR=$(($WEBCAM_WIDTH * $WEBCAM_HEIGHT))
IN_FORMAT=0
for AP in $VIDEO_TEST; do
     if [[ $AP =~ Pixel[[:space:]]Format:.*\'(.*)\' ]]; then
        CUR_FORMAT=${BASH_REMATCH[1]}
        IN_FORMAT=0
        if [[ "$CUR_FORMAT" == "$PIXEL_FORMAT" ]]; then
                IN_FORMAT=1
                IN_FR=0
        fi
     fi
     if [[ $AP =~ :[[:space:]]\'(.*)\' ]]; then
        CUR_FORMAT=${BASH_REMATCH[1]}
        IN_FORMAT=0
        if [[ "$CUR_FORMAT" == "$PIXEL_FORMAT" ]]; then
                IN_FORMAT=1
                IN_FR=0
        fi
     fi
     if (( $IN_FORMAT == 1 )); then
       if [[ "$AP" =~ Size:.Discrete.([0-9]+)x([0-9]+) ]]; then
         ACT_W=${BASH_REMATCH[1]}
         ACT_H=${BASH_REMATCH[2]}
         ACT_ERROR=$(( ($WEBCAM_WIDTH * $WEBCAM_HEIGHT) - ($ACT_W * $ACT_H) ))
         if (( $ACT_ERROR < 0 )); then
           ACT_ERROR=$(( -$ACT_ERROR ))
         fi
         if (( $ACT_ERROR < $BEST_ERROR )); then
           BEST_ERROR=$ACT_ERROR
           BEST_FRAMERATE=0
           BEST_WIDTH=$ACT_W
           BEST_HEIGHT=$ACT_H
           IN_FR=1
         else
           IN_FR=0
         fi
       fi
       if (( $IN_FR == 1 )); then
         if [[ "$AP" =~ Interval.*\(([0-9]+)\.000 ]]; then
            ACT_FR=${BASH_REMATCH[1]}
            if (( $ACT_FR >= $WEBCAM_FRAMERATE )) || (( $BEST_FRAMERATE == 0 )); then
              BEST_FRAMERATE="${ACT_FR}"
            fi
         fi
       fi
     fi
   done
echo "Best resolution: $BEST_WIDTH x $BEST_HEIGHT at $BEST_FRAMERATE"
if [[ "$BEST_FRAMERATE" == 0 ]]; then
  exit 0;
fi
# Find port for device

if [ ! -e "../etc/webcam_ports/${DEV}" ]; then
    # Create new file with new port number
    COUNTER="$(cat ../etc/webcam_ports/last_port)"
    ((COUNTER++))
    echo $COUNTER > ../etc/webcam_ports/last_port
    echo $COUNTER > "../etc/webcam_ports/${DEV}"
fi
PORT="$(cat "../etc/webcam_ports/${DEV}")"
echo "Starting ${DEV} on port ${PORT}"
echo "${MJPG_STREAMER} -i \"${MJPG_PLUGIN_DIR}/input_uvc.so -d ${VIDEO} --fps ${BEST_FRAMERATE} -q ${WEBCAM_QUALITY} -r ${BEST_WIDTH}x${BEST_HEIGHT}${MJPG_PARAM_YUYV} ${WEBCAM_USB_PARAMS}\" -o \"${MJPG_PLUGIN_DIR}/output_http.so -p ${PORT} -w ${MJPG_WWW_DIR}\" -b"
${MJPG_STREAMER} -i "${MJPG_PLUGIN_DIR}/input_uvc.so -d ${VIDEO} --fps ${BEST_FRAMERATE} -q ${WEBCAM_QUALITY} -r ${BEST_WIDTH}x${BEST_HEIGHT}${MJPG_PARAM_YUYV} ${WEBCAM_USB_PARAMS}" -o "${MJPG_PLUGIN_DIR}/output_http.so -p ${PORT} -w ${MJPG_WWW_DIR}" -b
