#!/bin/bash
# version: 20080920-0212

[ -f ~/.avldfeed ] && source ~/.avldfeed

[ -z "$WIDTH" ] && WIDTH=1024
[ -z "$HEIGHT" ] && HEIGHT=768
[ -z "$FPS" ] && FPS=0
[ -z "$FORMAT" ] && FORMAT=bgr24
[ -z "$URL" ] && URL=rtsp://cam
[ -z "$DEVICE" ] && DEVICE=/dev/video1
[ -z "$PALETTE" ] && PALETTE="RGB24"
[ -z "$SCALE" ] && SCALE=none
[ -z "$FILTER" ] && FILTER=none
[ -z "$DEPTH" ] && DEPTH=24

if [ "$1" == "-h" ] || [ "$1" == "--help" ] || ( [ -z "$1" ] && [ ! -f ~/.avldfeed ] ) ; then
	echo
	echo "Usage: avldfeed [ -h ]  [ <configuration_file> ] [ <OPTION=value> ... ]"
	echo
	echo "OPTIONS:"
	echo
	echo "       URL=<value>"
	echo "       DEVICE=<value>"
	echo "       WIDTH=<value>"
	echo "       HEIGHT=<value>"
	echo "       FPS=<-1|0|value>"
        echo "       FORMAT=<bgr24|uyvy|...>"
	echo "       PALETTE=<RGB24|UYVY|...> (overriden by FORMAT)";
	echo "       SCALE=<none|qntsc|qpal|ntsc|pal|sntsc|spal>"
	echo "       FILTER=<none|mencoder_filter_chain>"
	echo "       DEPTH=<value>"
	echo
	echo avldfeed send the specified video stream to the avld video device.
	echo
	echo Previous parameters are saved in $HOME/.avldfeed so that you can run the
	echo command again with no parameters or a subset, or with a configuration file
	echo "as first command argument (it will replace $HOME/.avldfeed)"
	echo
	echo
	echo "====  ~/.avldfeed ===="
	cat ~/.avldfeed
	echo
       	exit 0
fi

if [ -f "$1" ] ; then
	source "$1"
	shift
fi

CMDLINEOPTIONS=`echo "$@" | tr ' ' ';'`
echo $CMDLINEOPTIONS
eval $CMDLINEOPTIONS  || exit

echo Loading avld kernel module
lsmod | grep -q avld || sudo modprobe avld || exit

# v4l palettes

VIDEO_PALETTE_GREY=1
VIDEO_PALETTE_HI240=2
VIDEO_PALETTE_RGB565=3
VIDEO_PALETTE_RGB24=4
VIDEO_PALETTE_RGB32=5
VIDEO_PALETTE_RGB555=6
VIDEO_PALETTE_YUV422=7
VIDEO_PALETTE_YUYV=8
VIDEO_PALETTE_UYVY=9
VIDEO_PALETTE_YUV420=10
VIDEO_PALETTE_YUV411=11
VIDEO_PALETTE_RAW=12
VIDEO_PALETTE_YUV422P=13
VIDEO_PALETTE_YUV411P=14
VIDEO_PALETTE_YUV420P=15
VIDEO_PALETTE_YUV410P=16

# mencoder formats: 444p 422p 411p yuy2 uyvy yvu9 if09 yv12 i420 iyuv clpl hm12 y800 y8 nv12 nv21 bgr24 bgr32 bgr16 bgr15 bgr8 bgr4 bg4b bgr1 rgb24 rgb32 rgb16 rgb15 rgb8 rgb4 rg4b rgb1 rgba argb bgra abgr mjpeg mjpg

# preset value supported by the V4L driver (yv12, rgb32, rgb24, rgb16, rgb15, uyvy, yuy2, i420) 
case "$FORMAT"  in

	bgr24|rgb24|4|0)
		PALETTE="RGB24"
		;;
	bgr32|5)
		PALETTE="RGB32"
		;;
	uyvy|9)
		PALETTE="UYVY"
		;;
	i420|15)
		PALETTE="YUV420P"
		;;
	iyuv|7)
		PALETTE="YUV422"
		;;

	*)
		echo "format not yet handled (edit this script...)"	
		exit 1
esac


echo echo width=$WIDTH height=$HEIGHT fps=$FPS palette=$PALETTE depth=$DEPTH \> $DEVICE
echo width=$WIDTH height=$HEIGHT fps=$FPS palette=$PALETTE depth=$DEPTH > $DEVICE || exit

(
	echo "# general"
	echo "	URL=$URL"
	echo "	DEVICE=$DEVICE"
	echo "# avld parameters: (PALETTE is overriden by FORMAT)"
	echo "	WIDTH=$WIDTH"
	echo "	HEIGHT=$HEIGHT"
	echo "	FPS=$FPS"
	echo "	PALETTE=$PALETTE"
	echo "# image format"
	echo "	FORMAT=$FORMAT"
	echo "# mencoder video filter (eg: \"scale=$WIDTH:$HEIGHT\" )"
	echo "	FILTER=$FILTER"
	echo "# mencoder scaling preset"
	echo "	SCALE=$SCALE"
	echo "# bitdepth"
	echo "  DEPTH=$DEPTH"

) > ~/.avldfeed

[ "$FILTER" == "none" ] && FILTER=

if [ "$SCALE" != "none" ] ; then
	[ -n "$FILTER" ] && FILTER=",$FILTER"
	FILTER="scale=::::::$SCALE$FILTER"
fi

[ -n "$FILTER" ] && FILTER="$FILTER,"

while true ; do
echo	mencoder $URL -cache 8192 -nosound -ovc raw -vf ${FILTER}format=$FORMAT  -of rawvideo -o $DEVICE
echo
echo
	mencoder $URL -cache 8192 -nosound -ovc raw -vf ${FILTER}format=$FORMAT  -of rawvideo -o $DEVICE
	sleep 5
done
