#!/bin/sh

#
# example usage:
#
#    encode-images_to_ogg
#    encode-images_to_ogg -h
#    encode-images_to_ogg --help
#    encode-images_to_ogg "grabbed-image*.png" 10 clip
#

encode_images_to_ogg()
{
	WILDCARD=$1
	FPS_RATE=$2
	NAME=$3

	if [ ! -n "$1" ] || [ $1 == "-h" ] || [ $1 == "--help" ];
	then
		echo "Usage:";
		echo "    encode-images_to_ogg <wildcard> <fps-rate> <output-name>";
		echo "";
		echo "Example:";
		echo "    encode-images_to_ogg  \"frame_*.ppm\" 10 clip";
		echo "";
		echo "This will result in an ogg/theora video called \"clip.ogg\""
		echo "";
	else
		FILE_ARRAY=($WILDCARD);
		TYPE=`echo ${FILE_ARRAY[0]} | cut -f2 -d.`;
		TMP_FILE=${FILE_ARRAY[0]%%.$TYPE}.png
		convert ${FILE_ARRAY[0]} $TMP_FILE;
		OLD_WIDTH=$(echo `file $TMP_FILE | cut -f2 -d, | cut -f2 -d" "`);
		OLD_HEIGHT=$(echo `file $TMP_FILE | cut -f2 -d, | cut -f4 -d" "`);
		WIDTH_FACTOR=$(echo "scale=0;$OLD_WIDTH/16" | bc);
		HEIGHT_FACTOR=$(echo "scale=0;$OLD_HEIGHT/16" | bc);
		NEW_WIDTH=$(echo "$WIDTH_FACTOR*16" | bc);
		NEW_HEIGHT=$(echo "$HEIGHT_FACTOR*16" | bc);
		rm $TMP_FILE;
		ASPECT_RATIO=$(echo "width=$NEW_WIDTH;height=$NEW_HEIGHT;scale=4;width/height" | bc);
		echo starting to convert images from $TYPE to png;
		INDEX=1;
		for image in $WILDCARD;
			do
				convert -crop ${NEW_WIDTH}x${NEW_HEIGHT} $image ${image%%.$TYPE}.png;
				if [ $(echo "$INDEX%100" | bc) == "0" ]; then
					echo -n $INDEX;
				else
					echo -n .;
				fi
				INDEX=$((INDEX+1));
			done
		echo "";
		echo finished converting images from $TYPE to png;
		if [ $OLD_WIDTH != $NEW_WIDTH ] || [ $OLD_HEIGHT != $NEW_HEIGHT ]; then
			rm ${WILDCARD%%.$TYPE}[^-0].png;
			NEW_WILDCARD=${WILDCARD%%.$TYPE}-0.png;
		else
			NEW_WILDCARD=${WILDCARD%%.$TYPE}.png;
		fi
		mencoder mf://$NEW_WILDCARD -mf w=$NEW_WIDTH:h=$NEW_HEIGHT:fps=$FPS_RATE:type=png -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -o /dev/null;
		mencoder mf://$NEW_WILDCARD -mf w=$NEW_WIDTH:h=$NEW_HEIGHT:fps=$FPS_RATE:type=png -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vpass=2 -o $NAME.avi;
		ffmpeg2theora $NAME.avi;
		rm $NAME.avi
		echo "";
		echo "The resulting $NAME.ogg is `ls -l $NAME.ogg | cut -f5 -d\" \"` bytes large";
		rm $NEW_WILDCARD;
	fi
}

#
# example usage:
#
#    encode_images_to_avi
#    encode_images_to_avi -h
#    encode_images_to_avi --help
#    encode_images_to_avi "frame_*.ppm" 10 700 clip
#

encode_images_to_avi()
{
	WILDCARD=$1
	FPS_RATE=$2
	BIT_RATE=$3
	NAME=$4

	if [ ! -n "$1" ] || [ $1 == "-h" ] || [ $1 == "--help" ];
	then
		echo "Usage:";
		echo "    encode-images_to_avi <wildcard> <fps-rate> <bit-rate> <output-name>";
		echo "";
		echo "Example:";
		echo "    encode-images_to_avi \"frame_*.ppm\" 10 700 clip";
		echo "";
		echo "This will result in a h.264-encoded avi-video called \"clip.avi\" created from a series of images foto_*.ppm."
		echo "";
	else
		FILE_ARRAY=($WILDCARD);
		TYPE=`echo ${FILE_ARRAY[0]} | cut -f2 -d.`;
		TMP_FILE=${FILE_ARRAY[0]%%.$TYPE}.png
		convert ${FILE_ARRAY[0]} $TMP_FILE;
		OLD_WIDTH=$(echo `file $TMP_FILE | cut -f2 -d, | cut -f2 -d" "`);
		OLD_HEIGHT=$(echo `file $TMP_FILE | cut -f2 -d, | cut -f4 -d" "`);
		WIDTH_FACTOR=$(echo "scale=0;$OLD_WIDTH/16" | bc);
		HEIGHT_FACTOR=$(echo "scale=0;$OLD_HEIGHT/16" | bc);
		NEW_WIDTH=$(echo "$WIDTH_FACTOR*16" | bc);
		NEW_HEIGHT=$(echo "$HEIGHT_FACTOR*16" | bc);
		rm $TMP_FILE;
		ASPECT_RATIO=$(echo "width=$NEW_WIDTH;height=$NEW_HEIGHT;scale=4;width/height" | bc);
		VALID_ASPECT=$(echo "$ASPECT_RATIO<=3.0" | bc);
		if [ $VALID_ASPECT == "0" ]; then
			echo Sorry, H.264 does not support an aspect-ratio greater than 3.0;
			echo Your images have an aspect-ratio of $ASPECT_RATIO;
			echo Consider using encode-images_to_ogg instead;
			return;
		fi
		echo starting to convert images from $TYPE to png;
		INDEX=1;
		for image in $WILDCARD;
			do
				convert -crop ${NEW_WIDTH}x${NEW_HEIGHT} $image ${image%%.$TYPE}.png;
				if [ $(echo "$INDEX%100" | bc) == "0" ]; then
					echo -n $INDEX;
				else
					echo -n .;
				fi
				INDEX=$((INDEX+1));
			done
		echo "";
		echo finished converting images from $TYPE to png;
		if [ $OLD_WIDTH != $NEW_WIDTH ] || [ $OLD_HEIGHT != $NEW_HEIGHT ]; then
			rm ${WILDCARD%%.$TYPE}[^-0].png;
			NEW_WILDCARD=${WILDCARD%%.$TYPE}-0.png;
		else
			NEW_WILDCARD=${WILDCARD%%.$TYPE}.png;
		fi
		mencoder mf://$NEW_WILDCARD -mf w=$NEW_WIDTH:h=$NEW_HEIGHT:fps=$FPS_RATE:type=png -ovc x264 -x264encopts bitrate=$BIT_RATE:qp_constant=15:deblockalpha=2:deblockbeta=2:direct_pred=2:me=3:subq=6:nofast_pskip:nr=0:cqm=flat:keyint=1000:bframes=8:nob_adapt:qcomp=0.8:weight_b -aspect $ASPECT_RATIO -o $NAME.avi
		echo ""
		echo "The resulting $NAME.avi is `ls -l $NAME.avi | cut -f5 -d\" \"` bytes large";
		rm $NEW_WILDCARD;
	fi
}

