#!/bin/bash

# can include extra mencoder options after the filename/s

#ASAMPLERATE="${ASAMPLERATE:-8000}" # Hz
#ACHANNELS="${ACHANNELS:-1}"
#ABITSIZE="${ABITSIZE:-8}"

#AQUALITY="${AQUALITY:-100}"

#ASAMPLERATE=8000

#ASAMPLERATE="${ASAMPLERATE:-44100}" # Hz
#ACHANNELS="${ACHANNELS:-2}"
#ABITSIZE="${ABITSIZE:-16}"

#VKBITRATE="${VKBITRATE:-1000}"  # Kbp/s
#FPS="${FPS:-30}" # Hz
# 23.976

v() {
	echo "$@" >&2
	"$@"
}

AUDIO="${AUDIO:-1}"
TWOPASS="${TWOPASS:-1}"

if [ -z "$1" ]; then
	echo >&2 usage: `basename $0` infile.ext [outfile.mp4]
	exit
fi
I="$1"
shift
if [ -n "$1" ]; then
	O="$1"
	shift
else
	O="$I"
fi
O="${O%.*}"

# method from http://www.brad-x.com/2007/05/19/yet-another-linuxnix-video-h264-howto
# changes: not to use dvd, no cropping, normal stereo not 6-channel stuff, tweaked for my camera's video format, autodetect parameters

rm -f audiodump.wav "$O".aac "$O".264 divx2pass.log "$O".mp4 mplayerparams.sh

# get video / audio parameters
mplayer "$I" -identify -vc null -vo null -ao null -endpos 0 -frames 0 2>&1 | perl -ne 'print STDERR $_; chomp; /^VIDEO:\s+\[(.*?)\]\s+(\d+)x(\d+)\s+(\d+)bpp\s+([\d.]+) fps\s+([\d.]+) kbps/ && print "VINTYPE=$1\nVINWIDTH=$2\nVINHEIGHT=$3\nVINBPP=$4\nFPS=$5\nVINKBITRATE=".int($6)."\n"; /AUDIO: (\d+) Hz, (\d+) ch, ([us])(\d+)([bl]e)?, ([\d\.]+)/ && print "AINSAMPLERATE=$1\nACHANNELS=$2\nASIGN=$3\nABITSIZE=$4\nAENDIAN=$5\nAINKBITRATE=$6\n"; /^(ID_.*?)=(.*)$/ && !$already{$1}++ && print qq{$1="$2"\n}' > mplayerparams.sh
  # TODO use easily-parsed -identify parameters, rename my params to match
cat mplayerparams.sh
source mplayerparams.sh

VKBITRATE="${VKBITRATE:-$VINKBITRATE}"  # Kbp/s
if [ "$VKBITRATE" = 0 -o "$VKBITRATE" = "0.0" ]; then
	export VINWIDTH VINHEIGHT
	VKBITRATE=`perl -e 'print int($ENV{VINWIDTH}*$ENV{VINHEIGHT}/(640*480)*1000)'`
	echo >&2 "WARNING: VINKBITRATE was reported as 0, using VKBITRATE=$VKBITRATE"
fi
ASAMPLERATE="${ASAMPLERATE:-$AINSAMPLERATE}"
if [ -z "$AQUALITY" ]; then
	AQUALITY=`perl -e '$aq = int('$ID_AUDIO_BITRATE'/1000/120.0*100+0.5); if ($aq<10) { $aq=100 } elsif ($aq>800) { $aq=500 } print $aq'`
	# TODO might be better to use the -b (bitrate) option to faac?
fi

if [ "$AUDIO" = 1 ]; then
	mkfifo audiodump.wav
#	RESAMPLE=""
#	if [ "$ASAMPLERATE" != "$AINSAMPLERATE" ]; then
#		RESAMPLE="-srate $ASAMPLERATE -af-adv force=5"
#	fi
	echo >&2
	echo >&2 AUDIO:
	if [ -e audiodump.wav ]; then
		v faac --mpeg-vers 4 -q "$AQUALITY" audiodump.wav -o "$O".aac &
		v mplayer "$I" -vo null -ao pcm:fast &
	else
		v mplayer "$I" -vo null -ao pcm:fast
		v faac --mpeg-vers 4 -q "$AQUALITY" audiodump.wav -o "$O".aac
	fi
	wait
elif [ "$AUDIO" = mp3 -a "`macodec "$I"`" = mp3 ]; then
	ffmpeg -i "$I" -vn -acodec copy "$O".mp3
fi

if [ "$TWOPASS" = 1 ]; then
	echo >&2
	echo >&2 VIDEO 1:
	v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:turbo=2:pass=1 -noskip "$I" -o /dev/null

	echo >&2
	echo >&2 VIDEO 2:
	v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:pass=2 -noskip "$I" -o "$O".264
else
	echo >&2
	echo >&2 VIDEO:
	v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto -noskip "$I" -o "$O".264
fi

echo >&2
echo >&2 MP4:
v mp4creator -rate "$FPS" -a "$O".264 "$O".mp4

if [ "$AUDIO" = 1 ]; then
	v MP4Box -add "$O".aac "$O".mp4
elif [ "$AUDIO" = mp3 ]; then
	v MP4Box -add "$O".mp3 "$O".mp4
fi

if [ "$KEEP" != 1 ]; then
	rm -f audiodump.wav "$O".aac "$O".264 divx2pass.log mplayerparams.sh
fi

echo >&2
echo >&2 DONE
echo >&2

