
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://kb.speeddemosarchive.com/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://kb.speeddemosarchive.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SelbyMD</id>
		<title>SDA Knowledge Base - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://kb.speeddemosarchive.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SelbyMD"/>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Special:Contributions/SelbyMD"/>
		<updated>2026-04-04T21:18:45Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.9</generator>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh</id>
		<title>Anri-chan/Source/build deps.sh</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh"/>
				<updated>2008-12-24T22:47:48Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: use xcodebuild rather than applescript to build afconvert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#anri4 support binary build script&lt;br /&gt;
#tested on g4 powerbook under osx 10.4&lt;br /&gt;
#&lt;br /&gt;
#requirements:&lt;br /&gt;
#mp4box, mplayer/mencoder, wget, and x264 build without extra programs&lt;br /&gt;
#afconvert source should already be present on your system&lt;br /&gt;
#ffmpeg requires svn and gnu make 3.81 or newer (as make)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#sanitize local environment, you might need to change this&lt;br /&gt;
mkdir -p bin log src zip&lt;br /&gt;
ln -f &amp;quot;$(which svn)&amp;quot; bin/svn&lt;br /&gt;
ln -f &amp;quot;$(which make)&amp;quot; bin/make&lt;br /&gt;
unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS DYLD_LIBRARY_PATH PKG_CONFIG_PATH&lt;br /&gt;
export PATH=&amp;quot;$PWD/bin:/bin:/sbin:/usr/bin:/usr/sbin&amp;quot;&lt;br /&gt;
hash -r&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#the patch stops afconvert from exiting with an error when failing to shorten&lt;br /&gt;
#the length of a sound file, but i might actually need to fix the bug&lt;br /&gt;
#rather than just comment it out.  only testing will tell...&lt;br /&gt;
build-afconvert () {&lt;br /&gt;
	local     dir=AudioFileTools&lt;br /&gt;
	local fulldir=/Developer/Examples/CoreAudio/Services/$dir&lt;br /&gt;
	if [ ! -e $fulldir ]; then&lt;br /&gt;
		echo &amp;quot;afconvert source not found, cannot build&amp;quot;&lt;br /&gt;
		return&lt;br /&gt;
	fi&lt;br /&gt;
	rm -rf src/$dir bin/afconvert&lt;br /&gt;
	cp -R $fulldir src/$dir&lt;br /&gt;
	cd src&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru AudioFileTools/Utility/CAAudioFileConverter.cpp AudioFileTools-patched/Utility/CAAudioFileConverter.cpp&lt;br /&gt;
--- AudioFileTools/Utility/CAAudioFileConverter.cpp	2008-11-06 23:49:03.000000000 -0500&lt;br /&gt;
+++ AudioFileTools-patched/Utility/CAAudioFileConverter.cpp	2008-11-06 23:50:22.000000000 -0500&lt;br /&gt;
@@ -372,7 +372,7 @@&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
-		if (decoding) {&lt;br /&gt;
+		if (0) {&lt;br /&gt;
 			// fix up the destination file's length if necessary and possible&lt;br /&gt;
 			SInt64 nframes = mSrcFile.GetNumberFrames();&lt;br /&gt;
 			if (nframes != 0) {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	xcodebuild -project $dir/$dir.xcode -target afconvert&lt;br /&gt;
	ln $dir/build/afconvert ../bin/afconvert&lt;br /&gt;
	cd ..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if you see a complaint about vm_allocate failing&lt;br /&gt;
#upgrade built-in make (gnu make 3.80) to 3.81 or newer&lt;br /&gt;
#remember to define it (and svn) above if it isn't in the path&lt;br /&gt;
build-ffmpeg () {&lt;br /&gt;
	local ffmpeg=ffmpeg-r15761&lt;br /&gt;
	local    url=svn://svn.mplayerhq.hu/ffmpeg/trunk&lt;br /&gt;
	rm -rf src/ffmpeg bin/ffmpeg&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$ffmpeg.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$ffmpeg.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		svn export -r 15761 $url ffmpeg&lt;br /&gt;
		tar -cf ../zip/$ffmpeg.tar ffmpeg&lt;br /&gt;
		bzip2 ../zip/$ffmpeg.tar&lt;br /&gt;
	fi&lt;br /&gt;
	cd ffmpeg&lt;br /&gt;
	./configure&lt;br /&gt;
	make&lt;br /&gt;
	ln ffmpeg ../../bin/ffmpeg&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-mencoder () {&lt;br /&gt;
	echo &amp;quot;mencoder is built by mplayer, so use that target instead&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#-force_cpusubtype_ALL is listed as darwin only, so a linux build might need to change this&lt;br /&gt;
build-mplayer () {&lt;br /&gt;
	local mplayer=MPlayer-1.0rc2&lt;br /&gt;
	local     url=http://www11.mplayerhq.hu/MPlayer/releases/&lt;br /&gt;
	rm -rf src/$mplayer bin/mplayer bin/mencoder&lt;br /&gt;
	if [ ! -e zip/$mplayer.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$mplayer.tar.bz2 -o zip/$mplayer.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$mplayer.tar.bz2&lt;br /&gt;
	cd $mplayer&lt;br /&gt;
	CFLAGS=-force_cpusubtype_ALL ./configure --enable-largefiles --disable-freetype --disable-fontconfig --disable-gl --disable-openal --disable-x11&lt;br /&gt;
	make&lt;br /&gt;
	ln mplayer ../../bin/mplayer&lt;br /&gt;
	ln mencoder ../../bin/mencoder&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#the -soname option to the dynamic lib build command is invalid on osx,&lt;br /&gt;
#and we only want to use the static lib anyway, so the patch just comments it out,&lt;br /&gt;
#makes mp4box link against the static lib, and fixes a namespace collision.&lt;br /&gt;
build-mp4box () {&lt;br /&gt;
	local gpac=gpac-2008-11-01&lt;br /&gt;
	local  url=-d:pserver:anonymous:@gpac.cvs.sourceforge.net:/cvsroot/gpac&lt;br /&gt;
	rm -rf src/gpac bin/mp4box&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$gpac.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$gpac.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		cvs $url login&lt;br /&gt;
		cvs -z3 $url export -D 2008-11-01 gpac&lt;br /&gt;
		tar -cf ../zip/$gpac.tar gpac&lt;br /&gt;
		bzip2 ../zip/$gpac.tar&lt;br /&gt;
	fi&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru gpac/applications/mp4box/Makefile gpac-patched/applications/mp4box/Makefile&lt;br /&gt;
--- gpac/applications/mp4box/Makefile	2008-10-06 05:41:13.000000000 -0400&lt;br /&gt;
+++ gpac-patched/applications/mp4box/Makefile	2008-11-02 23:25:41.000000000 -0500&lt;br /&gt;
@@ -35,8 +35,8 @@&lt;br /&gt;
 else&lt;br /&gt;
 EXT=&lt;br /&gt;
 PROG=MP4Box&lt;br /&gt;
-#LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
-LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
+LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
+#LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
 endif&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/Makefile gpac-patched/src/Makefile&lt;br /&gt;
--- gpac/src/Makefile	2008-10-06 08:58:56.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/Makefile	2008-11-02 23:27:29.000000000 -0500&lt;br /&gt;
@@ -206,7 +206,7 @@&lt;br /&gt;
 $(LIB): $(LIBGPAC_UTILS) $(LIBGPAC_IETF) $(LIBGPAC_BIFS) $(LIBGPAC_ODF) $(LIBGPAC_LASER) $(LIBGPAC_ISOM) $(LIBGPAC_SCENEMANAGER) $(LIBGPAC_TERMINAL) compositor scenegraph mediatools mcrypt $(OBJSPIC)&lt;br /&gt;
 	ar cr ../bin/gcc/libgpac_static.a $(OBJS)&lt;br /&gt;
 	ranlib ../bin/gcc/libgpac_static.a&lt;br /&gt;
-	$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
+	#$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
 &lt;br /&gt;
 dep: depend&lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/scenegraph/base_scenegraph.c gpac-patched/src/scenegraph/base_scenegraph.c&lt;br /&gt;
--- gpac/src/scenegraph/base_scenegraph.c	2008-10-31 09:42:57.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/base_scenegraph.c	2008-11-03 00:39:19.000000000 -0500&lt;br /&gt;
@@ -1601,7 +1601,7 @@&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 GF_EXPORT&lt;br /&gt;
 const char *gf_node_get_class_name(GF_Node *node)&lt;br /&gt;
 {&lt;br /&gt;
diff -Nru gpac/src/scenegraph/xml_ns.c gpac-patched/src/scenegraph/xml_ns.c&lt;br /&gt;
--- gpac/src/scenegraph/xml_ns.c	2008-10-24 09:06:24.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/xml_ns.c	2008-11-03 00:39:43.000000000 -0500&lt;br /&gt;
@@ -391,7 +391,7 @@&lt;br /&gt;
 	return DOM_String_datatype;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 &lt;br /&gt;
 const char*gf_svg_get_attribute_name(GF_Node *node, u32 tag)&lt;br /&gt;
 {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	cd gpac&lt;br /&gt;
	chmod 700 configure&lt;br /&gt;
	./configure --disable-ssl --disable-opengl&lt;br /&gt;
	make lib&lt;br /&gt;
	make -C applications/mp4box&lt;br /&gt;
	ln bin/gcc/MP4Box ../../bin/mp4box&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-wget () {&lt;br /&gt;
	local wget=wget-1.11.4&lt;br /&gt;
	local  url=ftp://ftp.gnu.org/gnu/wget&lt;br /&gt;
	rm -rf src/$wget bin/wget&lt;br /&gt;
	if [ ! -e zip/$wget.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$wget.tar.bz2 -o zip/$wget.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$wget.tar.bz2&lt;br /&gt;
	cd $wget&lt;br /&gt;
	./configure --disable-rpath --without-ssl&lt;br /&gt;
	make&lt;br /&gt;
	ln src/wget ../../bin/wget&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#info on versions used by anri&lt;br /&gt;
#0.59.859 ce13bb6 ce13bb6e8108657599433031df9c260c9f81b49d 2008-05-20&lt;br /&gt;
#0.64.995 2324c70 2324c7074585b8b3f56e49ae41df9cbca06f6185 2008-09-29&lt;br /&gt;
#fetch tarball from the next day to include the specified revision&lt;br /&gt;
#the patch removes the dependency on git to determine the revision&lt;br /&gt;
build-x264 () {&lt;br /&gt;
	local x264=x264-snapshot-20080521-2245&lt;br /&gt;
	local  url=ftp://ftp.videolan.org/pub/videolan/x264/snapshots&lt;br /&gt;
	if [ ! -e src/gpac ]; then&lt;br /&gt;
		echo &amp;quot;gpac not found but needed for mp4 output&amp;quot;&lt;br /&gt;
		echo &amp;quot;build mp4box first, then build x264 without deleting src/gpac&amp;quot;&lt;br /&gt;
		return&lt;br /&gt;
	fi&lt;br /&gt;
	rm -rf src/$x264 bin/x264&lt;br /&gt;
	if [ ! -e zip/$x264.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$x264.tar.bz2 -o zip/$x264.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$x264.tar.bz2&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru x264-snapshot-20080521-2245/version.sh x264-patched/version.sh&lt;br /&gt;
--- x264-snapshot-20080521-2245/version.sh	2008-05-21 16:45:10.000000000 -0400&lt;br /&gt;
+++ x264-patched/version.sh	2008-12-04 14:13:25.000000000 -0500&lt;br /&gt;
@@ -1,4 +1,7 @@&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
+echo &amp;quot;#define X264_VERSION \&amp;quot; r859\&amp;quot;&amp;quot; &amp;gt;&amp;gt; config.h&lt;br /&gt;
+echo &amp;quot;#define X264_POINTVER \&amp;quot;0.59.859\&amp;quot;&amp;quot; &amp;gt;&amp;gt; config.h&lt;br /&gt;
+exit&lt;br /&gt;
 git-rev-list HEAD | sort &amp;gt; config.git-hash&lt;br /&gt;
 LOCALVER=`wc -l config.git-hash | awk '{print $1}'`&lt;br /&gt;
 if [ $LOCALVER \&amp;gt; 1 ] ; then&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	cd $x264&lt;br /&gt;
	CFLAGS=&amp;quot;-I$PWD/../gpac/include&amp;quot; LDFLAGS=&amp;quot;-L$PWD/../gpac/bin/gcc&amp;quot; ./configure --enable-mp4-output&lt;br /&gt;
	make&lt;br /&gt;
	ln x264 ../../bin/x264&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
programs=(afconvert ffmpeg mencoder mplayer mp4box wget x264)&lt;br /&gt;
for arg; do&lt;br /&gt;
	for program in ${programs[*]}; do&lt;br /&gt;
		if [[ $program == $arg || $arg == &amp;quot;all&amp;quot; ]]; then&lt;br /&gt;
			echo &amp;quot;$program build started&amp;quot;&lt;br /&gt;
			time build-$program &amp;gt;log/$program.out 2&amp;gt;log/$program.err&lt;br /&gt;
			echo &amp;quot;$program build finished&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl</id>
		<title>Anri-chan/Source/mp4nerf.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl"/>
				<updated>2008-12-06T22:48:02Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: fixed a bug parsing inside atoms with 64 bit lengths&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package mp4nerf;&lt;br /&gt;
&lt;br /&gt;
$action = 'nerf';  # default when called from anri&lt;br /&gt;
{ no warnings 'once'; *anri::mp4nerf = *mp4nerf; }&lt;br /&gt;
exit &amp;amp;mp4batchnerf(@ARGV) unless defined caller();&lt;br /&gt;
&lt;br /&gt;
sub mp4batchnerf {&lt;br /&gt;
	$verbose = 1;&lt;br /&gt;
	$action  = 'print';  # default when called stand-alone&lt;br /&gt;
	&amp;amp;pout(&amp;quot;MP4 audio track disabler\n&amp;quot;);&lt;br /&gt;
	&amp;amp;pout(&amp;quot;beta 0.2, DJ Grenola &amp;amp; SelbyMD\n\n&amp;quot;);&lt;br /&gt;
	&amp;amp;pout(&amp;quot;This software comes with no warranty.\n\n&amp;quot;);&lt;br /&gt;
	unless (grep {-e} @_) {&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl    &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to print track information\n&amp;quot;);&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl -n &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to disable commentary\n&amp;quot;);&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl -u &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to re-enable commentary\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	for $arg (@_) {&lt;br /&gt;
		if    ($arg eq '-p') { $action = 'print'  }&lt;br /&gt;
		elsif ($arg eq '-u') { $action = 'unnerf' }&lt;br /&gt;
		elsif ($arg eq '-n') { $action = 'nerf'   }&lt;br /&gt;
		elsif ($arg eq '-x') { $action = 'nerf'   }&lt;br /&gt;
		else                 { $files++; $errors += &amp;amp;mp4nerf($arg) }&lt;br /&gt;
	}&lt;br /&gt;
	if ($errors) {&lt;br /&gt;
		&amp;amp;perr(&amp;quot;[-] There were errors during processing. [${errors}/${files}]\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pout(&amp;quot;[+] All files processed successfully.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return $errors;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub mp4nerf {&lt;br /&gt;
	$mp4file        = shift;&lt;br /&gt;
	$matches        = 0;&lt;br /&gt;
	$tracks_to_skip = ($action eq 'nerf') ? 1 : 0;&lt;br /&gt;
	unless (open(FH, '+&amp;lt;:raw', $mp4file)) {&lt;br /&gt;
		&amp;amp;perr(qq([-] Failed to open file &amp;quot;${mp4file}&amp;quot;.\n\n));&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;pout(qq([+] Scanning file &amp;quot;${mp4file}&amp;quot;.\n));&lt;br /&gt;
	@traks = &amp;amp;getatomtree([qw(moov trak)], [0, -s $mp4file]);&lt;br /&gt;
	unless (@traks) {&lt;br /&gt;
		&amp;amp;perr(qq([-] No tracks found. Maybe this isn't an mp4 file.\n\n));&lt;br /&gt;
		close(FH);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	for $trak (@traks) {&lt;br /&gt;
		($tkhd) = &amp;amp;getatoms('tkhd', @$trak);&lt;br /&gt;
		($offset, $id, $status, $type) = ($$tkhd[0], &amp;amp;id($tkhd), &amp;amp;status($tkhd), &amp;amp;type($trak));&lt;br /&gt;
		unless (defined($id) and defined($status)) {&lt;br /&gt;
			&amp;amp;perr(qq([-] Error reading from file &amp;quot;${mp4file}&amp;quot;.\n\n));&lt;br /&gt;
			close(FH);&lt;br /&gt;
			return 1;&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;[+] Track %d (%7s,%8s) at 0x%08x, &amp;quot;, $id, $type, $status, $$trak[0] - 8) if $verbose;&lt;br /&gt;
		if ($type ne 'audio') {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;ignored.\n&amp;quot;);&lt;br /&gt;
		} elsif (++$matches &amp;lt;= $tracks_to_skip) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;skipped.\n&amp;quot;);&lt;br /&gt;
		} elsif (($action eq 'nerf') and ($status eq 'enabled')) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;attempting to disable ...\n&amp;quot;);&lt;br /&gt;
			if (nerf($offset)) {&lt;br /&gt;
				&amp;amp;pout(&amp;quot;[+] Nerfed successfully.\n&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;perr(&amp;quot;[-] Failed to nerf this track.\n\n&amp;quot;);&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (($action eq 'unnerf') and ($status eq 'disabled')) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;attempting to enable ...\n&amp;quot;);&lt;br /&gt;
			if (unnerf($offset)) {&lt;br /&gt;
				&amp;amp;pout(&amp;quot;[+] Unnerfed successfully.\n&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;perr(&amp;quot;[-] Failed to unnerf this track.\n\n&amp;quot;);&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;no action taken.\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;pout(qq([+] File &amp;quot;$mp4file&amp;quot; processed successfully.\n\n));&lt;br /&gt;
	close(FH);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pout { print STDOUT @_ if $verbose }&lt;br /&gt;
sub perr { print STDERR @_ }&lt;br /&gt;
&lt;br /&gt;
sub myread  { sysseek(FH, $_[1], 0) and ( sysread(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
sub mywrite { sysseek(FH, $_[1], 0) and (syswrite(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
&lt;br /&gt;
sub nerf   { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) &amp;amp; 0xFE), $_[0] + 3, 1) }&lt;br /&gt;
sub unnerf { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) | 0x01), $_[0] + 3, 1) }&lt;br /&gt;
&lt;br /&gt;
sub isvideo { &amp;amp;getatomtree([qw(mdia minf vmhd)], $_[0]) }&lt;br /&gt;
sub isaudio { &amp;amp;getatomtree([qw(mdia minf smhd)], $_[0]) }&lt;br /&gt;
&lt;br /&gt;
sub type   { &amp;amp;isaudio ? 'audio' : &amp;amp;isvideo ? 'video' : 'unknown' }&lt;br /&gt;
sub id     { &amp;amp;myread($temp, $_[0][0] + 12, 4) ?   unpack('N', $temp) : 0 }&lt;br /&gt;
sub status { &amp;amp;myread($temp, $_[0][0] +  3, 1) ? ((unpack('C', $temp) % 2) ? 'enabled' : 'disabled') : undef }&lt;br /&gt;
&lt;br /&gt;
sub getatoms {&lt;br /&gt;
	($atomname, $start, $end) = @_;&lt;br /&gt;
	@atoms = ();&lt;br /&gt;
	use bytes;&lt;br /&gt;
	while ($start &amp;lt; $end) {&lt;br /&gt;
		last unless &amp;amp;myread($temp, $start, 8);&lt;br /&gt;
		($size, $name) = unpack('NA4', $temp);&lt;br /&gt;
		if ($size == 1) {    # might not have 'Q', so do this manually&lt;br /&gt;
			last unless &amp;amp;myread($temp, $start + 8, 8);&lt;br /&gt;
			$size = unpack('N', substr($temp, 0, 4)) * 2**32 + unpack('N', substr($temp, 4, 4));&lt;br /&gt;
			if ($size &amp;lt; 16) { $size = (-s $mp4file) - $start }&lt;br /&gt;
			if ($name eq $atomname) { push @atoms, [$start + 16, $start + $size] }&lt;br /&gt;
		} else {&lt;br /&gt;
			if ($size &amp;lt;  8) { $size = (-s $mp4file) - $start }&lt;br /&gt;
			if ($name eq $atomname) { push @atoms, [$start +  8, $start + $size] }&lt;br /&gt;
		}&lt;br /&gt;
		$start += $size;&lt;br /&gt;
	}&lt;br /&gt;
	@atoms;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub getatomtree {&lt;br /&gt;
	@tree = ($_[1]);&lt;br /&gt;
	for my $atomname (@{$_[0]}) {&lt;br /&gt;
		last unless @tree;&lt;br /&gt;
		@tree = map { &amp;amp;getatoms($atomname, @$_) } @tree;&lt;br /&gt;
	}&lt;br /&gt;
	@tree;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh</id>
		<title>Anri-chan/Source/build deps.sh</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh"/>
				<updated>2008-12-05T01:04:00Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: x264 synced with nate's windows binary (r859)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#anri4 support binary build script&lt;br /&gt;
#tested on g4 powerbook under osx 10.4&lt;br /&gt;
#&lt;br /&gt;
#requirements:&lt;br /&gt;
#mp4box, mplayer/mencoder, wget, and x264 build without extra programs&lt;br /&gt;
#afconvert source should already be present on your system&lt;br /&gt;
#ffmpeg requires svn and gnu make 3.81 or newer (as make)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#sanitize local environment, you might need to change this&lt;br /&gt;
mkdir -p bin log src zip&lt;br /&gt;
ln -f &amp;quot;$(which svn)&amp;quot; bin/svn&lt;br /&gt;
ln -f &amp;quot;$(which make)&amp;quot; bin/make&lt;br /&gt;
unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS DYLD_LIBRARY_PATH PKG_CONFIG_PATH&lt;br /&gt;
export PATH=&amp;quot;$PWD/bin:/bin:/sbin:/usr/bin:/usr/sbin&amp;quot;&lt;br /&gt;
hash -r&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#this is a bit inefficient, since i don't know how to build just afconvert,&lt;br /&gt;
#so either manually tell xcode to stop after afconvert builds or wait it out.&lt;br /&gt;
#the patch stops afconvert from exiting with an error when failing to shorten&lt;br /&gt;
#the length of a sound file, but i might actually need to fix the bug&lt;br /&gt;
#rather than just comment it out.  only testing will tell...&lt;br /&gt;
build-afconvert () {&lt;br /&gt;
	local     dir=AudioFileTools&lt;br /&gt;
	local fulldir=/Developer/Examples/CoreAudio/Services/$dir&lt;br /&gt;
	if [ ! -e $fulldir ]; then&lt;br /&gt;
		echo &amp;quot;afconvert source not found, cannot build&amp;quot;&lt;br /&gt;
		return&lt;br /&gt;
	fi&lt;br /&gt;
	rm -rf src/$dir bin/afconvert&lt;br /&gt;
	cp -R $fulldir src/$dir&lt;br /&gt;
	cd src&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru AudioFileTools/Utility/CAAudioFileConverter.cpp AudioFileTools-patched/Utility/CAAudioFileConverter.cpp&lt;br /&gt;
--- AudioFileTools/Utility/CAAudioFileConverter.cpp	2008-11-06 23:49:03.000000000 -0500&lt;br /&gt;
+++ AudioFileTools-patched/Utility/CAAudioFileConverter.cpp	2008-11-06 23:50:22.000000000 -0500&lt;br /&gt;
@@ -372,7 +372,7 @@&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
-		if (decoding) {&lt;br /&gt;
+		if (0) {&lt;br /&gt;
 			// fix up the destination file's length if necessary and possible&lt;br /&gt;
 			SInt64 nframes = mSrcFile.GetNumberFrames();&lt;br /&gt;
 			if (nframes != 0) {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	osascript &amp;lt;&amp;lt;END_OF_APPLESCRIPT&lt;br /&gt;
tell application &amp;quot;Xcode&amp;quot;&lt;br /&gt;
	activate&lt;br /&gt;
	open posix file &amp;quot;$PWD/$dir/$dir.xcode&amp;quot;&lt;br /&gt;
	with timeout of 300 seconds&lt;br /&gt;
		build&lt;br /&gt;
	end timeout&lt;br /&gt;
	quit&lt;br /&gt;
end tell&lt;br /&gt;
END_OF_APPLESCRIPT&lt;br /&gt;
	ln $dir/build/afconvert ../bin/afconvert&lt;br /&gt;
	cd ..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if you see a complaint about vm_allocate failing&lt;br /&gt;
#upgrade built-in make (gnu make 3.80) to 3.81 or newer&lt;br /&gt;
#remember to define it (and svn) above if it isn't in the path&lt;br /&gt;
build-ffmpeg () {&lt;br /&gt;
	local ffmpeg=ffmpeg-r15761&lt;br /&gt;
	local    url=svn://svn.mplayerhq.hu/ffmpeg/trunk&lt;br /&gt;
	rm -rf src/ffmpeg bin/ffmpeg&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$ffmpeg.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$ffmpeg.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		svn export -r 15761 $url ffmpeg&lt;br /&gt;
		tar -cf ../zip/$ffmpeg.tar ffmpeg&lt;br /&gt;
		bzip2 ../zip/$ffmpeg.tar&lt;br /&gt;
	fi&lt;br /&gt;
	cd ffmpeg&lt;br /&gt;
	./configure&lt;br /&gt;
	make&lt;br /&gt;
	ln ffmpeg ../../bin/ffmpeg&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-mencoder () {&lt;br /&gt;
	echo &amp;quot;mencoder is built by mplayer, so use that target instead&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#-force_cpusubtype_ALL is listed as darwin only, so a linux build might need to change this&lt;br /&gt;
build-mplayer () {&lt;br /&gt;
	local mplayer=MPlayer-1.0rc2&lt;br /&gt;
	local     url=http://www11.mplayerhq.hu/MPlayer/releases/&lt;br /&gt;
	rm -rf src/$mplayer bin/mplayer bin/mencoder&lt;br /&gt;
	if [ ! -e zip/$mplayer.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$mplayer.tar.bz2 -o zip/$mplayer.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$mplayer.tar.bz2&lt;br /&gt;
	cd $mplayer&lt;br /&gt;
	CFLAGS=-force_cpusubtype_ALL ./configure --enable-largefiles --disable-freetype --disable-fontconfig --disable-gl --disable-openal --disable-x11&lt;br /&gt;
	make&lt;br /&gt;
	ln mplayer ../../bin/mplayer&lt;br /&gt;
	ln mencoder ../../bin/mencoder&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#the -soname option to the dynamic lib build command is invalid on osx,&lt;br /&gt;
#and we only want to use the static lib anyway, so the patch just comments it out,&lt;br /&gt;
#makes mp4box link against the static lib, and fixes a namespace collision.&lt;br /&gt;
build-mp4box () {&lt;br /&gt;
	local gpac=gpac-2008-11-01&lt;br /&gt;
	local  url=-d:pserver:anonymous:@gpac.cvs.sourceforge.net:/cvsroot/gpac&lt;br /&gt;
	rm -rf src/gpac bin/mp4box&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$gpac.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$gpac.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		cvs $url login&lt;br /&gt;
		cvs -z3 $url export -D 2008-11-01 gpac&lt;br /&gt;
		tar -cf ../zip/$gpac.tar gpac&lt;br /&gt;
		bzip2 ../zip/$gpac.tar&lt;br /&gt;
	fi&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru gpac/applications/mp4box/Makefile gpac-patched/applications/mp4box/Makefile&lt;br /&gt;
--- gpac/applications/mp4box/Makefile	2008-10-06 05:41:13.000000000 -0400&lt;br /&gt;
+++ gpac-patched/applications/mp4box/Makefile	2008-11-02 23:25:41.000000000 -0500&lt;br /&gt;
@@ -35,8 +35,8 @@&lt;br /&gt;
 else&lt;br /&gt;
 EXT=&lt;br /&gt;
 PROG=MP4Box&lt;br /&gt;
-#LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
-LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
+LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
+#LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
 endif&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/Makefile gpac-patched/src/Makefile&lt;br /&gt;
--- gpac/src/Makefile	2008-10-06 08:58:56.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/Makefile	2008-11-02 23:27:29.000000000 -0500&lt;br /&gt;
@@ -206,7 +206,7 @@&lt;br /&gt;
 $(LIB): $(LIBGPAC_UTILS) $(LIBGPAC_IETF) $(LIBGPAC_BIFS) $(LIBGPAC_ODF) $(LIBGPAC_LASER) $(LIBGPAC_ISOM) $(LIBGPAC_SCENEMANAGER) $(LIBGPAC_TERMINAL) compositor scenegraph mediatools mcrypt $(OBJSPIC)&lt;br /&gt;
 	ar cr ../bin/gcc/libgpac_static.a $(OBJS)&lt;br /&gt;
 	ranlib ../bin/gcc/libgpac_static.a&lt;br /&gt;
-	$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
+	#$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
 &lt;br /&gt;
 dep: depend&lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/scenegraph/base_scenegraph.c gpac-patched/src/scenegraph/base_scenegraph.c&lt;br /&gt;
--- gpac/src/scenegraph/base_scenegraph.c	2008-10-31 09:42:57.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/base_scenegraph.c	2008-11-03 00:39:19.000000000 -0500&lt;br /&gt;
@@ -1601,7 +1601,7 @@&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 GF_EXPORT&lt;br /&gt;
 const char *gf_node_get_class_name(GF_Node *node)&lt;br /&gt;
 {&lt;br /&gt;
diff -Nru gpac/src/scenegraph/xml_ns.c gpac-patched/src/scenegraph/xml_ns.c&lt;br /&gt;
--- gpac/src/scenegraph/xml_ns.c	2008-10-24 09:06:24.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/xml_ns.c	2008-11-03 00:39:43.000000000 -0500&lt;br /&gt;
@@ -391,7 +391,7 @@&lt;br /&gt;
 	return DOM_String_datatype;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 &lt;br /&gt;
 const char*gf_svg_get_attribute_name(GF_Node *node, u32 tag)&lt;br /&gt;
 {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	cd gpac&lt;br /&gt;
	chmod 700 configure&lt;br /&gt;
	./configure --disable-ssl --disable-opengl&lt;br /&gt;
	make lib&lt;br /&gt;
	make -C applications/mp4box&lt;br /&gt;
	ln bin/gcc/MP4Box ../../bin/mp4box&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-wget () {&lt;br /&gt;
	local wget=wget-1.11.4&lt;br /&gt;
	local  url=ftp://ftp.gnu.org/gnu/wget&lt;br /&gt;
	rm -rf src/$wget bin/wget&lt;br /&gt;
	if [ ! -e zip/$wget.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$wget.tar.bz2 -o zip/$wget.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$wget.tar.bz2&lt;br /&gt;
	cd $wget&lt;br /&gt;
	./configure --disable-rpath --without-ssl&lt;br /&gt;
	make&lt;br /&gt;
	ln src/wget ../../bin/wget&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#info on versions used by anri&lt;br /&gt;
#0.59.859 ce13bb6 ce13bb6e8108657599433031df9c260c9f81b49d 2008-05-20&lt;br /&gt;
#0.64.995 2324c70 2324c7074585b8b3f56e49ae41df9cbca06f6185 2008-09-29&lt;br /&gt;
#fetch tarball from the next day to include the specified revision&lt;br /&gt;
#the patch removes the dependency on git to determine the revision&lt;br /&gt;
build-x264 () {&lt;br /&gt;
	local x264=x264-snapshot-20080521-2245&lt;br /&gt;
	local  url=ftp://ftp.videolan.org/pub/videolan/x264/snapshots&lt;br /&gt;
	if [ ! -e src/gpac ]; then&lt;br /&gt;
		echo &amp;quot;gpac not found but needed for mp4 output&amp;quot;&lt;br /&gt;
		echo &amp;quot;build mp4box first, then build x264 without deleting src/gpac&amp;quot;&lt;br /&gt;
		return&lt;br /&gt;
	fi&lt;br /&gt;
	rm -rf src/$x264 bin/x264&lt;br /&gt;
	if [ ! -e zip/$x264.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$x264.tar.bz2 -o zip/$x264.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$x264.tar.bz2&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru x264-snapshot-20080521-2245/version.sh x264-patched/version.sh&lt;br /&gt;
--- x264-snapshot-20080521-2245/version.sh	2008-05-21 16:45:10.000000000 -0400&lt;br /&gt;
+++ x264-patched/version.sh	2008-12-04 14:13:25.000000000 -0500&lt;br /&gt;
@@ -1,4 +1,7 @@&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
+echo &amp;quot;#define X264_VERSION \&amp;quot; r859\&amp;quot;&amp;quot; &amp;gt;&amp;gt; config.h&lt;br /&gt;
+echo &amp;quot;#define X264_POINTVER \&amp;quot;0.59.859\&amp;quot;&amp;quot; &amp;gt;&amp;gt; config.h&lt;br /&gt;
+exit&lt;br /&gt;
 git-rev-list HEAD | sort &amp;gt; config.git-hash&lt;br /&gt;
 LOCALVER=`wc -l config.git-hash | awk '{print $1}'`&lt;br /&gt;
 if [ $LOCALVER \&amp;gt; 1 ] ; then&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	cd $x264&lt;br /&gt;
	CFLAGS=&amp;quot;-I$PWD/../gpac/include&amp;quot; LDFLAGS=&amp;quot;-L$PWD/../gpac/bin/gcc&amp;quot; ./configure --enable-mp4-output&lt;br /&gt;
	make&lt;br /&gt;
	ln x264 ../../bin/x264&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
programs=(afconvert ffmpeg mencoder mplayer mp4box wget x264)&lt;br /&gt;
for arg; do&lt;br /&gt;
	for program in ${programs[*]}; do&lt;br /&gt;
		if [[ $program == $arg || $arg == &amp;quot;all&amp;quot; ]]; then&lt;br /&gt;
			echo &amp;quot;$program build started&amp;quot;&lt;br /&gt;
			time build-$program &amp;gt;log/$program.out 2&amp;gt;log/$program.err&lt;br /&gt;
			echo &amp;quot;$program build finished&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini</id>
		<title>Anri-chan/Source/config old.ini</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini"/>
				<updated>2008-11-11T20:40:30Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: @avifiles and $avidir&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$gba_crop_left = 43;&lt;br /&gt;
$gba_crop_top = 39;&lt;br /&gt;
$gba_crop_right = 44;&lt;br /&gt;
$gba_crop_bottom = 41;&lt;br /&gt;
&lt;br /&gt;
$gb_crop_left = 80;&lt;br /&gt;
$gb_crop_top = 48;&lt;br /&gt;
$gb_crop_right = 80;&lt;br /&gt;
$gb_crop_bottom = 48;&lt;br /&gt;
&lt;br /&gt;
#for mplayer/mencoder&lt;br /&gt;
$really_quiet = &amp;quot;-really-quiet&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#sample settings for auto mode, needs commenting&lt;br /&gt;
#boolean vars can be either 1/0 or $lang{y/n}&lt;br /&gt;
$auto=0;&lt;br /&gt;
if ($auto) {&lt;br /&gt;
	@menuchoices=(1,2);&lt;br /&gt;
	$driveletter='D';&lt;br /&gt;
	$dvdripto='game';&lt;br /&gt;
	$dvdsource=1;&lt;br /&gt;
	@dvdchoices=qw(game);&lt;br /&gt;
	@avifiles=('D:/tmp/desktop/avidir/test.avi');&lt;br /&gt;
	$avidir='D:/tmp/desktop/avidir';&lt;br /&gt;
	$projname='game';&lt;br /&gt;
	$startframe=1022;&lt;br /&gt;
	$dfnd=0;&lt;br /&gt;
	$dfnd_set=1;&lt;br /&gt;
	$d=1;&lt;br /&gt;
	$f=1;&lt;br /&gt;
	$twod=0;&lt;br /&gt;
	$nes=0;&lt;br /&gt;
	$gb=0;&lt;br /&gt;
	$gba=0;&lt;br /&gt;
	$prog=0;&lt;br /&gt;
	$fieldorder=1;&lt;br /&gt;
	$vhs=0;&lt;br /&gt;
	$onepixel=0;&lt;br /&gt;
	$deflicker=0;&lt;br /&gt;
	$maxaudiobitrate=256000;&lt;br /&gt;
	$make_nmf=1;&lt;br /&gt;
	$trim=1;&lt;br /&gt;
	@trimarr=(1000,1100,2000,2100,5000,5100,6000,6100);&lt;br /&gt;
	$statid=1;&lt;br /&gt;
	@statidlines=('name','game','type and time');&lt;br /&gt;
	@encodethese=qw(lq mq hq iq xq lqavi mqavi);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-11-11T20:34:41Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: q_avi auto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#default&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#goes after a drive letter&lt;br /&gt;
	$colon = ':';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = 'NUL';&lt;br /&gt;
	&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;START&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else { #we're on unix&lt;br /&gt;
	#desktop location and other os-dependent stuff&lt;br /&gt;
	if (&amp;quot;$^O&amp;quot; eq &amp;quot;darwin&amp;quot;) {&lt;br /&gt;
		$desktop = glob(&amp;quot;~/Desktop&amp;quot;);&lt;br /&gt;
		$path_to_verdana = &amp;quot;/Library/Fonts/Verdana.ttf&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		### FIXME NON-MAC UNIX DESKTOP LOCATION, PATH TO VERDANA&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory ### FIXME ###&lt;br /&gt;
	$anri_dir = `pwd`;&lt;br /&gt;
	chomp($anri_dir);&lt;br /&gt;
	&lt;br /&gt;
	#our encoders - invocation names only - path will be prepended later ...&lt;br /&gt;
	$x264 = 'x264';&lt;br /&gt;
	$afconvert = 'afconvert';&lt;br /&gt;
	#for mp4box&lt;br /&gt;
#	print &amp;quot;export DYLD_LIBRARY_PATH=${anri_dir}\n&amp;quot;;&lt;br /&gt;
	$mp4box = 'mp4box';&lt;br /&gt;
	$ffmpeg = 'ffmpeg';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$avidemux = $anri_dir.'/avidemux2_qt4.app/Contents/Resources/script';&lt;br /&gt;
	$mplayer = &amp;quot;mplayer&amp;quot;;&lt;br /&gt;
	$mencoder = &amp;quot;mencoder&amp;quot;;&lt;br /&gt;
	$really_quiet = &amp;quot;-really-quiet&amp;quot;; #for mencoder&lt;br /&gt;
	$wget = &amp;quot;wget&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;${anri_dir}/dvdripto&amp;quot;; ### FIXME&lt;br /&gt;
	&lt;br /&gt;
	#not needed under unix&lt;br /&gt;
	$colon = '';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = '/dev/null';&lt;br /&gt;
&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;open&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#color initialization&lt;br /&gt;
	require Term::ANSIColor;&lt;br /&gt;
	import Term::ANSIColor qw(color);&lt;br /&gt;
	$cecho = &amp;quot;echo&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#fewer colors to choose from than under windows if we want to maintain portability ...&lt;br /&gt;
	$black_on_gray = color(&amp;quot;black on_white&amp;quot;);&lt;br /&gt;
	$gray_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$white_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$aqua_on_black = color(&amp;quot;green on_black&amp;quot;);&lt;br /&gt;
	$blue_on_black = color(&amp;quot;blue on_black&amp;quot;);&lt;br /&gt;
	$teal_on_gray = color(&amp;quot;green on_white&amp;quot;);&lt;br /&gt;
	$navy_on_gray = color(&amp;quot;blue on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_gray = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_silver = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$white_on_gray = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$red_on_gray = color(&amp;quot;red on_white&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.color(&amp;quot;reset&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#make sure we can find anri's libs&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
&lt;br /&gt;
#load config file&lt;br /&gt;
require 'config.ini' if -e 'config.ini';&lt;br /&gt;
&lt;br /&gt;
#localization&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
require &amp;quot;lang_${language}.pl&amp;quot; if $language ne &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&amp;amp;out_cls;&lt;br /&gt;
@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
);&lt;br /&gt;
while (1) {&lt;br /&gt;
	if (@menuchoices) {&lt;br /&gt;
		eval($mainmenu[shift(@menuchoices)-1][1]);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;out_cls;&lt;br /&gt;
		&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
		&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/([1-5])$/) {&lt;br /&gt;
				#execute the contents of this value in the array&lt;br /&gt;
				eval($mainmenu[$1-1][1]);&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	if (! defined $startframe) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			@sources = &amp;amp;pipe_prepare($projname, &amp;quot;sources&amp;quot;);&lt;br /&gt;
			$avidemuxarg = &amp;quot; --load&amp;quot;;&lt;br /&gt;
			for (@sources) {&lt;br /&gt;
				$avidemuxargs .= &amp;quot;${avidemuxarg} \&amp;quot;${desktop}/anri_sample/${_}\&amp;quot;&amp;quot;;&lt;br /&gt;
				$avidemuxarg = &amp;quot; --append&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			#system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; ${avidemuxargs} &amp;amp;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[0-9]+$/) {&lt;br /&gt;
				$startframe = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		### remove .idx files&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF()\nSeparateFields()\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	if (!@statidlines) {&lt;br /&gt;
		foreach $i (1 .. 3) {&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			chomp($statidline);&lt;br /&gt;
			$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
			push(@statidlines,$statidline);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{SECTION_PROJECT_SETUP});&lt;br /&gt;
	if (! defined $projname) {&lt;br /&gt;
		&amp;amp;out_info($lang{ENTER_PROJECT_NAME});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
		system($reset_color);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/[% ]/) {&lt;br /&gt;
				$projname = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{MOVIE_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{MOVIE_SOURCE_MPEG2_HINT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if (q_boo($lang{MPEG2_SOURCE_QUESTION}, $dvdsource)) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;q_dfnd if !$dfnd_set;&lt;br /&gt;
		if (!$dfnd_set) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			if (! defined $d) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[14]$/) {&lt;br /&gt;
						$d = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (! defined $f) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[1-5]$/) {&lt;br /&gt;
						$f = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			q_boo($lang{QUESTION_ND}, $twod) if ($f == 1);&lt;br /&gt;
			if (!$auto) {&lt;br /&gt;
				#:q_submit_dfnd&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				system($start, 'http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0') if q_boo($lang{QUESTION_SUBMIT_DFND});&lt;br /&gt;
				#:dfnd_is_set&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$hqq = 17 if $d == 4;&lt;br /&gt;
		$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Video properties&lt;br /&gt;
		# &lt;br /&gt;
		# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
		# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
		# skip the entire section. Anyways..&lt;br /&gt;
		# &lt;br /&gt;
		# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
		# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
		# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
		# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
		# &lt;br /&gt;
		# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
		# &lt;br /&gt;
		# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
		#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# function: q_fieldorder&lt;br /&gt;
		# &lt;br /&gt;
		# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
		# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
		# better.&lt;br /&gt;
		# &lt;br /&gt;
		# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
		# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		if (! defined $fieldorder) {&lt;br /&gt;
			&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			#:q_fieldorder_p2&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[tb]$/) {&lt;br /&gt;
					#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
					tr/tb/10/;&lt;br /&gt;
					$fieldorder = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		#q_vhs&lt;br /&gt;
		q_boo($lang{QUESTION_VHS}, $vhs);&lt;br /&gt;
&lt;br /&gt;
		#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if ($f != 2);&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_NES}, $nes);&lt;br /&gt;
		#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GBA}, $gba);&lt;br /&gt;
		$deflicker=1 if $gba;&lt;br /&gt;
		#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GB}, $gb);&lt;br /&gt;
		$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_DEFLICKERED}, $deflicker) if ($f != 2);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. If the frame range is like 50 to 30 an error is shown, same if a '-'&lt;br /&gt;
	# is inputted.&lt;br /&gt;
	# Users can enter dummy values and edit project_job.bat later on and it will &lt;br /&gt;
	# still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (! defined $trim) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo($lang{QUESTION_TRIM}, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. Implemented basic checking if the frame range is valid.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} elsif ((@trimarr % 2) &amp;amp;&amp;amp; ($trimarr[@trimarr-1] &amp;gt; $_)) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_RANGE};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (! defined $statid) {&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo($lang{QUESTION_STATID}, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if ($auto or q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		%qualities = (&lt;br /&gt;
				#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
				#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			lq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			mq    =&amp;gt; [			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			hq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			iq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			xq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			lqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			mqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
		);&lt;br /&gt;
		&lt;br /&gt;
		if (!@encodethese) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
			for (qw(lq mq hq iq xq lqavi mqavi)) {&lt;br /&gt;
				my @t = @{ $qualities{$_} };&lt;br /&gt;
				#if this quality is not disabled for these content properties - then ask the user if they want to make it&lt;br /&gt;
				push(@encodethese, $_) if $t[0] and q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $t[2] (&amp;quot;.($t[4]+($t[5]/1000)).&amp;quot; kbit/sec)&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $qualities{$_}[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my @t = @{ $qualities{$_} };&lt;br /&gt;
			print &amp;quot;now encoding $t[2] ($projname.$t[3].$nmf, $projname.$t[3], @t[4..8])\n&amp;quot;;&lt;br /&gt;
			$t[1]-&amp;gt;($projname.$t[3].$nmf, $projname.$t[3], @t[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	} else { #unix&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.tga&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	my $f = shift;&lt;br /&gt;
	map { $_-&amp;gt;join() } map { threads-&amp;gt;create($f, $_) } @_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo($lang{QUESTION_CREATE_NMF},$make_nmf)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	if ($statid) {&lt;br /&gt;
		$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
		$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
		$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
		$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid++run++statid\n&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [$lang{y}/$lang{n}] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$secondarg = '.';&lt;br /&gt;
	$secondarg = $_[1] if $_[1];&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${secondarg}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub trim($) { #from http://www.somacon.com/p114.php&lt;br /&gt;
	my $string = shift;&lt;br /&gt;
	$string =~ s/^\s+//;&lt;br /&gt;
	$string =~ s/\s+$//;&lt;br /&gt;
	return $string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	if (defined $_[1]) {&lt;br /&gt;
		if ($_[1] == 1 or $_[1] eq $lang{&amp;quot;y&amp;quot;}) { #for some reason {y} causes textwrangler's syntax highlighting to break&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($_[1] == 0 or $_[1] eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($_[0].&amp;quot; [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput eq $lang{&amp;quot;y&amp;quot;}) {&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($userinput eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr ||= 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	if (@avifiles) {&lt;br /&gt;
		#nothing to do here&lt;br /&gt;
	} elsif (defined $avidir) {&lt;br /&gt;
		&amp;amp;q_avi_a;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/([ia])$/) {&lt;br /&gt;
				#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
				tr/ia/10/;&lt;br /&gt;
				$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_DIR_LOAD_INFO});&lt;br /&gt;
	while (1) {&lt;br /&gt;
		if (defined $avidir) {&lt;br /&gt;
			$_ = $avidir;&lt;br /&gt;
		} else {&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			$_ = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		}&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/ or $os ne 'windows') {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (glob(&amp;quot;$avifolder/*.avi&amp;quot;)) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				if ($auto or q_boo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN})) {&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		undef $avidir;&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~s/\&amp;amp;amp\;/\&amp;amp;/g;&lt;br /&gt;
				#right now only the accent in Pokemon and &amp;amp; need to be changed, but it'd be better for it to work with all utf chars&lt;br /&gt;
				$title=~s/(\xc3\xa9)/chr(130)/eg;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
				#printing at most 50 lines at a time&lt;br /&gt;
				if(($i+1) % 50 == 0) {&lt;br /&gt;
					print $titles;&lt;br /&gt;
					$titles = '';&lt;br /&gt;
					&amp;amp;out_info($lang{PRESS_ENTER_PAGE});&lt;br /&gt;
					&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo($lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN});&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (! defined $driveletter) {&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[a-z]$/i) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		} else { #unix&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_PATH});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP_UNIX});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (!m/^$/) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_PATH};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#this is mainly because when you drag things onto a terminal window in os x it cats a space on the end of the path&lt;br /&gt;
	$driveletter = &amp;amp;trim($driveletter);&lt;br /&gt;
	if (defined $dvdripto) {&lt;br /&gt;
		$dvdripto = &amp;quot;${dvdripto_parentdir}/${dvdripto}&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/^$/) {&lt;br /&gt;
				$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir; #paranoia&lt;br /&gt;
	mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	}&lt;br /&gt;
	if (-e &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$video_ts = &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (glob(&amp;quot;${video_ts}/VTS*.IFO&amp;quot;)) {&lt;br /&gt;
			&amp;amp;pgccount(glob(&amp;quot;${video_ts}/VTS*.IFO&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 2.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${video_ts} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${video_ts}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	#we don't actually index anything under unix but we still need to pick from the ripped dvd sources, write the start of the main project .avs and set some variables&lt;br /&gt;
	$maxaudiobr ||= 320000;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		@dvdfilemasksorig = @dvdfilemasks;&lt;br /&gt;
		foreach $mask (@dvdfilemasksorig) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (@dvdchoices) {&lt;br /&gt;
		map { $_ = &amp;quot;${dvdripto_parentdir}/$_&amp;quot; } @dvdchoices;&lt;br /&gt;
	} else {&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
			@errormsgs = ();&lt;br /&gt;
			#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
			if (m/^$/) {&lt;br /&gt;
				push(@errormsgs,$lang{INVALID_INPUT});&lt;br /&gt;
			} else {&lt;br /&gt;
				for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
					if (defined($gooddvddirs{$_})) {&lt;br /&gt;
						push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
					} else {&lt;br /&gt;
						push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error(@errormsgs);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ m/^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					if ($os eq 'windows') {&lt;br /&gt;
						# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
						#I01_001.vob&lt;br /&gt;
						#dvdtest_1_I01_001.d2v&lt;br /&gt;
						#dvdtest_1_I01_001.log&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
						&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
						### FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
						for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
							if (defined($3)) {&lt;br /&gt;
								$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					} else { #unix&lt;br /&gt;
						&amp;amp;cp($mpegfile,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;MPEG2source(\&amp;quot;${1}.${2}\&amp;quot;,upconv=1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
						### FIXME get $maxaudiobr?&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub pipe_prepare($$) {&lt;br /&gt;
	$basename = shift;&lt;br /&gt;
	$mode = shift;&lt;br /&gt;
&lt;br /&gt;
	$avs = &amp;quot;${basename}.pipe&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if -e $avs;&lt;br /&gt;
	system(&amp;quot;mkfifo&amp;quot;, $avs);&lt;br /&gt;
&lt;br /&gt;
	open(AVS, &amp;quot;${basename}.avs&amp;quot;); #must be unix text when running sasami under unix ...&lt;br /&gt;
	@avs = &amp;lt;AVS&amp;gt;;&lt;br /&gt;
	close(AVS);&lt;br /&gt;
	@sources = ();&lt;br /&gt;
	@trims = ();&lt;br /&gt;
	$f = 1;&lt;br /&gt;
	for (@avs) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		next if m/^#/;&lt;br /&gt;
		push(@sources,$1) if m/^.*MPEG2source\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*avisource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*directshowsource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		$fieldorder = 1 if m/^AssumeTFF\(\)/i;&lt;br /&gt;
		$fieldorder = 0 if m/^AssumeBFF\(\)/i;&lt;br /&gt;
		$d = 1 if m/^global d1 = true/;&lt;br /&gt;
		$d = 4 if m/^global d1 = false/;&lt;br /&gt;
		$d = 4 if m/^separatefields\(\)$/i; #for sample extraction&lt;br /&gt;
		$f = $1 if m/^changefps\(f1\/([0-9])\)/;&lt;br /&gt;
		$deflicker = 1 if m/^nate_retard_bob_2/;&lt;br /&gt;
		$vhs = 1 if m/^nate_vhs_head_change_erase/;&lt;br /&gt;
		$onepixel = 1 if m/^nate_1_pixel_bob_fix/;&lt;br /&gt;
		$nes = 1 if m/^nate_nes$/;&lt;br /&gt;
		push(@trims,&amp;quot;$1,$2&amp;quot;) if m/trim\(([0-9]+),([0-9]+)\)/;&lt;br /&gt;
		$gba = 1 if m/^nate_gba$/;&lt;br /&gt;
		$gb = 1 if m/^nate_gb$/;&lt;br /&gt;
		#$resize = 1 if m/^lanczos4resize\(/;&lt;br /&gt;
		#nate format&lt;br /&gt;
		$statidlines[0] = $1 if m/^statid1=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[1] = $1 if m/^statid2=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[2] = $1 if m/^statid3=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		#anri format&lt;br /&gt;
		(@statidlines) = ($1, $2, $3) if m/^statid=.*\(run,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;\)/;&lt;br /&gt;
	}&lt;br /&gt;
	die 'sasami: no sources detected in .avs!' if @sources == 0;&lt;br /&gt;
	return @sources if $mode eq 'sources';&lt;br /&gt;
	&lt;br /&gt;
	open(JS, &amp;quot;&amp;gt;${basename}.js&amp;quot;) or die &amp;quot;could not open ${basename}.js for writing&amp;quot;;&lt;br /&gt;
	print JS '//AD  &amp;lt;- Needed to identify//'.&amp;quot;\n\nvar app = new Avidemux();\n\n&amp;quot;;&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @sources ; $i++) {&lt;br /&gt;
		print JS &amp;quot;app.forceUnpack();\n&amp;quot;;&lt;br /&gt;
		if ($i == 0) {&lt;br /&gt;
			print JS &amp;quot;app.load(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print JS &amp;quot;app.append(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
# 	@mencoderargslist = ();&lt;br /&gt;
# 	#build mencoder command to feed fifo&lt;br /&gt;
# 	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
	&lt;br /&gt;
	print JS &amp;quot;\napp.clearSegments();\n&amp;quot;;&lt;br /&gt;
	my $sourcenum = 0;&lt;br /&gt;
	my $previous_sourcelength = 0;&lt;br /&gt;
	my $this_sourcelength;&lt;br /&gt;
	foreach $source (@sources) {&lt;br /&gt;
		#get vital info about source&lt;br /&gt;
		my $mplayeridentify = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
mplayer -identify -vo null -slave ${source} 2&amp;gt;&amp;amp;1 &amp;lt;&amp;lt;ENDOFSCRIPT&lt;br /&gt;
quit&lt;br /&gt;
ENDOFSCRIPT&lt;br /&gt;
SABRAC&lt;br /&gt;
		for (qx($mplayeridentify)) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;&lt;br /&gt;
			$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;&lt;br /&gt;
			$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;&lt;br /&gt;
			$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;&lt;br /&gt;
			$this_sourcelength = &amp;amp;round($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;&lt;br /&gt;
		}&lt;br /&gt;
	# 	print &amp;quot;$width\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$height\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$framerate\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$maxaudiobitrate\n&amp;quot;;&lt;br /&gt;
		$pal = ($height eq &amp;quot;576&amp;quot;);&lt;br /&gt;
		### FIXME moved from above the foreach source block because it depends on $pal being set - check only first source and then set?&lt;br /&gt;
		$newframerate = ($pal ? (50/$f) : (59.94/$f)); #required for trimming&lt;br /&gt;
		&lt;br /&gt;
		#trimming&lt;br /&gt;
	# 	$framerate = 29.97;&lt;br /&gt;
	# 	$framerate = 25 if $pal;&lt;br /&gt;
		my $sourcelength = ($previous_sourcelength + $this_sourcelength);&lt;br /&gt;
		for (@trims) {&lt;br /&gt;
			if ($_) {&lt;br /&gt;
				#print &amp;quot;popped: $_\n&amp;quot;;&lt;br /&gt;
				my $trimone = '';&lt;br /&gt;
				my $trimtwo = '';&lt;br /&gt;
				m/^(.*),(.*)$/;&lt;br /&gt;
				if ($1) {&lt;br /&gt;
					if ($1 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = ($1 - $previous_sourcelength);&lt;br /&gt;
						$trimtwo = ($this_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ($2) {&lt;br /&gt;
					if ($2 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = 0 if !$trimone;&lt;br /&gt;
						$trimtwo = ($2 - $previous_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (($trimone ne '') &amp;amp;&amp;amp; ($trimtwo ne '')) {&lt;br /&gt;
					print JS &amp;quot;app.addSegment(${sourcenum},${trimone},${trimtwo});\n&amp;quot;;&lt;br /&gt;
					$_ = &amp;quot;,&amp;quot;;&lt;br /&gt;
					#keep second trim point in case we haven't reached it yet&lt;br /&gt;
					$_ .= $2 if $2 &amp;gt; $sourcelength;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$previous_sourcelength = $sourcelength;&lt;br /&gt;
		$sourcenum++;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
# app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=14&amp;quot;,&amp;quot;right=16&amp;quot;,&amp;quot;top=22&amp;quot;,&amp;quot;bottom=30&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;resamplefps&amp;quot;,&amp;quot;newfps=29970&amp;quot;,&amp;quot;use_linear=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=2&amp;quot;);&lt;br /&gt;
	#one pixel bob&lt;br /&gt;
# 		if ($onepixel) {&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=1&amp;quot;,&amp;quot;bottom=0&amp;quot;);&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=1&amp;quot;);&lt;br /&gt;
# 			$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-1).&amp;quot;:0:0,expand=${width}:${height}:0:1&amp;quot;;&lt;br /&gt;
# 			$fieldorder = 0 if $fieldorder == 1;&lt;br /&gt;
# 			$fieldorder = 1 if $fieldorder == 0;&lt;br /&gt;
# 		}&lt;br /&gt;
	&lt;br /&gt;
	if ($nes) {&lt;br /&gt;
		print JS '//nes'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.($width-8).&amp;quot;:${height}:8:0,expand=${width}:${height}:8:0&amp;quot; if $nes;&lt;br /&gt;
		#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi&lt;br /&gt;
		#Would change the number of channels to 6 and set up 4 routes that copy channel 0 to channels 0 to 3.  Channel 4 and 5 will contain silence.&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity='.$fieldorder.'&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 1;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}&amp;quot; if $d == 1;&lt;br /&gt;
	#$tfields = 0;&lt;br /&gt;
	#$tfields = 4 if $deflicker;&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 4;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add tfields=${tfields}&amp;quot; if $d == 4;&lt;br /&gt;
	&lt;br /&gt;
	#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters&lt;br /&gt;
	#print JS 'app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);'.&amp;quot;\n&amp;quot; if $deflicker;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add unsharp=l3x3:0.6:c3x3:0.6&amp;quot; if $deflicker;&lt;br /&gt;
&lt;br /&gt;
	if ($vhs) {&lt;br /&gt;
		print JS '//vhs'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-12).&amp;quot;:0:0,expand=0:-12:0:0&amp;quot; if $vhs;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($gba) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gba_crop_left.'&amp;quot;,&amp;quot;right='.$gba_crop_right.'&amp;quot;,&amp;quot;top='.$gba_crop_top.'&amp;quot;,&amp;quot;bottom='.$gba_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gba_crop_right-$gba_crop_left).&amp;quot;:&amp;quot;.(240-$gba_crop_bottom-$gba_crop_top).&amp;quot;:${gba_crop_left}:${gba_crop_top}&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=240&amp;quot;,&amp;quot;h=160&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=240:160&amp;quot;;&lt;br /&gt;
		$newwidth = 240;&lt;br /&gt;
		$newheight = 160;&lt;br /&gt;
	} elsif ($gb) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gb_crop_left.'&amp;quot;,&amp;quot;right='.$gb_crop_right.'&amp;quot;,&amp;quot;top='.$gb_crop_top.'&amp;quot;,&amp;quot;bottom='.$gb_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gb_crop_right-$gb_crop_left).&amp;quot;:&amp;quot;.(240-$gb_crop_bottom-$gb_crop_top).&amp;quot;:${gb_crop_left}:${gb_crop_top}&amp;quot;;&lt;br /&gt;
		$newwidth = (320-$gb_crop_right-$gb_crop_left);&lt;br /&gt;
		$newheight = (240-$gb_crop_bottom-$gb_crop_top);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;&lt;br /&gt;
	$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add framestep=${f}&amp;quot;;&lt;br /&gt;
	$x264newframerate = &amp;quot;--fps ${newframerate}&amp;quot;;&lt;br /&gt;
	$x264outext = '264';&lt;br /&gt;
	$x264dimensions = &amp;quot;${newwidth}x${newheight}&amp;quot;;&lt;br /&gt;
	$ampersand = '&amp;amp;';&lt;br /&gt;
	$mp4boxnewframerate = &amp;quot;-fps ${newframerate}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w='.$newwidth.'&amp;quot;,&amp;quot;h='.$newheight.'&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add scale=${newwidth}:${newheight}&amp;quot;;# if $resize;&lt;br /&gt;
	&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print JS 'app.video.codec(&amp;quot;YV12&amp;quot;,&amp;quot;CQ=1&amp;quot;,&amp;quot;0 &amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.load(&amp;quot;NONE&amp;quot;,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.setContainer(&amp;quot;OGM&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.save(&amp;quot;'.&amp;quot;${desktop}/${projname}/avidemux.pipe&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
		print JS 'app.audio.codec(&amp;quot;none&amp;quot;,128,0,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.save(&amp;quot;'.&amp;quot;${avs}&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;.'setSuccess(1);'.&amp;quot;\n&amp;quot;.'app.Exit();'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	close(JS);&lt;br /&gt;
&lt;br /&gt;
# 	my $sourcesplit = '&amp;quot;'.$source.'&amp;quot;';&lt;br /&gt;
# 	my $littleo = &amp;quot;-o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	$littleo = &amp;quot;-ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast&amp;quot; if $mode eq &amp;quot;audio&amp;quot;;&lt;br /&gt;
# 	if (@trimargsarr) {&lt;br /&gt;
# 		my $mencoderargstemp = '';&lt;br /&gt;
# 		while (my $trimargs = shift(@trimargsarr)) {&lt;br /&gt;
# 			$mencoderargstemp .= $mencoderargs.&amp;quot; ${sourcesplit}&amp;quot;.$trimargs.&amp;quot; ${littleo}\n&amp;quot;;&lt;br /&gt;
# 		}&lt;br /&gt;
# 		$mencoderargs = $mencoderargstemp;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$mencoderargs .= &amp;quot; ${sourcesplit} ${littleo}\n&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
# 	&lt;br /&gt;
# 	push(@mencoderargslist,$mencoderargs);&lt;br /&gt;
	&lt;br /&gt;
	if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2])) {&lt;br /&gt;
		require Imager;&lt;br /&gt;
		$img = Imager-&amp;gt;new;&lt;br /&gt;
		$img-&amp;gt;read(file=&amp;gt;&amp;quot;ntsc_d1.tga&amp;quot;) or die &amp;quot;Cannot load statid image: &amp;quot;, $img-&amp;gt;errstr;&lt;br /&gt;
		$font = Imager::Font-&amp;gt;new(file=&amp;gt;$path_to_verdana); #will need to be changed for non-mac unix ...&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[0], $img-&amp;gt;getheight/2, 36, 'white'  ) if $statidlines[0];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[1], 360,               36, 'white'  ) if $statidlines[1];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[2], 400,               36, 'white'  ) if $statidlines[2];&lt;br /&gt;
		&amp;amp;statid_lines_write(&amp;quot;Audio commentary on track 2&amp;quot;, 460, 28, '#E1CE8B') if defined $audio_commentary;&lt;br /&gt;
		$img-&amp;gt;write(file=&amp;gt;'statid.tga')&lt;br /&gt;
		or die 'Cannot save statid.tga: ', $img-&amp;gt;errstr;&lt;br /&gt;
		open(MF,&amp;quot;&amp;gt;statid.txt&amp;quot;) or die &amp;quot;Could not open statid.txt for appending!&amp;quot;;&lt;br /&gt;
		for (1..5) { #once for each second of the statid&lt;br /&gt;
			for (1..$newframerate) { #once for each frame this second&lt;br /&gt;
				print MF &amp;quot;statid.tga\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(MF);&lt;br /&gt;
		if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add scale=${newwidth}:${newheight} -vf-add format=i420 -ovc raw -of rawvideo -nosound -ofps ${newframerate} mf://\@statid.txt -mf fps=${newframerate}:type=tga -o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
		} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet} -audiofile \&amp;quot;silence_stereo_48000.wav\&amp;quot; -vc null -ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast mf://\@statid.txt -mf fps=${newframerate}:type=tga&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pipe_write {&lt;br /&gt;
	print &amp;quot;opening ${avs} ...\n&amp;quot;;&lt;br /&gt;
	open(FIFO,&amp;quot;&amp;gt;${avs}&amp;quot;);&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print &amp;quot;making avidemux.pipe ...\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;mkfifo&amp;quot;, &amp;quot;avidemux.pipe&amp;quot;);&lt;br /&gt;
		print &amp;quot;made avidemux.pipe\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add format=i420 -ovc raw -of rawvideo -nosound -o \&amp;quot;${avs}\&amp;quot; avidemux.pipe &amp;amp;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; --run \&amp;quot;${basename}.js\&amp;quot;&amp;quot;); #need the full path to the js for some reason&lt;br /&gt;
	&amp;amp;rm(&amp;quot;avidemux.pipe&amp;quot;) if $mode eq &amp;quot;video&amp;quot;;&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	close(FIFO);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#statid line text, y-offset, text size, color&lt;br /&gt;
sub statid_lines_write {&lt;br /&gt;
$font-&amp;gt;align(string =&amp;gt; $_[0],&lt;br /&gt;
	aa =&amp;gt; 1,&lt;br /&gt;
	size =&amp;gt; $_[2],&lt;br /&gt;
	color =&amp;gt; $_[3],&lt;br /&gt;
	x =&amp;gt; $img-&amp;gt;getwidth/2,&lt;br /&gt;
	y =&amp;gt; $_[1],&lt;br /&gt;
	halign =&amp;gt; 'center',&lt;br /&gt;
	valign =&amp;gt; 'center',&lt;br /&gt;
	image =&amp;gt; $img);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub round {&lt;br /&gt;
	return int($_[0] + .5 * ($_[0] &amp;lt;=&amp;gt; 0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim ${x264newframerate} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	print &amp;quot;x264 is going ...\n&amp;quot;;&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	print &amp;quot;pipe_write is going ...\n&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${avs}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[2] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[2] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[2]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#MUX&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --ref 3 --mixed-refs --no-fast-pskip --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse all --no-fast-pskip --subme 7 --trellis 2 --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean, x264argsfirstpass, x264argssecondpass&lt;br /&gt;
sub x264 {&lt;br /&gt;
	$x264args_pass2 = pop;&lt;br /&gt;
	$x264args_pass1 = pop;&lt;br /&gt;
&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass1} --output ${nul} \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	#this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile - thanks grenola!&lt;br /&gt;
	while (!(-e &amp;quot;${_[1]}.stats&amp;quot;)) {&lt;br /&gt;
		print(&amp;quot;Waiting for stats file ...\n&amp;quot;);&lt;br /&gt;
		sleep(1);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass2} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
	&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${avs} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[3] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[3] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x ...&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[3]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	$avs = $_[0].'.avs';&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${avs}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini</id>
		<title>Anri-chan/Source/config old.ini</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini"/>
				<updated>2008-11-11T18:21:13Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added rip_dvd auto vars&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$gba_crop_left = 43;&lt;br /&gt;
$gba_crop_top = 39;&lt;br /&gt;
$gba_crop_right = 44;&lt;br /&gt;
$gba_crop_bottom = 41;&lt;br /&gt;
&lt;br /&gt;
$gb_crop_left = 80;&lt;br /&gt;
$gb_crop_top = 48;&lt;br /&gt;
$gb_crop_right = 80;&lt;br /&gt;
$gb_crop_bottom = 48;&lt;br /&gt;
&lt;br /&gt;
#for mplayer/mencoder&lt;br /&gt;
$really_quiet = &amp;quot;-really-quiet&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#sample settings for auto mode, needs commenting&lt;br /&gt;
#boolean vars can be either 1/0 or $lang{y/n}&lt;br /&gt;
$auto=0;&lt;br /&gt;
if ($auto) {&lt;br /&gt;
	@menuchoices=(1,2);&lt;br /&gt;
	@dvdchoices=qw(game);&lt;br /&gt;
	$projname='game';&lt;br /&gt;
	$dvdripto='game';&lt;br /&gt;
	$driveletter='D';&lt;br /&gt;
	$startframe=1022;&lt;br /&gt;
	$dvdsource=1;&lt;br /&gt;
	$dfnd=0;&lt;br /&gt;
	$dfnd_set=1;&lt;br /&gt;
	$d=1;&lt;br /&gt;
	$f=1;&lt;br /&gt;
	$twod=0;&lt;br /&gt;
	$nes=0;&lt;br /&gt;
	$gb=0;&lt;br /&gt;
	$gba=0;&lt;br /&gt;
	$prog=0;&lt;br /&gt;
	$fieldorder=1;&lt;br /&gt;
	$vhs=0;&lt;br /&gt;
	$onepixel=0;&lt;br /&gt;
	$deflicker=0;&lt;br /&gt;
	$maxaudiobitrate=256000;&lt;br /&gt;
	$make_nmf=1;&lt;br /&gt;
	$trim=1;&lt;br /&gt;
	@trimarr=(1000,1100,2000,2100,5000,5100,6000,6100);&lt;br /&gt;
	$statid=1;&lt;br /&gt;
	@statidlines=('name','game','type and time');&lt;br /&gt;
	@encodethese=qw(lq mq hq iq xq lqavi mqavi);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-11-11T18:15:45Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: now rip_dvd can be automated too, that should just leave the q_avi set&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#default&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#goes after a drive letter&lt;br /&gt;
	$colon = ':';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = 'NUL';&lt;br /&gt;
	&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;START&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else { #we're on unix&lt;br /&gt;
	#desktop location and other os-dependent stuff&lt;br /&gt;
	if (&amp;quot;$^O&amp;quot; eq &amp;quot;darwin&amp;quot;) {&lt;br /&gt;
		$desktop = glob(&amp;quot;~/Desktop&amp;quot;);&lt;br /&gt;
		$path_to_verdana = &amp;quot;/Library/Fonts/Verdana.ttf&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		### FIXME NON-MAC UNIX DESKTOP LOCATION, PATH TO VERDANA&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory ### FIXME ###&lt;br /&gt;
	$anri_dir = `pwd`;&lt;br /&gt;
	chomp($anri_dir);&lt;br /&gt;
	&lt;br /&gt;
	#our encoders - invocation names only - path will be prepended later ...&lt;br /&gt;
	$x264 = 'x264';&lt;br /&gt;
	$afconvert = 'afconvert';&lt;br /&gt;
	#for mp4box&lt;br /&gt;
#	print &amp;quot;export DYLD_LIBRARY_PATH=${anri_dir}\n&amp;quot;;&lt;br /&gt;
	$mp4box = 'mp4box';&lt;br /&gt;
	$ffmpeg = 'ffmpeg';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$avidemux = $anri_dir.'/avidemux2_qt4.app/Contents/Resources/script';&lt;br /&gt;
	$mplayer = &amp;quot;mplayer&amp;quot;;&lt;br /&gt;
	$mencoder = &amp;quot;mencoder&amp;quot;;&lt;br /&gt;
	$really_quiet = &amp;quot;-really-quiet&amp;quot;; #for mencoder&lt;br /&gt;
	$wget = &amp;quot;wget&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;${anri_dir}/dvdripto&amp;quot;; ### FIXME&lt;br /&gt;
	&lt;br /&gt;
	#not needed under unix&lt;br /&gt;
	$colon = '';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = '/dev/null';&lt;br /&gt;
&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;open&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#color initialization&lt;br /&gt;
	require Term::ANSIColor;&lt;br /&gt;
	import Term::ANSIColor qw(color);&lt;br /&gt;
	$cecho = &amp;quot;echo&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#fewer colors to choose from than under windows if we want to maintain portability ...&lt;br /&gt;
	$black_on_gray = color(&amp;quot;black on_white&amp;quot;);&lt;br /&gt;
	$gray_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$white_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$aqua_on_black = color(&amp;quot;green on_black&amp;quot;);&lt;br /&gt;
	$blue_on_black = color(&amp;quot;blue on_black&amp;quot;);&lt;br /&gt;
	$teal_on_gray = color(&amp;quot;green on_white&amp;quot;);&lt;br /&gt;
	$navy_on_gray = color(&amp;quot;blue on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_gray = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_silver = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$white_on_gray = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$red_on_gray = color(&amp;quot;red on_white&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.color(&amp;quot;reset&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#make sure we can find anri's libs&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
&lt;br /&gt;
#load config file&lt;br /&gt;
require 'config.ini' if -e 'config.ini';&lt;br /&gt;
&lt;br /&gt;
#localization&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
require &amp;quot;lang_${language}.pl&amp;quot; if $language ne &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&amp;amp;out_cls;&lt;br /&gt;
@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
);&lt;br /&gt;
while (1) {&lt;br /&gt;
	if (@menuchoices) {&lt;br /&gt;
		eval($mainmenu[shift(@menuchoices)-1][1]);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;out_cls;&lt;br /&gt;
		&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
		&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/([1-5])$/) {&lt;br /&gt;
				#execute the contents of this value in the array&lt;br /&gt;
				eval($mainmenu[$1-1][1]);&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	if (! defined $startframe) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			@sources = &amp;amp;pipe_prepare($projname, &amp;quot;sources&amp;quot;);&lt;br /&gt;
			$avidemuxarg = &amp;quot; --load&amp;quot;;&lt;br /&gt;
			for (@sources) {&lt;br /&gt;
				$avidemuxargs .= &amp;quot;${avidemuxarg} \&amp;quot;${desktop}/anri_sample/${_}\&amp;quot;&amp;quot;;&lt;br /&gt;
				$avidemuxarg = &amp;quot; --append&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			#system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; ${avidemuxargs} &amp;amp;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[0-9]+$/) {&lt;br /&gt;
				$startframe = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		### remove .idx files&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF()\nSeparateFields()\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	if (!@statidlines) {&lt;br /&gt;
		foreach $i (1 .. 3) {&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			chomp($statidline);&lt;br /&gt;
			$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
			push(@statidlines,$statidline);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{SECTION_PROJECT_SETUP});&lt;br /&gt;
	if (! defined $projname) {&lt;br /&gt;
		&amp;amp;out_info($lang{ENTER_PROJECT_NAME});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
		system($reset_color);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/[% ]/) {&lt;br /&gt;
				$projname = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{MOVIE_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{MOVIE_SOURCE_MPEG2_HINT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if (q_boo($lang{MPEG2_SOURCE_QUESTION}, $dvdsource)) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;q_dfnd if !$dfnd_set;&lt;br /&gt;
		if (!$dfnd_set) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			if (! defined $d) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[14]$/) {&lt;br /&gt;
						$d = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (! defined $f) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[1-5]$/) {&lt;br /&gt;
						$f = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			q_boo($lang{QUESTION_ND}, $twod) if ($f == 1);&lt;br /&gt;
			if (!$auto) {&lt;br /&gt;
				#:q_submit_dfnd&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				system($start, 'http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0') if q_boo($lang{QUESTION_SUBMIT_DFND});&lt;br /&gt;
				#:dfnd_is_set&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$hqq = 17 if $d == 4;&lt;br /&gt;
		$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Video properties&lt;br /&gt;
		# &lt;br /&gt;
		# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
		# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
		# skip the entire section. Anyways..&lt;br /&gt;
		# &lt;br /&gt;
		# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
		# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
		# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
		# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
		# &lt;br /&gt;
		# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
		# &lt;br /&gt;
		# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
		#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# function: q_fieldorder&lt;br /&gt;
		# &lt;br /&gt;
		# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
		# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
		# better.&lt;br /&gt;
		# &lt;br /&gt;
		# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
		# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		if (! defined $fieldorder) {&lt;br /&gt;
			&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			#:q_fieldorder_p2&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[tb]$/) {&lt;br /&gt;
					#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
					tr/tb/10/;&lt;br /&gt;
					$fieldorder = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		#q_vhs&lt;br /&gt;
		q_boo($lang{QUESTION_VHS}, $vhs);&lt;br /&gt;
&lt;br /&gt;
		#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if ($f != 2);&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_NES}, $nes);&lt;br /&gt;
		#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GBA}, $gba);&lt;br /&gt;
		$deflicker=1 if $gba;&lt;br /&gt;
		#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GB}, $gb);&lt;br /&gt;
		$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_DEFLICKERED}, $deflicker) if ($f != 2);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. If the frame range is like 50 to 30 an error is shown, same if a '-'&lt;br /&gt;
	# is inputted.&lt;br /&gt;
	# Users can enter dummy values and edit project_job.bat later on and it will &lt;br /&gt;
	# still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (! defined $trim) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo($lang{QUESTION_TRIM}, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. Implemented basic checking if the frame range is valid.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} elsif ((@trimarr % 2) &amp;amp;&amp;amp; ($trimarr[@trimarr-1] &amp;gt; $_)) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_RANGE};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (! defined $statid) {&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo($lang{QUESTION_STATID}, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if ($auto or q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		%qualities = (&lt;br /&gt;
				#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
				#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			lq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			mq    =&amp;gt; [			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			hq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			iq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			xq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			lqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			mqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
		);&lt;br /&gt;
		&lt;br /&gt;
		if (!@encodethese) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
			for (qw(lq mq hq iq xq lqavi mqavi)) {&lt;br /&gt;
				my @t = @{ $qualities{$_} };&lt;br /&gt;
				#if this quality is not disabled for these content properties - then ask the user if they want to make it&lt;br /&gt;
				push(@encodethese, $_) if $t[0] and q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $t[2] (&amp;quot;.($t[4]+($t[5]/1000)).&amp;quot; kbit/sec)&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $qualities{$_}[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my @t = @{ $qualities{$_} };&lt;br /&gt;
			print &amp;quot;now encoding $t[2] ($projname.$t[3].$nmf, $projname.$t[3], @t[4..8])\n&amp;quot;;&lt;br /&gt;
			$t[1]-&amp;gt;($projname.$t[3].$nmf, $projname.$t[3], @t[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	} else { #unix&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.tga&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	my $f = shift;&lt;br /&gt;
	map { $_-&amp;gt;join() } map { threads-&amp;gt;create($f, $_) } @_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo($lang{QUESTION_CREATE_NMF},$make_nmf)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	if ($statid) {&lt;br /&gt;
		$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
		$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
		$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
		$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid++run++statid\n&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [$lang{y}/$lang{n}] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$secondarg = '.';&lt;br /&gt;
	$secondarg = $_[1] if $_[1];&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${secondarg}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub trim($) { #from http://www.somacon.com/p114.php&lt;br /&gt;
	my $string = shift;&lt;br /&gt;
	$string =~ s/^\s+//;&lt;br /&gt;
	$string =~ s/\s+$//;&lt;br /&gt;
	return $string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	if (defined $_[1]) {&lt;br /&gt;
		if ($_[1] == 1 or $_[1] eq $lang{&amp;quot;y&amp;quot;}) { #for some reason {y} causes textwrangler's syntax highlighting to break&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($_[1] == 0 or $_[1] eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($_[0].&amp;quot; [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput eq $lang{&amp;quot;y&amp;quot;}) {&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($userinput eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				if (q_boo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN})) {&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg = $enterhelp;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~s/\&amp;amp;amp\;/\&amp;amp;/g;&lt;br /&gt;
				#right now only the accent in Pokemon and &amp;amp; need to be changed, but it'd be better for it to work with all utf chars&lt;br /&gt;
				$title=~s/(\xc3\xa9)/chr(130)/eg;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
				#printing at most 50 lines at a time&lt;br /&gt;
				if(($i+1) % 50 == 0) {&lt;br /&gt;
					print $titles;&lt;br /&gt;
					$titles = '';&lt;br /&gt;
					&amp;amp;out_info($lang{PRESS_ENTER_PAGE});&lt;br /&gt;
					&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo($lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN});&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (! defined $driveletter) {&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[a-z]$/i) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		} else { #unix&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_PATH});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP_UNIX});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (!m/^$/) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_PATH};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#this is mainly because when you drag things onto a terminal window in os x it cats a space on the end of the path&lt;br /&gt;
	$driveletter = &amp;amp;trim($driveletter);&lt;br /&gt;
	if (defined $dvdripto) {&lt;br /&gt;
		$dvdripto = &amp;quot;${dvdripto_parentdir}/${dvdripto}&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/^$/) {&lt;br /&gt;
				$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir; #paranoia&lt;br /&gt;
	mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	}&lt;br /&gt;
	if (-e &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$video_ts = &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (glob(&amp;quot;${video_ts}/VTS*.IFO&amp;quot;)) {&lt;br /&gt;
			&amp;amp;pgccount(glob(&amp;quot;${video_ts}/VTS*.IFO&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 2.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${video_ts} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${video_ts}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	#we don't actually index anything under unix but we still need to pick from the ripped dvd sources, write the start of the main project .avs and set some variables&lt;br /&gt;
	$maxaudiobr ||= 320000;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		@dvdfilemasksorig = @dvdfilemasks;&lt;br /&gt;
		foreach $mask (@dvdfilemasksorig) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (@dvdchoices) {&lt;br /&gt;
		map { $_ = &amp;quot;${dvdripto_parentdir}/$_&amp;quot; } @dvdchoices;&lt;br /&gt;
	} else {&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
			@errormsgs = ();&lt;br /&gt;
			#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
			if (m/^$/) {&lt;br /&gt;
				push(@errormsgs,$lang{INVALID_INPUT});&lt;br /&gt;
			} else {&lt;br /&gt;
				for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
					if (defined($gooddvddirs{$_})) {&lt;br /&gt;
						push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
					} else {&lt;br /&gt;
						push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error(@errormsgs);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ m/^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					if ($os eq 'windows') {&lt;br /&gt;
						# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
						#I01_001.vob&lt;br /&gt;
						#dvdtest_1_I01_001.d2v&lt;br /&gt;
						#dvdtest_1_I01_001.log&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
						&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
						### FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
						for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
							if (defined($3)) {&lt;br /&gt;
								$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					} else { #unix&lt;br /&gt;
						&amp;amp;cp($mpegfile,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;MPEG2source(\&amp;quot;${1}.${2}\&amp;quot;,upconv=1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
						### FIXME get $maxaudiobr?&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub pipe_prepare($$) {&lt;br /&gt;
	$basename = shift;&lt;br /&gt;
	$mode = shift;&lt;br /&gt;
&lt;br /&gt;
	$avs = &amp;quot;${basename}.pipe&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if -e $avs;&lt;br /&gt;
	system(&amp;quot;mkfifo&amp;quot;, $avs);&lt;br /&gt;
&lt;br /&gt;
	open(AVS, &amp;quot;${basename}.avs&amp;quot;); #must be unix text when running sasami under unix ...&lt;br /&gt;
	@avs = &amp;lt;AVS&amp;gt;;&lt;br /&gt;
	close(AVS);&lt;br /&gt;
	@sources = ();&lt;br /&gt;
	@trims = ();&lt;br /&gt;
	$f = 1;&lt;br /&gt;
	for (@avs) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		next if m/^#/;&lt;br /&gt;
		push(@sources,$1) if m/^.*MPEG2source\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*avisource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*directshowsource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		$fieldorder = 1 if m/^AssumeTFF\(\)/i;&lt;br /&gt;
		$fieldorder = 0 if m/^AssumeBFF\(\)/i;&lt;br /&gt;
		$d = 1 if m/^global d1 = true/;&lt;br /&gt;
		$d = 4 if m/^global d1 = false/;&lt;br /&gt;
		$d = 4 if m/^separatefields\(\)$/i; #for sample extraction&lt;br /&gt;
		$f = $1 if m/^changefps\(f1\/([0-9])\)/;&lt;br /&gt;
		$deflicker = 1 if m/^nate_retard_bob_2/;&lt;br /&gt;
		$vhs = 1 if m/^nate_vhs_head_change_erase/;&lt;br /&gt;
		$onepixel = 1 if m/^nate_1_pixel_bob_fix/;&lt;br /&gt;
		$nes = 1 if m/^nate_nes$/;&lt;br /&gt;
		push(@trims,&amp;quot;$1,$2&amp;quot;) if m/trim\(([0-9]+),([0-9]+)\)/;&lt;br /&gt;
		$gba = 1 if m/^nate_gba$/;&lt;br /&gt;
		$gb = 1 if m/^nate_gb$/;&lt;br /&gt;
		#$resize = 1 if m/^lanczos4resize\(/;&lt;br /&gt;
		#nate format&lt;br /&gt;
		$statidlines[0] = $1 if m/^statid1=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[1] = $1 if m/^statid2=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[2] = $1 if m/^statid3=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		#anri format&lt;br /&gt;
		(@statidlines) = ($1, $2, $3) if m/^statid=.*\(run,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;\)/;&lt;br /&gt;
	}&lt;br /&gt;
	die 'sasami: no sources detected in .avs!' if @sources == 0;&lt;br /&gt;
	return @sources if $mode eq 'sources';&lt;br /&gt;
	&lt;br /&gt;
	open(JS, &amp;quot;&amp;gt;${basename}.js&amp;quot;) or die &amp;quot;could not open ${basename}.js for writing&amp;quot;;&lt;br /&gt;
	print JS '//AD  &amp;lt;- Needed to identify//'.&amp;quot;\n\nvar app = new Avidemux();\n\n&amp;quot;;&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @sources ; $i++) {&lt;br /&gt;
		print JS &amp;quot;app.forceUnpack();\n&amp;quot;;&lt;br /&gt;
		if ($i == 0) {&lt;br /&gt;
			print JS &amp;quot;app.load(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print JS &amp;quot;app.append(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
# 	@mencoderargslist = ();&lt;br /&gt;
# 	#build mencoder command to feed fifo&lt;br /&gt;
# 	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
	&lt;br /&gt;
	print JS &amp;quot;\napp.clearSegments();\n&amp;quot;;&lt;br /&gt;
	my $sourcenum = 0;&lt;br /&gt;
	my $previous_sourcelength = 0;&lt;br /&gt;
	my $this_sourcelength;&lt;br /&gt;
	foreach $source (@sources) {&lt;br /&gt;
		#get vital info about source&lt;br /&gt;
		my $mplayeridentify = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
mplayer -identify -vo null -slave ${source} 2&amp;gt;&amp;amp;1 &amp;lt;&amp;lt;ENDOFSCRIPT&lt;br /&gt;
quit&lt;br /&gt;
ENDOFSCRIPT&lt;br /&gt;
SABRAC&lt;br /&gt;
		for (qx($mplayeridentify)) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;&lt;br /&gt;
			$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;&lt;br /&gt;
			$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;&lt;br /&gt;
			$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;&lt;br /&gt;
			$this_sourcelength = &amp;amp;round($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;&lt;br /&gt;
		}&lt;br /&gt;
	# 	print &amp;quot;$width\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$height\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$framerate\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$maxaudiobitrate\n&amp;quot;;&lt;br /&gt;
		$pal = ($height eq &amp;quot;576&amp;quot;);&lt;br /&gt;
		### FIXME moved from above the foreach source block because it depends on $pal being set - check only first source and then set?&lt;br /&gt;
		$newframerate = ($pal ? (50/$f) : (59.94/$f)); #required for trimming&lt;br /&gt;
		&lt;br /&gt;
		#trimming&lt;br /&gt;
	# 	$framerate = 29.97;&lt;br /&gt;
	# 	$framerate = 25 if $pal;&lt;br /&gt;
		my $sourcelength = ($previous_sourcelength + $this_sourcelength);&lt;br /&gt;
		for (@trims) {&lt;br /&gt;
			if ($_) {&lt;br /&gt;
				#print &amp;quot;popped: $_\n&amp;quot;;&lt;br /&gt;
				my $trimone = '';&lt;br /&gt;
				my $trimtwo = '';&lt;br /&gt;
				m/^(.*),(.*)$/;&lt;br /&gt;
				if ($1) {&lt;br /&gt;
					if ($1 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = ($1 - $previous_sourcelength);&lt;br /&gt;
						$trimtwo = ($this_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ($2) {&lt;br /&gt;
					if ($2 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = 0 if !$trimone;&lt;br /&gt;
						$trimtwo = ($2 - $previous_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (($trimone ne '') &amp;amp;&amp;amp; ($trimtwo ne '')) {&lt;br /&gt;
					print JS &amp;quot;app.addSegment(${sourcenum},${trimone},${trimtwo});\n&amp;quot;;&lt;br /&gt;
					$_ = &amp;quot;,&amp;quot;;&lt;br /&gt;
					#keep second trim point in case we haven't reached it yet&lt;br /&gt;
					$_ .= $2 if $2 &amp;gt; $sourcelength;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$previous_sourcelength = $sourcelength;&lt;br /&gt;
		$sourcenum++;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
# app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=14&amp;quot;,&amp;quot;right=16&amp;quot;,&amp;quot;top=22&amp;quot;,&amp;quot;bottom=30&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;resamplefps&amp;quot;,&amp;quot;newfps=29970&amp;quot;,&amp;quot;use_linear=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=2&amp;quot;);&lt;br /&gt;
	#one pixel bob&lt;br /&gt;
# 		if ($onepixel) {&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=1&amp;quot;,&amp;quot;bottom=0&amp;quot;);&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=1&amp;quot;);&lt;br /&gt;
# 			$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-1).&amp;quot;:0:0,expand=${width}:${height}:0:1&amp;quot;;&lt;br /&gt;
# 			$fieldorder = 0 if $fieldorder == 1;&lt;br /&gt;
# 			$fieldorder = 1 if $fieldorder == 0;&lt;br /&gt;
# 		}&lt;br /&gt;
	&lt;br /&gt;
	if ($nes) {&lt;br /&gt;
		print JS '//nes'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.($width-8).&amp;quot;:${height}:8:0,expand=${width}:${height}:8:0&amp;quot; if $nes;&lt;br /&gt;
		#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi&lt;br /&gt;
		#Would change the number of channels to 6 and set up 4 routes that copy channel 0 to channels 0 to 3.  Channel 4 and 5 will contain silence.&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity='.$fieldorder.'&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 1;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}&amp;quot; if $d == 1;&lt;br /&gt;
	#$tfields = 0;&lt;br /&gt;
	#$tfields = 4 if $deflicker;&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 4;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add tfields=${tfields}&amp;quot; if $d == 4;&lt;br /&gt;
	&lt;br /&gt;
	#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters&lt;br /&gt;
	#print JS 'app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);'.&amp;quot;\n&amp;quot; if $deflicker;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add unsharp=l3x3:0.6:c3x3:0.6&amp;quot; if $deflicker;&lt;br /&gt;
&lt;br /&gt;
	if ($vhs) {&lt;br /&gt;
		print JS '//vhs'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-12).&amp;quot;:0:0,expand=0:-12:0:0&amp;quot; if $vhs;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($gba) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gba_crop_left.'&amp;quot;,&amp;quot;right='.$gba_crop_right.'&amp;quot;,&amp;quot;top='.$gba_crop_top.'&amp;quot;,&amp;quot;bottom='.$gba_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gba_crop_right-$gba_crop_left).&amp;quot;:&amp;quot;.(240-$gba_crop_bottom-$gba_crop_top).&amp;quot;:${gba_crop_left}:${gba_crop_top}&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=240&amp;quot;,&amp;quot;h=160&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=240:160&amp;quot;;&lt;br /&gt;
		$newwidth = 240;&lt;br /&gt;
		$newheight = 160;&lt;br /&gt;
	} elsif ($gb) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gb_crop_left.'&amp;quot;,&amp;quot;right='.$gb_crop_right.'&amp;quot;,&amp;quot;top='.$gb_crop_top.'&amp;quot;,&amp;quot;bottom='.$gb_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gb_crop_right-$gb_crop_left).&amp;quot;:&amp;quot;.(240-$gb_crop_bottom-$gb_crop_top).&amp;quot;:${gb_crop_left}:${gb_crop_top}&amp;quot;;&lt;br /&gt;
		$newwidth = (320-$gb_crop_right-$gb_crop_left);&lt;br /&gt;
		$newheight = (240-$gb_crop_bottom-$gb_crop_top);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;&lt;br /&gt;
	$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add framestep=${f}&amp;quot;;&lt;br /&gt;
	$x264newframerate = &amp;quot;--fps ${newframerate}&amp;quot;;&lt;br /&gt;
	$x264outext = '264';&lt;br /&gt;
	$x264dimensions = &amp;quot;${newwidth}x${newheight}&amp;quot;;&lt;br /&gt;
	$ampersand = '&amp;amp;';&lt;br /&gt;
	$mp4boxnewframerate = &amp;quot;-fps ${newframerate}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w='.$newwidth.'&amp;quot;,&amp;quot;h='.$newheight.'&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add scale=${newwidth}:${newheight}&amp;quot;;# if $resize;&lt;br /&gt;
	&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print JS 'app.video.codec(&amp;quot;YV12&amp;quot;,&amp;quot;CQ=1&amp;quot;,&amp;quot;0 &amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.load(&amp;quot;NONE&amp;quot;,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.setContainer(&amp;quot;OGM&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.save(&amp;quot;'.&amp;quot;${desktop}/${projname}/avidemux.pipe&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
		print JS 'app.audio.codec(&amp;quot;none&amp;quot;,128,0,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.save(&amp;quot;'.&amp;quot;${avs}&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;.'setSuccess(1);'.&amp;quot;\n&amp;quot;.'app.Exit();'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	close(JS);&lt;br /&gt;
&lt;br /&gt;
# 	my $sourcesplit = '&amp;quot;'.$source.'&amp;quot;';&lt;br /&gt;
# 	my $littleo = &amp;quot;-o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	$littleo = &amp;quot;-ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast&amp;quot; if $mode eq &amp;quot;audio&amp;quot;;&lt;br /&gt;
# 	if (@trimargsarr) {&lt;br /&gt;
# 		my $mencoderargstemp = '';&lt;br /&gt;
# 		while (my $trimargs = shift(@trimargsarr)) {&lt;br /&gt;
# 			$mencoderargstemp .= $mencoderargs.&amp;quot; ${sourcesplit}&amp;quot;.$trimargs.&amp;quot; ${littleo}\n&amp;quot;;&lt;br /&gt;
# 		}&lt;br /&gt;
# 		$mencoderargs = $mencoderargstemp;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$mencoderargs .= &amp;quot; ${sourcesplit} ${littleo}\n&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
# 	&lt;br /&gt;
# 	push(@mencoderargslist,$mencoderargs);&lt;br /&gt;
	&lt;br /&gt;
	if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2])) {&lt;br /&gt;
		require Imager;&lt;br /&gt;
		$img = Imager-&amp;gt;new;&lt;br /&gt;
		$img-&amp;gt;read(file=&amp;gt;&amp;quot;ntsc_d1.tga&amp;quot;) or die &amp;quot;Cannot load statid image: &amp;quot;, $img-&amp;gt;errstr;&lt;br /&gt;
		$font = Imager::Font-&amp;gt;new(file=&amp;gt;$path_to_verdana); #will need to be changed for non-mac unix ...&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[0], $img-&amp;gt;getheight/2, 36, 'white'  ) if $statidlines[0];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[1], 360,               36, 'white'  ) if $statidlines[1];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[2], 400,               36, 'white'  ) if $statidlines[2];&lt;br /&gt;
		&amp;amp;statid_lines_write(&amp;quot;Audio commentary on track 2&amp;quot;, 460, 28, '#E1CE8B') if defined $audio_commentary;&lt;br /&gt;
		$img-&amp;gt;write(file=&amp;gt;'statid.tga')&lt;br /&gt;
		or die 'Cannot save statid.tga: ', $img-&amp;gt;errstr;&lt;br /&gt;
		open(MF,&amp;quot;&amp;gt;statid.txt&amp;quot;) or die &amp;quot;Could not open statid.txt for appending!&amp;quot;;&lt;br /&gt;
		for (1..5) { #once for each second of the statid&lt;br /&gt;
			for (1..$newframerate) { #once for each frame this second&lt;br /&gt;
				print MF &amp;quot;statid.tga\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(MF);&lt;br /&gt;
		if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add scale=${newwidth}:${newheight} -vf-add format=i420 -ovc raw -of rawvideo -nosound -ofps ${newframerate} mf://\@statid.txt -mf fps=${newframerate}:type=tga -o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
		} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet} -audiofile \&amp;quot;silence_stereo_48000.wav\&amp;quot; -vc null -ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast mf://\@statid.txt -mf fps=${newframerate}:type=tga&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pipe_write {&lt;br /&gt;
	print &amp;quot;opening ${avs} ...\n&amp;quot;;&lt;br /&gt;
	open(FIFO,&amp;quot;&amp;gt;${avs}&amp;quot;);&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print &amp;quot;making avidemux.pipe ...\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;mkfifo&amp;quot;, &amp;quot;avidemux.pipe&amp;quot;);&lt;br /&gt;
		print &amp;quot;made avidemux.pipe\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add format=i420 -ovc raw -of rawvideo -nosound -o \&amp;quot;${avs}\&amp;quot; avidemux.pipe &amp;amp;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; --run \&amp;quot;${basename}.js\&amp;quot;&amp;quot;); #need the full path to the js for some reason&lt;br /&gt;
	&amp;amp;rm(&amp;quot;avidemux.pipe&amp;quot;) if $mode eq &amp;quot;video&amp;quot;;&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	close(FIFO);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#statid line text, y-offset, text size, color&lt;br /&gt;
sub statid_lines_write {&lt;br /&gt;
$font-&amp;gt;align(string =&amp;gt; $_[0],&lt;br /&gt;
	aa =&amp;gt; 1,&lt;br /&gt;
	size =&amp;gt; $_[2],&lt;br /&gt;
	color =&amp;gt; $_[3],&lt;br /&gt;
	x =&amp;gt; $img-&amp;gt;getwidth/2,&lt;br /&gt;
	y =&amp;gt; $_[1],&lt;br /&gt;
	halign =&amp;gt; 'center',&lt;br /&gt;
	valign =&amp;gt; 'center',&lt;br /&gt;
	image =&amp;gt; $img);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub round {&lt;br /&gt;
	return int($_[0] + .5 * ($_[0] &amp;lt;=&amp;gt; 0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim ${x264newframerate} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	print &amp;quot;x264 is going ...\n&amp;quot;;&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	print &amp;quot;pipe_write is going ...\n&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${avs}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[2] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[2] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[2]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#MUX&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --ref 3 --mixed-refs --no-fast-pskip --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse all --no-fast-pskip --subme 7 --trellis 2 --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean, x264argsfirstpass, x264argssecondpass&lt;br /&gt;
sub x264 {&lt;br /&gt;
	$x264args_pass2 = pop;&lt;br /&gt;
	$x264args_pass1 = pop;&lt;br /&gt;
&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass1} --output ${nul} \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	#this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile - thanks grenola!&lt;br /&gt;
	while (!(-e &amp;quot;${_[1]}.stats&amp;quot;)) {&lt;br /&gt;
		print(&amp;quot;Waiting for stats file ...\n&amp;quot;);&lt;br /&gt;
		sleep(1);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass2} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
	&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${avs} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[3] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[3] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x ...&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[3]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	$avs = $_[0].'.avs';&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${avs}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-11-11T05:17:09Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: forgot to remove mp4nerf.pl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#default&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#goes after a drive letter&lt;br /&gt;
	$colon = ':';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = 'NUL';&lt;br /&gt;
	&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;START&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else { #we're on unix&lt;br /&gt;
	#desktop location and other os-dependent stuff&lt;br /&gt;
	if (&amp;quot;$^O&amp;quot; eq &amp;quot;darwin&amp;quot;) {&lt;br /&gt;
		$desktop = glob(&amp;quot;~/Desktop&amp;quot;);&lt;br /&gt;
		$path_to_verdana = &amp;quot;/Library/Fonts/Verdana.ttf&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		### FIXME NON-MAC UNIX DESKTOP LOCATION, PATH TO VERDANA&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory ### FIXME ###&lt;br /&gt;
	$anri_dir = `pwd`;&lt;br /&gt;
	chomp($anri_dir);&lt;br /&gt;
	&lt;br /&gt;
	#our encoders - invocation names only - path will be prepended later ...&lt;br /&gt;
	$x264 = 'x264';&lt;br /&gt;
	$afconvert = 'afconvert';&lt;br /&gt;
	#for mp4box&lt;br /&gt;
#	print &amp;quot;export DYLD_LIBRARY_PATH=${anri_dir}\n&amp;quot;;&lt;br /&gt;
	$mp4box = 'mp4box';&lt;br /&gt;
	$ffmpeg = 'ffmpeg';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$avidemux = $anri_dir.'/avidemux2_qt4.app/Contents/Resources/script';&lt;br /&gt;
	$mplayer = &amp;quot;mplayer&amp;quot;;&lt;br /&gt;
	$mencoder = &amp;quot;mencoder&amp;quot;;&lt;br /&gt;
	$really_quiet = &amp;quot;-really-quiet&amp;quot;; #for mencoder&lt;br /&gt;
	$wget = &amp;quot;wget&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;${anri_dir}/dvdripto&amp;quot;; ### FIXME&lt;br /&gt;
	&lt;br /&gt;
	#not needed under unix&lt;br /&gt;
	$colon = '';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = '/dev/null';&lt;br /&gt;
&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;open&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#color initialization&lt;br /&gt;
	require Term::ANSIColor;&lt;br /&gt;
	import Term::ANSIColor qw(color);&lt;br /&gt;
	$cecho = &amp;quot;echo&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#fewer colors to choose from than under windows if we want to maintain portability ...&lt;br /&gt;
	$black_on_gray = color(&amp;quot;black on_white&amp;quot;);&lt;br /&gt;
	$gray_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$white_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$aqua_on_black = color(&amp;quot;green on_black&amp;quot;);&lt;br /&gt;
	$blue_on_black = color(&amp;quot;blue on_black&amp;quot;);&lt;br /&gt;
	$teal_on_gray = color(&amp;quot;green on_white&amp;quot;);&lt;br /&gt;
	$navy_on_gray = color(&amp;quot;blue on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_gray = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_silver = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$white_on_gray = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$red_on_gray = color(&amp;quot;red on_white&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.color(&amp;quot;reset&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#make sure we can find anri's libs&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
&lt;br /&gt;
#load config file&lt;br /&gt;
require 'config.ini' if -e 'config.ini';&lt;br /&gt;
&lt;br /&gt;
#localization&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
require &amp;quot;lang_${language}.pl&amp;quot; if $language ne &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&amp;amp;out_cls;&lt;br /&gt;
@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
);&lt;br /&gt;
while (1) {&lt;br /&gt;
	if (@menuchoices) {&lt;br /&gt;
		eval($mainmenu[shift(@menuchoices)-1][1]);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;out_cls;&lt;br /&gt;
		&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
		&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/([1-5])$/) {&lt;br /&gt;
				#execute the contents of this value in the array&lt;br /&gt;
				eval($mainmenu[$1-1][1]);&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	if (! defined $startframe) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			@sources = &amp;amp;pipe_prepare($projname, &amp;quot;sources&amp;quot;);&lt;br /&gt;
			$avidemuxarg = &amp;quot; --load&amp;quot;;&lt;br /&gt;
			for (@sources) {&lt;br /&gt;
				$avidemuxargs .= &amp;quot;${avidemuxarg} \&amp;quot;${desktop}/anri_sample/${_}\&amp;quot;&amp;quot;;&lt;br /&gt;
				$avidemuxarg = &amp;quot; --append&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			#system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; ${avidemuxargs} &amp;amp;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[0-9]+$/) {&lt;br /&gt;
				$startframe = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		### remove .idx files&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF()\nSeparateFields()\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	if (!@statidlines) {&lt;br /&gt;
		foreach $i (1 .. 3) {&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			chomp($statidline);&lt;br /&gt;
			$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
			push(@statidlines,$statidline);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{SECTION_PROJECT_SETUP});&lt;br /&gt;
	if (! defined $projname) {&lt;br /&gt;
		&amp;amp;out_info($lang{ENTER_PROJECT_NAME});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
		system($reset_color);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/[% ]/) {&lt;br /&gt;
				$projname = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{MOVIE_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{MOVIE_SOURCE_MPEG2_HINT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if (q_boo($lang{MPEG2_SOURCE_QUESTION}, $dvdsource)) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;q_dfnd if !$dfnd_set;&lt;br /&gt;
		if (!$dfnd_set) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			if (! defined $d) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[14]$/) {&lt;br /&gt;
						$d = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (! defined $f) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[1-5]$/) {&lt;br /&gt;
						$f = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			q_boo($lang{QUESTION_ND}, $twod) if ($f == 1);&lt;br /&gt;
			if (!$auto) {&lt;br /&gt;
				#:q_submit_dfnd&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				system($start, 'http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0') if q_boo($lang{QUESTION_SUBMIT_DFND});&lt;br /&gt;
				#:dfnd_is_set&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$hqq = 17 if $d == 4;&lt;br /&gt;
		$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Video properties&lt;br /&gt;
		# &lt;br /&gt;
		# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
		# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
		# skip the entire section. Anyways..&lt;br /&gt;
		# &lt;br /&gt;
		# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
		# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
		# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
		# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
		# &lt;br /&gt;
		# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
		# &lt;br /&gt;
		# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
		#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# function: q_fieldorder&lt;br /&gt;
		# &lt;br /&gt;
		# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
		# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
		# better.&lt;br /&gt;
		# &lt;br /&gt;
		# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
		# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		if (! defined $fieldorder) {&lt;br /&gt;
			&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			#:q_fieldorder_p2&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[tb]$/) {&lt;br /&gt;
					#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
					tr/tb/10/;&lt;br /&gt;
					$fieldorder = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		#q_vhs&lt;br /&gt;
		q_boo($lang{QUESTION_VHS}, $vhs);&lt;br /&gt;
&lt;br /&gt;
		#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if ($f != 2);&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_NES}, $nes);&lt;br /&gt;
		#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GBA}, $gba);&lt;br /&gt;
		$deflicker=1 if $gba;&lt;br /&gt;
		#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GB}, $gb);&lt;br /&gt;
		$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_DEFLICKERED}, $deflicker) if ($f != 2);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. If the frame range is like 50 to 30 an error is shown, same if a '-'&lt;br /&gt;
	# is inputted.&lt;br /&gt;
	# Users can enter dummy values and edit project_job.bat later on and it will &lt;br /&gt;
	# still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (! defined $trim) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo($lang{QUESTION_TRIM}, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. Implemented basic checking if the frame range is valid.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} elsif ((@trimarr % 2) &amp;amp;&amp;amp; ($trimarr[@trimarr-1] &amp;gt; $_)) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_RANGE};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (! defined $statid) {&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo($lang{QUESTION_STATID}, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if ($auto or q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		%qualities = (&lt;br /&gt;
				#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
				#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			lq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			mq    =&amp;gt; [			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			hq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			iq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			xq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			lqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			mqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
		);&lt;br /&gt;
		&lt;br /&gt;
		if (!@encodethese) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
			for (qw(lq mq hq iq xq lqavi mqavi)) {&lt;br /&gt;
				my @t = @{ $qualities{$_} };&lt;br /&gt;
				#if this quality is not disabled for these content properties - then ask the user if they want to make it&lt;br /&gt;
				push(@encodethese, $_) if $t[0] and q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $t[2] (&amp;quot;.($t[4]+($t[5]/1000)).&amp;quot; kbit/sec)&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $qualities{$_}[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my @t = @{ $qualities{$_} };&lt;br /&gt;
			print &amp;quot;now encoding $t[2] ($projname.$t[3].$nmf, $projname.$t[3], @t[4..8])\n&amp;quot;;&lt;br /&gt;
			$t[1]-&amp;gt;($projname.$t[3].$nmf, $projname.$t[3], @t[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	} else { #unix&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.tga&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	my $f = shift;&lt;br /&gt;
	map { $_-&amp;gt;join() } map { threads-&amp;gt;create($f, $_) } @_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo($lang{QUESTION_CREATE_NMF},$make_nmf)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	if ($statid) {&lt;br /&gt;
		$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
		$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
		$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
		$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid++run++statid\n&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [$lang{y}/$lang{n}] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$secondarg = '.';&lt;br /&gt;
	$secondarg = $_[1] if $_[1];&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${secondarg}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub trim($) { #from http://www.somacon.com/p114.php&lt;br /&gt;
	my $string = shift;&lt;br /&gt;
	$string =~ s/^\s+//;&lt;br /&gt;
	$string =~ s/\s+$//;&lt;br /&gt;
	return $string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	if (defined $_[1]) {&lt;br /&gt;
		if ($_[1] == 1 or $_[1] eq $lang{&amp;quot;y&amp;quot;}) { #for some reason {y} causes textwrangler's syntax highlighting to break&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($_[1] == 0 or $_[1] eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($_[0].&amp;quot; [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput eq $lang{&amp;quot;y&amp;quot;}) {&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($userinput eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				if (q_boo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN})) {&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg = $enterhelp;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~s/\&amp;amp;amp\;/\&amp;amp;/g;&lt;br /&gt;
				#right now only the accent in Pokemon and \&amp;amp;amp; need to be changed, but it'd be better for it to work with all utf chars&lt;br /&gt;
				$title=~s/(\xc3\xa9)/chr(130)/eg;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
				#printing at most 50 lines at a time&lt;br /&gt;
				if(($i+1) % 50 == 0) {&lt;br /&gt;
					print $titles;&lt;br /&gt;
					$titles = '';&lt;br /&gt;
					&amp;amp;out_info($lang{PRESS_ENTER_PAGE});&lt;br /&gt;
					&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo($lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN});&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[a-z]$/i) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		} else { #unix&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_PATH});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP_UNIX});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (!m/^$/) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_PATH};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#this is mainly because when you drag things onto a terminal window in os x it cats a space on the end of the path&lt;br /&gt;
	$driveletter = &amp;amp;trim($driveletter);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir; #paranoia&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 2.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	#we don't actually index anything under unix but we still need to pick from the ripped dvd sources, write the start of the main project .avs and set some variables&lt;br /&gt;
	$maxaudiobr ||= 320000;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		@dvdfilemasksorig = @dvdfilemasks;&lt;br /&gt;
		foreach $mask (@dvdfilemasksorig) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (@dvdchoices) {&lt;br /&gt;
		map { $_ = &amp;quot;${dvdripto_parentdir}/$_&amp;quot; } @dvdchoices;&lt;br /&gt;
	} else {&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
			@errormsgs = ();&lt;br /&gt;
			#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
			if (m/^$/) {&lt;br /&gt;
				push(@errormsgs,$lang{INVALID_INPUT});&lt;br /&gt;
			} else {&lt;br /&gt;
				for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
					if (defined($gooddvddirs{$_})) {&lt;br /&gt;
						push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
					} else {&lt;br /&gt;
						push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error(@errormsgs);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ m/^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					if ($os eq 'windows') {&lt;br /&gt;
						# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
						#I01_001.vob&lt;br /&gt;
						#dvdtest_1_I01_001.d2v&lt;br /&gt;
						#dvdtest_1_I01_001.log&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
						&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
						### FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
						for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
							if (defined($3)) {&lt;br /&gt;
								$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					} else { #unix&lt;br /&gt;
						&amp;amp;cp($mpegfile,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;MPEG2source(\&amp;quot;${1}.${2}\&amp;quot;,upconv=1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
						### FIXME get $maxaudiobr?&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub pipe_prepare($$) {&lt;br /&gt;
	$basename = shift;&lt;br /&gt;
	$mode = shift;&lt;br /&gt;
&lt;br /&gt;
	$avs = &amp;quot;${basename}.pipe&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if -e $avs;&lt;br /&gt;
	system(&amp;quot;mkfifo&amp;quot;, $avs);&lt;br /&gt;
&lt;br /&gt;
	open(AVS, &amp;quot;${basename}.avs&amp;quot;); #must be unix text when running sasami under unix ...&lt;br /&gt;
	@avs = &amp;lt;AVS&amp;gt;;&lt;br /&gt;
	close(AVS);&lt;br /&gt;
	@sources = ();&lt;br /&gt;
	@trims = ();&lt;br /&gt;
	$f = 1;&lt;br /&gt;
	for (@avs) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		next if m/^#/;&lt;br /&gt;
		push(@sources,$1) if m/^.*MPEG2source\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*avisource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*directshowsource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		$fieldorder = 1 if m/^AssumeTFF\(\)/i;&lt;br /&gt;
		$fieldorder = 0 if m/^AssumeBFF\(\)/i;&lt;br /&gt;
		$d = 1 if m/^global d1 = true/;&lt;br /&gt;
		$d = 4 if m/^global d1 = false/;&lt;br /&gt;
		$d = 4 if m/^separatefields\(\)$/i; #for sample extraction&lt;br /&gt;
		$f = $1 if m/^changefps\(f1\/([0-9])\)/;&lt;br /&gt;
		$deflicker = 1 if m/^nate_retard_bob_2/;&lt;br /&gt;
		$vhs = 1 if m/^nate_vhs_head_change_erase/;&lt;br /&gt;
		$onepixel = 1 if m/^nate_1_pixel_bob_fix/;&lt;br /&gt;
		$nes = 1 if m/^nate_nes$/;&lt;br /&gt;
		push(@trims,&amp;quot;$1,$2&amp;quot;) if m/trim\(([0-9]+),([0-9]+)\)/;&lt;br /&gt;
		$gba = 1 if m/^nate_gba$/;&lt;br /&gt;
		$gb = 1 if m/^nate_gb$/;&lt;br /&gt;
		#$resize = 1 if m/^lanczos4resize\(/;&lt;br /&gt;
		#nate format&lt;br /&gt;
		$statidlines[0] = $1 if m/^statid1=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[1] = $1 if m/^statid2=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[2] = $1 if m/^statid3=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		#anri format&lt;br /&gt;
		(@statidlines) = ($1, $2, $3) if m/^statid=.*\(run,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;\)/;&lt;br /&gt;
	}&lt;br /&gt;
	die 'sasami: no sources detected in .avs!' if @sources == 0;&lt;br /&gt;
	return @sources if $mode eq 'sources';&lt;br /&gt;
	&lt;br /&gt;
	open(JS, &amp;quot;&amp;gt;${basename}.js&amp;quot;) or die &amp;quot;could not open ${basename}.js for writing&amp;quot;;&lt;br /&gt;
	print JS '//AD  &amp;lt;- Needed to identify//'.&amp;quot;\n\nvar app = new Avidemux();\n\n&amp;quot;;&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @sources ; $i++) {&lt;br /&gt;
		print JS &amp;quot;app.forceUnpack();\n&amp;quot;;&lt;br /&gt;
		if ($i == 0) {&lt;br /&gt;
			print JS &amp;quot;app.load(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print JS &amp;quot;app.append(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
# 	@mencoderargslist = ();&lt;br /&gt;
# 	#build mencoder command to feed fifo&lt;br /&gt;
# 	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
	&lt;br /&gt;
	print JS &amp;quot;\napp.clearSegments();\n&amp;quot;;&lt;br /&gt;
	my $sourcenum = 0;&lt;br /&gt;
	my $previous_sourcelength = 0;&lt;br /&gt;
	my $this_sourcelength;&lt;br /&gt;
	foreach $source (@sources) {&lt;br /&gt;
		#get vital info about source&lt;br /&gt;
		my $mplayeridentify = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
mplayer -identify -vo null -slave ${source} 2&amp;gt;&amp;amp;1 &amp;lt;&amp;lt;ENDOFSCRIPT&lt;br /&gt;
quit&lt;br /&gt;
ENDOFSCRIPT&lt;br /&gt;
SABRAC&lt;br /&gt;
		for (qx($mplayeridentify)) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;&lt;br /&gt;
			$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;&lt;br /&gt;
			$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;&lt;br /&gt;
			$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;&lt;br /&gt;
			$this_sourcelength = &amp;amp;round($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;&lt;br /&gt;
		}&lt;br /&gt;
	# 	print &amp;quot;$width\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$height\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$framerate\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$maxaudiobitrate\n&amp;quot;;&lt;br /&gt;
		$pal = ($height eq &amp;quot;576&amp;quot;);&lt;br /&gt;
		### FIXME moved from above the foreach source block because it depends on $pal being set - check only first source and then set?&lt;br /&gt;
		$newframerate = ($pal ? (50/$f) : (59.94/$f)); #required for trimming&lt;br /&gt;
		&lt;br /&gt;
		#trimming&lt;br /&gt;
	# 	$framerate = 29.97;&lt;br /&gt;
	# 	$framerate = 25 if $pal;&lt;br /&gt;
		my $sourcelength = ($previous_sourcelength + $this_sourcelength);&lt;br /&gt;
		for (@trims) {&lt;br /&gt;
			if ($_) {&lt;br /&gt;
				#print &amp;quot;popped: $_\n&amp;quot;;&lt;br /&gt;
				my $trimone = '';&lt;br /&gt;
				my $trimtwo = '';&lt;br /&gt;
				m/^(.*),(.*)$/;&lt;br /&gt;
				if ($1) {&lt;br /&gt;
					if ($1 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = ($1 - $previous_sourcelength);&lt;br /&gt;
						$trimtwo = ($this_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ($2) {&lt;br /&gt;
					if ($2 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = 0 if !$trimone;&lt;br /&gt;
						$trimtwo = ($2 - $previous_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (($trimone ne '') &amp;amp;&amp;amp; ($trimtwo ne '')) {&lt;br /&gt;
					print JS &amp;quot;app.addSegment(${sourcenum},${trimone},${trimtwo});\n&amp;quot;;&lt;br /&gt;
					$_ = &amp;quot;,&amp;quot;;&lt;br /&gt;
					#keep second trim point in case we haven't reached it yet&lt;br /&gt;
					$_ .= $2 if $2 &amp;gt; $sourcelength;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$previous_sourcelength = $sourcelength;&lt;br /&gt;
		$sourcenum++;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
# app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=14&amp;quot;,&amp;quot;right=16&amp;quot;,&amp;quot;top=22&amp;quot;,&amp;quot;bottom=30&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;resamplefps&amp;quot;,&amp;quot;newfps=29970&amp;quot;,&amp;quot;use_linear=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=2&amp;quot;);&lt;br /&gt;
	#one pixel bob&lt;br /&gt;
# 		if ($onepixel) {&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=1&amp;quot;,&amp;quot;bottom=0&amp;quot;);&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=1&amp;quot;);&lt;br /&gt;
# 			$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-1).&amp;quot;:0:0,expand=${width}:${height}:0:1&amp;quot;;&lt;br /&gt;
# 			$fieldorder = 0 if $fieldorder == 1;&lt;br /&gt;
# 			$fieldorder = 1 if $fieldorder == 0;&lt;br /&gt;
# 		}&lt;br /&gt;
	&lt;br /&gt;
	if ($nes) {&lt;br /&gt;
		print JS '//nes'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.($width-8).&amp;quot;:${height}:8:0,expand=${width}:${height}:8:0&amp;quot; if $nes;&lt;br /&gt;
		#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi&lt;br /&gt;
		#Would change the number of channels to 6 and set up 4 routes that copy channel 0 to channels 0 to 3.  Channel 4 and 5 will contain silence.&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity='.$fieldorder.'&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 1;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}&amp;quot; if $d == 1;&lt;br /&gt;
	#$tfields = 0;&lt;br /&gt;
	#$tfields = 4 if $deflicker;&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 4;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add tfields=${tfields}&amp;quot; if $d == 4;&lt;br /&gt;
	&lt;br /&gt;
	#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters&lt;br /&gt;
	#print JS 'app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);'.&amp;quot;\n&amp;quot; if $deflicker;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add unsharp=l3x3:0.6:c3x3:0.6&amp;quot; if $deflicker;&lt;br /&gt;
&lt;br /&gt;
	if ($vhs) {&lt;br /&gt;
		print JS '//vhs'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-12).&amp;quot;:0:0,expand=0:-12:0:0&amp;quot; if $vhs;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($gba) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gba_crop_left.'&amp;quot;,&amp;quot;right='.$gba_crop_right.'&amp;quot;,&amp;quot;top='.$gba_crop_top.'&amp;quot;,&amp;quot;bottom='.$gba_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gba_crop_right-$gba_crop_left).&amp;quot;:&amp;quot;.(240-$gba_crop_bottom-$gba_crop_top).&amp;quot;:${gba_crop_left}:${gba_crop_top}&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=240&amp;quot;,&amp;quot;h=160&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=240:160&amp;quot;;&lt;br /&gt;
		$newwidth = 240;&lt;br /&gt;
		$newheight = 160;&lt;br /&gt;
	} elsif ($gb) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gb_crop_left.'&amp;quot;,&amp;quot;right='.$gb_crop_right.'&amp;quot;,&amp;quot;top='.$gb_crop_top.'&amp;quot;,&amp;quot;bottom='.$gb_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gb_crop_right-$gb_crop_left).&amp;quot;:&amp;quot;.(240-$gb_crop_bottom-$gb_crop_top).&amp;quot;:${gb_crop_left}:${gb_crop_top}&amp;quot;;&lt;br /&gt;
		$newwidth = (320-$gb_crop_right-$gb_crop_left);&lt;br /&gt;
		$newheight = (240-$gb_crop_bottom-$gb_crop_top);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;&lt;br /&gt;
	$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add framestep=${f}&amp;quot;;&lt;br /&gt;
	$x264newframerate = &amp;quot;--fps ${newframerate}&amp;quot;;&lt;br /&gt;
	$x264outext = '264';&lt;br /&gt;
	$x264dimensions = &amp;quot;${newwidth}x${newheight}&amp;quot;;&lt;br /&gt;
	$ampersand = '&amp;amp;';&lt;br /&gt;
	$mp4boxnewframerate = &amp;quot;-fps ${newframerate}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w='.$newwidth.'&amp;quot;,&amp;quot;h='.$newheight.'&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add scale=${newwidth}:${newheight}&amp;quot;;# if $resize;&lt;br /&gt;
	&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print JS 'app.video.codec(&amp;quot;YV12&amp;quot;,&amp;quot;CQ=1&amp;quot;,&amp;quot;0 &amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.load(&amp;quot;NONE&amp;quot;,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.setContainer(&amp;quot;OGM&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.save(&amp;quot;'.&amp;quot;${desktop}/${projname}/avidemux.pipe&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
		print JS 'app.audio.codec(&amp;quot;none&amp;quot;,128,0,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.save(&amp;quot;'.&amp;quot;${avs}&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;.'setSuccess(1);'.&amp;quot;\n&amp;quot;.'app.Exit();'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	close(JS);&lt;br /&gt;
&lt;br /&gt;
# 	my $sourcesplit = '&amp;quot;'.$source.'&amp;quot;';&lt;br /&gt;
# 	my $littleo = &amp;quot;-o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	$littleo = &amp;quot;-ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast&amp;quot; if $mode eq &amp;quot;audio&amp;quot;;&lt;br /&gt;
# 	if (@trimargsarr) {&lt;br /&gt;
# 		my $mencoderargstemp = '';&lt;br /&gt;
# 		while (my $trimargs = shift(@trimargsarr)) {&lt;br /&gt;
# 			$mencoderargstemp .= $mencoderargs.&amp;quot; ${sourcesplit}&amp;quot;.$trimargs.&amp;quot; ${littleo}\n&amp;quot;;&lt;br /&gt;
# 		}&lt;br /&gt;
# 		$mencoderargs = $mencoderargstemp;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$mencoderargs .= &amp;quot; ${sourcesplit} ${littleo}\n&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
# 	&lt;br /&gt;
# 	push(@mencoderargslist,$mencoderargs);&lt;br /&gt;
	&lt;br /&gt;
	if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2])) {&lt;br /&gt;
		require Imager;&lt;br /&gt;
		$img = Imager-&amp;gt;new;&lt;br /&gt;
		$img-&amp;gt;read(file=&amp;gt;&amp;quot;ntsc_d1.tga&amp;quot;) or die &amp;quot;Cannot load statid image: &amp;quot;, $img-&amp;gt;errstr;&lt;br /&gt;
		$font = Imager::Font-&amp;gt;new(file=&amp;gt;$path_to_verdana); #will need to be changed for non-mac unix ...&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[0], $img-&amp;gt;getheight/2, 36, 'white'  ) if $statidlines[0];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[1], 360,               36, 'white'  ) if $statidlines[1];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[2], 400,               36, 'white'  ) if $statidlines[2];&lt;br /&gt;
		&amp;amp;statid_lines_write(&amp;quot;Audio commentary on track 2&amp;quot;, 460, 28, '#E1CE8B') if defined $audio_commentary;&lt;br /&gt;
		$img-&amp;gt;write(file=&amp;gt;'statid.tga')&lt;br /&gt;
		or die 'Cannot save statid.tga: ', $img-&amp;gt;errstr;&lt;br /&gt;
		open(MF,&amp;quot;&amp;gt;statid.txt&amp;quot;) or die &amp;quot;Could not open statid.txt for appending!&amp;quot;;&lt;br /&gt;
		for (1..5) { #once for each second of the statid&lt;br /&gt;
			for (1..$newframerate) { #once for each frame this second&lt;br /&gt;
				print MF &amp;quot;statid.tga\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(MF);&lt;br /&gt;
		if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add scale=${newwidth}:${newheight} -vf-add format=i420 -ovc raw -of rawvideo -nosound -ofps ${newframerate} mf://\@statid.txt -mf fps=${newframerate}:type=tga -o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
		} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet} -audiofile \&amp;quot;silence_stereo_48000.wav\&amp;quot; -vc null -ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast mf://\@statid.txt -mf fps=${newframerate}:type=tga&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pipe_write {&lt;br /&gt;
	print &amp;quot;opening ${avs} ...\n&amp;quot;;&lt;br /&gt;
	open(FIFO,&amp;quot;&amp;gt;${avs}&amp;quot;);&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print &amp;quot;making avidemux.pipe ...\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;mkfifo&amp;quot;, &amp;quot;avidemux.pipe&amp;quot;);&lt;br /&gt;
		print &amp;quot;made avidemux.pipe\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add format=i420 -ovc raw -of rawvideo -nosound -o \&amp;quot;${avs}\&amp;quot; avidemux.pipe &amp;amp;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; --run \&amp;quot;${basename}.js\&amp;quot;&amp;quot;); #need the full path to the js for some reason&lt;br /&gt;
	&amp;amp;rm(&amp;quot;avidemux.pipe&amp;quot;) if $mode eq &amp;quot;video&amp;quot;;&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	close(FIFO);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#statid line text, y-offset, text size, color&lt;br /&gt;
sub statid_lines_write {&lt;br /&gt;
$font-&amp;gt;align(string =&amp;gt; $_[0],&lt;br /&gt;
	aa =&amp;gt; 1,&lt;br /&gt;
	size =&amp;gt; $_[2],&lt;br /&gt;
	color =&amp;gt; $_[3],&lt;br /&gt;
	x =&amp;gt; $img-&amp;gt;getwidth/2,&lt;br /&gt;
	y =&amp;gt; $_[1],&lt;br /&gt;
	halign =&amp;gt; 'center',&lt;br /&gt;
	valign =&amp;gt; 'center',&lt;br /&gt;
	image =&amp;gt; $img);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub round {&lt;br /&gt;
	return int($_[0] + .5 * ($_[0] &amp;lt;=&amp;gt; 0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim ${x264newframerate} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	print &amp;quot;x264 is going ...\n&amp;quot;;&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	print &amp;quot;pipe_write is going ...\n&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${avs}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[2] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[2] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[2]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#MUX&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --ref 3 --mixed-refs --no-fast-pskip --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse all --no-fast-pskip --subme 7 --trellis 2 --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean, x264argsfirstpass, x264argssecondpass&lt;br /&gt;
sub x264 {&lt;br /&gt;
	$x264args_pass2 = pop;&lt;br /&gt;
	$x264args_pass1 = pop;&lt;br /&gt;
&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass1} --output ${nul} \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	#this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile - thanks grenola!&lt;br /&gt;
	while (!(-e &amp;quot;${_[1]}.stats&amp;quot;)) {&lt;br /&gt;
		print(&amp;quot;Waiting for stats file ...\n&amp;quot;);&lt;br /&gt;
		sleep(1);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass2} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
	&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${avs} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[3] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[3] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x ...&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[3]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	$avs = $_[0].'.avs';&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${avs}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source</id>
		<title>Anri-chan/Source</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source"/>
				<updated>2008-11-11T05:14:15Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: regrouped some items, clarified descriptions, and cleaned up whitespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Anri-chan]] is a set of Windows NT-series [http://en.wikipedia.org/wiki/Batch_file batch files] that bring together the functions of a number of movie editing and encoding applications to create movies suitable for publication on Speed Demos Archive.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 4===&lt;br /&gt;
[[Anri-chan/Source/anri.pl|anri.pl]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/config.ini|config.ini]] - External config file loaded on launch; user will eventually be able to use it to totally automate Anri.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_english.pl|lang_english.pl]] - English language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_german.pl|lang_german.pl]] - German language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_swedish.pl|lang_swedish.pl]] - Swedish language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_dutch.pl|lang_dutch.pl]] - Dutch language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/Feature list|Feature list]] - What we're working on now and will be working on in the future.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 3===&lt;br /&gt;
[[Anri-chan/Source/anri.bat|anri.bat]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/statid.bat|statid.bat]] - Station ID sample script; produces an example StatID to preview.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/ini.bat|ini.bat]] - Change settings.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/edit_settings.bat|edit_settings.bat]] - Settings script; asks most of the questions in anri.bat so it can skip them. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Not currently integrated into Anri-chan.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Avisynth Library===&lt;br /&gt;
[[Anri-chan/Source/nate.avs|nate.avs]] - The M2K2SDA Avisynth library written by nate and ballofsnow&lt;br /&gt;
&lt;br /&gt;
===Misc. Files===&lt;br /&gt;
[[Anri-chan/Source/DGIndex.ini|DGIndex.ini]] - DGIndex settings. Take note of Output_Method, Enable_Info_Log and Use_MPA_Extensions.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/infotemplate.avs|infotemplate.avs]] - Used with DGindex to gather information of video, audio and audio delay.&lt;br /&gt;
&lt;br /&gt;
===PHP Files===&lt;br /&gt;
[[Anri-chan/Source/df.php|df.php]] - Produces the dfnd_data.bat and dfnd_titles.bat game database files on the server side.&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
[[Anri-chan/Source/anrichan.nsi|anrichan.nsi]] - Anri-chan 3 installer&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/builddir.bat|builddir.bat]] - Helps build directory content list.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/build_deps.sh|build_deps.sh]] - Builds the OS X binaries needed for Anri 4.&lt;br /&gt;
&lt;br /&gt;
===Coding standards===&lt;br /&gt;
[[Anri-chan/Source/Coding_Standards/Perl|Perl]]&lt;br /&gt;
&lt;br /&gt;
===Deprecated===&lt;br /&gt;
[[Anri-chan/Source/directshowsource_list.txt|directshowsource_list.txt]] - Compare AVI fourCC with list to determine avisource or directshowsource.  Integrated into anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/pgccount.cpp|pgccount.cpp]] - [[Media:pgccount_0.3.zip|exe]] - Finds all unique program chains in an IFO, to be used with Mplayer's stream dump.  Integrated into anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.c|mp4nerf.c]] - [[Media:mp4nerf-b0.1.zip|exe]] - [[Anri-chan/Source/mp4nerf.pl|mp4nerf.pl]] - Disables all but the first audio track in a muxed MP4 file.  Now handled by MP4Box.&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini</id>
		<title>Anri-chan/Source/config old.ini</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/config_old.ini"/>
				<updated>2008-11-11T04:55:12Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added auto mode vars&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$gba_crop_left = 43;&lt;br /&gt;
$gba_crop_top = 39;&lt;br /&gt;
$gba_crop_right = 44;&lt;br /&gt;
$gba_crop_bottom = 41;&lt;br /&gt;
&lt;br /&gt;
$gb_crop_left = 80;&lt;br /&gt;
$gb_crop_top = 48;&lt;br /&gt;
$gb_crop_right = 80;&lt;br /&gt;
$gb_crop_bottom = 48;&lt;br /&gt;
&lt;br /&gt;
#for mplayer/mencoder&lt;br /&gt;
$really_quiet = &amp;quot;-really-quiet&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#sample settings for auto mode, probably needs commenting&lt;br /&gt;
#boolean vars can be either 1/0 or $lang{y/n}&lt;br /&gt;
$auto=0;&lt;br /&gt;
if ($auto) {&lt;br /&gt;
	@menuchoices=(2);&lt;br /&gt;
	@dvdchoices=qw(game);&lt;br /&gt;
	$projname='game';&lt;br /&gt;
	$startframe=1022;&lt;br /&gt;
	$dvdsource=1;&lt;br /&gt;
	$dfnd=0;&lt;br /&gt;
	$dfnd_set=1;&lt;br /&gt;
	$d=1;&lt;br /&gt;
	$f=1;&lt;br /&gt;
	$twod=0;&lt;br /&gt;
	$nes=0;&lt;br /&gt;
	$gb=0;&lt;br /&gt;
	$gba=0;&lt;br /&gt;
	$prog=0;&lt;br /&gt;
	$fieldorder=1;&lt;br /&gt;
	$vhs=0;&lt;br /&gt;
	$onepixel=0;&lt;br /&gt;
	$deflicker=0;&lt;br /&gt;
	$maxaudiobitrate=256000;&lt;br /&gt;
	$make_nmf=1;&lt;br /&gt;
	$trim=1;&lt;br /&gt;
	@trimarr=(1000,1100,2000,2100,5000,5100,6000,6100);&lt;br /&gt;
	$statid=1;&lt;br /&gt;
	@statidlines=('name','game','type and time');&lt;br /&gt;
	@encodethese=qw(lq mq hq iq xq lqavi mqavi);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-11-11T04:42:01Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: auto mode works now, which required little changes everywhere, but maybe i didn't overlook anything&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#default&lt;br /&gt;
$language = &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#goes after a drive letter&lt;br /&gt;
	$colon = ':';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = 'NUL';&lt;br /&gt;
	&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;START&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else { #we're on unix&lt;br /&gt;
	#desktop location and other os-dependent stuff&lt;br /&gt;
	if (&amp;quot;$^O&amp;quot; eq &amp;quot;darwin&amp;quot;) {&lt;br /&gt;
		$desktop = glob(&amp;quot;~/Desktop&amp;quot;);&lt;br /&gt;
		$path_to_verdana = &amp;quot;/Library/Fonts/Verdana.ttf&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		### FIXME NON-MAC UNIX DESKTOP LOCATION, PATH TO VERDANA&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory ### FIXME ###&lt;br /&gt;
	$anri_dir = `pwd`;&lt;br /&gt;
	chomp($anri_dir);&lt;br /&gt;
	&lt;br /&gt;
	#our encoders - invocation names only - path will be prepended later ...&lt;br /&gt;
	$x264 = 'x264';&lt;br /&gt;
	$afconvert = 'afconvert';&lt;br /&gt;
	#for mp4box&lt;br /&gt;
#	print &amp;quot;export DYLD_LIBRARY_PATH=${anri_dir}\n&amp;quot;;&lt;br /&gt;
	$mp4box = 'mp4box';&lt;br /&gt;
	$ffmpeg = 'ffmpeg';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$avidemux = $anri_dir.'/avidemux2_qt4.app/Contents/Resources/script';&lt;br /&gt;
	$mplayer = &amp;quot;mplayer&amp;quot;;&lt;br /&gt;
	$mencoder = &amp;quot;mencoder&amp;quot;;&lt;br /&gt;
	$really_quiet = &amp;quot;-really-quiet&amp;quot;; #for mencoder&lt;br /&gt;
	$wget = &amp;quot;wget&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;${anri_dir}/dvdripto&amp;quot;; ### FIXME&lt;br /&gt;
	&lt;br /&gt;
	#not needed under unix&lt;br /&gt;
	$colon = '';&lt;br /&gt;
	&lt;br /&gt;
	#black hole&lt;br /&gt;
	$nul = '/dev/null';&lt;br /&gt;
&lt;br /&gt;
	#to start programs/open urls&lt;br /&gt;
	$start = &amp;quot;open&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#color initialization&lt;br /&gt;
	require Term::ANSIColor;&lt;br /&gt;
	import Term::ANSIColor qw(color);&lt;br /&gt;
	$cecho = &amp;quot;echo&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#fewer colors to choose from than under windows if we want to maintain portability ...&lt;br /&gt;
	$black_on_gray = color(&amp;quot;black on_white&amp;quot;);&lt;br /&gt;
	$gray_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$white_on_black = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$aqua_on_black = color(&amp;quot;green on_black&amp;quot;);&lt;br /&gt;
	$blue_on_black = color(&amp;quot;blue on_black&amp;quot;);&lt;br /&gt;
	$teal_on_gray = color(&amp;quot;green on_white&amp;quot;);&lt;br /&gt;
	$navy_on_gray = color(&amp;quot;blue on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_gray = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$maroon_on_silver = color(&amp;quot;magenta on_white&amp;quot;);&lt;br /&gt;
	$white_on_gray = color(&amp;quot;white on_black&amp;quot;);&lt;br /&gt;
	$red_on_gray = color(&amp;quot;red on_white&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.color(&amp;quot;reset&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
&lt;br /&gt;
#load config file&lt;br /&gt;
require 'config.ini' if -e 'config.ini';&lt;br /&gt;
&lt;br /&gt;
#localization&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
require &amp;quot;lang_${language}.pl&amp;quot; if $language ne &amp;quot;english&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&amp;amp;out_cls;&lt;br /&gt;
@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
);&lt;br /&gt;
while (1) {&lt;br /&gt;
	if (@menuchoices) {&lt;br /&gt;
		eval($mainmenu[shift(@menuchoices)-1][1]);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;out_cls;&lt;br /&gt;
		&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
		&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/([1-5])$/) {&lt;br /&gt;
				#execute the contents of this value in the array&lt;br /&gt;
				eval($mainmenu[$1-1][1]);&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	if (! defined $startframe) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			@sources = &amp;amp;pipe_prepare($projname, &amp;quot;sources&amp;quot;);&lt;br /&gt;
			$avidemuxarg = &amp;quot; --load&amp;quot;;&lt;br /&gt;
			for (@sources) {&lt;br /&gt;
				$avidemuxargs .= &amp;quot;${avidemuxarg} \&amp;quot;${desktop}/anri_sample/${_}\&amp;quot;&amp;quot;;&lt;br /&gt;
				$avidemuxarg = &amp;quot; --append&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			#system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; ${avidemuxargs} &amp;amp;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[0-9]+$/) {&lt;br /&gt;
				$startframe = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		### remove .idx files&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF()\nSeparateFields()\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	if (!@statidlines) {&lt;br /&gt;
		foreach $i (1 .. 3) {&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			chomp($statidline);&lt;br /&gt;
			$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
			push(@statidlines,$statidline);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{SECTION_PROJECT_SETUP});&lt;br /&gt;
	if (! defined $projname) {&lt;br /&gt;
		&amp;amp;out_info($lang{ENTER_PROJECT_NAME});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
		system($reset_color);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (!m/[% ]/) {&lt;br /&gt;
				$projname = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
			print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins if $os eq 'windows';&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{MOVIE_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{MOVIE_SOURCE_MPEG2_HINT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if (q_boo($lang{MPEG2_SOURCE_QUESTION}, $dvdsource)) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;q_dfnd if !$dfnd_set;&lt;br /&gt;
		if (!$dfnd_set) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			if (! defined $d) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[14]$/) {&lt;br /&gt;
						$d = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (! defined $f) {&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					if (m/^[1-5]$/) {&lt;br /&gt;
						$f = $_;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			q_boo($lang{QUESTION_ND}, $twod) if ($f == 1);&lt;br /&gt;
			if (!$auto) {&lt;br /&gt;
				#:q_submit_dfnd&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
				system($start, 'http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0') if q_boo($lang{QUESTION_SUBMIT_DFND});&lt;br /&gt;
				#:dfnd_is_set&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$hqq = 17 if $d == 4;&lt;br /&gt;
		$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Video properties&lt;br /&gt;
		# &lt;br /&gt;
		# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
		# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
		# skip the entire section. Anyways..&lt;br /&gt;
		# &lt;br /&gt;
		# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
		# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
		# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
		# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
		# &lt;br /&gt;
		# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
		# &lt;br /&gt;
		# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
		#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# function: q_fieldorder&lt;br /&gt;
		# &lt;br /&gt;
		# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
		# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
		# better.&lt;br /&gt;
		# &lt;br /&gt;
		# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
		# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
		############################################################################&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		if (! defined $fieldorder) {&lt;br /&gt;
			&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			#:q_fieldorder_p2&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[tb]$/) {&lt;br /&gt;
					#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
					tr/tb/10/;&lt;br /&gt;
					$fieldorder = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		#q_vhs&lt;br /&gt;
		q_boo($lang{QUESTION_VHS}, $vhs);&lt;br /&gt;
&lt;br /&gt;
		#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if ($f != 2);&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_NES}, $nes);&lt;br /&gt;
		#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GBA}, $gba);&lt;br /&gt;
		$deflicker=1 if $gba;&lt;br /&gt;
		#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_GB}, $gb);&lt;br /&gt;
		$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
		q_boo($lang{QUESTION_DEFLICKERED}, $deflicker) if ($f != 2);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. If the frame range is like 50 to 30 an error is shown, same if a '-'&lt;br /&gt;
	# is inputted.&lt;br /&gt;
	# Users can enter dummy values and edit project_job.bat later on and it will &lt;br /&gt;
	# still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (! defined $trim) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo($lang{QUESTION_TRIM}, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. Implemented basic checking if the frame range is valid.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;${start} \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} elsif ((@trimarr % 2) &amp;amp;&amp;amp; ($trimarr[@trimarr-1] &amp;gt; $_)) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_RANGE};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (! defined $statid) {&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo($lang{QUESTION_STATID}, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if ($auto or q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		%qualities = (&lt;br /&gt;
				#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
				#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			lq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			mq    =&amp;gt; [			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			hq    =&amp;gt; [			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			iq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			xq    =&amp;gt; [   (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			lqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			mqavi =&amp;gt; [			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
		);&lt;br /&gt;
		&lt;br /&gt;
		if (!@encodethese) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
			for (qw(lq mq hq iq xq lqavi mqavi)) {&lt;br /&gt;
				my @t = @{ $qualities{$_} };&lt;br /&gt;
				#if this quality is not disabled for these content properties - then ask the user if they want to make it&lt;br /&gt;
				push(@encodethese, $_) if $t[0] and q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $t[2] (&amp;quot;.($t[4]+($t[5]/1000)).&amp;quot; kbit/sec)&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $qualities{$_}[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my @t = @{ $qualities{$_} };&lt;br /&gt;
			print &amp;quot;now encoding $t[2] ($projname.$t[3].$nmf, $projname.$t[3], @t[4..8])\n&amp;quot;;&lt;br /&gt;
			$t[1]-&amp;gt;($projname.$t[3].$nmf, $projname.$t[3], @t[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	} else { #unix&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.tga&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	my $f = shift;&lt;br /&gt;
	map { $_-&amp;gt;join() } map { threads-&amp;gt;create($f, $_) } @_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo($lang{QUESTION_CREATE_NMF},$make_nmf)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	if ($statid) {&lt;br /&gt;
		$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
		$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
		$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
		$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
		$projtemp .= &amp;quot;statid++run++statid\n&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [$lang{y}/$lang{n}] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$secondarg = '.';&lt;br /&gt;
	$secondarg = $_[1] if $_[1];&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${secondarg}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub trim($) { #from http://www.somacon.com/p114.php&lt;br /&gt;
	my $string = shift;&lt;br /&gt;
	$string =~ s/^\s+//;&lt;br /&gt;
	$string =~ s/\s+$//;&lt;br /&gt;
	return $string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	if (defined $_[1]) {&lt;br /&gt;
		if ($_[1] == 1 or $_[1] eq $lang{&amp;quot;y&amp;quot;}) { #for some reason {y} causes textwrangler's syntax highlighting to break&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($_[1] == 0 or $_[1] eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($_[0].&amp;quot; [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput eq $lang{&amp;quot;y&amp;quot;}) {&lt;br /&gt;
			$_[1] = 1;&lt;br /&gt;
			return 1;&lt;br /&gt;
		} elsif ($userinput eq $lang{n}) {&lt;br /&gt;
			$_[1] = 0;&lt;br /&gt;
			return 0;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				if (q_boo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN})) {&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg = $enterhelp;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~s/\&amp;amp;amp\;/\&amp;amp;/g;&lt;br /&gt;
				#right now only the accent in Pokemon and \&amp;amp;amp; need to be changed, but it'd be better for it to work with all utf chars&lt;br /&gt;
				$title=~s/(\xc3\xa9)/chr(130)/eg;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
				#printing at most 50 lines at a time&lt;br /&gt;
				if(($i+1) % 50 == 0) {&lt;br /&gt;
					print $titles;&lt;br /&gt;
					$titles = '';&lt;br /&gt;
					&amp;amp;out_info($lang{PRESS_ENTER_PAGE});&lt;br /&gt;
					&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo($lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN});&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[a-z]$/i) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		} else { #unix&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_PATH});&lt;br /&gt;
			&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP_UNIX});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (!m/^$/) {&lt;br /&gt;
					$driveletter = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				} else {&lt;br /&gt;
					$errormsg=$lang{DVD_MUST_ENTER_DRIVE_PATH};&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#this is mainly because when you drag things onto a terminal window in os x it cats a space on the end of the path&lt;br /&gt;
	$driveletter = &amp;amp;trim($driveletter);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir; #paranoia&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}${colon}/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 2.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	#we don't actually index anything under unix but we still need to pick from the ripped dvd sources, write the start of the main project .avs and set some variables&lt;br /&gt;
	$maxaudiobr ||= 320000;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		@dvdfilemasksorig = @dvdfilemasks;&lt;br /&gt;
		foreach $mask (@dvdfilemasksorig) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (@dvdchoices) {&lt;br /&gt;
		map { $_ = &amp;quot;${dvdripto_parentdir}/$_&amp;quot; } @dvdchoices;&lt;br /&gt;
	} else {&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
			@errormsgs = ();&lt;br /&gt;
			#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
			if (m/^$/) {&lt;br /&gt;
				push(@errormsgs,$lang{INVALID_INPUT});&lt;br /&gt;
			} else {&lt;br /&gt;
				for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
					if (defined($gooddvddirs{$_})) {&lt;br /&gt;
						push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
					} else {&lt;br /&gt;
						push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error(@errormsgs);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $os eq 'windows';&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ m/^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					if ($os eq 'windows') {&lt;br /&gt;
						# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
						#I01_001.vob&lt;br /&gt;
						#dvdtest_1_I01_001.d2v&lt;br /&gt;
						#dvdtest_1_I01_001.log&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
						#print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
						#print &amp;quot;\n&amp;quot;;&lt;br /&gt;
						system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
						&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
						### FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
						for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
							&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
							if (defined($3)) {&lt;br /&gt;
								$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					} else { #unix&lt;br /&gt;
						&amp;amp;cp($mpegfile,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;MPEG2source(\&amp;quot;${1}.${2}\&amp;quot;,upconv=1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
						### FIXME get $maxaudiobr?&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub pipe_prepare($$) {&lt;br /&gt;
	$basename = shift;&lt;br /&gt;
	$mode = shift;&lt;br /&gt;
&lt;br /&gt;
	$avs = &amp;quot;${basename}.pipe&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if -e $avs;&lt;br /&gt;
	system(&amp;quot;mkfifo&amp;quot;, $avs);&lt;br /&gt;
&lt;br /&gt;
	open(AVS, &amp;quot;${basename}.avs&amp;quot;); #must be unix text when running sasami under unix ...&lt;br /&gt;
	@avs = &amp;lt;AVS&amp;gt;;&lt;br /&gt;
	close(AVS);&lt;br /&gt;
	@sources = ();&lt;br /&gt;
	@trims = ();&lt;br /&gt;
	$f = 1;&lt;br /&gt;
	for (@avs) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		next if m/^#/;&lt;br /&gt;
		push(@sources,$1) if m/^.*MPEG2source\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*avisource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		push(@sources,$1) if m/^.*directshowsource\(&amp;quot;([^&amp;quot;]+)&amp;quot;.*$/i;&lt;br /&gt;
		$fieldorder = 1 if m/^AssumeTFF\(\)/i;&lt;br /&gt;
		$fieldorder = 0 if m/^AssumeBFF\(\)/i;&lt;br /&gt;
		$d = 1 if m/^global d1 = true/;&lt;br /&gt;
		$d = 4 if m/^global d1 = false/;&lt;br /&gt;
		$d = 4 if m/^separatefields\(\)$/i; #for sample extraction&lt;br /&gt;
		$f = $1 if m/^changefps\(f1\/([0-9])\)/;&lt;br /&gt;
		$deflicker = 1 if m/^nate_retard_bob_2/;&lt;br /&gt;
		$vhs = 1 if m/^nate_vhs_head_change_erase/;&lt;br /&gt;
		$onepixel = 1 if m/^nate_1_pixel_bob_fix/;&lt;br /&gt;
		$nes = 1 if m/^nate_nes$/;&lt;br /&gt;
		push(@trims,&amp;quot;$1,$2&amp;quot;) if m/trim\(([0-9]+),([0-9]+)\)/;&lt;br /&gt;
		$gba = 1 if m/^nate_gba$/;&lt;br /&gt;
		$gb = 1 if m/^nate_gb$/;&lt;br /&gt;
		#$resize = 1 if m/^lanczos4resize\(/;&lt;br /&gt;
		#nate format&lt;br /&gt;
		$statidlines[0] = $1 if m/^statid1=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[1] = $1 if m/^statid2=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		$statidlines[2] = $1 if m/^statid3=&amp;quot;&amp;quot;&amp;quot;(.*)&amp;quot;&amp;quot;&amp;quot;$/;&lt;br /&gt;
		#anri format&lt;br /&gt;
		(@statidlines) = ($1, $2, $3) if m/^statid=.*\(run,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;,&amp;quot;([^&amp;quot;])&amp;quot;\)/;&lt;br /&gt;
	}&lt;br /&gt;
	die 'sasami: no sources detected in .avs!' if @sources == 0;&lt;br /&gt;
	return @sources if $mode eq 'sources';&lt;br /&gt;
	&lt;br /&gt;
	open(JS, &amp;quot;&amp;gt;${basename}.js&amp;quot;) or die &amp;quot;could not open ${basename}.js for writing&amp;quot;;&lt;br /&gt;
	print JS '//AD  &amp;lt;- Needed to identify//'.&amp;quot;\n\nvar app = new Avidemux();\n\n&amp;quot;;&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @sources ; $i++) {&lt;br /&gt;
		print JS &amp;quot;app.forceUnpack();\n&amp;quot;;&lt;br /&gt;
		if ($i == 0) {&lt;br /&gt;
			print JS &amp;quot;app.load(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print JS &amp;quot;app.append(\&amp;quot;${desktop}/${projname}/${sources[$i]}\&amp;quot;);\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
# 	@mencoderargslist = ();&lt;br /&gt;
# 	#build mencoder command to feed fifo&lt;br /&gt;
# 	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
# 		$mencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet}&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
	&lt;br /&gt;
	print JS &amp;quot;\napp.clearSegments();\n&amp;quot;;&lt;br /&gt;
	my $sourcenum = 0;&lt;br /&gt;
	my $previous_sourcelength = 0;&lt;br /&gt;
	my $this_sourcelength;&lt;br /&gt;
	foreach $source (@sources) {&lt;br /&gt;
		#get vital info about source&lt;br /&gt;
		my $mplayeridentify = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
mplayer -identify -vo null -slave ${source} 2&amp;gt;&amp;amp;1 &amp;lt;&amp;lt;ENDOFSCRIPT&lt;br /&gt;
quit&lt;br /&gt;
ENDOFSCRIPT&lt;br /&gt;
SABRAC&lt;br /&gt;
		for (qx($mplayeridentify)) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;&lt;br /&gt;
			$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;&lt;br /&gt;
			$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;&lt;br /&gt;
			$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;&lt;br /&gt;
			$this_sourcelength = &amp;amp;round($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;&lt;br /&gt;
		}&lt;br /&gt;
	# 	print &amp;quot;$width\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$height\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$framerate\n&amp;quot;;&lt;br /&gt;
	# 	print &amp;quot;$maxaudiobitrate\n&amp;quot;;&lt;br /&gt;
		$pal = ($height eq &amp;quot;576&amp;quot;);&lt;br /&gt;
		### FIXME moved from above the foreach source block because it depends on $pal being set - check only first source and then set?&lt;br /&gt;
		$newframerate = ($pal ? (50/$f) : (59.94/$f)); #required for trimming&lt;br /&gt;
		&lt;br /&gt;
		#trimming&lt;br /&gt;
	# 	$framerate = 29.97;&lt;br /&gt;
	# 	$framerate = 25 if $pal;&lt;br /&gt;
		my $sourcelength = ($previous_sourcelength + $this_sourcelength);&lt;br /&gt;
		for (@trims) {&lt;br /&gt;
			if ($_) {&lt;br /&gt;
				#print &amp;quot;popped: $_\n&amp;quot;;&lt;br /&gt;
				my $trimone = '';&lt;br /&gt;
				my $trimtwo = '';&lt;br /&gt;
				m/^(.*),(.*)$/;&lt;br /&gt;
				if ($1) {&lt;br /&gt;
					if ($1 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = ($1 - $previous_sourcelength);&lt;br /&gt;
						$trimtwo = ($this_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ($2) {&lt;br /&gt;
					if ($2 &amp;lt; $sourcelength) {&lt;br /&gt;
						$trimone = 0 if !$trimone;&lt;br /&gt;
						$trimtwo = ($2 - $previous_sourcelength - $trimone + 1);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (($trimone ne '') &amp;amp;&amp;amp; ($trimtwo ne '')) {&lt;br /&gt;
					print JS &amp;quot;app.addSegment(${sourcenum},${trimone},${trimtwo});\n&amp;quot;;&lt;br /&gt;
					$_ = &amp;quot;,&amp;quot;;&lt;br /&gt;
					#keep second trim point in case we haven't reached it yet&lt;br /&gt;
					$_ .= $2 if $2 &amp;gt; $sourcelength;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$previous_sourcelength = $sourcelength;&lt;br /&gt;
		$sourcenum++;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
# app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=14&amp;quot;,&amp;quot;right=16&amp;quot;,&amp;quot;top=22&amp;quot;,&amp;quot;bottom=30&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;resamplefps&amp;quot;,&amp;quot;newfps=29970&amp;quot;,&amp;quot;use_linear=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity=0&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);&lt;br /&gt;
# app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=2&amp;quot;);&lt;br /&gt;
	#one pixel bob&lt;br /&gt;
# 		if ($onepixel) {&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=1&amp;quot;,&amp;quot;bottom=0&amp;quot;);&lt;br /&gt;
# 			app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=1&amp;quot;);&lt;br /&gt;
# 			$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-1).&amp;quot;:0:0,expand=${width}:${height}:0:1&amp;quot;;&lt;br /&gt;
# 			$fieldorder = 0 if $fieldorder == 1;&lt;br /&gt;
# 			$fieldorder = 1 if $fieldorder == 0;&lt;br /&gt;
# 		}&lt;br /&gt;
	&lt;br /&gt;
	if ($nes) {&lt;br /&gt;
		print JS '//nes'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=8&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=0&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.($width-8).&amp;quot;:${height}:8:0,expand=${width}:${height}:8:0&amp;quot; if $nes;&lt;br /&gt;
		#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi&lt;br /&gt;
		#Would change the number of channels to 6 and set up 4 routes that copy channel 0 to channels 0 to 3.  Channel 4 and 5 will contain silence.&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mcdeinterlace&amp;quot;,&amp;quot;mode=2&amp;quot;,&amp;quot;qp=1&amp;quot;,&amp;quot;initial_parity='.$fieldorder.'&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 1;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}&amp;quot; if $d == 1;&lt;br /&gt;
	#$tfields = 0;&lt;br /&gt;
	#$tfields = 4 if $deflicker;&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;YADIF&amp;quot;,&amp;quot;mode=3&amp;quot;,&amp;quot;order=1&amp;quot;);'.&amp;quot;\n&amp;quot; if $d == 4;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add tfields=${tfields}&amp;quot; if $d == 4;&lt;br /&gt;
	&lt;br /&gt;
	#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters&lt;br /&gt;
	#print JS 'app.video.addFilter(&amp;quot;msharpen&amp;quot;,&amp;quot;mask=0&amp;quot;,&amp;quot;highq=1&amp;quot;,&amp;quot;strength=100&amp;quot;,&amp;quot;threshold=15&amp;quot;);'.&amp;quot;\n&amp;quot; if $deflicker;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add unsharp=l3x3:0.6:c3x3:0.6&amp;quot; if $deflicker;&lt;br /&gt;
&lt;br /&gt;
	if ($vhs) {&lt;br /&gt;
		print JS '//vhs'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;addblack&amp;quot;,&amp;quot;left=0&amp;quot;,&amp;quot;right=0&amp;quot;,&amp;quot;top=0&amp;quot;,&amp;quot;bottom=12&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=${width}:&amp;quot;.($height-12).&amp;quot;:0:0,expand=0:-12:0:0&amp;quot; if $vhs;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($gba) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gba_crop_left.'&amp;quot;,&amp;quot;right='.$gba_crop_right.'&amp;quot;,&amp;quot;top='.$gba_crop_top.'&amp;quot;,&amp;quot;bottom='.$gba_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gba_crop_right-$gba_crop_left).&amp;quot;:&amp;quot;.(240-$gba_crop_bottom-$gba_crop_top).&amp;quot;:${gba_crop_left}:${gba_crop_top}&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=240&amp;quot;,&amp;quot;h=160&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=240:160&amp;quot;;&lt;br /&gt;
		$newwidth = 240;&lt;br /&gt;
		$newheight = 160;&lt;br /&gt;
	} elsif ($gb) {&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w=320&amp;quot;,&amp;quot;h=240&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add scale=320:240&amp;quot;;&lt;br /&gt;
		print JS 'app.video.addFilter(&amp;quot;crop&amp;quot;,&amp;quot;left='.$gb_crop_left.'&amp;quot;,&amp;quot;right='.$gb_crop_right.'&amp;quot;,&amp;quot;top='.$gb_crop_top.'&amp;quot;,&amp;quot;bottom='.$gb_crop_bottom.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		#$mencoderargs .= &amp;quot; -vf-add crop=&amp;quot;.(320-$gb_crop_right-$gb_crop_left).&amp;quot;:&amp;quot;.(240-$gb_crop_bottom-$gb_crop_top).&amp;quot;:${gb_crop_left}:${gb_crop_top}&amp;quot;;&lt;br /&gt;
		$newwidth = (320-$gb_crop_right-$gb_crop_left);&lt;br /&gt;
		$newheight = (240-$gb_crop_bottom-$gb_crop_top);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;&lt;br /&gt;
	$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add framestep=${f}&amp;quot;;&lt;br /&gt;
	$x264newframerate = &amp;quot;--fps ${newframerate}&amp;quot;;&lt;br /&gt;
	$x264outext = '264';&lt;br /&gt;
	$x264dimensions = &amp;quot;${newwidth}x${newheight}&amp;quot;;&lt;br /&gt;
	$ampersand = '&amp;amp;';&lt;br /&gt;
	$mp4boxnewframerate = &amp;quot;-fps ${newframerate}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	print JS 'app.video.addFilter(&amp;quot;mpresize&amp;quot;,&amp;quot;w='.$newwidth.'&amp;quot;,&amp;quot;h='.$newheight.'&amp;quot;,&amp;quot;algo=2&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	#$mencoderargs .= &amp;quot; -vf-add scale=${newwidth}:${newheight}&amp;quot;;# if $resize;&lt;br /&gt;
	&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print JS 'app.video.codec(&amp;quot;YV12&amp;quot;,&amp;quot;CQ=1&amp;quot;,&amp;quot;0 &amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.load(&amp;quot;NONE&amp;quot;,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.setContainer(&amp;quot;OGM&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.save(&amp;quot;'.&amp;quot;${desktop}/${projname}/avidemux.pipe&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
		print JS 'app.audio.codec(&amp;quot;none&amp;quot;,128,0,&amp;quot;&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
		print JS 'app.audio.save(&amp;quot;'.&amp;quot;${avs}&amp;quot;.'&amp;quot;);'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print JS &amp;quot;\n&amp;quot;.'setSuccess(1);'.&amp;quot;\n&amp;quot;.'app.Exit();'.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	close(JS);&lt;br /&gt;
&lt;br /&gt;
# 	my $sourcesplit = '&amp;quot;'.$source.'&amp;quot;';&lt;br /&gt;
# 	my $littleo = &amp;quot;-o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	$littleo = &amp;quot;-ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast&amp;quot; if $mode eq &amp;quot;audio&amp;quot;;&lt;br /&gt;
# 	if (@trimargsarr) {&lt;br /&gt;
# 		my $mencoderargstemp = '';&lt;br /&gt;
# 		while (my $trimargs = shift(@trimargsarr)) {&lt;br /&gt;
# 			$mencoderargstemp .= $mencoderargs.&amp;quot; ${sourcesplit}&amp;quot;.$trimargs.&amp;quot; ${littleo}\n&amp;quot;;&lt;br /&gt;
# 		}&lt;br /&gt;
# 		$mencoderargs = $mencoderargstemp;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$mencoderargs .= &amp;quot; ${sourcesplit} ${littleo}\n&amp;quot;;&lt;br /&gt;
# 	}&lt;br /&gt;
# 	&lt;br /&gt;
# 	push(@mencoderargslist,$mencoderargs);&lt;br /&gt;
	&lt;br /&gt;
	if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2])) {&lt;br /&gt;
		require Imager;&lt;br /&gt;
		$img = Imager-&amp;gt;new;&lt;br /&gt;
		$img-&amp;gt;read(file=&amp;gt;&amp;quot;ntsc_d1.tga&amp;quot;) or die &amp;quot;Cannot load statid image: &amp;quot;, $img-&amp;gt;errstr;&lt;br /&gt;
		$font = Imager::Font-&amp;gt;new(file=&amp;gt;$path_to_verdana); #will need to be changed for non-mac unix ...&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[0], $img-&amp;gt;getheight/2, 36, 'white'  ) if $statidlines[0];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[1], 360,               36, 'white'  ) if $statidlines[1];&lt;br /&gt;
		&amp;amp;statid_lines_write($statidlines[2], 400,               36, 'white'  ) if $statidlines[2];&lt;br /&gt;
		&amp;amp;statid_lines_write(&amp;quot;Audio commentary on track 2&amp;quot;, 460, 28, '#E1CE8B') if defined $audio_commentary;&lt;br /&gt;
		$img-&amp;gt;write(file=&amp;gt;'statid.tga')&lt;br /&gt;
		or die 'Cannot save statid.tga: ', $img-&amp;gt;errstr;&lt;br /&gt;
		open(MF,&amp;quot;&amp;gt;statid.txt&amp;quot;) or die &amp;quot;Could not open statid.txt for appending!&amp;quot;;&lt;br /&gt;
		for (1..5) { #once for each second of the statid&lt;br /&gt;
			for (1..$newframerate) { #once for each frame this second&lt;br /&gt;
				print MF &amp;quot;statid.tga\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(MF);&lt;br /&gt;
		if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add scale=${newwidth}:${newheight} -vf-add format=i420 -ovc raw -of rawvideo -nosound -ofps ${newframerate} mf://\@statid.txt -mf fps=${newframerate}:type=tga -o \&amp;quot;${avs}\&amp;quot;&amp;quot;;&lt;br /&gt;
		} elsif ($mode eq &amp;quot;audio&amp;quot;) {&lt;br /&gt;
			$statidmencoderargs = &amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; ${really_quiet} -audiofile \&amp;quot;silence_stereo_48000.wav\&amp;quot; -vc null -ao pcm:file=\&amp;quot;${avs}\&amp;quot;:fast mf://\@statid.txt -mf fps=${newframerate}:type=tga&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pipe_write {&lt;br /&gt;
	print &amp;quot;opening ${avs} ...\n&amp;quot;;&lt;br /&gt;
	open(FIFO,&amp;quot;&amp;gt;${avs}&amp;quot;);&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	if ($mode eq &amp;quot;video&amp;quot;) {&lt;br /&gt;
		print &amp;quot;making avidemux.pipe ...\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;mkfifo&amp;quot;, &amp;quot;avidemux.pipe&amp;quot;);&lt;br /&gt;
		print &amp;quot;made avidemux.pipe\n&amp;quot;;&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mencoder}\&amp;quot; ${really_quiet} -vf-add format=i420 -ovc raw -of rawvideo -nosound -o \&amp;quot;${avs}\&amp;quot; avidemux.pipe &amp;amp;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;sh \&amp;quot;${avidemux}\&amp;quot; --run \&amp;quot;${basename}.js\&amp;quot;&amp;quot;); #need the full path to the js for some reason&lt;br /&gt;
	&amp;amp;rm(&amp;quot;avidemux.pipe&amp;quot;) if $mode eq &amp;quot;video&amp;quot;;&lt;br /&gt;
	print(&amp;quot;$statidmencoderargs\n&amp;quot;) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	system($statidmencoderargs) if (($statidlines[0]) || ($statidlines[1]) || ($statidlines[2]));&lt;br /&gt;
	close(FIFO);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#statid line text, y-offset, text size, color&lt;br /&gt;
sub statid_lines_write {&lt;br /&gt;
$font-&amp;gt;align(string =&amp;gt; $_[0],&lt;br /&gt;
	aa =&amp;gt; 1,&lt;br /&gt;
	size =&amp;gt; $_[2],&lt;br /&gt;
	color =&amp;gt; $_[3],&lt;br /&gt;
	x =&amp;gt; $img-&amp;gt;getwidth/2,&lt;br /&gt;
	y =&amp;gt; $_[1],&lt;br /&gt;
	halign =&amp;gt; 'center',&lt;br /&gt;
	valign =&amp;gt; 'center',&lt;br /&gt;
	image =&amp;gt; $img);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub round {&lt;br /&gt;
	return int($_[0] + .5 * ($_[0] &amp;lt;=&amp;gt; 0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim ${x264newframerate} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	print &amp;quot;x264 is going ...\n&amp;quot;;&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	print &amp;quot;pipe_write is going ...\n&amp;quot;;&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${avs}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[2] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[2] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[2]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#MUX&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--level 4.1 --bframes 3 --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --ref 3 --mixed-refs --no-fast-pskip --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	&amp;amp;x264(&lt;br /&gt;
		@_,&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse none --no-ssim',&lt;br /&gt;
		'--vbv-bufsize 512 --vbv-maxrate 768 --level 1.3 --no-cabac --threads auto --thread-input --progress --no-psnr --analyse all --no-fast-pskip --subme 7 --trellis 2 --me umh'&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean, x264argsfirstpass, x264argssecondpass&lt;br /&gt;
sub x264 {&lt;br /&gt;
	$x264args_pass2 = pop;&lt;br /&gt;
	$x264args_pass1 = pop;&lt;br /&gt;
&lt;br /&gt;
	#VIDEO&lt;br /&gt;
	$x264newframerate = '';&lt;br /&gt;
	$x264outext = 'mp4';&lt;br /&gt;
	$x264dimensions = '';&lt;br /&gt;
	$ampersand = '';&lt;br /&gt;
	$mp4boxnewframerate = '';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		$avs = $_[0].'.avs';&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;video&amp;quot;);&lt;br /&gt;
		$avs = $_[0].'.pipe';&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass1} --output ${nul} \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	#this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile - thanks grenola!&lt;br /&gt;
	while (!(-e &amp;quot;${_[1]}.stats&amp;quot;)) {&lt;br /&gt;
		print(&amp;quot;Waiting for stats file ...\n&amp;quot;);&lt;br /&gt;
		sleep(1);&lt;br /&gt;
	}&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --qpmin ${_[4]} ${x264newframerate} ${x264args_pass2} --output \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; \&amp;quot;${avs}\&amp;quot; ${x264dimensions} ${ampersand}&amp;quot;);&lt;br /&gt;
	&amp;amp;pipe_write if $os ne 'windows';&lt;br /&gt;
	system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
	&lt;br /&gt;
	#AUDIO&lt;br /&gt;
	$audioext = 'mp4';&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${avs} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pipe_prepare($_[0],&amp;quot;audio&amp;quot;);&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; -dumpstream -dumpfile \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${avs}\&amp;quot; &amp;amp;&amp;quot;);&lt;br /&gt;
		&amp;amp;pipe_write;&lt;br /&gt;
		system(&amp;quot;rm&amp;quot;, $avs) if $os ne 'windows';&lt;br /&gt;
		if ($faac) {&lt;br /&gt;
			$audioext = 'aac';&lt;br /&gt;
			#thanks grenola&lt;br /&gt;
			$faacq = &amp;quot;-q 65 -c 8000&amp;quot;; #default is for mq/lq&lt;br /&gt;
			$faacq = &amp;quot;-b 128&amp;quot; if $_[3] ge &amp;quot;128000&amp;quot;;&lt;br /&gt;
			$faacq = &amp;quot;-b 256&amp;quot; if $_[3] ge &amp;quot;256000&amp;quot;;&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${faac}\&amp;quot; --mpeg-vers 4 ${faacq} -o \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
		} else { #afconvert's only going to work under os x ...&lt;br /&gt;
			system(&amp;quot;\&amp;quot;${anri_dir}/${afconvert}\&amp;quot; -f mp4f -d 'aac ' -b ${_[3]} -s 1 -v \&amp;quot;${_[1]}_temp.wav\&amp;quot; \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot;&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		system(&amp;quot;export DYLD_LIBRARY_PATH=\&amp;quot;${anri_dir}\&amp;quot;;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; ${mp4boxnewframerate} -tmp . -new -add \&amp;quot;${_[1]}_video.${x264outext}\&amp;quot; -add \&amp;quot;${_[1]}_audio.${audioext}\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	#CLEANUP&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.${x264outext}&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.${audioext}&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	$avs = $_[0].'.avs';&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${avs}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${avs}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source</id>
		<title>Anri-chan/Source</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source"/>
				<updated>2008-11-08T18:22:48Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added build_deps.sh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Anri-chan]] is a set of Windows NT-series [http://en.wikipedia.org/wiki/Batch_file batch files] that bring together the functions of a number of movie editing and encoding applications to create movies suitable for publication on Speed Demos Archive.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 4===&lt;br /&gt;
[[Anri-chan/Source/anri.pl|anri.pl]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/config.ini|config.ini]] - External config file loaded on launch; user will eventually be able to use it to totally automate Anri.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.pl|mp4nerf.pl]] - Disables all but the first audio track in a muxed MP4 file. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_english.pl|lang_english.pl]] - English language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_german.pl|lang_german.pl]] - German language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_swedish.pl|lang_swedish.pl]] - Swedish language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/lang_dutch.pl|lang_dutch.pl]] - Dutch language localized strings. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/Feature list|Feature list]] - What we're working on now and will be working on in the future.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 3===&lt;br /&gt;
[[Anri-chan/Source/anri.bat|anri.bat]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/statid.bat|statid.bat]] - Station ID sample script; produces an example StatID to preview.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/ini.bat|ini.bat]] - Change settings.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/edit_settings.bat|edit_settings.bat]] - Settings script; asks most of the questions in anri.bat so it can skip them. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Not currently integrated into Anri-chan.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Avisynth Library===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/nate.avs|nate.avs]] - The M2K2SDA Avisynth library written by nate and ballofsnow&lt;br /&gt;
&lt;br /&gt;
===Misc. Files===&lt;br /&gt;
[[Anri-chan/Source/DGIndex.ini|DGIndex.ini]] - DGIndex settings. Take note of Output_Method, Enable_Info_Log and Use_MPA_Extensions.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/infotemplate.avs|infotemplate.avs]] - Used with DGindex to gather information of video, audio and audio delay.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/directshowsource_list.txt|directshowsource_list.txt]] - Compare AVI fourCC with list to determine avisource or directshowsource.&lt;br /&gt;
&lt;br /&gt;
===PHP Files===&lt;br /&gt;
[[Anri-chan/Source/df.php|df.php]] - Produces the dfnd_data.bat and dfnd_titles.bat game database files on the server side.&lt;br /&gt;
&lt;br /&gt;
===C Files===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/pgccount.cpp|pgccount.cpp]] - [[Media:pgccount_0.3.zip|exe]] - Finds all unique program chains in an IFO, to be used with Mplayer's stream dump. Not needed for Anri 4.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.c|mp4nerf.c]] - [[Media:mp4nerf-b0.1.zip|exe]] - Disables all but the first audio track in a muxed MP4 file. Not currently integrated into anri-chan.  Not needed for Anri 4.&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
[[Anri-chan/Source/anrichan.nsi|anrichan.nsi]] - Anri-chan 3 installer&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/builddir.bat|builddir.bat]] - Helps build directory content list.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/build_deps.sh|build_deps.sh]] - Builds the ppc binaries needed for Anri 4.&lt;br /&gt;
&lt;br /&gt;
===Coding standards===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/Coding_Standards/Perl|Perl]]&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh</id>
		<title>Anri-chan/Source/build deps.sh</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/build_deps.sh"/>
				<updated>2008-11-08T18:10:04Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added script to build osx dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#anri4 support binary build script&lt;br /&gt;
#tested on g4 powerbook under osx 10.4&lt;br /&gt;
#&lt;br /&gt;
#requirements:&lt;br /&gt;
#mp4box, mplayer/mencoder, wget, and x264 build without extra programs&lt;br /&gt;
#afconvert source should already be present on your system&lt;br /&gt;
#ffmpeg requires svn and gnu make 3.81 or newer (as make)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#sanitize local environment, you might need to change this&lt;br /&gt;
mkdir -p bin src zip&lt;br /&gt;
ln -f &amp;quot;$(which svn)&amp;quot; bin/svn&lt;br /&gt;
ln -f &amp;quot;$(which make)&amp;quot; bin/make&lt;br /&gt;
unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS DYLD_LIBRARY_PATH PKG_CONFIG_PATH&lt;br /&gt;
export PATH=&amp;quot;$PWD/bin:/bin:/sbin:/usr/bin:/usr/sbin&amp;quot;&lt;br /&gt;
hash -r&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#this is a bit inefficient, since i don't know how to build just afconvert,&lt;br /&gt;
#so either manually tell xcode to stop after afconvert builds or wait it out.&lt;br /&gt;
#the patch stops afconvert from exiting with an error when failing to shorten&lt;br /&gt;
#the length of a sound file, but i might actually need to fix the bug&lt;br /&gt;
#rather than just comment it out.  only testing will tell...&lt;br /&gt;
build-afconvert () {&lt;br /&gt;
	local     dir=AudioFileTools&lt;br /&gt;
	local fulldir=/Developer/Examples/CoreAudio/Services/$dir&lt;br /&gt;
	if [ ! -e $fulldir ]; then&lt;br /&gt;
		echo &amp;quot;afconvert source not found, cannot build&amp;quot;&lt;br /&gt;
		return&lt;br /&gt;
	fi&lt;br /&gt;
	rm -rf src/$dir bin/afconvert&lt;br /&gt;
	cp -R $fulldir src/$dir&lt;br /&gt;
	cd src&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru AudioFileTools/Utility/CAAudioFileConverter.cpp AudioFileTools-patched/Utility/CAAudioFileConverter.cpp&lt;br /&gt;
--- AudioFileTools/Utility/CAAudioFileConverter.cpp	2008-11-06 23:49:03.000000000 -0500&lt;br /&gt;
+++ AudioFileTools-patched/Utility/CAAudioFileConverter.cpp	2008-11-06 23:50:22.000000000 -0500&lt;br /&gt;
@@ -372,7 +372,7 @@&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
-		if (decoding) {&lt;br /&gt;
+		if (0) {&lt;br /&gt;
 			// fix up the destination file's length if necessary and possible&lt;br /&gt;
 			SInt64 nframes = mSrcFile.GetNumberFrames();&lt;br /&gt;
 			if (nframes != 0) {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	osascript &amp;lt;&amp;lt;END_OF_APPLESCRIPT&lt;br /&gt;
tell application &amp;quot;Xcode&amp;quot;&lt;br /&gt;
	activate&lt;br /&gt;
	open posix file &amp;quot;$PWD/$dir/$dir.xcode&amp;quot;&lt;br /&gt;
	with timeout of 300 seconds&lt;br /&gt;
		build&lt;br /&gt;
	end timeout&lt;br /&gt;
	quit&lt;br /&gt;
end tell&lt;br /&gt;
END_OF_APPLESCRIPT&lt;br /&gt;
	ln $dir/build/afconvert ../bin/afconvert&lt;br /&gt;
	cd ..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if you see a complaint about vm_allocate failing&lt;br /&gt;
#upgrade built-in make (gnu make 3.80) to 3.81 or newer&lt;br /&gt;
#remember to define it (and svn) above if it isn't in the path&lt;br /&gt;
build-ffmpeg () {&lt;br /&gt;
	local ffmpeg=ffmpeg-r15761&lt;br /&gt;
	local    url=svn://svn.mplayerhq.hu/ffmpeg/trunk&lt;br /&gt;
	rm -rf src/ffmpeg bin/ffmpeg&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$ffmpeg.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$ffmpeg.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		svn export -r 15761 $url ffmpeg&lt;br /&gt;
		tar -cf ../zip/$ffmpeg.tar ffmpeg&lt;br /&gt;
		bzip2 ../zip/$ffmpeg.tar&lt;br /&gt;
	fi&lt;br /&gt;
	cd ffmpeg&lt;br /&gt;
	./configure&lt;br /&gt;
	make&lt;br /&gt;
	ln ffmpeg ../../bin/ffmpeg&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-mencoder () {&lt;br /&gt;
	echo &amp;quot;mencoder is built by mplayer, so use that target instead&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#-force_cpusubtype_ALL is listed as darwin only, so a linux build might need to change this&lt;br /&gt;
build-mplayer () {&lt;br /&gt;
	local mplayer=MPlayer-1.0rc2&lt;br /&gt;
	local     url=http://www11.mplayerhq.hu/MPlayer/releases/&lt;br /&gt;
	rm -rf src/$mplayer bin/mplayer bin/mencoder&lt;br /&gt;
	if [ ! -e zip/$mplayer.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$mplayer.tar.bz2 -o zip/$mplayer.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$mplayer.tar.bz2&lt;br /&gt;
	cd $mplayer&lt;br /&gt;
	CFLAGS=-force_cpusubtype_ALL ./configure --enable-largefiles --disable-freetype --disable-fontconfig --disable-gl --disable-openal --disable-x11&lt;br /&gt;
	make&lt;br /&gt;
	ln mplayer ../../bin/mplayer&lt;br /&gt;
	ln mencoder ../../bin/mencoder&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#the -soname option to the dynamic lib build command is invalid on osx,&lt;br /&gt;
#and we only want to use the static lib anyway, so the patch just comments it out,&lt;br /&gt;
#makes mp4box link against the static lib, and fixes a namespace collision.&lt;br /&gt;
build-mp4box () {&lt;br /&gt;
	local gpac=gpac-2008-11-01&lt;br /&gt;
	local  url=-d:pserver:anonymous:@gpac.cvs.sourceforge.net:/cvsroot/gpac&lt;br /&gt;
	rm -rf src/gpac bin/mp4box&lt;br /&gt;
	cd src&lt;br /&gt;
	if [ -e ../zip/$gpac.tar.bz2 ]; then&lt;br /&gt;
		tar -xjf ../zip/$gpac.tar.bz2&lt;br /&gt;
	else&lt;br /&gt;
		cvs $url login&lt;br /&gt;
		cvs -z3 $url export -D 2008-11-01 gpac&lt;br /&gt;
		tar -cf ../zip/$gpac.tar gpac&lt;br /&gt;
		bzip2 ../zip/$gpac.tar&lt;br /&gt;
	fi&lt;br /&gt;
	patch -p0 &amp;lt;&amp;lt;'END_OF_PATCH'&lt;br /&gt;
diff -Nru gpac/applications/mp4box/Makefile gpac-patched/applications/mp4box/Makefile&lt;br /&gt;
--- gpac/applications/mp4box/Makefile	2008-10-06 05:41:13.000000000 -0400&lt;br /&gt;
+++ gpac-patched/applications/mp4box/Makefile	2008-11-02 23:25:41.000000000 -0500&lt;br /&gt;
@@ -35,8 +35,8 @@&lt;br /&gt;
 else&lt;br /&gt;
 EXT=&lt;br /&gt;
 PROG=MP4Box&lt;br /&gt;
-#LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
-LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
+LINKFLAGS+=-lgpac_static $(EXTRALIBS) $(GPAC_SH_FLAGS) -lz &lt;br /&gt;
+#LINKFLAGS+=-lgpac -lz  $(OGL_LIBS)&lt;br /&gt;
 endif&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/Makefile gpac-patched/src/Makefile&lt;br /&gt;
--- gpac/src/Makefile	2008-10-06 08:58:56.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/Makefile	2008-11-02 23:27:29.000000000 -0500&lt;br /&gt;
@@ -206,7 +206,7 @@&lt;br /&gt;
 $(LIB): $(LIBGPAC_UTILS) $(LIBGPAC_IETF) $(LIBGPAC_BIFS) $(LIBGPAC_ODF) $(LIBGPAC_LASER) $(LIBGPAC_ISOM) $(LIBGPAC_SCENEMANAGER) $(LIBGPAC_TERMINAL) compositor scenegraph mediatools mcrypt $(OBJSPIC)&lt;br /&gt;
 	ar cr ../bin/gcc/libgpac_static.a $(OBJS)&lt;br /&gt;
 	ranlib ../bin/gcc/libgpac_static.a&lt;br /&gt;
-	$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
+	#$(CC) $(SHFLAGS) -Wl,-soname,$(LIB) $(LDFLAGS) -o ../bin/gcc/$@ $(OBJSPIC) $(EXTRALIBS)&lt;br /&gt;
 &lt;br /&gt;
 dep: depend&lt;br /&gt;
 &lt;br /&gt;
diff -Nru gpac/src/scenegraph/base_scenegraph.c gpac-patched/src/scenegraph/base_scenegraph.c&lt;br /&gt;
--- gpac/src/scenegraph/base_scenegraph.c	2008-10-31 09:42:57.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/base_scenegraph.c	2008-11-03 00:39:19.000000000 -0500&lt;br /&gt;
@@ -1601,7 +1601,7 @@&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 GF_EXPORT&lt;br /&gt;
 const char *gf_node_get_class_name(GF_Node *node)&lt;br /&gt;
 {&lt;br /&gt;
diff -Nru gpac/src/scenegraph/xml_ns.c gpac-patched/src/scenegraph/xml_ns.c&lt;br /&gt;
--- gpac/src/scenegraph/xml_ns.c	2008-10-24 09:06:24.000000000 -0400&lt;br /&gt;
+++ gpac-patched/src/scenegraph/xml_ns.c	2008-11-03 00:39:43.000000000 -0500&lt;br /&gt;
@@ -391,7 +391,7 @@&lt;br /&gt;
 	return DOM_String_datatype;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-char szNameBuffer[1024];&lt;br /&gt;
+static char szNameBuffer[1024];&lt;br /&gt;
 &lt;br /&gt;
 const char*gf_svg_get_attribute_name(GF_Node *node, u32 tag)&lt;br /&gt;
 {&lt;br /&gt;
END_OF_PATCH&lt;br /&gt;
	cd gpac&lt;br /&gt;
	chmod 700 configure&lt;br /&gt;
	./configure --disable-ssl --disable-opengl&lt;br /&gt;
	make lib&lt;br /&gt;
	make -C applications/mp4box&lt;br /&gt;
	ln bin/gcc/MP4Box ../../bin/mp4box&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-wget () {&lt;br /&gt;
	local wget=wget-1.11.4&lt;br /&gt;
	local  url=ftp://ftp.gnu.org/gnu/wget&lt;br /&gt;
	rm -rf src/$wget bin/wget&lt;br /&gt;
	if [ ! -e zip/$wget.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$wget.tar.bz2 -o zip/$wget.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$wget.tar.bz2&lt;br /&gt;
	cd $wget&lt;br /&gt;
	./configure --disable-rpath --without-ssl&lt;br /&gt;
	make&lt;br /&gt;
	ln src/wget ../../bin/wget&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
build-x264 () {&lt;br /&gt;
	local x264=x264-snapshot-20081101-2245&lt;br /&gt;
	local  url=ftp://ftp.videolan.org/pub/videolan/x264/snapshots&lt;br /&gt;
	rm -rf src/$x264 bin/x264&lt;br /&gt;
	if [ ! -e zip/$x264.tar.bz2 ]; then&lt;br /&gt;
		curl $url/$x264.tar.bz2 -o zip/$x264.tar.bz2&lt;br /&gt;
	fi&lt;br /&gt;
	cd src&lt;br /&gt;
	tar -xjf ../zip/$x264.tar.bz2&lt;br /&gt;
	cd $x264&lt;br /&gt;
	./configure&lt;br /&gt;
	make&lt;br /&gt;
	ln x264 ../../bin/x264&lt;br /&gt;
	cd ../..&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
programs=(afconvert ffmpeg mencoder mplayer mp4box wget x264)&lt;br /&gt;
for arg; do&lt;br /&gt;
	for program in ${programs[*]}; do&lt;br /&gt;
		if [[ $program == $arg || $arg == &amp;quot;all&amp;quot; ]]; then&lt;br /&gt;
			echo &amp;quot;[+] $program build started&amp;quot;&lt;br /&gt;
			time build-$program&lt;br /&gt;
			echo &amp;quot;[+] $program build finished&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-15T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: appearantly tr doesn't like %lang&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
#require &amp;quot;lang_${language}.pl&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	@statidlines = ();&lt;br /&gt;
	foreach $i (1 .. 3) {&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		chomp($statidline);&lt;br /&gt;
		$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
		push(@statidlines,$statidline);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{PROGRAM_START}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;$lang{SECTION_PROJECT_SETUP}&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{ENTER_PROJECT_NAME}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;$lang{MOVIE_SOURCE}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{MOVIE_SOURCE_MPEG2_HINT}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;$lang{MPEG2_SOURCE_QUESTION} [$lang{y}/$lang{n}]&amp;quot;, $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;$lang{QUESTION_ND} [$lang{y}/$lang{n}]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;$lang{QUESTION_SUBMIT_DFND} [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_VHS} [$lang{y}/$lang{n}]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_NES} [$lang{y}/$lang{n}]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GBA} [$lang{y}/$lang{n}]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GB} [$lang{y}/$lang{n}]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_DEFLICKERED} [$lang{y}/$lang{n}]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_TRIM} [$lang{y}/$lang{n}]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_STATID} [$lang{y}/$lang{n}]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if ($$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese, $_) if q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $${_[2]} (&amp;quot;.($$_[4]+($$_[5]/1000)).&amp;quot; kbit/sec) [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			$$_[1]($projname.$$_[3].$nmf.&amp;quot;.avs&amp;quot;, $projname.$$_[3], @$_[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	map { threads-&amp;gt;create($_[0], $_) } @_[1..$#_];&lt;br /&gt;
	map { $_-&amp;gt;join() } threads-&amp;gt;list();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;$lang{QUESTION_CREATE_NMF} [$lang{y}/$lang{n}]&amp;quot;)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= $statid ? &amp;quot;statid++run++statid\n&amp;quot; : &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [$lang{y}/$lang{n}] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0].&amp;quot; [$lang{y}/$lang{n}]&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[$lang{y}$lang{n}]$/) {&lt;br /&gt;
			#$lang{y} becomes 1 (true), $lang{n} becomes 0 (false)&lt;br /&gt;
			$userinput = $userinput eq $lang{y};&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[$lang{y}$lang{n}]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;$lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
		&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;$lang{INVALID_INPUT}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-15T02:48:20Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added statid sample mode using vdub.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
#require &amp;quot;lang_${language}.pl&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Statid Sample&lt;br /&gt;
# &lt;br /&gt;
# Statid preview mode shows users how their statid will look without having&lt;br /&gt;
# to encode anything.  A slimmed down version of the code from the main&lt;br /&gt;
# procedure and script_buildfiles is used.  The same temporary project&lt;br /&gt;
# name and directory from sample extraction mode are used and deleted.&lt;br /&gt;
# The user is sent back to the main menu but currently will need&lt;br /&gt;
# to enter the statid information again during the main script.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub statid_sample {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
	&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
	@statidlines = ();&lt;br /&gt;
	foreach $i (1 .. 3) {&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		chomp($statidline);&lt;br /&gt;
		$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
		push(@statidlines,$statidline);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = false\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$projtemp  = &amp;quot;run = blankclip(width=640, height=480)&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_d1(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;statid\n&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{PROGRAM_START}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;$lang{SECTION_PROJECT_SETUP}&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{ENTER_PROJECT_NAME}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;$lang{MOVIE_SOURCE}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{MOVIE_SOURCE_MPEG2_HINT}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;$lang{MPEG2_SOURCE_QUESTION} [y,n]&amp;quot;, $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;$lang{QUESTION_ND} [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;$lang{QUESTION_SUBMIT_DFND} [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_VHS} [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_NES} [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GBA} [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GB} [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_DEFLICKERED} [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_TRIM} [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_STATID} [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if ($$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese, $_) if q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $${_[2]} (&amp;quot;.($$_[4]+($$_[5]/1000)).&amp;quot; kbit/sec) [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			$$_[1]($projname.$$_[3].$nmf.&amp;quot;.avs&amp;quot;, $projname.$$_[3], @$_[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	map { threads-&amp;gt;create($_[0], $_) } @_[1..$#_];&lt;br /&gt;
	map { $_-&amp;gt;join() } threads-&amp;gt;list();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;$lang{QUESTION_CREATE_NMF} [y/n]&amp;quot;)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
	$projtemp = '';&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= $statid ? &amp;quot;statid++run++statid\n&amp;quot; : &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;$lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN} [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
		&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;$lang{INVALID_INPUT}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-14T20:07:32Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: multithreaded nmf working now, but outputting rgb888 (for me at least).  plus fixed some %% getting passed to avisynth.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
require 'lang_english.pl';&lt;br /&gt;
#after having loaded english, load preferred language by using $language variable from config file, would be cool if we could set this in the installer&lt;br /&gt;
#require &amp;quot;lang_${language}.pl&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($lang{PROGRAM_START});&lt;br /&gt;
	&amp;amp;out_section($lang{MAINMENU});&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	[$lang{MAINMENU_RIPDVD}, 		'&amp;amp;rip_dvd'],&lt;br /&gt;
	[$lang{MAINMENU_STARTNEWPROJECT}, 	'&amp;amp;project'],&lt;br /&gt;
	[$lang{MAINMENU_EXTRACTSAMPLE}, 	'&amp;amp;proc_sample'],&lt;br /&gt;
	[$lang{MAINMENU_STATIDPREVIEW}, 	'&amp;amp;statid_sample'],&lt;br /&gt;
	[$lang{MAINMENU_EXIT}, 			'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_SAMPLE_EXTRACTION});&lt;br /&gt;
	q_boo($lang{QUESTION_DVDMPEG_SOURCE}, $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_SAMPLE_LENGTH});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}$lang{SAMPLE_EXTRACTION_DONE}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n$lang{SAMPLE_EXTRACTION_README}&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{PROGRAM_START}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;$lang{SECTION_PROJECT_SETUP}&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{ENTER_PROJECT_NAME}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;$lang{PROJECT_FILES_APPEAR_IN} ${navy_on_gray}${desktop}\\($lang{PROJECT_NAME})\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{PROJECT_NAME_ILLEGAL_CHARACTERS}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;$lang{MOVIE_SOURCE}&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{MOVIE_SOURCE_MPEG2_HINT}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;$lang{MPEG2_SOURCE_QUESTION} [y,n]&amp;quot;, $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_GAME_PROPERTIES});&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo($lang{PC_GAME_QUESTION}, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_EXPLAIN});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_FIND_AT_THIS_URL});&lt;br /&gt;
			&amp;amp;out_info($lang{DFND_URL});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{DF_IF_NOT_FOUND_THEN_WHAT});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_D});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo($lang{QUESTION_F});&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;$lang{QUESTION_ND} [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{QUESTION_SUBMIT_DFND_WHY});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;$lang{QUESTION_SUBMIT_DFND} [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_VIDEO_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo($lang{QUESTION_PROGRESSIVE_INTERLACED}, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{FIELDORDER_VDUB_WINDOW_OPENS});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info($lang{VDUB_WINDOW_CAN_CLOSE_NOW});&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_VHS} [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo($lang{QUESTION_1PIXEL_BOB}, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_NES} [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GBA} [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_GB} [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;$lang{QUESTION_DEFLICKERED} [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_CONTENT_PROPERTIES});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_TRIM});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_TRIM} [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_VDUB_WINDOW_OPENS});&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info($lang{TRIM_MULTIPLE_RANGES});&lt;br /&gt;
			&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=$lang{TRIM_ILLEGAL_VALUE};&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_NO_VALUES_ENTERED});&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error($lang{TRIM_ODD_NUMBER_OF_FRAMES});&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info($lang{TRIM_DONE});&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER};&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info($lang{TRIM_POINT_LOADED_SUCCESSFULLY}.' #'.@trimarr);&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_STATID});&lt;br /&gt;
		&amp;amp;out_info($lang{STATID_INFO});&lt;br /&gt;
		if (q_boo(&amp;quot;$lang{QUESTION_STATID} [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info($lang{STATID_ABOUT_EACH_LINE});&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info($lang{STATID_LINE}.&amp;quot; ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			@statidlines = ('','','');&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	#$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_READY_TO_ENCODE});&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{SETTINGS_SAVED_TO_FILE} \&amp;quot;${projname}_job.bat\&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo($lang{QUESTION_ENCODE_NOW_OR})) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section($lang{SECTION_ENCODING_OPTIONS});&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if ($$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese, $_) if q_boo(&amp;quot;$lang{QUESTION_CREATE_VIDEO} $${_[2]} (&amp;quot;.($$_[4]+($$_[5]/1000)).&amp;quot; kbit/sec) [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info($lang{NOW_ENCODING});&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			$$_[1]($projname.$$_[3].$nmf.&amp;quot;.avs&amp;quot;, $projname.$$_[3], @$_[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# simple multi-threaded map, currently used for nmf&lt;br /&gt;
# one thread is created per argument (excluding the first)&lt;br /&gt;
sub tmap (&amp;amp;@) {&lt;br /&gt;
	require threads;&lt;br /&gt;
	map { threads-&amp;gt;create($_[0], $_) } @_[1..$#_];&lt;br /&gt;
	map { $_-&amp;gt;join() } threads-&amp;gt;list();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_NMF});&lt;br /&gt;
	&amp;amp;out_info($lang{NMF_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{INFO_HQ_IQ_XQ_NMF});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;$lang{QUESTION_CREATE_NMF} [y/n]&amp;quot;)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;) if -e &amp;quot;${projname}_HQ_nmf.avs&amp;quot;;&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		@nmfcommands = ();&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		foreach $i (1 .. $number_of_processors) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_${i}.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i-1).&amp;quot;.000), floor(last.framecount/${number_of_processors}.000*${i}.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot;);&lt;br /&gt;
			push @nmfcommands, qq(&amp;quot;${vdub_dir}/${vdubcli}&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avs&amp;quot; /i &amp;quot;${anri_dir}/nmf.vcf&amp;quot; &amp;quot;${projname}_HQIQXQ_${i}.avi&amp;quot;);&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#for now lq and nq ignore the nmf&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_xvid_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echo($lang{ENCODING_NMF});&lt;br /&gt;
		tmap { system($_) } @nmfcommands;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info($lang{NMF_SUCCESSFULLY_CREATED});&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width % 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height % 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width % 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= $statid ? &amp;quot;statid++run++statid\n&amp;quot; : &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_AVI_SOURCE});&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_SOURCE_INFO});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{AVI_PATH_TO});&lt;br /&gt;
	&amp;amp;out_info($lang{TYPE_N_TO_QUIT});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=$lang{AVI_BAD_INPUT};&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=$lang{AVI_NONE_ENTERED};&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=$lang{AVI_NOT_AVI};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{FILE_NOT_FOUND};&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info($lang{AVI_LOADED_SUCCESSFULLY}.' #'.@avifiles);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = $lang{AVI_DIR_LOAD_INFO};&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_ENTER_PATH};&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH};&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST};&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = $lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR};&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo($lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN});&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;$lang{INVALID_INPUT}\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info($lang{DFND_INFO});&lt;br /&gt;
	q_boo($lang{QUESTION_USE_DFND_DATABASE}, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info($lang{INFO_CONNECTING_TO_DFND_DATABASE});&lt;br /&gt;
		&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;'.$lang{DFND_URL}.'&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_CHOOSE_GAME};&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=$lang{DFND_MUST_ENTER_GAME_NUMBER};&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=$lang{INVALID_SELECTION};&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error($lang{DFND_COULD_NOT_CONNECT_TO_SDA});&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;$lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN} [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section($lang{SECTION_RIP_DVD});&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info($lang{QUESTION_DVD_DRIVE_LETTER});&lt;br /&gt;
		&amp;amp;out_info($lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP});&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=$lang{DVD_MUST_ENTER_DRIVE_LETTER};&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} $lang{QUESTION_DVD_RIPTO_DIR_NAME}&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME};&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INFO_ANRI_WILL_RIP_NOW});&lt;br /&gt;
	&amp;amp;out_info($lang{PRESS_ENTER_TO_CONTINUE});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info $lang{DVD_ADVANCED_MODE}&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=$lang{DVD_TITLE_NUMBERS}&lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo($lang{DVD_VIDEOTS_NOT_FOUND});&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;$lang{DVD_FINISHED_RIPPING} $lang{PRESS_ENTER_TO_CONTINUE}&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info($lang{DVD_INDEX_INFO_FILELIST});&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo($lang{DVD_INDEX_WARNING});&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error($lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND});&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;$lang{INVALID_INPUT}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;$lang{INVALID_SELECTION}: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info($lang{DVD_INDEX_NOW_INDEXING});&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/lang_english.pl</id>
		<title>Anri-chan/Source/lang english.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/lang_english.pl"/>
				<updated>2008-10-14T19:11:20Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: 2 semicolons were missing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
&lt;br /&gt;
$lang{PROGRAM_START} = &amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;;&lt;br /&gt;
$lang{MAINMENU} = &amp;quot;Main&amp;quot;;&lt;br /&gt;
$lang{MAINMENU_RIPDVD} = 'Rip DVD to hard drive (required for DVD material)';&lt;br /&gt;
$lang{MAINMENU_STARTNEWPROJECT} = 'Start new project';&lt;br /&gt;
$lang{MAINMENU_EXTRACTSAMPLE} = 'Extract sample';&lt;br /&gt;
$lang{MAINMENU_STATIDPREVIEW} = 'Station ID preview';&lt;br /&gt;
$lang{MAINMENU_EXIT} = 'Exit';&lt;br /&gt;
$lang{INVALID_INPUT} = &amp;quot;Invalid input&amp;quot;;&lt;br /&gt;
$lang{SECTION_SAMPLE_EXTRACTION} = &amp;quot;Sample Extraction&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DVDMPEG_SOURCE} = 'DVD/MPEG source [y,n]';&lt;br /&gt;
$lang{INFO_SAMPLE_LENGTH} = &amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with action.&amp;quot;;&lt;br /&gt;
$lang{PRESS_ENTER_TO_CONTINUE} = &amp;quot;Press ENTER to continue ...&amp;quot;;&lt;br /&gt;
$lang{SAMPLE_EXTRACTION_DONE} = &amp;quot;Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;;&lt;br /&gt;
$lang{SAMPLE_EXTRACTION_README} = &amp;quot;${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically. ${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;;&lt;br /&gt;
$lang{SECTION_PROJECT_SETUP} = &amp;quot;PROJECT SETUP&amp;quot;;&lt;br /&gt;
$lang{PROJECT_NAME_ILLEGAL_CHARACTERS} = &amp;quot;You may not use spaces or the % character in the name, sorry.&amp;quot;;&lt;br /&gt;
$lang{ENTER_PROJECT_NAME} = &amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). $lang{PROJECT_NAME_ILLEGAL_CHARACTERS}&amp;quot;;&lt;br /&gt;
$lang{PROJECT_FILES_APPEAR_IN} = &amp;quot;${white_on_gray}All files associated with this project will appear in&amp;quot;;&lt;br /&gt;
$lang{PROJECT_NAME} = &amp;quot;project name&amp;quot;;&lt;br /&gt;
$lang{MOVIE_SOURCE} = &amp;quot;MOVIE SOURCE&amp;quot;;&lt;br /&gt;
$lang{MOVIE_SOURCE_MPEG2_HINT} = &amp;quot;If you used a capture card with DVD or MPEG settings, place those files in ${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;;&lt;br /&gt;
$lang{MPEG2_SOURCE_QUESTION} = &amp;quot;DVD/MPEG source&amp;quot;;&lt;br /&gt;
$lang{SECTION_GAME_PROPERTIES} = &amp;quot;GAME PROPERTIES&amp;quot;;&lt;br /&gt;
$lang{PC_GAME_QUESTION} = &amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;;&lt;br /&gt;
$lang{DF_EXPLAIN} = &amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;;&lt;br /&gt;
$lang{DF_FIND_AT_THIS_URL} = &amp;quot;Find D and F for your game at this URL:&amp;quot;;&lt;br /&gt;
$lang{DF_IF_NOT_FOUND_THEN_WHAT} = &amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_D} = &amp;quot;Please enter 1 or 4 for D.&amp;quot;;&lt;br /&gt;
$lang{DFND_URL} = &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;;&lt;br /&gt;
$lang{QUESTION_F} = &amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_ND} = &amp;quot;2D game&amp;quot;;&lt;br /&gt;
$lang{QUESTION_SUBMIT_DFND_WHY} = &amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_SUBMIT_DFND} = &amp;quot;Submit this game's data to SDA?&amp;quot;;&lt;br /&gt;
$lang{SECTION_VIDEO_PROPERTIES} = &amp;quot;VIDEO PROPERTIES&amp;quot;;&lt;br /&gt;
$lang{QUESTION_PROGRESSIVE_INTERLACED} = &amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;;&lt;br /&gt;
$lang{FIELDORDER_VDUB_WINDOW_OPENS} = &amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;;&lt;br /&gt;
$lang{VDUB_WINDOW_CAN_CLOSE_NOW} = &amp;quot;You may now close the VirtualDub window.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_VHS} = &amp;quot;Did you use VHS to help capture this run?&amp;quot;;&lt;br /&gt;
$lang{QUESTION_1PIXEL_BOB} = &amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_NES} = &amp;quot;NES&amp;quot;;&lt;br /&gt;
$lang{QUESTION_GBA} = &amp;quot;Game Boy Advance&amp;quot;;&lt;br /&gt;
$lang{QUESTION_GB} = &amp;quot;Game Boy&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DEFLICKERED} = &amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console)&amp;quot;;&lt;br /&gt;
$lang{SECTION_CONTENT_PROPERTIES} = &amp;quot;CONTENT PROPERTIES&amp;quot;;&lt;br /&gt;
$lang{INFO_TRIM} = &amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_TRIM} = &amp;quot;Do you want to trim off unwanted content in this video?&amp;quot;;&lt;br /&gt;
$lang{TRIM_VDUB_WINDOW_OPENS} = &amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;;&lt;br /&gt;
$lang{TYPE_N_TO_QUIT} = &amp;quot;  - Type n to quit -&amp;quot;;&lt;br /&gt;
$lang{TRIM_MULTIPLE_RANGES} = &amp;quot;You can specify multiple ranges of frames. $lang{TYPE_N_TO_QUIT}&amp;quot;;&lt;br /&gt;
$lang{TRIM_ILLEGAL_VALUE} = &amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
$lang{TRIM_NO_VALUES_ENTERED} = &amp;quot;No values entered. Canceling trim.&amp;quot;;&lt;br /&gt;
$lang{TRIM_ODD_NUMBER_OF_FRAMES} = &amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;;&lt;br /&gt;
$lang{TRIM_DONE} = &amp;quot;Trimming done!&amp;quot;;&lt;br /&gt;
$lang{TRIM_INVALID_INPUT_MUST_BE_FRAME_NUMBER} = &amp;quot;$lang{INVALID_INPUT}. Must be frame number.&amp;quot;;&lt;br /&gt;
$lang{TRIM_POINT_LOADED_SUCCESSFULLY} = &amp;quot;Trim point loaded successfully:&amp;quot;;&lt;br /&gt;
$lang{SECTION_STATID} = &amp;quot;Station ID&amp;quot;;&lt;br /&gt;
$lang{STATID_INFO} = &amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_STATID} = &amp;quot;Do you want to append an SDA Station ID to the front and end of this video?&amp;quot;;&lt;br /&gt;
$lang{STATID_ABOUT_EACH_LINE} = &amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;;&lt;br /&gt;
$lang{STATID_LINE} = &amp;quot;Station ID Line&amp;quot;;&lt;br /&gt;
$lang{SECTION_READY_TO_ENCODE} = &amp;quot;READY TO ENCODE&amp;quot;;&lt;br /&gt;
$lang{SETTINGS_SAVED_TO_FILE} = &amp;quot;Your settings for this project have been saved. To resume the project, double-click&amp;quot;;&lt;br /&gt;
$lang{QUESTION_ENCODE_NOW_OR} = &amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;;&lt;br /&gt;
$lang{SECTION_ENCODING_OPTIONS} = &amp;quot;ENCODING OPTIONS&amp;quot;;&lt;br /&gt;
$lang{QUESTION_CREATE_VIDEO} = &amp;quot;Create video?&amp;quot;;&lt;br /&gt;
$lang{NOW_ENCODING} = &amp;quot;Now encoding ...&amp;quot;;&lt;br /&gt;
$lang{SECTION_NMF} = &amp;quot;New Master File&amp;quot;;&lt;br /&gt;
$lang{NMF_INFO} = &amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;;&lt;br /&gt;
$lang{INFO_HQ_IQ_XQ_NMF} = &amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_CREATE_NMF} = &amp;quot;Create NMF?&amp;quot;;&lt;br /&gt;
$lang{NMF_SUCCESSFULLY_CREATED} = &amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;;&lt;br /&gt;
$lang{ENCODING_NMF} = &amp;quot;Encoding NMF ...&amp;quot;;&lt;br /&gt;
$lang{SECTION_AVI_SOURCE} = &amp;quot;AVI SOURCE&amp;quot;;&lt;br /&gt;
$lang{AVI_SOURCE_INFO} = &amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;;&lt;br /&gt;
$lang{AVI_PATH_TO} = 'Path to source video file e.g. c:\path to\video.avi without quotes.';&lt;br /&gt;
$lang{AVI_BAD_INPUT} = &amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
$lang{AVI_NONE_ENTERED} = &amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
$lang{AVI_NOT_AVI} = &amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
$lang{FILE_NOT_FOUND} = &amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
$lang{AVI_LOADED_SUCCESSFULLY} = &amp;quot;AVI loaded successfully!&amp;quot;;&lt;br /&gt;
$lang{AVI_DIR_LOAD_INFO} = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
$lang{AVI_DIR_LOAD_MUST_ENTER_PATH} = &amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
$lang{AVI_DIR_LOAD_MUST_BE_FULL_PATH} = &amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
$lang{AVI_DIR_LOAD_DIR_DOES_NOT_EXIST} = &amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
$lang{AVI_DIR_LOAD_NO_AVIS_FOUND_IN_DIR} = 'No avi files found in that folder!';&lt;br /&gt;
$lang{QUESTION_AVI_DIR_LOAD_CONTINUE_OR_RESCAN} = 'Continue [y] or rescan [n]?';&lt;br /&gt;
$lang{DFND_INFO} = &amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_USE_DFND_DATABASE} = &amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;;&lt;br /&gt;
$lang{INFO_CONNECTING_TO_DFND_DATABASE} = &amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;;&lt;br /&gt;
$lang{DFND_MUST_CHOOSE_GAME} = &amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
$lang{DFND_MUST_ENTER_GAME_NUMBER} = &amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
$lang{INVALID_SELECTION} = &amp;quot;Invalid selection&amp;quot;;&lt;br /&gt;
$lang{DFND_COULD_NOT_CONNECT_TO_SDA} = &amp;quot;Could not connect to SDA!&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DFND_COULD_NOT_CONNECT_TO_SDA_TRY_AGAIN} = &amp;quot;Try again?&amp;quot;;&lt;br /&gt;
$lang{SECTION_RIP_DVD} = &amp;quot;Rip DVD&amp;quot;;&lt;br /&gt;
$lang{RIP_DVD_SOURCE_FILES_ON_HD_TIP} = &amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DVD_DRIVE_LETTER} = &amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DVD_DRIVE_PATH} = &amp;quot;What is the path to your DVD (e.g. /Volumes/MYDISC)?&amp;quot;;&lt;br /&gt;
$lang{DVD_MUST_ENTER_DRIVE_LETTER} = &amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
$lang{DVD_MUST_ENTER_DRIVE_PATH} = &amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
$lang{DVD_INFO_ANRI_WILL_EXTRACT_TO_DIR} = &amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory.&amp;quot;;&lt;br /&gt;
$lang{QUESTION_DVD_RIPTO_DIR_NAME} = &amp;quot;Name a folder for your DVD files.&amp;quot;;&lt;br /&gt;
$lang{DVD_MUST_ENTER_RIPTO_DIR_NAME} = &amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
$lang{DVD_INFO_ANRI_WILL_RIP_NOW} = &amp;quot;Anri will now extract everything needed from the DVD to the folder you just entered. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;;&lt;br /&gt;
$lang{DVD_ADVANCED_MODE} = &amp;quot;-advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all.&amp;quot;;&lt;br /&gt;
$lang{DVD_TITLE_NUMBERS} = &amp;quot;Title numbers: &amp;quot;;&lt;br /&gt;
$lang{DVD_VIDEOTS_NOT_FOUND} = &amp;quot;Neither a VIDEO_TS nor a DVD_RTAV folder was found in that location. Anri is displeased.&amp;quot;;&lt;br /&gt;
$lang{DVD_FINISHED_RIPPING} = &amp;quot;Finished ripping.&amp;quot;;&lt;br /&gt;
$lang{DVD_INDEX_INFO_FILELIST} = &amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;;&lt;br /&gt;
$lang{DVD_INDEX_WARNING} = &amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;;&lt;br /&gt;
$lang{DVD_INDEX_NO_FOLDERS_WITH_DVD_FILES_FOUND} = &amp;quot;No folders with DVD files found!&amp;quot;;&lt;br /&gt;
$lang{DVD_INDEX_NOW_INDEXING} = &amp;quot;Now indexing MPEG-2 ...&amp;quot;;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-13T05:35:05Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: several miscellaneous bug fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;Main&amp;quot;);&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	['Rip DVD to hard drive (required for DVD material)', 	'&amp;amp;rip_dvd'],&lt;br /&gt;
	['Start new project', 					'&amp;amp;project'],&lt;br /&gt;
	['Extract sample', 					'&amp;amp;proc_sample'],&lt;br /&gt;
	['Station ID preview', 					'&amp;amp;statid_sample'],&lt;br /&gt;
	['Exit', 						'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Sample Extraction&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;action.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;PROJECT SETUP&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). You may not use spaces or the % character in the name, sorry.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}All files associated with this project will appear in ${navy_on_gray}${desktop}\\(project name)\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;You may not use spaces or the % character in the name, sorry.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;MOVIE SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;If you used a capture card with DVD or MPEG settings, place those files in&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;GAME PROPERTIES&amp;quot;);&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo(&amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Find D and F for your game at this URL:&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1 or 4 for D.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;2D game [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;Submit this game's data to SDA? [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;VIDEO PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo(&amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You may now close the VirtualDub window.&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;Did you use VHS to help capture this run? [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;NES [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy Advance [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console) [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;CONTENT PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to trim off unwanted content in this video? [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You can specify multiple ranges of frames. - Type n to quit -&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=&amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;No values entered. Canceling trim.&amp;quot;);&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error(&amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;);&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;Trimming done!&amp;quot;);&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid input. Must be frame number.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info('trim point #'.@trimarr.' loaded successfully!');&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;Station ID&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to append an SDA Station ID to the front and end of this video? [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;);&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info(&amp;quot;Station ID Line ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,$statidline);&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;READY TO ENCODE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Your settings for this project have been saved to \&amp;quot;${projname}_job.bat\&amp;quot;. To resume the project, double-click that file.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo(&amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;)) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;ENCODING OPTIONS&amp;quot;);&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if ($$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese, $_) if q_boo(&amp;quot;Create $${_[2]} (&amp;quot;.($$_[4]+($$_[5]/1000)).&amp;quot; kbps) video? [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info(&amp;quot;Now encoding ...&amp;quot;);&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			$$_[1]($projname.$$_[3].$nmf.&amp;quot;.avs&amp;quot;, $projname.$$_[3], @$_[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;New Master File&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;Create NMF? [y/n]&amp;quot;, $create_nmf)) {&lt;br /&gt;
	        $nmf = '_nmf';&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze - yv12 and multithreading turned on&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# multithreading=1&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (my $i = 0;$i &amp;lt; $number_of_processors; $i++) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*${i}.000), floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i+1).&amp;quot;.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1));&lt;br /&gt;
			system(&amp;quot;START /LOW /B \&amp;quot;encoding nmf section &amp;quot;.($i+1).&amp;quot;\&amp;quot; \&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs\&amp;quot; /i \&amp;quot;${anri_dir}/nmf.vcf\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot; &amp;gt; NUL&amp;quot;);&lt;br /&gt;
			$i++;&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		while (grep(/vdub\.exe/, qx(&amp;quot;\&amp;quot;${anri_dir}/tasklist.exe\&amp;quot;&amp;quot;))) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;%time%  Encoding NMF ...&amp;quot;);&lt;br /&gt;
			sleep(10);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;\\++\\\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if $i &amp;gt; 0;&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width %% 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= $statid ? &amp;quot;statid++run++statid\n&amp;quot; : &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;) if $isPCGAME;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;) if -e &amp;quot;${projname}_trimtemp.avs&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;AVI SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info('Path to source video file e.g. c:\path to\video.avi without quotes.');&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;  - Type n to quit -&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=&amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info('avi #'.@avifiles.' loaded successfully!');&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = 'No avi files found in that folder!';&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo('Continue [y] or rescan [n]?');&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=&amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=&amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid selection.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error(&amp;quot;Could not connect to SDA!&amp;quot;);&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;Try again? [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Rip DVD&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=&amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory. Name a folder for your DVD files.&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto_parentdir) if !-e $dvdripto_parentdir;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will now extract everything needed from the DVD to ${dvdripto}. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info -advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all. You can look at pgclist.txt in the DVD file destination directory to see which titles will be ripped by default.&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=Title numbers: &lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Neither VIDEO_TS or DVD_RTAV folder was found on ${driveletter}:\\. Anri is displeased.&amp;quot;);&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Finished ripping. Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	@pgclist = ();&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info(&amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}\\. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error(&amp;quot;No folders with DVD files found!&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;Invalid input.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;Invalid selection: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Now indexing MPEG-2 ...&amp;quot;);&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot; -progress&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -progress -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-10T01:15:06Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: replaced use with require for Win32 api calls so it wouldn't crash on unix, removed duplicate color, and made some other small changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	require Win32;&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	$desktop = Win32::GetFolderPath(Win32::CSIDL_DESKTOPDIRECTORY());&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(Win32::CSIDL_PROGRAM_FILES());&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;Main&amp;quot;);&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	['Rip DVD to hard drive (required for DVD material)', 	'&amp;amp;rip_dvd'],&lt;br /&gt;
	['Start new project', 					'&amp;amp;project'],&lt;br /&gt;
	['Extract sample', 					'&amp;amp;proc_sample'],&lt;br /&gt;
	['Station ID preview', 					'&amp;amp;statid_sample'],&lt;br /&gt;
	['Exit', 						'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Sample Extraction&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;action.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;PROJECT SETUP&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). You may not use spaces or the % character in the name, sorry.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}All files associated with this project will appear in ${navy_on_gray}${desktop}\\(project name)\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;You may not use spaces or the % character in the name, sorry.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;MOVIE SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;If you used a capture card with DVD or MPEG settings, place those files in&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;GAME PROPERTIES&amp;quot;);&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo(&amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Find D and F for your game at this URL:&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1 or 4 for D.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;2D game [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;Submit this game's data to SDA? [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;VIDEO PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo(&amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You may now close the VirtualDub window.&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;Did you use VHS to help capture this run? [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;NES [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy Advance [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console) [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;CONTENT PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to trim off unwanted content in this video? [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You can specify multiple ranges of frames. - Type n to quit -&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=&amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;No values entered. Canceling trim.&amp;quot;);&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error(&amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;);&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;Trimming done!&amp;quot;);&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid input. Must be frame number.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info('trim point #'.@trimarr.' loaded successfully!');&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;Station ID&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to append an SDA Station ID to the front and end of this video? [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;);&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info(&amp;quot;Station ID Line ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,'&amp;quot;'.$statidline.'&amp;quot;');&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;READY TO ENCODE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Your settings for this project have been saved to \&amp;quot;${projname}_job.bat\&amp;quot;. To resume the project, double-click that file.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo(&amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;)) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ/XQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;ENCODING OPTIONS&amp;quot;);&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;ipod,		&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;twopass,	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	\&amp;amp;twopass,	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;_LQ&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	\&amp;amp;xvid,		&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if ($$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese, $_) if q_boo(&amp;quot;Create $${_[2]} (&amp;quot;.($$_[4]+($$_[5]/1000)).&amp;quot; kbps) video? [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = $$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info(&amp;quot;Now encoding ...&amp;quot;);&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			$$_[1]($projname.$$_[3].$nmf.&amp;quot;.avs&amp;quot;, $projname, @$_[4..8]);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	$nmf = '_nmf';&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;New Master File&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;Create NMF? [y/n]&amp;quot;, $create_nmf)) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$number_of_processors=$ENV{NUMBER_OF_PROCESSORS};&lt;br /&gt;
		#Set lagarith to yv12 under doze - yv12 and multithreading turned on&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# multithreading=1&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (my $i = 0;$i &amp;lt; $number_of_processors; $i++) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*${i}.000), floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i+1).&amp;quot;.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1));&lt;br /&gt;
			system(&amp;quot;START /LOW /B \&amp;quot;encoding nmf section &amp;quot;.($i+1).&amp;quot;\&amp;quot; \&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs\&amp;quot; /i \&amp;quot;${anri_dir}/nmf.vcf\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot; &amp;gt; NUL&amp;quot;);&lt;br /&gt;
			$i++;&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		while (grep(/vdub\.exe/, qx(&amp;quot;\&amp;quot;${anri_dir}/tasklist.exe\&amp;quot;&amp;quot;))) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;%time%  Encoding NMF ...&amp;quot;);&lt;br /&gt;
			sleep(10);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width %% 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statid ? $projtemp .= &amp;quot;statid++run++statid\n&amp;quot; : $projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;) if $isPCGAME;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	require Win32::TieRegistry;&lt;br /&gt;
	import  Win32::TieRegistry (Delimiter=&amp;gt;&amp;quot;/&amp;quot;, ArrayValues=&amp;gt;0) unless defined $Registry;&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;AVI SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info('Path to source video file e.g. c:\path to\video.avi without quotes.');&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;  - Type n to quit -&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=&amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info('avi #'.@avifiles.' loaded successfully!');&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = 'No avi files found in that folder!';&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo('Continue [y] or rescan [n]?');&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=&amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=&amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid selection.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error(&amp;quot;Could not connect to SDA!&amp;quot;);&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;Try again? [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Rip DVD&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=&amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory. Name a folder for your DVD files.&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will now extract everything needed from the DVD to ${dvdripto}. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info -advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all. You can look at pgclist.txt in the DVD file destination directory to see which titles will be ripped by default.&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=Title numbers: &lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Neither VIDEO_TS or DVD_RTAV folder was found on ${driveletter}:\\. Anri is displeased.&amp;quot;);&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Finished ripping. Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	#substr($buffer, 0, 12) eq pack('C12', 0x44, 0x56, 0x44, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x56, 0x54, 0x53) or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info(&amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}\\. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error(&amp;quot;No folders with DVD files found!&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;Invalid input.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;Invalid selection: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Now indexing MPEG-2 ...&amp;quot;);&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -ab ${_[3]} -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source</id>
		<title>Anri-chan/Source</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source"/>
				<updated>2008-10-03T02:43:05Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: edited mp4nerf.pl description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Anri-chan]] is a set of Windows NT-series [http://en.wikipedia.org/wiki/Batch_file batch files] that bring together the functions of a number of movie editing and encoding applications to create movies suitable for publication on Speed Demos Archive.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 4===&lt;br /&gt;
[[Anri-chan/Source/anri.pl|anri.pl]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/sasami.pl|sasami.pl]] - Translate Anri-written .avs into a FIFO written to by mencoder for running under Unix - to be integrated into anri.pl?&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.pl|mp4nerf.pl]] - Disables all but the first audio track in a muxed MP4 file. Imported from anri.pl.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 3===&lt;br /&gt;
[[Anri-chan/Source/anri.bat|anri.bat]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/statid.bat|statid.bat]] - Station ID sample script; produces an example StatID to preview.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/ini.bat|ini.bat]] - Change settings.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/edit_settings.bat|edit_settings.bat]] - Settings script; asks most of the questions in anri.bat so it can skip them. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Not currently integrated into Anri-chan.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Avisynth Library===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/nate.avs|nate.avs]] - The M2K2SDA Avisynth library written by nate and ballofsnow&lt;br /&gt;
&lt;br /&gt;
===Misc. Files===&lt;br /&gt;
[[Anri-chan/Source/DGIndex.ini|DGIndex.ini]] - DGIndex settings. Take note of Output_Method, Enable_Info_Log and Use_MPA_Extensions.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/infotemplate.avs|infotemplate.avs]] - Used with DGindex to gather information of video, audio and audio delay.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/directshowsource_list.txt|directshowsource_list.txt]] - Compare AVI fourCC with list to determine avisource or directshowsource.&lt;br /&gt;
&lt;br /&gt;
===PHP Files===&lt;br /&gt;
[[Anri-chan/Source/df.php|df.php]] - Produces the dfnd_data.bat and dfnd_titles.bat game database files on the server side.&lt;br /&gt;
&lt;br /&gt;
===C Files===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/pgccount.cpp|pgccount.cpp]] - [[Media:pgccount_0.3.zip|exe]] - Finds all unique program chains in an IFO, to be used with Mplayer's stream dump.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.c|mp4nerf.c]] - [[Media:mp4nerf-b0.1.zip|exe]] - Disables all but the first audio track in a muxed MP4 file. Not currently integrated into anri-chan.&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
[[Anri-chan/Source/anrichan.nsi|anrichan.nsi]] - Anri-chan 3 installer&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/builddir.bat|builddir.bat]] - Helps build directory content list.&lt;br /&gt;
&lt;br /&gt;
===Coding standards===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/Coding_Standards/Perl|Perl]]&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-10-03T02:40:41Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: now imports &amp;amp;mp4nerf()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	use Win32 qw(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	$desktop = Win32::GetFolderPath(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	use Win32 qw(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#import mp4nerf&lt;br /&gt;
push @INC, $anri_dir;&lt;br /&gt;
require 'mp4nerf.pl';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;Main&amp;quot;);&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	['Rip DVD to hard drive (required for DVD material)', 	'&amp;amp;rip_dvd'],&lt;br /&gt;
	['Start new project', 					'&amp;amp;project'],&lt;br /&gt;
	['Extract sample', 					'&amp;amp;proc_sample'],&lt;br /&gt;
	['Station ID preview', 					'&amp;amp;statid_sample'],&lt;br /&gt;
	['Exit', 						'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Sample Extraction&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;action.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;PROJECT SETUP&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). You may not use spaces or the % character in the name, sorry.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}All files associated with this project will appear in ${navy_on_gray}${desktop}\\(project name)\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;You may not use spaces or the % character in the name, sorry.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;MOVIE SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;If you used a capture card with DVD or MPEG settings, place those files in&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;GAME PROPERTIES&amp;quot;);&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo(&amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Find D and F for your game at this URL:&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1 or 4 for D.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;2D game [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;Submit this game's data to SDA? [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;VIDEO PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo(&amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You may now close the VirtualDub window.&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;Did you use VHS to help capture this run? [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;NES [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy Advance [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console) [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;CONTENT PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to trim off unwanted content in this video? [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You can specify multiple ranges of frames. - Type n to quit -&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=&amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;No values entered. Canceling trim.&amp;quot;);&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error(&amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;);&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;Trimming done!&amp;quot;);&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid input. Must be frame number.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info('trim point #'.@trimarr.' loaded successfully!');&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;Station ID&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to append an SDA Station ID to the front and end of this video? [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;);&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info(&amp;quot;Station ID Line ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,'&amp;quot;'.$statidline.'&amp;quot;');&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;READY TO ENCODE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Your settings for this project have been saved to \&amp;quot;${projname}_job.bat\&amp;quot;. To resume the project, double-click that file.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo(&amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;)) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;ENCODING OPTIONS&amp;quot;);&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;ipod',	&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;_LQ&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if (@$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese,[ @$_ ]) if q_boo(&amp;quot;Create @${_[2]} (&amp;quot;.(@$_[4]+(@$_[5]/1000)).&amp;quot; kbps) video? [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = @$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info(&amp;quot;Now encoding ...&amp;quot;);&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
		#				0			    1        2        3       4          5       6&lt;br /&gt;
			eval(@${_[1]}.&amp;quot;(\&amp;quot;&amp;quot;.${projname}.@${_[3]}.${nmf}.&amp;quot;.avs\&amp;quot;, \&amp;quot;&amp;quot;.${projname}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[4]}.&amp;quot;, &amp;quot;.@${_[5]}.&amp;quot;, \&amp;quot;&amp;quot;.@${_[6]}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[7]}.&amp;quot;, &amp;quot;.@${_[8]}.&amp;quot;)&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	$nmf = '_nmf';&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;New Master File&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;Create NMF? [y/n]&amp;quot;, $create_nmf)) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$_=qx(&amp;quot;ECHO %NUMBER_OF_PROCESSORS%&amp;quot;);&lt;br /&gt;
			chomp;&lt;br /&gt;
			$number_of_processors=$_;&lt;br /&gt;
		#Set lagarith to yv12 under doze - yv12 and multithreading turned on&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# multithreading=1&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (my $i = 0;$i &amp;lt; $number_of_processors; $i++) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*${i}.000), floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i+1).&amp;quot;.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1));&lt;br /&gt;
			system(&amp;quot;START /LOW /B \&amp;quot;encoding nmf section &amp;quot;.($i+1).&amp;quot;\&amp;quot; \&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs\&amp;quot; /i \&amp;quot;${anri_dir}/nmf.vcf\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot; &amp;gt; NUL&amp;quot;);&lt;br /&gt;
			$i++;&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		while (grep(/vdub\.exe/, qx(&amp;quot;\&amp;quot;${anri_dir}/tasklist.exe\&amp;quot;&amp;quot;))) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;%time%  Encoding NMF ...&amp;quot;);&lt;br /&gt;
			sleep(10);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width %% 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statid ? $projtemp .= &amp;quot;statid++run++statid\n&amp;quot; : $projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;) if $isPCGAME;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	use Win32::TieRegistry(Delimiter=&amp;gt;&amp;quot;/&amp;quot;,ArrayValues=&amp;gt;0);&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;AVI SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info('Path to source video file e.g. c:\path to\video.avi without quotes.');&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;  - Type n to quit -&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=&amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info('avi #'.@avifiles.' loaded successfully!');&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = 'No avi files found in that folder!';&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo('Continue [y] or rescan [n]?');&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=&amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=&amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid selection.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error(&amp;quot;Could not connect to SDA!&amp;quot;);&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;Try again? [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Rip DVD&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=&amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory. Name a folder for your DVD files.&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will now extract everything needed from the DVD to ${dvdripto}. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info -advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all. You can look at pgclist.txt in the DVD file destination directory to see which titles will be ripped by default.&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=Title numbers: &lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Neither VIDEO_TS or DVD_RTAV folder was found on ${driveletter}:\\. Anri is displeased.&amp;quot;);&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Finished ripping. Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	#substr($buffer, 0, 12) eq pack('C12', 0x44, 0x56, 0x44, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x56, 0x54, 0x53) or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info(&amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}\\. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error(&amp;quot;No folders with DVD files found!&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;Invalid input.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;Invalid selection: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Now indexing MPEG-2 ...&amp;quot;);&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -b &amp;quot;.($_[3]/1000).&amp;quot; -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl</id>
		<title>Anri-chan/Source/mp4nerf.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl"/>
				<updated>2008-10-03T02:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: suppressed status messages when called from anri&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package mp4nerf;&lt;br /&gt;
&lt;br /&gt;
$action = 'nerf';  # default when called from anri&lt;br /&gt;
{ no warnings 'once'; *anri::mp4nerf = *mp4nerf; }&lt;br /&gt;
exit &amp;amp;mp4batchnerf(@ARGV) unless defined caller();&lt;br /&gt;
&lt;br /&gt;
sub mp4batchnerf {&lt;br /&gt;
	$verbose = 1;&lt;br /&gt;
	$action  = 'print';  # default when called stand-alone&lt;br /&gt;
	&amp;amp;pout(&amp;quot;MP4 audio track disabler\n&amp;quot;);&lt;br /&gt;
	&amp;amp;pout(&amp;quot;beta 0.2, DJ Grenola &amp;amp; SelbyMD\n\n&amp;quot;);&lt;br /&gt;
	&amp;amp;pout(&amp;quot;This software comes with no warranty.\n\n&amp;quot;);&lt;br /&gt;
	unless (grep {-e} @_) {&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl    &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to print track information\n&amp;quot;);&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl -n &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to disable commentary\n&amp;quot;);&lt;br /&gt;
		&amp;amp;perr(&amp;quot;Usage: mp4nerf.pl -u &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to re-enable commentary\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	for $arg (@_) {&lt;br /&gt;
		if    ($arg eq '-p') { $action = 'print'  }&lt;br /&gt;
		elsif ($arg eq '-u') { $action = 'unnerf' }&lt;br /&gt;
		elsif ($arg eq '-n') { $action = 'nerf'   }&lt;br /&gt;
		elsif ($arg eq '-x') { $action = 'nerf'   }&lt;br /&gt;
		else                 { $files++; $errors += &amp;amp;mp4nerf($arg) }&lt;br /&gt;
	}&lt;br /&gt;
	if ($errors) {&lt;br /&gt;
		&amp;amp;perr(&amp;quot;[-] There were errors during processing. [${errors}/${files}]\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;pout(&amp;quot;[+] All files processed successfully.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return $errors;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub mp4nerf {&lt;br /&gt;
	$mp4file        = shift;&lt;br /&gt;
	$matches        = 0;&lt;br /&gt;
	$tracks_to_skip = ($action eq 'nerf') ? 1 : 0;&lt;br /&gt;
	unless (open(FH, '+&amp;lt;:raw', $mp4file)) {&lt;br /&gt;
		&amp;amp;perr(qq([-] Failed to open file &amp;quot;${mp4file}&amp;quot;.\n\n));&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;pout(qq([+] Scanning file &amp;quot;${mp4file}&amp;quot;.\n));&lt;br /&gt;
	@traks = &amp;amp;getatomtree([qw(moov trak)], [0, -s $mp4file]);&lt;br /&gt;
	unless (@traks) {&lt;br /&gt;
		&amp;amp;perr(qq([-] No tracks found. Maybe this isn't an mp4 file.\n\n));&lt;br /&gt;
		close(FH);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	for $trak (@traks) {&lt;br /&gt;
		($tkhd) = &amp;amp;getatoms('tkhd', @$trak);&lt;br /&gt;
		($offset, $id, $status, $type) = ($$tkhd[0], &amp;amp;id($tkhd), &amp;amp;status($tkhd), &amp;amp;type($trak));&lt;br /&gt;
		unless (defined($id) and defined($status)) {&lt;br /&gt;
			&amp;amp;perr(qq([-] Error reading from file &amp;quot;${mp4file}&amp;quot;.\n\n));&lt;br /&gt;
			close(FH);&lt;br /&gt;
			return 1;&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;[+] Track %d (%7s,%8s) at 0x%08x, &amp;quot;, $id, $type, $status, $$trak[0] - 8) if $verbose;&lt;br /&gt;
		if ($type ne 'audio') {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;ignored.\n&amp;quot;);&lt;br /&gt;
		} elsif (++$matches &amp;lt;= $tracks_to_skip) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;skipped.\n&amp;quot;);&lt;br /&gt;
		} elsif (($action eq 'nerf') and ($status eq 'enabled')) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;attempting to disable ...\n&amp;quot;);&lt;br /&gt;
			if (nerf($offset)) {&lt;br /&gt;
				&amp;amp;pout(&amp;quot;[+] Nerfed successfully.\n&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;perr(&amp;quot;[-] Failed to nerf this track.\n\n&amp;quot;);&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (($action eq 'unnerf') and ($status eq 'disabled')) {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;attempting to enable ...\n&amp;quot;);&lt;br /&gt;
			if (unnerf($offset)) {&lt;br /&gt;
				&amp;amp;pout(&amp;quot;[+] Unnerfed successfully.\n&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;perr(&amp;quot;[-] Failed to unnerf this track.\n\n&amp;quot;);&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;pout(&amp;quot;no action taken.\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;pout(qq([+] File &amp;quot;$mp4file&amp;quot; processed successfully.\n\n));&lt;br /&gt;
	close(FH);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub pout { print STDOUT @_ if $verbose }&lt;br /&gt;
sub perr { print STDERR @_ }&lt;br /&gt;
&lt;br /&gt;
sub myread  { sysseek(FH, $_[1], 0) and ( sysread(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
sub mywrite { sysseek(FH, $_[1], 0) and (syswrite(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
&lt;br /&gt;
sub nerf   { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) &amp;amp; 0xFE), $_[0] + 3, 1) }&lt;br /&gt;
sub unnerf { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) | 0x01), $_[0] + 3, 1) }&lt;br /&gt;
&lt;br /&gt;
sub isvideo { &amp;amp;getatomtree([qw(mdia minf vmhd)], $_[0]) }&lt;br /&gt;
sub isaudio { &amp;amp;getatomtree([qw(mdia minf smhd)], $_[0]) }&lt;br /&gt;
&lt;br /&gt;
sub type   { &amp;amp;isaudio ? 'audio' : &amp;amp;isvideo ? 'video' : 'unknown' }&lt;br /&gt;
sub id     { &amp;amp;myread($temp, $_[0][0] + 12, 4) ?   unpack('N', $temp) : 0 }&lt;br /&gt;
sub status { &amp;amp;myread($temp, $_[0][0] +  3, 1) ? ((unpack('C', $temp) % 2) ? 'enabled' : 'disabled') : undef }&lt;br /&gt;
&lt;br /&gt;
sub getatoms {&lt;br /&gt;
	($atomname, $start, $end) = @_;&lt;br /&gt;
	@atoms = ();&lt;br /&gt;
	use bytes;&lt;br /&gt;
	while ($start &amp;lt; $end) {&lt;br /&gt;
		last unless &amp;amp;myread($temp, $start, 8);&lt;br /&gt;
		($size, $name) = unpack('NA4', $temp);&lt;br /&gt;
		if ($size == 1) {    # might not have 'Q', so do this manually&lt;br /&gt;
			last unless &amp;amp;myread($temp, $start + 8, 8);&lt;br /&gt;
			$size = unpack('N', substr($temp, 0, 4)) * 2**32 + unpack('N', substr($temp, 4, 4));&lt;br /&gt;
		}&lt;br /&gt;
		if ($size &amp;lt; 8) { $size = (-s $mp4file) - $start }&lt;br /&gt;
		if ($name eq $atomname) { push @atoms, [$start + 8, $start + $size] }&lt;br /&gt;
		$start += $size;&lt;br /&gt;
	}&lt;br /&gt;
	@atoms;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub getatomtree {&lt;br /&gt;
	@tree = ($_[1]);&lt;br /&gt;
	for my $atomname (@{$_[0]}) {&lt;br /&gt;
		last unless @tree;&lt;br /&gt;
		@tree = map { &amp;amp;getatoms($atomname, @$_) } @tree;&lt;br /&gt;
	}&lt;br /&gt;
	@tree;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-09-27T23:50:39Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added &amp;amp;pgccount()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	use Win32 qw(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	$desktop = Win32::GetFolderPath(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	use Win32 qw(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;Main&amp;quot;);&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	['Rip DVD to hard drive (required for DVD material)', 	'&amp;amp;rip_dvd'],&lt;br /&gt;
	['Start new project', 					'&amp;amp;project'],&lt;br /&gt;
	['Extract sample', 					'&amp;amp;proc_sample'],&lt;br /&gt;
	['Station ID preview', 					'&amp;amp;statid_sample'],&lt;br /&gt;
	['Exit', 						'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Sample Extraction&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;action.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;PROJECT SETUP&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). You may not use spaces or the % character in the name, sorry.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}All files associated with this project will appear in ${navy_on_gray}${desktop}\\(project name)\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;You may not use spaces or the % character in the name, sorry.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;MOVIE SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;If you used a capture card with DVD or MPEG settings, place those files in&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;GAME PROPERTIES&amp;quot;);&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo(&amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Find D and F for your game at this URL:&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1 or 4 for D.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;2D game [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;Submit this game's data to SDA? [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;VIDEO PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo(&amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You may now close the VirtualDub window.&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;Did you use VHS to help capture this run? [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;NES [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy Advance [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console) [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;CONTENT PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to trim off unwanted content in this video? [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You can specify multiple ranges of frames. - Type n to quit -&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=&amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;No values entered. Canceling trim.&amp;quot;);&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error(&amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;);&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;Trimming done!&amp;quot;);&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid input. Must be frame number.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info('trim point #'.@trimarr.' loaded successfully!');&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;Station ID&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to append an SDA Station ID to the front and end of this video? [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;);&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info(&amp;quot;Station ID Line ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				chomp($statidline);&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,'&amp;quot;'.$statidline.'&amp;quot;');&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;READY TO ENCODE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Your settings for this project have been saved to \&amp;quot;${projname}_job.bat\&amp;quot;. To resume the project, double-click that file.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo(&amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;)) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;ENCODING OPTIONS&amp;quot;);&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;ipod',	&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;_LQ&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if (@$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese,[ @$_ ]) if q_boo(&amp;quot;Create @${_[2]} (&amp;quot;.(@$_[4]+(@$_[5]/1000)).&amp;quot; kbps) video? [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = @$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info(&amp;quot;Now encoding ...&amp;quot;);&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
		#				0			    1        2        3       4          5       6&lt;br /&gt;
			eval(@${_[1]}.&amp;quot;(\&amp;quot;&amp;quot;.${projname}.@${_[3]}.${nmf}.&amp;quot;.avs\&amp;quot;, \&amp;quot;&amp;quot;.${projname}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[4]}.&amp;quot;, &amp;quot;.@${_[5]}.&amp;quot;, \&amp;quot;&amp;quot;.@${_[6]}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[7]}.&amp;quot;, &amp;quot;.@${_[8]}.&amp;quot;)&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	$nmf = '_nmf';&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;New Master File&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;Create NMF? [y/n]&amp;quot;, $create_nmf)) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$_=qx(&amp;quot;ECHO %NUMBER_OF_PROCESSORS%&amp;quot;);&lt;br /&gt;
			chomp;&lt;br /&gt;
			$number_of_processors=$_;&lt;br /&gt;
		#Set lagarith to yv12 under doze - yv12 and multithreading turned on&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# multithreading=1&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (my $i = 0;$i &amp;lt; $number_of_processors; $i++) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*${i}.000), floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i+1).&amp;quot;.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1));&lt;br /&gt;
			system(&amp;quot;START /LOW /B \&amp;quot;encoding nmf section &amp;quot;.($i+1).&amp;quot;\&amp;quot; \&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs\&amp;quot; /i \&amp;quot;${anri_dir}/nmf.vcf\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot; &amp;gt; NUL&amp;quot;);&lt;br /&gt;
			$i++;&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		while (grep(/vdub\.exe/, qx(&amp;quot;\&amp;quot;${anri_dir}/tasklist.exe\&amp;quot;&amp;quot;))) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;%time%  Encoding NMF ...&amp;quot;);&lt;br /&gt;
			sleep(10);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width %% 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statid ? $projtemp .= &amp;quot;statid++run++statid\n&amp;quot; : $projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;) if $isPCGAME;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	use Win32::TieRegistry(Delimiter=&amp;gt;&amp;quot;/&amp;quot;,ArrayValues=&amp;gt;0);&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;AVI SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info('Path to source video file e.g. c:\path to\video.avi without quotes.');&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;  - Type n to quit -&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=&amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info('avi #'.@avifiles.' loaded successfully!');&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = 'No avi files found in that folder!';&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo('Continue [y] or rescan [n]?');&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=&amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=&amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid selection.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error(&amp;quot;Could not connect to SDA!&amp;quot;);&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;Try again? [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Rip DVD&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=&amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory. Name a folder for your DVD files.&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will now extract everything needed from the DVD to ${dvdripto}. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;) {&lt;br /&gt;
			&amp;amp;pgccount(&amp;lt;${dvdsource}/VTS*.IFO&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info -advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all. You can look at pgclist.txt in the DVD file destination directory to see which titles will be ripped by default.&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=Title numbers: &lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from &amp;amp;pgccount()&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Neither VIDEO_TS or DVD_RTAV folder was found on ${driveletter}:\\. Anri is displeased.&amp;quot;);&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Finished ripping. Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# finds all unique program chains in a set of IFO files, stores in @pgclist&lt;br /&gt;
sub pgccount {&lt;br /&gt;
	use bytes;&lt;br /&gt;
	$pgctable = 0x1000;&lt;br /&gt;
	for $ifofile (@_) {&lt;br /&gt;
		next unless &amp;amp;check_ifo();&lt;br /&gt;
		@sectors = ();&lt;br /&gt;
		for (1 .. unpack('n', substr($buffer, $pgctable, 2))) {&lt;br /&gt;
			$pgcstart   = unpack('N', substr($buffer, $pgctable + $_ * 8 + 4,             4));&lt;br /&gt;
			$cellstart  = unpack('n', substr($buffer, $pgctable + $pgcstart + 0xE8,       2)) + 8;&lt;br /&gt;
			$cellsector = unpack('N', substr($buffer, $pgctable + $pgcstart + $cellstart, 4));&lt;br /&gt;
			$currentpgc++;&lt;br /&gt;
			unless (grep { $_ == $cellsector } @sectors) {&lt;br /&gt;
				push @sectors, $cellsector;&lt;br /&gt;
				push @pgclist, &amp;quot;${currentpgc},${ifofile}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# performs error checking for pgccount&lt;br /&gt;
sub check_ifo {&lt;br /&gt;
	-s $ifofile &amp;lt; 2**20 or return 0;&lt;br /&gt;
	open(IFO, '&amp;lt;:raw', $ifofile) or return 0;&lt;br /&gt;
	local $/;&lt;br /&gt;
	$buffer = &amp;lt;IFO&amp;gt;;&lt;br /&gt;
	close(IFO);&lt;br /&gt;
	substr($buffer, 0, 12) eq 'DVDVIDEO-VTS' or return 0;&lt;br /&gt;
	#substr($buffer, 0, 12) eq pack('C12', 0x44, 0x56, 0x44, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x56, 0x54, 0x53) or return 0;&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info(&amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}\\. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error(&amp;quot;No folders with DVD files found!&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;Invalid input.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;Invalid selection: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Now indexing MPEG-2 ...&amp;quot;);&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -b &amp;quot;.($_[3]/1000).&amp;quot; -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source</id>
		<title>Anri-chan/Source</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source"/>
				<updated>2008-09-22T00:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: added mp4nerf.pl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Anri-chan]] is a set of Windows NT-series [http://en.wikipedia.org/wiki/Batch_file batch files] that bring together the functions of a number of movie editing and encoding applications to create movies suitable for publication on Speed Demos Archive.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 4===&lt;br /&gt;
[[Anri-chan/Source/anri.pl|anri.pl]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/sasami.pl|sasami.pl]] - Translate Anri-written .avs into a FIFO written to by mencoder for running under Unix - to be integrated into anri.pl?&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.pl|mp4nerf.pl]] - Disables all but the first audio track in a muxed MP4 file. Not currently integrated into anri-chan.&lt;br /&gt;
&lt;br /&gt;
===Anri-chan 3===&lt;br /&gt;
[[Anri-chan/Source/anri.bat|anri.bat]] - The main script; asks the relevant questions and encodes the movie.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/statid.bat|statid.bat]] - Station ID sample script; produces an example StatID to preview.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/ini.bat|ini.bat]] - Change settings.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/edit_settings.bat|edit_settings.bat]] - Settings script; asks most of the questions in anri.bat so it can skip them. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Not currently integrated into Anri-chan.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Avisynth Library===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/nate.avs|nate.avs]] - The M2K2SDA Avisynth library written by nate and ballofsnow&lt;br /&gt;
&lt;br /&gt;
===Misc. Files===&lt;br /&gt;
[[Anri-chan/Source/DGIndex.ini|DGIndex.ini]] - DGIndex settings. Take note of Output_Method, Enable_Info_Log and Use_MPA_Extensions.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/infotemplate.avs|infotemplate.avs]] - Used with DGindex to gather information of video, audio and audio delay.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/directshowsource_list.txt|directshowsource_list.txt]] - Compare AVI fourCC with list to determine avisource or directshowsource.&lt;br /&gt;
&lt;br /&gt;
===PHP Files===&lt;br /&gt;
[[Anri-chan/Source/df.php|df.php]] - Produces the dfnd_data.bat and dfnd_titles.bat game database files on the server side.&lt;br /&gt;
&lt;br /&gt;
===C Files===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/pgccount.cpp|pgccount.cpp]] - [[Media:pgccount_0.3.zip|exe]] - Finds all unique program chains in an IFO, to be used with Mplayer's stream dump.&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/mp4nerf.c|mp4nerf.c]] - [[Media:mp4nerf-b0.1.zip|exe]] - Disables all but the first audio track in a muxed MP4 file. Not currently integrated into anri-chan.&lt;br /&gt;
&lt;br /&gt;
===Compile===&lt;br /&gt;
[[Anri-chan/Source/anrichan.nsi|anrichan.nsi]] - Anri-chan 3 installer&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/builddir.bat|builddir.bat]] - Helps build directory content list.&lt;br /&gt;
&lt;br /&gt;
===Coding standards===&lt;br /&gt;
&lt;br /&gt;
[[Anri-chan/Source/Coding_Standards/Perl|Perl]]&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl</id>
		<title>Anri-chan/Source/mp4nerf.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/mp4nerf.pl"/>
				<updated>2008-09-22T00:50:24Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: New page: &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt; #!/usr/bin/perl use warnings; use strict 'subs'; package mp4;  exit &amp;amp;mp4batchnerf(@ARGV) unless caller();  ################################################ # mp4nerf.pl # c v...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package mp4;&lt;br /&gt;
&lt;br /&gt;
exit &amp;amp;mp4batchnerf(@ARGV) unless caller();&lt;br /&gt;
&lt;br /&gt;
################################################&lt;br /&gt;
# mp4nerf.pl&lt;br /&gt;
# c version by DJ Grenola on 17 July 2007&lt;br /&gt;
# perl version by SelbyMD on 20 September 2008&lt;br /&gt;
# license: none (public domain)&lt;br /&gt;
################################################&lt;br /&gt;
&lt;br /&gt;
sub mp4batchnerf {&lt;br /&gt;
	print &amp;quot;MP4 audio track disabler\n&amp;quot;;&lt;br /&gt;
	print &amp;quot;beta 0.2, DJ Grenola &amp;amp; SelbyMD\n\n&amp;quot;;&lt;br /&gt;
	print &amp;quot;This software comes with no warranty.\n\n&amp;quot;;&lt;br /&gt;
	unless (grep {-e} @_) {&lt;br /&gt;
		print &amp;quot;Usage: mp4nerf.pl    &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to print track information\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;Usage: mp4nerf.pl -n &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to disable commentary\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;Usage: mp4nerf.pl -u &amp;lt;MP4 file&amp;gt; [ &amp;lt;MP4 file&amp;gt; ... ] to re-enable commentary\n&amp;quot;;&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	$action = 'print';&lt;br /&gt;
	for $arg (@_) {&lt;br /&gt;
		if    ($arg eq '-p') { $action = 'print'  }&lt;br /&gt;
		elsif ($arg eq '-u') { $action = 'unnerf' }&lt;br /&gt;
		elsif ($arg eq '-n') { $action = 'nerf'   }&lt;br /&gt;
		elsif ($arg eq '-x') { $action = 'nerf'   }&lt;br /&gt;
		else                 { $files++; $errors += &amp;amp;mp4nerf($arg) }&lt;br /&gt;
	}&lt;br /&gt;
	if ($errors) {&lt;br /&gt;
		printf &amp;quot;[-] %s file%s had errors during processing.\n&amp;quot;,&lt;br /&gt;
		    ($files == 1) ? ('The', '') : (&amp;quot;${errors} of ${files}&amp;quot;, 's');&lt;br /&gt;
	} else {&lt;br /&gt;
		printf &amp;quot;[+] %s file%s processed successfully.\n&amp;quot;,&lt;br /&gt;
		    ($files == 1) ? ('The', ' was') : (&amp;quot;All ${files}&amp;quot;, 's were');&lt;br /&gt;
	}&lt;br /&gt;
	return $errors;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub mp4nerf {&lt;br /&gt;
	$mp4file        = shift;&lt;br /&gt;
	$matches        = 0;&lt;br /&gt;
	$tracks_to_skip = ($action eq 'nerf') ? 1 : 0;&lt;br /&gt;
	unless (open(FH, '+&amp;lt;:raw', $mp4file)) {&lt;br /&gt;
		print qq([-] Failed to open file &amp;quot;${mp4file}&amp;quot;.\n\n);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	print qq([+] Scanning file &amp;quot;${mp4file}&amp;quot;.\n);&lt;br /&gt;
	@traks = &amp;amp;getatomtree([qw(moov trak)], [0, -s $mp4file]);&lt;br /&gt;
	unless (@traks) {&lt;br /&gt;
		print qq([-] No tracks found. Maybe this isn't an mp4 file.\n\n);&lt;br /&gt;
		close(FH);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	for $trak (@traks) {&lt;br /&gt;
		($tkhd) = &amp;amp;getatoms('tkhd', @$trak);&lt;br /&gt;
		($offset, $id, $status, $type) = ($$tkhd[0], &amp;amp;id($tkhd), &amp;amp;status($tkhd), &amp;amp;type($trak));&lt;br /&gt;
		unless (defined($id) and defined($status)) {&lt;br /&gt;
			print qq([-] Error reading from file &amp;quot;${mp4file}&amp;quot;.\n\n);&lt;br /&gt;
			close(FH);&lt;br /&gt;
			return 1;&lt;br /&gt;
		}&lt;br /&gt;
		printf &amp;quot;[+] Track %d (%7s,%8s) at 0x%08x, &amp;quot;, $id, $type, $status, $$trak[0] - 8;&lt;br /&gt;
		if ($type ne 'audio') {&lt;br /&gt;
			print &amp;quot;ignored.\n&amp;quot;;&lt;br /&gt;
		} elsif (++$matches &amp;lt;= $tracks_to_skip) {&lt;br /&gt;
			print &amp;quot;skipped.\n&amp;quot;;&lt;br /&gt;
		} elsif (($action eq 'nerf') and ($status eq 'enabled')) {&lt;br /&gt;
			print &amp;quot;attempting to disable ...\n&amp;quot;;&lt;br /&gt;
			if (nerf($offset)) {&lt;br /&gt;
				print &amp;quot;[+] Nerfed successfully.\n&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				print &amp;quot;[-] Failed to nerf this track.\n\n&amp;quot;;&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (($action eq 'unnerf') and ($status eq 'disabled')) {&lt;br /&gt;
			print &amp;quot;attempting to enable ...\n&amp;quot;;&lt;br /&gt;
			if (unnerf($offset)) {&lt;br /&gt;
				print &amp;quot;[+] Unnerfed successfully.\n&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				print &amp;quot;[-] Failed to unnerf this track.\n\n&amp;quot;;&lt;br /&gt;
				close(FH);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;no action taken.\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	print qq([+] File &amp;quot;$mp4file&amp;quot; processed successfully.\n\n);&lt;br /&gt;
	close(FH);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub myread  { sysseek(FH, $_[1], 0) and ( sysread(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
sub mywrite { sysseek(FH, $_[1], 0) and (syswrite(FH, $_[0], $_[2]) == $_[2]) }&lt;br /&gt;
&lt;br /&gt;
sub nerf   { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) &amp;amp; 0xFE), $_[0] + 3, 1) }&lt;br /&gt;
sub unnerf { &amp;amp;myread($temp, $_[0] + 3, 1) and &amp;amp;mywrite(pack('C', unpack('C', $temp) | 0x01), $_[0] + 3, 1) }&lt;br /&gt;
&lt;br /&gt;
sub isvideo { &amp;amp;getatomtree([qw(mdia minf vmhd)], $_[0]) }&lt;br /&gt;
sub isaudio { &amp;amp;getatomtree([qw(mdia minf smhd)], $_[0]) }&lt;br /&gt;
&lt;br /&gt;
sub type   { &amp;amp;isaudio ? 'audio' : &amp;amp;isvideo ? 'video' : 'unknown' }&lt;br /&gt;
sub id     { &amp;amp;myread($temp, $_[0][0] + 12, 4) ?   unpack('N', $temp) : 0 }&lt;br /&gt;
sub status { &amp;amp;myread($temp, $_[0][0] +  3, 1) ? ((unpack('C', $temp) % 2) ? 'enabled' : 'disabled') : undef }&lt;br /&gt;
&lt;br /&gt;
sub getatoms {&lt;br /&gt;
	($atomname, $start, $end) = @_;&lt;br /&gt;
	@atoms = ();&lt;br /&gt;
	use bytes;    # needed for substr here&lt;br /&gt;
	while ($start &amp;lt; $end) {&lt;br /&gt;
		last unless &amp;amp;myread($temp, $start, 8);&lt;br /&gt;
		($size, $name) = (unpack('N', substr($temp, 0, 4)), substr($temp, 4, 4));&lt;br /&gt;
		if ($size == 1) {    # might not have 'Q', so do this manually&lt;br /&gt;
			last unless &amp;amp;myread($temp, $start + 8, 8);&lt;br /&gt;
			$size = unpack('N', substr($temp, 0, 4)) * 2**32 + unpack('N', substr($temp, 4, 4));&lt;br /&gt;
		}&lt;br /&gt;
		if ($size == 0)         { $size = (-s $mp4file) - $start; }&lt;br /&gt;
		if ($name eq $atomname) { push @atoms, [$start + 8, $start + $size]; }&lt;br /&gt;
		$start += $size;&lt;br /&gt;
	}&lt;br /&gt;
	@atoms;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub getatomtree {&lt;br /&gt;
	@tree = ($_[1]);&lt;br /&gt;
	for my $atomname (@{$_[0]}) {&lt;br /&gt;
		last unless @tree;&lt;br /&gt;
		@tree = map { &amp;amp;getatoms($atomname, @$_) } @tree;&lt;br /&gt;
	}&lt;br /&gt;
	@tree;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	<entry>
		<id>https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl</id>
		<title>Anri-chan/Source/anri.pl</title>
		<link rel="alternate" type="text/html" href="https://kb.speeddemosarchive.com/Anri-chan/Source/anri.pl"/>
				<updated>2008-09-19T04:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;SelbyMD: Replaced cfourcc call with equivalent perl code (using 0xBC).  Still considering better avi parsing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Credits&lt;br /&gt;
#&lt;br /&gt;
# nathan jahnke &amp;lt;njahnke@gmail.com&amp;gt;&lt;br /&gt;
# Ian Bennett&lt;br /&gt;
# Philip &amp;quot;ballofsnow&amp;quot; Cornell&lt;br /&gt;
# Brett &amp;quot;Psonar&amp;quot; Ables&lt;br /&gt;
#&lt;br /&gt;
# Anri is distributed under the terms of the Gnu General Public License 3.0:&lt;br /&gt;
# http://www.gnu.org/licenses/gpl-3.0.txt&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Initialization&lt;br /&gt;
#&lt;br /&gt;
# Some obvious stuff in here. Desktop location is set using the win32api&lt;br /&gt;
# module under Windows.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
use warnings;&lt;br /&gt;
use strict 'subs';&lt;br /&gt;
package anri;&lt;br /&gt;
&lt;br /&gt;
#version of this software, used in building the path to the executable, so must match the value from the installer&lt;br /&gt;
$version = '4a1';&lt;br /&gt;
&lt;br /&gt;
#name of this file&lt;br /&gt;
$anripl = 'anri.pl';&lt;br /&gt;
&lt;br /&gt;
#cute prompt for user input&lt;br /&gt;
$prompt = 'ANRI&amp;gt; ';&lt;br /&gt;
&lt;br /&gt;
#what os are we running? unix is default since there are so many possible flavors&lt;br /&gt;
$os = 'unix';&lt;br /&gt;
$os = 'windows' if &amp;quot;$^O&amp;quot; eq &amp;quot;MSWin32&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#no auto mode yet&lt;br /&gt;
$auto=0;&lt;br /&gt;
&lt;br /&gt;
#nmf off by default, so filename identifier is null&lt;br /&gt;
$nmf='';&lt;br /&gt;
&lt;br /&gt;
if ($os eq 'windows') {&lt;br /&gt;
	#the below api calls probably require the win32api module(?) to be installed which will have to be included in the anri installer ...&lt;br /&gt;
	&lt;br /&gt;
	#get the name of the work directory. this is the desktop by default under windows&lt;br /&gt;
	use Win32 qw(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	$desktop = Win32::GetFolderPath(CSIDL_DESKTOPDIRECTORY);&lt;br /&gt;
	&lt;br /&gt;
	#get the path to program files so we can build the anri program directory&lt;br /&gt;
	use Win32 qw(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	$programfiles = Win32::GetFolderPath(CSIDL_PROGRAM_FILES);&lt;br /&gt;
	&lt;br /&gt;
	#anri program directory&lt;br /&gt;
	$anri_dir = &amp;quot;${programfiles}/anri_${version}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing dgindex.exe under anri's program directory and of the executable itself&lt;br /&gt;
	$dgmpgdec_dir = &amp;quot;${anri_dir}/dgmpgdec152&amp;quot;;&lt;br /&gt;
	$dgindex = 'dgindex.exe';&lt;br /&gt;
	&lt;br /&gt;
	#name of the directory containing virtualdub.exe under anri's program directory and of the executables both gui and cli&lt;br /&gt;
	$vdub_dir = &amp;quot;${anri_dir}/VirtualDub-1.8.5&amp;quot;;&lt;br /&gt;
	$vdubgui = 'virtualdub.exe';&lt;br /&gt;
	$vdubcli = 'vdub.exe';&lt;br /&gt;
	&lt;br /&gt;
	#our encoders&lt;br /&gt;
	$x264 = 'x264.exe';&lt;br /&gt;
	$naac = 'neroaacenc.exe';&lt;br /&gt;
	$mp4box = 'mp4box.exe';&lt;br /&gt;
	$xvid = 'xvid_encraw.exe';&lt;br /&gt;
	$ffmpeg = 'ffmpeg.exe';&lt;br /&gt;
	&lt;br /&gt;
	#some anri support files&lt;br /&gt;
	$directshowsourcelistfile = 'directshowsource_list.txt';&lt;br /&gt;
	$pgccount = &amp;quot;pgccount.exe&amp;quot;;&lt;br /&gt;
	$mplayer = &amp;quot;mplayer.exe&amp;quot;;&lt;br /&gt;
	$wget = &amp;quot;wget.exe&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#dunno about this&lt;br /&gt;
	$dvdripto_parentdir = &amp;quot;C:\\AnriMPEG&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#set some keys in the registry to make vdub show only the input video pane (having both the input and output panes open as is default tends to confuse users)&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update input pane&amp;quot;, &amp;quot;0x0001&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
	&amp;amp;update_registry_key(&amp;quot;CUser/Software/Freeware/VirtualDub/Persistence/Update output pane&amp;quot;, &amp;quot;0x0000&amp;quot;, &amp;quot;REG_DWORD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;CLS&amp;quot;;&lt;br /&gt;
	#or, for debugging ...&lt;br /&gt;
	$clear = &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	#                              Color Initialization&lt;br /&gt;
	# &lt;br /&gt;
	# Edit by: Psonar  -  Brett Ables&lt;br /&gt;
	# Below is the code necessary to use the CECHO.exe function&lt;br /&gt;
	# to add color to anrichan. Run CECHO.exe /? for usage help.&lt;br /&gt;
	# CECHO.exe was written by Thomas Polaert.&lt;br /&gt;
	# &lt;br /&gt;
	# The environment variable CECHO is set to the absolute path&lt;br /&gt;
	# of the CECHO.exe program so that %CECHO% may be used &lt;br /&gt;
	# to call the function regardless of the working directory&lt;br /&gt;
	# &lt;br /&gt;
	# RESET_COLOR is used to reset the default color scheme &lt;br /&gt;
	# after CECHO has been used to output different colors.&lt;br /&gt;
	# &lt;br /&gt;
	# Color is a DOS function that affects the whole command &lt;br /&gt;
	# window at once.  It is used only once here to initialize the&lt;br /&gt;
	# background color of the window. 80 is the same as {black on gray}.&lt;br /&gt;
	# &lt;br /&gt;
	# CECHO is used in out_cls, out_info, out_error, and out_section.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	$cecho = &amp;quot;${anri_dir}/cecho.exe&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$black_on_gray = '{black on gray}';&lt;br /&gt;
	$gray_on_black = '{gray on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$white_on_black = '{white on black}';&lt;br /&gt;
	$aqua_on_black = '{aqua on black}';&lt;br /&gt;
	$blue_on_black = '{blue on black}';&lt;br /&gt;
	$teal_on_gray = '{teal on gray}';&lt;br /&gt;
	$navy_on_gray = '{navy on gray}';&lt;br /&gt;
	$maroon_on_gray = '{maroon on gray}';&lt;br /&gt;
	$maroon_on_silver = '{maroon on silver}';&lt;br /&gt;
	$white_on_gray = '{white on gray}';&lt;br /&gt;
	$red_on_gray = '{red on gray}';&lt;br /&gt;
	&lt;br /&gt;
	$reset_color = &amp;quot;\&amp;quot;${cecho}\&amp;quot; ${black_on_gray}&amp;quot;;&lt;br /&gt;
	system(&amp;quot;Color 80&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
	#FIXME UNIX DESKTOP&lt;br /&gt;
	&lt;br /&gt;
	#color initialization&lt;br /&gt;
	&lt;br /&gt;
	#os-specific commands&lt;br /&gt;
	$clear = &amp;quot;clear&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#FIXME LOGFILE STUFF&lt;br /&gt;
&lt;br /&gt;
#FIXME EXTERNAL CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
#main menu&lt;br /&gt;
&lt;br /&gt;
#FIXME: using_settings&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Main menu&lt;br /&gt;
#&lt;br /&gt;
# Anri's home.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;Main&amp;quot;);&lt;br /&gt;
	@mainmenu = (&lt;br /&gt;
	['Rip DVD to hard drive (required for DVD material)', 	'&amp;amp;rip_dvd'],&lt;br /&gt;
	['Start new project', 					'&amp;amp;project'],&lt;br /&gt;
	['Extract sample', 					'&amp;amp;proc_sample'],&lt;br /&gt;
	['Station ID preview', 					'&amp;amp;statid_sample'],&lt;br /&gt;
	['Exit', 						'exit 0'],&lt;br /&gt;
	);&lt;br /&gt;
	&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([1-5])$/) {&lt;br /&gt;
			#execute the contents of this value in the array&lt;br /&gt;
			eval($mainmenu[$1-1][1]);&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		&amp;amp;out_menu(@mainmenu);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                         Sample extraction procedure&lt;br /&gt;
# &lt;br /&gt;
# Sample extraction is basically regular mode minus a bunch of questions.&lt;br /&gt;
# This procedure gets called when a parameter &amp;quot;sample&amp;quot; has been sent to&lt;br /&gt;
# anri.bat. There isn't much documentation about how this works since this&lt;br /&gt;
# was meant to be short. One thing that's different is that the sample video&lt;br /&gt;
# will have separated fields. This is to avoid the problem with interlacing&lt;br /&gt;
# and the Yv12 colorspace. The fields are then weaved back together to&lt;br /&gt;
# determine DFnD.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub proc_sample {&lt;br /&gt;
#	&amp;amp;out_cls;&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	#FIXME no_pause_before_indexing?&lt;br /&gt;
	$projname = 'anri_sample';&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Sample Extraction&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	$dvdsource ? &amp;amp;index_dvd : &amp;amp;q_avi;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;lanczos4resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;This sample will be 300 frames long. Pick the starting frame of a scene with&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;action.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		#how are we going to do this in unix? your guess is as good as mine&lt;br /&gt;
	}&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[0-9]+$/) {&lt;br /&gt;
			$startframe = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;trim(${startframe},&amp;quot;.($startframe+299).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;AssumeTFF\nSeparateFields\nconverttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;onepass(&amp;quot;${desktop}/${projname}/${projname}.avs&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}&amp;quot;,&amp;quot;128000&amp;quot;,&amp;quot;19&amp;quot;,1);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${desktop}/${projname}/${projname}.mp4&amp;quot;,&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
# 	@todel = (&lt;br /&gt;
# 		&amp;quot;${projname}*.avs&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}.bak&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}*.d2v&amp;quot;,&lt;br /&gt;
# 		&amp;quot;${projname}VTS*&amp;quot;,&lt;br /&gt;
# 		&amp;quot;log*.txt&amp;quot;,&lt;br /&gt;
# 	);&lt;br /&gt;
	chdir(&amp;quot;${desktop}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n\n${white_on_gray}Finished. You will find a sample.mp4 file on your desktop. Feel free to rename it something more descriptive like nameofgame_sample.mp4.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;\n${red_on_gray} - READ -${white_on_gray} You will see that the video has been resized vertically.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${red_on_gray}THIS IS NORMAL${white_on_gray} and will make it easier for the techies to help you.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                             Main procedure&lt;br /&gt;
# &lt;br /&gt;
# Anri's home housing the program flow. This is beginning to end for&lt;br /&gt;
# encoding the video.&lt;br /&gt;
# &lt;br /&gt;
# The first section sets up the project name and folder, or if one already&lt;br /&gt;
# exists it will find the existing settings and go to the encoding stage.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub project {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;ON HERMESUS LUC ARSUS ESTARIAS AUC ELTRAS LI CELES! Now, let's get to work!&amp;quot;);&lt;br /&gt;
	&amp;amp;out_section(&amp;quot;PROJECT SETUP&amp;quot;);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (CALL :q_projname)&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter a project name. This name will be used as the basename for your encoded videos (e.g. the high quality video will be called projectname_HQ.mp4, etc.). You may not use spaces or the % character in the name, sorry.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}All files associated with this project will appear in ${navy_on_gray}${desktop}\\(project name)\n&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/[% ]/) {&lt;br /&gt;
			$projname = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;You may not use spaces or the % character in the name, sorry.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;make_projdir;&lt;br /&gt;
	&amp;amp;load_plugins;&lt;br /&gt;
	#FIXME settings manager&lt;br /&gt;
	#CALL :find_existing_settings&lt;br /&gt;
	#IF &amp;quot;%using_settings%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Movie source&lt;br /&gt;
	# &lt;br /&gt;
	# It's either DVD or AVI, no exceptions (for now). The current method for&lt;br /&gt;
	# DVD extraction is as follows: Find and validate the DVD folder. Check for&lt;br /&gt;
	# the existence of IFO files (has details on structure of DVD). If they are&lt;br /&gt;
	# found, the IFO is analyzed and ripped with Mplayer. Otherwise it goes&lt;br /&gt;
	# straight to DGindex.&lt;br /&gt;
	# &lt;br /&gt;
	# Why Mplayer? It has the ability to rip files per program chain. There is&lt;br /&gt;
	# a problem where indexing multiple program chains can cause audio desync.&lt;br /&gt;
	# Now that we get the data on a per PGC basis, we can index them individually&lt;br /&gt;
	# and join them up later in AviSynth which can properly align video/audio.&lt;br /&gt;
	# &lt;br /&gt;
	# There are two methods for loading AVI files. Either the user enters the&lt;br /&gt;
	# paths to the file individually, or specifies a directory and anri&lt;br /&gt;
	# loads all AVI files alphabetically. There is currently no validation for&lt;br /&gt;
	# AVI files with different video properties.&lt;br /&gt;
	############################################################################&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;MOVIE SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;If you used a capture card with DVD or MPEG settings, place those files in&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;${dvdripto_parentdir}\\foldername\\ and then answer y to the question below.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	q_boo('DVD/MPEG source [y,n]', $dvdsource);&lt;br /&gt;
	#IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; CALL :q_dvdsource&lt;br /&gt;
	if ($dvdsource) {&lt;br /&gt;
		#automation changes for q_driveletter are handled within the function b/c &lt;br /&gt;
		#important code related to ripping and dgindex is found there.&lt;br /&gt;
		&amp;amp;index_dvd;&lt;br /&gt;
	} else {&lt;br /&gt;
		#q_avi must be called (even in &amp;quot;auto&amp;quot; mode) for avs files to be set up properly&lt;br /&gt;
		&amp;amp;q_avi;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Game properties&lt;br /&gt;
	# &lt;br /&gt;
	# The purpose here is to find resolution, framerate and whether there are&lt;br /&gt;
	# flickering effects in the game. An online database is maintained at&lt;br /&gt;
	# http://speeddemosarchive.com/kb/index.php/DF to hold this information since&lt;br /&gt;
	# there isn't really a way to do it programmatically. Probably need C++ for&lt;br /&gt;
	# that... but even then. &lt;br /&gt;
	# &lt;br /&gt;
	# SDA has decided on minimum quantizers of 17 and 19 for low/high resolution&lt;br /&gt;
	# videos.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;GAME PROPERTIES&amp;quot;);&lt;br /&gt;
	if ((!$dvdsource) and (!$auto)) {&lt;br /&gt;
		q_boo(&amp;quot;Is this a PC game/non-console run recorded with screen capture software? If you say no, your video will be treated as NTSC / PAL.&amp;quot;, $isPCGAME);&lt;br /&gt;
	}&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		$d=1 if not defined($d);&lt;br /&gt;
		$f=1 if not defined($f);&lt;br /&gt;
		$twod=0 if not defined($twod);&lt;br /&gt;
		$hqq=19 if not defined($hqq);&lt;br /&gt;
		$prog=1 if not defined($prog);&lt;br /&gt;
		#&amp;amp;proc_gameproperties_p2;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$dfnd_set = 0;&lt;br /&gt;
	&amp;amp;q_dfnd if !$auto;&lt;br /&gt;
	if (!$dfnd_set) {&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;\&amp;quot;D\&amp;quot; and \&amp;quot;F\&amp;quot; are used at SDA to refer to the video dimensions and framerate. D1 is full resolution and D4 is half resolution. F1 is full framerate, F2 is half framerate and F3 is 1/3 framerate.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Find D and F for your game at this URL:&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;If you don't see your game listed there, you can use the Extract Sample main menu option to make a sample video to post in the SDA Tech Support Forum. Someone there will look at the video and let you know what D and F are.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1 or 4 for D.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[14]$/) {&lt;br /&gt;
					$d = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Please enter 1, 2 or 3 for F.&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^[1-5]$/) {&lt;br /&gt;
					$f = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ($f eq 1) {&lt;br /&gt;
			q_boo(&amp;quot;2D game [y,n]&amp;quot;, $twod) if !$auto;&lt;br /&gt;
		}&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#:q_submit_dfnd&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You didn't use the SDA games database. Does that mean that it didn't have your game? If so, we'd love it if you posted the \&amp;quot;D\&amp;quot;, \&amp;quot;F\&amp;quot; and maybe \&amp;quot;2D Game\&amp;quot; info you just entered here, into our DFnD updates topic on SDA, so we can add it to the next version of the database. You don't need to register to do so and it only takes a few seconds.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			system(&amp;quot;START http://speeddemosarchive.com/forum/index.php?action=post;topic=6416.0&amp;quot;) if q_boo(&amp;quot;Submit this game's data to SDA? [y,n]&amp;quot;);&lt;br /&gt;
			#:dfnd_is_set&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$hqq = 17 if $d == 4;&lt;br /&gt;
	$hqq = 19 if $d == 1;&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Video properties&lt;br /&gt;
	# &lt;br /&gt;
	# Wouldn't it be great if there was no more interlacing and everything was&lt;br /&gt;
	# progressive? As you can see, if the video is progressive you pretty much&lt;br /&gt;
	# skip the entire section. Anyways..&lt;br /&gt;
	# &lt;br /&gt;
	# The method for getting the field order is to open up an instance of vdub &lt;br /&gt;
	# with the video, the top half of the screen using Top Field First, and the&lt;br /&gt;
	# bottom half using Bottom Field First. The user then plays it to see which&lt;br /&gt;
	# one looks natural and chooses top or bottom accordingly.&lt;br /&gt;
	# &lt;br /&gt;
	# onepixel simply shifts one of the fields up or down by one pixel.&lt;br /&gt;
	# &lt;br /&gt;
	# TO DO: Describe nes, gba, deflicker.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;VIDEO PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		q_boo(&amp;quot;Progressive or interlaced? If you don't know, it's most likely interlaced (answer 'n' to the question). However, if your video is a PC screen capture (made using e.g. FRAPS or Camtasia) and never touched a VCR or DVD recorder, then it may be progressive.&amp;quot;, $prog);&lt;br /&gt;
	}&lt;br /&gt;
	#IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# function: q_fieldorder&lt;br /&gt;
	# &lt;br /&gt;
	# There's no foolproof method to detect field order programmatically. The&lt;br /&gt;
	# next best thing is to show the user both, and let them decide which looks&lt;br /&gt;
	# better.&lt;br /&gt;
	# &lt;br /&gt;
	# The script is simple enough, have a split screen with AssumeTFF and&lt;br /&gt;
	# AssumeBFF. Whichever is chosen will be used in all AviSynth scripts.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;VirtualDub will now open with a split screen of your video. Find a scene with movement and use the slider or play button to play through it to see which looks better. Enter t for top, or b for bottom. If both look good, enter t.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;tff=last.AssumeTFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;t\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;bff=last.AssumeBFF().SeparateFields().bilinearresize(320,240).subtitle(\&amp;quot;b\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;StackVertical(tff,bff)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	system(&amp;quot;START \&amp;quot;determine field order\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_fieldordertemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_fieldorder_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^[tb]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			tr/tb/10/;&lt;br /&gt;
			$fieldorder = $_;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You may now close the VirtualDub window.&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_fieldordertemp.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	#q_vhs&lt;br /&gt;
	q_boo(&amp;quot;Did you use VHS to help capture this run? [y/n]&amp;quot;, $vhs);&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%d%&amp;quot;==&amp;quot;1&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;1 pixel bob ... answer y if it's jumping up and down, otherwise n.&amp;quot;, $onepixel) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;NES [y/n]&amp;quot;, $nes) if !$auto;&lt;br /&gt;
	#IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy Advance [y/n]&amp;quot;, $gba) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gba;&lt;br /&gt;
	#GOTO proc_gameproperties_p2&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Game Boy [y/n]&amp;quot;, $gb) if !$auto;&lt;br /&gt;
	$deflicker=1 if $gb;&lt;br /&gt;
&lt;br /&gt;
	q_boo(&amp;quot;Deflickered (rereleased old game e.g. Mega Man AC, Sonic Mega Collection, Wii Virtual Console) [y,n]&amp;quot;, $deflicker) if !$auto and ($f != 2);&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Content properties&lt;br /&gt;
	# &lt;br /&gt;
	# For trimming, we startup another vdub instance and ask the user to input&lt;br /&gt;
	# frame numbers. The frame numbers will go into a single variable separated&lt;br /&gt;
	# by spaces. There is currently no validation for entering a frame range&lt;br /&gt;
	# like 50 to 30... or negative numbers. Users can enter dummy values and edit&lt;br /&gt;
	# project_job.bat later on and it will still work.&lt;br /&gt;
	# &lt;br /&gt;
	# StatID... not much to it. Three lines, quotations are allowed. Gets appended&lt;br /&gt;
	# at beginning and end of video.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_gameproperties_p2&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;CONTENT PROPERTIES&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Trimming lets you remove the start and end of the existing movie so you only keep the run itself.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to trim off unwanted content in this video? [y,n]&amp;quot;, $trim)) {&lt;br /&gt;
			############################################################################&lt;br /&gt;
			# function: q_trimming&lt;br /&gt;
			# &lt;br /&gt;
			# Create an array of numbers separated by spaces which will be used later on&lt;br /&gt;
			# when writing to the AviSynth scripts.&lt;br /&gt;
			# &lt;br /&gt;
			# There isn't much validation yet. A modulus of 2 is used to make sure there's&lt;br /&gt;
			# an even number of values. No checking to see if the frame ranges are valid&lt;br /&gt;
			# yet. No checking of negative values either.&lt;br /&gt;
			############################################################################&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;VirtualDub will now open with a low quality temporary version of the source video. Use the slider at the bottom of the VirtualDub window to locate the first and last frame numbers of the part of the video you WANT TO KEEP.&amp;quot;);&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;You can specify multiple ranges of frames. - Type n to quit -&amp;quot;);&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
			&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			if ($isPCGAME) {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,round(last.height*(320.000/last.width)))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				&amp;amp;echotofile(&amp;quot;Lanczos4Resize(320,240)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			system(&amp;quot;START \&amp;quot;trimming vdub\&amp;quot; \&amp;quot;${vdub_dir}/${vdubgui}\&amp;quot; \&amp;quot;${projname}_trimtemp.avs\&amp;quot;&amp;quot;);&lt;br /&gt;
			@trimarr = ();&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
				if ($_ eq '') {&lt;br /&gt;
					$errormsg=&amp;quot;You must enter a frame number, or type n to quit.&amp;quot;;&lt;br /&gt;
				} elsif (m/^n$/i) {&lt;br /&gt;
					if (@trimarr &amp;lt; 1) {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;No values entered. Canceling trim.&amp;quot;);&lt;br /&gt;
						$trim=0;&lt;br /&gt;
						last;&lt;br /&gt;
					} elsif (@trimarr % 2) {&lt;br /&gt;
						&amp;amp;out_error(&amp;quot;Odd number of frame numbers detected! All trim values erased!&amp;quot;);&lt;br /&gt;
						@trimarr = ();&lt;br /&gt;
					} else {&lt;br /&gt;
						&amp;amp;out_info(&amp;quot;Trimming done!&amp;quot;);&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				} elsif (!m/^[0-9]+$/i) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid input. Must be frame number.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@trimarr,$_);&lt;br /&gt;
					&amp;amp;out_info('trim point #'.@trimarr.' loaded successfully!');&lt;br /&gt;
					&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
					print $prompt;&lt;br /&gt;
					next;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#statid stuff&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;Station ID&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Set the info shown on the Station ID (the clip at the start of an SDA video). Run the Station ID Preview program for a preview.&amp;quot;);&lt;br /&gt;
		if (q_boo(&amp;quot;Do you want to append an SDA Station ID to the front and end of this video? [y,n]&amp;quot;, $statid)) {&lt;br /&gt;
			@statidlines = ();&lt;br /&gt;
			&amp;amp;out_info(&amp;quot;Line 1 is normally the runner's name. Line 2 (and Line 3 if necessary) normally include the game name, the type of run and the time to completion.&amp;quot;);&lt;br /&gt;
			for (my $i = 1 ; $i &amp;lt;= 3 ; $i++) {&lt;br /&gt;
				&amp;amp;out_info(&amp;quot;Station ID Line ${i}:&amp;quot;);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				$statidline = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
				$statidline =~ s/&amp;quot;/&amp;quot;+chr(34)+&amp;quot;/g;&lt;br /&gt;
				push(@statidlines,'&amp;quot;'.$statidline.'&amp;quot;');&lt;br /&gt;
				&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} #end of !$auto&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings&lt;br /&gt;
	# &lt;br /&gt;
	# This is where you get taken when you run project_job.bat. A file compare&lt;br /&gt;
	# is done to check if the user has edited job.bat. If it has been changed,&lt;br /&gt;
	# or if there are missing AviSynth files, the files are rebuilt. So if&lt;br /&gt;
	# someone is tinkering with the AviSynth files, they'd be wise to leave&lt;br /&gt;
	# job.bat alone, else have their work be overwritten.&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
	#:proc_check_settings&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	$ready=1;&lt;br /&gt;
	$ready=0 if !&amp;amp;samefiles(&amp;quot;${projname}_job.bat&amp;quot;,&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
	foreach $thefile (&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;,&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;) {&lt;br /&gt;
		$ready=0 if !-e $thefile;&lt;br /&gt;
	}&lt;br /&gt;
	if (!$ready) {&lt;br /&gt;
		#&amp;amp;savesettings;&lt;br /&gt;
		&amp;amp;script_buildfiles;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	############################################################################&lt;br /&gt;
	# Main procedure - Check settings (continued)&lt;br /&gt;
	# &lt;br /&gt;
	# All necessary files are ready for the encoding stage. Show the user the&lt;br /&gt;
	# current settings, then ask if they want to encode now. Saying no will reset&lt;br /&gt;
	# some variables and take the user back to Game Properties (DFnD).&lt;br /&gt;
	############################################################################&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;check_settings;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$settings_good=1;&lt;br /&gt;
# 	}&lt;br /&gt;
	#IF NOT &amp;quot;%settings_good%&amp;quot;==&amp;quot;y&amp;quot; GOTO proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;READY TO ENCODE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Your settings for this project have been saved to \&amp;quot;${projname}_job.bat\&amp;quot;. To resume the project, double-click that file.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# 	if (!$auto) {&lt;br /&gt;
# 		&amp;amp;q_encodenow;&lt;br /&gt;
# 	} else {&lt;br /&gt;
# 		$start_encode=1;&lt;br /&gt;
# 	}&lt;br /&gt;
&lt;br /&gt;
	if (q_boo(&amp;quot;Do you want to start encoding now [Y] or save the job for a later date [N]?&amp;quot;)) {&lt;br /&gt;
	&lt;br /&gt;
		#:proc_check_settings_p2&lt;br /&gt;
	&lt;br /&gt;
		#FOR %%A IN (dfnd_set d f twod fieldorder vhs onepixel nes gba gameboy deflicker trimarray) DO (SET %%A=)&lt;br /&gt;
		#SET batch=&lt;br /&gt;
	&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bat&amp;quot;);&lt;br /&gt;
	# 	&amp;amp;rm(&amp;quot;${projname}_job.bak&amp;quot;);&lt;br /&gt;
		#GOTO proc_gameproperties&lt;br /&gt;
	&lt;br /&gt;
		############################################################################&lt;br /&gt;
		# Main procedure - Encoding options&lt;br /&gt;
		# &lt;br /&gt;
		# Ask for H.264 LQ/MQ/HQ/IQ, and Xvid LQ/MQ.&lt;br /&gt;
		# &lt;br /&gt;
		# IF D1 and the user is encoding HQ/IQ/XQ, they will be asked whether&lt;br /&gt;
		# they want to encode a New Master File. This is to avoid using the extremely&lt;br /&gt;
		# slow mvbob deinterlacer four times, once for each pass. Instead, it will be&lt;br /&gt;
		# done once and encoded to the lossless Lagarith codec in Yv12 colorspace.&lt;br /&gt;
		# This NMF will then be used to encode HQ/IQ.&lt;br /&gt;
		############################################################################&lt;br /&gt;
	&lt;br /&gt;
		&amp;amp;out_cls_section(&amp;quot;ENCODING OPTIONS&amp;quot;);&lt;br /&gt;
		if (!$auto) {&lt;br /&gt;
			#&amp;amp;savesettings;&lt;br /&gt;
		&lt;br /&gt;
			@encodethese = ();&lt;br /&gt;
			for (&lt;br /&gt;
			#makethisboolean, howtomake, english, id tag, video bitrate in kbaud, audio bitrate in baud, minimum quantizer for x264, delete 2pass stats, delete all other tempfiles&lt;br /&gt;
			#			0		1			2		3	4	5		6	7 8&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;Low quality H.264 MP4&amp;quot;,	&amp;quot;_LQ&amp;quot;,	128,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;ipod',	&amp;quot;Medium quality H.264 MP4&amp;quot;,	&amp;quot;&amp;quot;,	512,	64000,		17,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;twopass',	&amp;quot;High quality H.264 MP4&amp;quot;,	&amp;quot;_HQ&amp;quot;,	2048,	128000,		$hqq,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;Insane quality H.264 MP4&amp;quot;,	&amp;quot;_IQ&amp;quot;,	5000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[    (($d==1) &amp;amp;&amp;amp; ($f==1)),	'&amp;amp;twopass',	&amp;quot;X-Treme quality H.264 MP4&amp;quot;,	&amp;quot;_XQ&amp;quot;,	10000,	$maxaudiobr,	19,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Low quality XviD AVI&amp;quot;,		&amp;quot;&amp;quot;,	128,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			[			1,	'&amp;amp;xvid',	&amp;quot;Medium quality XviD AVI&amp;quot;,	&amp;quot;_LQ&amp;quot;,	512,	64000,		&amp;quot;&amp;quot;,	1,1],&lt;br /&gt;
			) {&lt;br /&gt;
				if (@$_[0]) { #this quality is not disabled for these content properties - so ask the user if they want to make it&lt;br /&gt;
					push(@encodethese,[ @$_ ]) if q_boo(&amp;quot;Create @${_[2]} (&amp;quot;.(@$_[4]+(@$_[5]/1000)).&amp;quot; kbps) video? [y/n]&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
			my $idtag = @$_[3];&lt;br /&gt;
			if (&lt;br /&gt;
				((($d == 1) &amp;amp;&amp;amp; ($f == 1)) &amp;amp;&amp;amp; ($idtag =~ m/^_HQ$/)) #d1 f1 hq&lt;br /&gt;
			or&lt;br /&gt;
				($idtag =~ m/^(_IQ|_XQ)$/) #any iq/xq&lt;br /&gt;
			) {&lt;br /&gt;
				&amp;amp;nmf;&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&amp;amp;out_cls_info(&amp;quot;Now encoding ...&amp;quot;);&lt;br /&gt;
		for (@encodethese) {&lt;br /&gt;
		#				0			    1        2        3       4          5       6&lt;br /&gt;
			eval(@${_[1]}.&amp;quot;(\&amp;quot;&amp;quot;.${projname}.@${_[3]}.${nmf}.&amp;quot;.avs\&amp;quot;, \&amp;quot;&amp;quot;.${projname}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[4]}.&amp;quot;, &amp;quot;.@${_[5]}.&amp;quot;, \&amp;quot;&amp;quot;.@${_[6]}.&amp;quot;\&amp;quot;, &amp;quot;.@${_[7]}.&amp;quot;, &amp;quot;.@${_[8]}.&amp;quot;)&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		#save stuff&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
# MD finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.bat) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; .\finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO  Contents of project folder &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# DIR &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.avs) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# &lt;br /&gt;
# FOR %%G IN (*.log) DO (&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO  Contents of %%G &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO ---------------------------------------- &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   TYPE &amp;quot;%%G&amp;quot; &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
#   ECHO. &amp;gt;&amp;gt; finished\%log%&lt;br /&gt;
# )&lt;br /&gt;
# COPY finished\%log% finished\%log:~0,-4%.bak &amp;gt; NUL&lt;br /&gt;
# ATTRIB +H finished\%log:~0,-4%.bak&lt;br /&gt;
# &lt;br /&gt;
# MOVE /Y ${projname}_LQ.avi finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.avi    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_LQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}.mp4    finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_HQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_IQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# MOVE /Y ${projname}_XQ.mp4 finished &amp;gt; NUL 2&amp;gt;&amp;amp;1&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# :proc_close&lt;br /&gt;
# ECHO.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# IF &amp;quot;%IQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO HQ reached the quality limit imposed by SDA. IQ would reach the same limit, therefore it has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;true&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video. HQ reached the quality limit imposed by SDA so IQ was encoded with XQ settings and XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# IF &amp;quot;%XQskipped%&amp;quot;==&amp;quot;notHD&amp;quot; (&lt;br /&gt;
#   ECHO You chose XQ for high definition video however Anri determined that it is not truly HD. XQ has been skipped. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
#   ECHO. | &amp;quot;%anri_dir%tee.exe&amp;quot; -a finished\read.txt&lt;br /&gt;
# )&lt;br /&gt;
# CALL :out_info All dun.&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               File Handling&lt;br /&gt;
#&lt;br /&gt;
# Handle files in project directory.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#string, &amp;gt; or &amp;gt;&amp;gt;, filepath&lt;br /&gt;
#not much here yet but may need to modify in the future&lt;br /&gt;
#don't forget the \n if you want a newline as this won't do it otherwise&lt;br /&gt;
sub echotofile {&lt;br /&gt;
	open(OUTFILE, &amp;quot;${_[1]}${_[2]}&amp;quot;);&lt;br /&gt;
	print OUTFILE $_[0];&lt;br /&gt;
	close(OUTFILE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub samefiles {&lt;br /&gt;
	open(FILEONE, &amp;quot;${_[0]}&amp;quot;);&lt;br /&gt;
	@fileone=&amp;lt;FILEONE&amp;gt;;&lt;br /&gt;
	close(FILEONE);&lt;br /&gt;
	open(FILETWO, &amp;quot;${_[1]}&amp;quot;);&lt;br /&gt;
	@filetwo=&amp;lt;FILETWO&amp;gt;;&lt;br /&gt;
	close(FILETWO);&lt;br /&gt;
	#are they the same number of lines?&lt;br /&gt;
	return 0 if @fileone != @filetwo;&lt;br /&gt;
	#compare each line ... can tell the line on which they differ but currently no use for it in anri&lt;br /&gt;
	for (my $i = 0 ; $i &amp;lt; @fileone ; $i++) {&lt;br /&gt;
		return 0 if $fileone[$i] ne $filetwo[$i];&lt;br /&gt;
	}&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub make_projdir {&lt;br /&gt;
	chdir($desktop);&lt;br /&gt;
	mkdir($projname) if !-e $projname;&lt;br /&gt;
	chdir($projname);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/silence_stereo_48000.wav&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${dgmpgdec_dir}/infotemplate.avs&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${anri_dir}/ntsc_d1.png&amp;quot;,&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub wipe_avs {&lt;br /&gt;
	chdir(&amp;quot;${desktop}/${projname}&amp;quot;);&lt;br /&gt;
	&amp;amp;rm(&amp;quot;*.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.bak&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.bak&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#load_plugins makes a file plugins.avs in the project directory that contains the proper loadplugin() or import() declarations for every plugin (defined as a file ending in .dll or .avs) found under $anri_dir/plugins.&lt;br /&gt;
sub load_plugins {&lt;br /&gt;
	&amp;amp;rm(&amp;quot;plugins.avs&amp;quot;) if -e &amp;quot;plugins.avs&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	opendir(PLUGINS, &amp;quot;${anri_dir}/plugins&amp;quot;);&lt;br /&gt;
	@plugins = readdir(PLUGINS);&lt;br /&gt;
	closedir(PLUGINS);&lt;br /&gt;
	for (@plugins) {&lt;br /&gt;
		if (m/.*\.([dll]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		} elsif (m/.*\.([avs]+)$/i) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/plugins/${_}\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;plugins.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;plugins.avs&amp;quot;,&amp;quot;plugins.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nmf {&lt;br /&gt;
	$nmf = '_nmf';&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;New Master File&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;NMF: New Master File refers to an intermediate source video file in the encoding process, usually one saved after deinterlacing (to avoid slow deinterlacing during each pass for each quality of output).&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;You have chosen to encode HQ, IQ and/or XQ. We can speed up the encoding process by creating a NMF. BEWARE! The new file can be extremely large, somewhere around 36 to 72 GB per hour. Make sure you have enough hard drive space.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	if (q_boo(&amp;quot;Create NMF? [y/n]&amp;quot;, $create_nmf)) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		$number_of_processors=1;&lt;br /&gt;
		if ($os eq 'windows') {&lt;br /&gt;
			$_=qx(&amp;quot;ECHO %NUMBER_OF_PROCESSORS%&amp;quot;);&lt;br /&gt;
			chomp;&lt;br /&gt;
			$number_of_processors=$_;&lt;br /&gt;
		#Set lagarith to yv12 under doze - yv12 and multithreading turned on&lt;br /&gt;
# 		$lagarith_settings = &amp;lt;&amp;lt;SABRAC;&lt;br /&gt;
# [settings]&lt;br /&gt;
# lossy_option=3&lt;br /&gt;
# multithreading=1&lt;br /&gt;
# SABRAC&lt;br /&gt;
		#commented out until i can figure out how to detect vista&lt;br /&gt;
		# IF DEFINED LOCALAPPDATA (&lt;br /&gt;
		#   REM Vista&lt;br /&gt;
		#   ECHO [settings] &amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; &amp;quot;%LOCALAPPDATA%\VirtualStore\Windows\lagarith.ini&amp;quot;&lt;br /&gt;
		# ) ELSE (&lt;br /&gt;
		#   ECHO [settings] &amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		#   ECHO lossy_option=3 &amp;gt;&amp;gt; %WINDIR%\lagarith.ini&lt;br /&gt;
		# )&lt;br /&gt;
		} else {&lt;br /&gt;
#			use Sys::CPU;&lt;br /&gt;
#			$number_of_processors = Sys::CPU::cpu_count();&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;rm(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#:nmf_vdubloop&lt;br /&gt;
		#counterB&lt;br /&gt;
		$alignedsplice = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (my $i = 0;$i &amp;lt; $number_of_processors; $i++) {&lt;br /&gt;
			&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(floor(last.framecount/${number_of_processors}.000*${i}.000), floor(last.framecount/${number_of_processors}.000*&amp;quot;.($i+1).&amp;quot;.000)-1)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;avisource(\&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
			&amp;amp;rm(&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1));&lt;br /&gt;
			system(&amp;quot;START /LOW /B \&amp;quot;encoding nmf section &amp;quot;.($i+1).&amp;quot;\&amp;quot; \&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avs\&amp;quot; /i \&amp;quot;${anri_dir}/nmf.vcf\&amp;quot; \&amp;quot;${projname}_HQIQXQ_&amp;quot;.($i+1).&amp;quot;.avi\&amp;quot; &amp;gt; NUL&amp;quot;);&lt;br /&gt;
			$i++;&lt;br /&gt;
			$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;converttoyv12\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		#yikes ... better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;changefps(last.framerate)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_IQ_nmf.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ_nmf.avs&amp;quot;,&amp;quot;${projname}_XQ_nmf.avs&amp;quot;);&lt;br /&gt;
		while (grep(/vdub\.exe/, qx(&amp;quot;\&amp;quot;${anri_dir}/tasklist.exe\&amp;quot;&amp;quot;))) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;%time%  Encoding NMF ...&amp;quot;);&lt;br /&gt;
			sleep(10);&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;NMF successfully created. Continuing with encoding process in 5 seconds...&amp;quot;);&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		sleep(5);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: script_buildfiles&lt;br /&gt;
# &lt;br /&gt;
# Delete all avs files and restore base avs which has video source lines.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub script_buildfiles {&lt;br /&gt;
	&amp;amp;wipe_avs;&lt;br /&gt;
	#handle trimming stuff - @trimarr must already have an even number of elements due to our input sanitation&lt;br /&gt;
	if ($trim) {&lt;br /&gt;
		for (my $i=0 ; $i &amp;lt; @trimarr ; $i=($i+2)) {&lt;br /&gt;
			&amp;amp;echotofile(&amp;quot;trim(&amp;quot;.$trimarr[$i].&amp;quot;,&amp;quot;.$trimarr[$i+1].&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$fieldorder ? &amp;amp;echotofile(&amp;quot;AssumeTFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) : &amp;amp;echotofile(&amp;quot;AssumeBFF()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;global pal = (last.height==576) ? true : false\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	if ($isPCGAME) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = last.framerate\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#better use single quotes for this one&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)',&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = round(Sqrt(800*600*last.width/last.height))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Avoid weird res on at least the width.&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_width = new_width - new_width %% 16\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;new_height = round(new_width*last.height/last.width)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 800*600 ? Lanczos4Resize(new_width,new_height) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 640*512 ? Lanczos4Resize(640,round(last.height*(640.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width*last.height &amp;gt; 320*256 ? Lanczos4Resize(320,round(last.height*(320.0000/last.width))) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.height %% 2 == 1 ? AddBorders(0,0,0,1) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;last.width %% 2 == 1 ? AddBorders(0,0,1,0) : NOP\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global f1 = (pal==true) ? 50 : 59.94\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile('WriteFileStart(&amp;quot;resolution.log&amp;quot;,&amp;quot;last.width&amp;quot;,&amp;quot;&amp;quot;&amp;quot; &amp;quot;,&amp;quot; &amp;quot;&amp;quot;&amp;quot;, &amp;quot;last.height&amp;quot;)'.&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 704 or 640 (true), 352 or 320 (false)&lt;br /&gt;
		$dboo = ($d==1) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;;&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = &amp;quot;.$dboo.&amp;quot; ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;cp(&amp;quot;${projname}_HQ.avs&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
		#Set d1 either 352 or 320 for LQ/MQ&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;global d1 = false ? ((pal==true) ? 704 : 640) : ((pal==true) ? 352 : 320)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		#d1 is set, but not yet resized.&lt;br /&gt;
		#this $projtemp is like the old _temp.avs from doze batch anri - not sure if we still need to do this temporarily like this but it's way too complex for me to confidently say we don't so i'm going to keep it&lt;br /&gt;
		$projtemp = '';&lt;br /&gt;
		if ($prog) {&lt;br /&gt;
			$projtemp .= &amp;quot;pal==true ? d1==704 ? lanczos4resize(704,576) : lanczos4resize(352,288) : d1==640 ? lanczos4resize(640,480) : lanczos4resize(320,240)\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$projtemp .= &amp;quot;nate_vhs_head_change_erase\n&amp;quot; if $vhs;&lt;br /&gt;
			$projtemp .= &amp;quot;(pal==true ? d1==704 : d1==640) ? mvbob : separatefields\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_1_pixel_bob_fix\n&amp;quot; if $onepixel;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_retard_bob_2\n&amp;quot; if $deflicker;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_nes\n&amp;quot; if $nes;&lt;br /&gt;
			$projtemp .= &amp;quot;lanczos4resize(d1,last.height)\n&amp;quot;;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gba\n&amp;quot; if $gba;&lt;br /&gt;
			$projtemp .= &amp;quot;nate_gb\n&amp;quot; if $gb;&lt;br /&gt;
		}&lt;br /&gt;
		$projtemp .= &amp;quot;changefps(f1/&amp;quot;.$f.&amp;quot;)\n&amp;quot; if !$prog;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;run=converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statidtype = &amp;quot;d1&amp;quot;;&lt;br /&gt;
	$statidtype = &amp;quot;gba&amp;quot; if $gba;&lt;br /&gt;
	$statidtype = &amp;quot;gb&amp;quot; if $gb;&lt;br /&gt;
	$projtemp .= &amp;quot;statid=nate_statid_&amp;quot;.$statidtype.&amp;quot;(run,\&amp;quot;&amp;quot;.$statidlines[0].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[1].&amp;quot;\&amp;quot;,\&amp;quot;&amp;quot;.$statidlines[2].&amp;quot;\&amp;quot;).ConvertToRGB\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$projtemp .= &amp;quot;statid = float(run.width) / run.height &amp;gt;= 4./3 ?\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(round(run.height*4./3),run.height).AddBorders(floor((run.width-round(run.height*4./3))/2.),0,ceil((run.width-round(run.height*4./3))/2.),0).ConvertToYv12 :\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;\\ statid.Lanczos4Resize(run.width,round(run.width*3./4)).AddBorders(0,floor((run.height-round(run.width*3./4))/2.),0,ceil((run.height-round(run.width*3./4))/2.)).ConvertToYv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	$statid ? $projtemp .= &amp;quot;statid++run++statid\n&amp;quot; : $projtemp .= &amp;quot;run\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;changefps(last.framerate)\n&amp;quot;;&lt;br /&gt;
	$projtemp .= &amp;quot;converttoyv12\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_HQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_IQ.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile($projtemp,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_XQ.avs&amp;quot;) if $isPCGAME;&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if ($twod) {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/3) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;(last.framerate &amp;gt; 31) ? changefps(f1/2) : last\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}_LQ.avs&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_xvid.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}_LQ.avs&amp;quot;,&amp;quot;${projname}_LQ_xvid.avs&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}_trimtemp.avs&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# REM ------- SETTINGS MANAGER -------&lt;br /&gt;
# &lt;br /&gt;
# :find_existing_settings&lt;br /&gt;
# IF EXIST &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot; (&lt;br /&gt;
# 	CALL &amp;quot;%projdirpath%\${projname}_job.bat&amp;quot;&lt;br /&gt;
# 	SET using_settings=y&lt;br /&gt;
# )&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :check_settings&lt;br /&gt;
# CALL :show_settings&lt;br /&gt;
# :check_settings_p2&lt;br /&gt;
# SET s=&lt;br /&gt;
# SET /P s=Do you want to encode using these settings? If you choose No you will be prompted to enter them again. [y/n] &lt;br /&gt;
# CALL :set_var_bool settings_good check_settings_p2&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :show_settings&lt;br /&gt;
# CALL :out_cls_section REVIEW SETTINGS&lt;br /&gt;
# IF DEFINED this_anriver IF NOT &amp;quot;%this_anriver%&amp;quot;==&amp;quot;%anri_ver%&amp;quot; CALL :out_info NOTICE: Your settings for this project were created in an outdated version of Anri. They may not work properly in this version. It is recommended that you discard these settings and re-enter them.&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Source: Yes ) ELSE ( ECHO DVD Source: No )&lt;br /&gt;
# IF &amp;quot;%dvdsource%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO DVD Drive Letter: %driveletter% )&lt;br /&gt;
# ECHO Project Name: ${projname}&lt;br /&gt;
# IF DEFINED avifolder ECHO AVI folder: %avifolder%&lt;br /&gt;
# IF DEFINED avifiles ECHO Source Video Files: %avifiles%&lt;br /&gt;
# IF NOT &amp;quot;%twod%&amp;quot;==&amp;quot;y&amp;quot; (SET twodtemp=3D) ELSE (SET twodtemp=2D)&lt;br /&gt;
# IF DEFINED d IF DEFINED f ECHO Video Format: D%d% F%f% %twodtemp%&lt;br /&gt;
# IF &amp;quot;%vhs%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO From VHS Source ) ELSE ( ECHO Not From VHS Source )&lt;br /&gt;
# IF &amp;quot;%prog%&amp;quot;==&amp;quot;y&amp;quot; ( ECHO Progressive ) ELSE ( ECHO Interlaced )&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;t&amp;quot; ECHO Top field first&lt;br /&gt;
# IF &amp;quot;%fieldorder%&amp;quot;==&amp;quot;b&amp;quot; ECHO Bottom field first&lt;br /&gt;
# IF &amp;quot;%onepixel%&amp;quot;==&amp;quot;y&amp;quot; ECHO One-Pixel Bob&lt;br /&gt;
# IF &amp;quot;%nes%&amp;quot;==&amp;quot;y&amp;quot; ECHO From NES Console&lt;br /&gt;
# IF &amp;quot;%gba%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy Advance&lt;br /&gt;
# IF &amp;quot;%gameboy%&amp;quot;==&amp;quot;y&amp;quot; ECHO From Game Boy&lt;br /&gt;
# IF &amp;quot;%deflicker%&amp;quot;==&amp;quot;y&amp;quot; ECHO Deflickered&lt;br /&gt;
# IF &amp;quot;%trim%&amp;quot;==&amp;quot;y&amp;quot; ECHO Trim frame ranges %trimarray%&lt;br /&gt;
# IF &amp;quot;%statid%&amp;quot;==&amp;quot;y&amp;quot; ECHO StatID: %statid1:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid2:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;% / %statid3:&amp;quot;+chr(34)+&amp;quot;=&amp;quot;%&lt;br /&gt;
# ECHO.&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :savesettings&lt;br /&gt;
# ECHO @ECHO OFF &amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET proj_anriver=%anri_ver%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET using_settings=y) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET dvdsource=%dvdsource%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifolder=%avifolder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET avifiles=%avifiles%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET fieldorder=%fieldorder%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET d=%d%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET f=%f%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET vhs=%vhs%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET onepixel=%onepixel%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET nes=%nes%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET twod=%twod%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid=%statid%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid1=%statid1%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid2=%statid2%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET statid3=%statid3%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET driveletter=%driveletter%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET projname=${projname}) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gba=%gba%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET gameboy=%gameboy%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET deflicker=%deflicker%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET prog=%prog%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trim=%trim%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET trimarray=%trimarray%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET maxaudiobitrate=%maxaudiobitrate%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET hqq=%hqq%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO (SET isPCGAME=%isPCGAME%) &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# ECHO IF NOT &amp;quot;%%in_anrichan%%&amp;quot;==&amp;quot;y&amp;quot; call &amp;quot;%anri_path%&amp;quot; &amp;gt;&amp;gt; &amp;quot;${projname}_job.bat&amp;quot;&lt;br /&gt;
# COPY /Y &amp;quot;${projname}_job.bat&amp;quot; &amp;quot;${projname}_job.bak&amp;quot; &amp;gt; NUL&lt;br /&gt;
# GOTO :EOF&lt;br /&gt;
# &lt;br /&gt;
# :createjob&lt;br /&gt;
# CALL :savesettings&lt;br /&gt;
# PAUSE&lt;br /&gt;
# GOTO die&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Windows&lt;br /&gt;
#&lt;br /&gt;
# These subroutines make use of the win32api module.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#fullpathtokey, data, type&lt;br /&gt;
sub update_registry_key {&lt;br /&gt;
	use Win32::TieRegistry(Delimiter=&amp;gt;&amp;quot;/&amp;quot;,ArrayValues=&amp;gt;0);&lt;br /&gt;
	$Registry-&amp;gt;{$_[0]} = [ $_[1], $_[2] ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               System&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send OS-dependent shell commands.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#/D means change even if cwd is on a different drive letter&lt;br /&gt;
# sub cd {&lt;br /&gt;
# 	$flags = '';&lt;br /&gt;
# 	$flags = ' /D' if $os eq 'windows';&lt;br /&gt;
# 	&lt;br /&gt;
# 	#for debugging&lt;br /&gt;
# 	$command = &amp;quot;cd${flags} \&amp;quot;${_[0]}\&amp;quot;&amp;quot;;&lt;br /&gt;
# 	print &amp;quot;$command\n&amp;quot;;&lt;br /&gt;
# 	system($command);&lt;br /&gt;
# }&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#/B means force binary copy (do not attempt to translate line endings)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub cp {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'cp';&lt;br /&gt;
	$command = 'COPY' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y /B' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path, newpath (both can be relative)&lt;br /&gt;
#/Y means overwrite (i.e. automatically say Yes to the overwrite question)&lt;br /&gt;
#-R means recursive (copy directories and the files in them as well as just files)&lt;br /&gt;
sub mv {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#MOVE gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$command = 'mv';&lt;br /&gt;
	$command = 'MOVE' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -R';&lt;br /&gt;
	$flags = ' /Y' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$redirect = '';&lt;br /&gt;
	$redirect = ' &amp;gt; NUL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$command = &amp;quot;${command}${flags} \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}\&amp;quot;${redirect}&amp;quot;;&lt;br /&gt;
	#for debugging&lt;br /&gt;
#	print $command.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	system($command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#path&lt;br /&gt;
#-r means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
#-f means force (don't ask for confirmation, just do it - may be necessary on some red hat linux installs)&lt;br /&gt;
#/Q means don't ask for confirmation&lt;br /&gt;
#/S means recursive (delete directories and the files in them as well as just files)&lt;br /&gt;
sub rm {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		for (@_) {&lt;br /&gt;
			#COPY gives me errors unless the path delimiter is \ under doze&lt;br /&gt;
			s,/,\\,g if m,/,;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$command = 'rm';&lt;br /&gt;
	$command = 'DEL' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	$flags = ' -rf';&lt;br /&gt;
	$flags = ' /Q /F' if $os eq 'windows';&lt;br /&gt;
	&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		#is this a directory?&lt;br /&gt;
		if (-d &amp;quot;$_&amp;quot;) {&lt;br /&gt;
			$command = 'RD' if $os eq 'windows';&lt;br /&gt;
			$flags = ' /Q /S' if $os eq 'windows';&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		system(&amp;quot;${command}${flags} \&amp;quot;${_}\&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#lol it says subtitle - set the console's title&lt;br /&gt;
sub title {&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system('TITLE '.$_[0]);&lt;br /&gt;
	} else {&lt;br /&gt;
		system('declare -x PROMPT_COMMAND=\'printf &amp;quot;\e]0;'.$_[0].'\a&amp;quot;\'');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Input&lt;br /&gt;
#&lt;br /&gt;
# These subroutines get data from the user.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
# function: q_boo&lt;br /&gt;
# returns boolean, optionally also sets boolean variable (0 or 1)&lt;br /&gt;
#out_info text, [variable to set]&lt;br /&gt;
sub q_boo($;$) {&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (my $userinput = &amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp($userinput);&lt;br /&gt;
		if ($userinput =~ m/^[yn]$/) {&lt;br /&gt;
			#t becomes 1 (true), b becomes 0 (false)&lt;br /&gt;
			$userinput =~ tr/yn/10/;&lt;br /&gt;
			$_[1] = $userinput;&lt;br /&gt;
			return $userinput;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi&lt;br /&gt;
# &lt;br /&gt;
# Ask the user if they want to do manual input of file paths, or automatically&lt;br /&gt;
# by loading the files in a specified directory alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;AVI SOURCE&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Enter the path to each avi file [i]ndividually or [a]utomatically. Note that if you choose automatic, Anri will load the files in an alphabetical manner. The files must have the same resolution and framerate to be joined together.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/([ia])$/) {&lt;br /&gt;
			#i becomes 1 (true), a becomes 0 (false)&lt;br /&gt;
			tr/ia/10/;&lt;br /&gt;
			$_ ? &amp;amp;q_avi_i : &amp;amp;q_avi_a;&lt;br /&gt;
			last;&lt;br /&gt;
		}&lt;br /&gt;
		print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#IF &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; GOTO avimethod_skip&lt;br /&gt;
	#:avimethod_skip&lt;br /&gt;
	#AVI files loaded, generate avs source lines.&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	for $avifile (@avifiles) {&lt;br /&gt;
		&amp;amp;echotofile($alignedsplice, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$fourcc = &amp;quot;&amp;quot;;&lt;br /&gt;
		open(AVIFILE, &amp;quot;&amp;lt;:raw&amp;quot;, $avifile)&lt;br /&gt;
		    and sysseek(AVIFILE, 0xBC, 0)&lt;br /&gt;
		    and sysread(AVIFILE, $fourcc, 4);&lt;br /&gt;
		close(AVIFILE);&lt;br /&gt;
		$sourcedecverb = 'avisource';&lt;br /&gt;
		$sourcedecverb = 'directshowsource' if grep {$_ eq lc($fourcc)} qw(tscc xvid dx50);&lt;br /&gt;
		&amp;amp;echotofile(&amp;quot;${sourcedecverb}(\&amp;quot;${avifile}\&amp;quot;)\n&amp;quot;, &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
		$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	#newline needed&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\nconverttoyuy2()\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_i&lt;br /&gt;
# &lt;br /&gt;
# Manually add each file path to @avifiles. Do some validation; no &lt;br /&gt;
# resolution check yet.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_i {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info('Path to source video file e.g. c:\path to\video.avi without quotes.');&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;  - Type n to quit -&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#:q_avi_i_p2&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#error codes' precedence is descending, e.g. empty string is first because it is the most serious error&lt;br /&gt;
		if ($_ eq '') {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path, or type n to quit.&amp;quot;;&lt;br /&gt;
		} elsif (m/^n$/i) {&lt;br /&gt;
			if (@avifiles &amp;lt; 1) {&lt;br /&gt;
				$errormsg=&amp;quot;You must load at least one avi file.&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				last;&lt;br /&gt;
			}&lt;br /&gt;
		} elsif (!m/.*\.av[si]$/i) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be an avi file, try again.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;File does not exist, try again.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			push(@avifiles,$_);&lt;br /&gt;
			&amp;amp;out_info('avi #'.@avifiles.' loaded successfully!');&lt;br /&gt;
			&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			next;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_avi_a&lt;br /&gt;
# &lt;br /&gt;
# Automatic file loading. User just has to specify a directory and it will&lt;br /&gt;
# load the files alphabetically.&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_avi_a {&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	#saved this string in a variable for use later on down&lt;br /&gt;
	$enterhelp = 'Enter the path to the avi folder e.g. c:\my video folder\ without quotes.';&lt;br /&gt;
	&amp;amp;out_info($enterhelp);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	#Validate avifolder. Check for blank, then :\ for full path if windows, then see whether it exists.&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		@avifiles = ();&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a path.&amp;quot;;&lt;br /&gt;
		} elsif (m/^.[^:][^\\].*/) {&lt;br /&gt;
			$errormsg=&amp;quot;Must be full path.&amp;quot;;&lt;br /&gt;
		} elsif (! -e $_) {&lt;br /&gt;
			$errormsg=&amp;quot;Folder does not exist.&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$avifolder = $_;&lt;br /&gt;
			#remove any and all / or \ characters from the end of the path&lt;br /&gt;
			$avifolder =~ s/[\/]*$//;&lt;br /&gt;
			&lt;br /&gt;
			#build list&lt;br /&gt;
			for (&amp;lt;$avifolder/*.avi&amp;gt;) {&lt;br /&gt;
				push(@avifiles,$_);&lt;br /&gt;
				print $_.&amp;quot;\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			#user can accept if files were found&lt;br /&gt;
			if (@avifiles == 0) {&lt;br /&gt;
				$errormsg = 'No avi files found in that folder!';&lt;br /&gt;
			} else {&lt;br /&gt;
				#Ask user if the list is good.&lt;br /&gt;
				&amp;amp;echo('Continue [y] or rescan [n]?');&lt;br /&gt;
				print $prompt;&lt;br /&gt;
				while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
					chomp;&lt;br /&gt;
					last if (m/^[yn]$/);&lt;br /&gt;
					&lt;br /&gt;
					print &amp;quot;Invalid input.\n\n&amp;quot;;&lt;br /&gt;
					print $prompt;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				#do we need to do this whole thing again?&lt;br /&gt;
				last if $_ eq 'y';&lt;br /&gt;
				$errormsg = $enterhelp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: q_dfnd&lt;br /&gt;
# &lt;br /&gt;
# FIXME&lt;br /&gt;
############################################################################&lt;br /&gt;
sub q_dfnd {&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;The next few questions are about the game played in this video. SDA has a database of games we have seen in the past, which can answer some or all of the questions for you. However, you must be connected to the Internet to use it.&amp;quot;);&lt;br /&gt;
	q_boo(&amp;quot;Do you want to use Anri's games database [Y] or enter the data yourself [N]?&amp;quot;, $dfnd);&lt;br /&gt;
	if ($dfnd) {&lt;br /&gt;
		#:dfnd&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Anri will now attempt to connect to SDA's games database. This may take a few moments. Once complete, you will see a list of all games in the database.&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
		@dfnddata = ();&lt;br /&gt;
		$dfpage = &amp;quot;\&amp;quot;${anri_dir}/${wget}\&amp;quot;&amp;quot;.' -qO- --user-agent=&amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14&amp;quot; &amp;quot;http://speeddemosarchive.com/kb/index.php/DF&amp;quot;';&lt;br /&gt;
		$_ = join(&amp;quot;&amp;quot;,qx($dfpage));&lt;br /&gt;
		#must be only one table on that page ... or at least the dfnd data must be in the first one ... but bman assumed this too and it was ok&lt;br /&gt;
		if (s/.*&amp;lt;table&amp;gt;(.+)&amp;lt;\/table&amp;gt;.*/$1/s) {&lt;br /&gt;
			@rows = split(/&amp;lt;\/tr&amp;gt;\n&amp;lt;tr&amp;gt;/);&lt;br /&gt;
			for (@rows) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				#we don't want the header row&lt;br /&gt;
				next if m/&amp;lt;th/;&lt;br /&gt;
				@data = split(/&amp;lt;\/?t[dr]&amp;gt;+/);&lt;br /&gt;
				$nes = $gb = $gba = $d = $f = $twod = 0;&lt;br /&gt;
				for (@data) {&lt;br /&gt;
					$nes = 1 if m/for [^ ]*NES[^ ]*$/;&lt;br /&gt;
					if (m/(for [^ ]*GBC?[^ ]*)|(for Game Boy( Color)?)$/) {&lt;br /&gt;
						$gb = 1;&lt;br /&gt;
					}&lt;br /&gt;
					if (m/(for [^ ]*GBA[^ ]*)|(for Game Boy Advance)$/) {&lt;br /&gt;
						$gba = 1;&lt;br /&gt;
					}&lt;br /&gt;
					$d = $1 if m/^D([14])$/;&lt;br /&gt;
					$f = $1 if m/^F([123])$/;&lt;br /&gt;
					if (m/^([23])D$/) {&lt;br /&gt;
						$twod = $1;&lt;br /&gt;
						$twod =~ tr/23/10/;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
#			 			0    1   2    3     4     5     6&lt;br /&gt;
				push(@dfnddata,[$_, $d, $f, $twod, $nes, $gb, $gba]);&lt;br /&gt;
			}&lt;br /&gt;
			$titles = '';&lt;br /&gt;
			for $i ( 0 .. $#dfnddata ) {&lt;br /&gt;
				$title = $dfnddata[$i][0];&lt;br /&gt;
				$title =~ s/^&amp;lt;td&amp;gt;([^&amp;lt;]+)&amp;lt;\/td&amp;gt;.+/$1/;&lt;br /&gt;
				$title =~ s/&amp;amp;amp;/\&amp;amp;/g;&lt;br /&gt;
				$titles .= &amp;quot;&amp;quot;.($i+1).&amp;quot;: ${title}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			print $titles;&lt;br /&gt;
			#system(&amp;quot;echo \&amp;quot;${titles}\&amp;quot; | more&amp;quot;);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
			while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
				chomp;&lt;br /&gt;
				if (m/^$/) {&lt;br /&gt;
					$errormsg=&amp;quot;You must choose a game.&amp;quot;;&lt;br /&gt;
				} elsif (m/[^0-9]/) {&lt;br /&gt;
					$errormsg=&amp;quot;Please enter the number of a game.&amp;quot;;&lt;br /&gt;
				} elsif (($_ gt @dfnddata) or ($_ le 0)) {&lt;br /&gt;
					$errormsg=&amp;quot;Invalid selection.&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$gamechoice = $_;&lt;br /&gt;
					last;&lt;br /&gt;
				}&lt;br /&gt;
				&amp;amp;out_error($errormsg);&lt;br /&gt;
				print $prompt;&lt;br /&gt;
			}&lt;br /&gt;
			$gamechoice--;&lt;br /&gt;
			$d = $dfnddata[$gamechoice][1];&lt;br /&gt;
			$f = $dfnddata[$gamechoice][2];&lt;br /&gt;
			$twod = $dfnddata[$gamechoice][3];&lt;br /&gt;
			$nes = $dfnddata[$gamechoice][4];&lt;br /&gt;
			$gb = $dfnddata[$gamechoice][5];&lt;br /&gt;
			$gba = $dfnddata[$gamechoice][6];&lt;br /&gt;
			$dfnd_set = 1;&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;out_error(&amp;quot;Could not connect to SDA!&amp;quot;);&lt;br /&gt;
			&amp;amp;q_dfnd if q_boo(&amp;quot;Try again? [y/n]&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Output&lt;br /&gt;
#&lt;br /&gt;
# These subroutines send data to the console.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub echo {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	if ($os eq 'windows') {&lt;br /&gt;
		system(&amp;quot;\&amp;quot;${cecho}\&amp;quot; &amp;quot;.$_[0].'{\n}');&lt;br /&gt;
	} else {&lt;br /&gt;
		print $_[0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls {&lt;br /&gt;
	system($clear);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${gray_on_black}                                                                               &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_black}                        Speed Demos Archive Anri ${version}&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${aqua_on_black}       http://speeddemosarchive.com/     http://www.metroid2002.com/           &amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${blue_on_black}===============================================================================&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_info {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${white_on_gray}$_[0]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_error {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	for (@_) {&lt;br /&gt;
		&amp;amp;echo(&amp;quot;${maroon_on_gray}[!] ${maroon_on_silver}&amp;quot;.$_);&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${maroon_on_gray}[!]&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_section {&lt;br /&gt;
	$_[0] = '' if not defined $_[0];&lt;br /&gt;
	&amp;amp;title(&amp;quot;Anri ${version} - &amp;quot;.$_[0]);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}&amp;quot;.$_[0].&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${teal_on_gray}-------------------------&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_section {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_section($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub out_cls_info {&lt;br /&gt;
	&amp;amp;out_cls;&lt;br /&gt;
	&amp;amp;out_info($_[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#print the numbered english half of a 2d array consisting of english,command pairs and show the anri prompt at the end&lt;br /&gt;
sub out_menu {&lt;br /&gt;
	for (my $i = 0; $i &amp;lt; @_; $i++) {&lt;br /&gt;
		print &amp;quot; &amp;quot;.($i+1).&amp;quot;. &amp;quot;.$_[$i][0].&amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	print &amp;quot;\n${prompt}&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Acquisition&lt;br /&gt;
#&lt;br /&gt;
# Import video.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: index_dvd&lt;br /&gt;
# &lt;br /&gt;
# Show a list of ripped DVDs. Cycle through the user's choices, indexing&lt;br /&gt;
# VOB/VRO files one by one. Run a preview as well to get the dgindex log.&lt;br /&gt;
# The log gets created in the vob folder, so it needs to be moved to the&lt;br /&gt;
# project folder. Used to determine maxaudiobr. Everything that's been&lt;br /&gt;
# done so far (ripping and indexing) should be transparent with the rest of&lt;br /&gt;
# the program. All that matters is creating a valid project.avs.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
# function: rip_dvd&lt;br /&gt;
# &lt;br /&gt;
# If IFO files are present, rip with Mplayer. Otherwise just a straight copy.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
sub rip_dvd {&lt;br /&gt;
	&amp;amp;out_cls_section(&amp;quot;Rip DVD&amp;quot;);&lt;br /&gt;
	if (!$auto) {&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;What is the drive letter of your DVD drive (e.g. D)?&amp;quot;);&lt;br /&gt;
		&amp;amp;out_info(&amp;quot;Tip: If you already have your DVD source files on your hard drive, move them into C:\\VIDEO_TS\\ and enter C as your drive letter.&amp;quot;);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
		while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
			chomp;&lt;br /&gt;
			if (m/^[a-z]$/i) {&lt;br /&gt;
				$driveletter = $_;&lt;br /&gt;
				last;&lt;br /&gt;
			} else {&lt;br /&gt;
				$errormsg=&amp;quot;You must enter a drive letter. Enter e.g. D, not D: or D:\\.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;amp;out_error($errormsg);&lt;br /&gt;
			print $prompt;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will extract to the ${dvdripto_parentdir} parent directory. Name a folder for your DVD files.&amp;quot;);&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		if (!m/^$/) {&lt;br /&gt;
			$dvdripto = &amp;quot;${dvdripto_parentdir}/${_}&amp;quot;;&lt;br /&gt;
			mkdir($dvdripto) if !-e $dvdripto;&lt;br /&gt;
			last;&lt;br /&gt;
		} else {&lt;br /&gt;
			$errormsg=&amp;quot;You must enter a folder name.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error($errormsg);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Anri will now extract everything needed from the DVD to ${dvdripto}. Make sure you have enough hard drive space (up to 4.3 GB). This may take some time.&amp;quot;);&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	if (-e &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;) {&lt;br /&gt;
		$dvdsource = &amp;quot;${driveletter}:/VIDEO_TS&amp;quot;;&lt;br /&gt;
		if (glob(&amp;quot;${dvdsource}/VTS*.IFO&amp;quot;)) {&lt;br /&gt;
			$ifofiles = join(&amp;quot; &amp;quot;,(glob(&amp;quot;${dvdsource}/VTS*.IFO&amp;quot;)));&lt;br /&gt;
			#forward slash as path delimiter confuses pgccount&lt;br /&gt;
			#$ifofiles =~ s,/,\\,g;&lt;br /&gt;
			$pgccountcommand = &amp;quot;\&amp;quot;${anri_dir}/${pgccount}\&amp;quot; ${ifofiles}&amp;quot;;&lt;br /&gt;
			@pgclist = split(&amp;quot;\n&amp;quot;,qx($pgccountcommand));&lt;br /&gt;
&lt;br /&gt;
			if ($advanced_mode) {&lt;br /&gt;
		#       IF NOT &amp;quot;%auto%&amp;quot;==&amp;quot;y&amp;quot; (&lt;br /&gt;
		#         ECHO.&lt;br /&gt;
		#         CALL :out_info -advanced mode- Rip specific title numbers. Separate by spaces, or leave blank to rip all. You can look at pgclist.txt in the DVD file destination directory to see which titles will be ripped by default.&lt;br /&gt;
		#         SET s=&lt;br /&gt;
		#         SET /P s=Title numbers: &lt;br /&gt;
		#       ) ELSE (&lt;br /&gt;
		#       SET s=%auto_Title_numbers%&lt;br /&gt;
		#       )&lt;br /&gt;
		#       IF DEFINED s (&lt;br /&gt;
		#         REN pgclist.txt pgclist.bak&lt;br /&gt;
		#         FOR %%G IN (!s!) DO (&lt;br /&gt;
		#           TYPE pgclist.bak | FIND &amp;quot;%%G,&amp;quot; &amp;gt;&amp;gt; pgclist.txt&lt;br /&gt;
		#         )&lt;br /&gt;
		#       )&lt;br /&gt;
		#     )&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			#Rip the titles with Mplayer using info from pgclist.txt&lt;br /&gt;
			for (@pgclist) {&lt;br /&gt;
				m/^([^,]+),.+\/VTS_([0-9][0-9])_.*$/;&lt;br /&gt;
				#zero pad to 3 places to avoid sorting problems where 10 comes before 1.&lt;br /&gt;
				$expandpgc = sprintf(&amp;quot;%03d&amp;quot;, $1);&lt;br /&gt;
				#FIXME log this&lt;br /&gt;
				system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${dvdsource}/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if (-e &amp;quot;${driveletter}/DVD_RTAV&amp;quot;) {&lt;br /&gt;
			&amp;amp;cp(&amp;quot;${driveletter}/DVD_RTAV/*&amp;quot;,&amp;quot;${dvdripto}&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;Neither VIDEO_TS or DVD_RTAV folder was found on ${driveletter}:\\. Anri is displeased.&amp;quot;);&lt;br /&gt;
			#GOTO DIE&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Finished ripping. Press ENTER to continue ...&amp;quot;);&lt;br /&gt;
	&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub index_dvd {&lt;br /&gt;
	$maxaudiobr = 320000;&lt;br /&gt;
	&amp;amp;out_cls_info(&amp;quot;Here is the list of folders containing DVD/MPEG files (*.mpg, *.mpeg, *.vob, *.vro, etc.) in ${dvdripto_parentdir}\\. Select one or more by typing in the name or names separated by spaces. If you select more than one, the files will be joined in the order you specify.&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;${navy_on_gray}Note that joining different DVD/MPEG files is only recommended if they're of the same game.  The settings you choose later in the editing phase will be applied to the whole project which can cause problems since different games will possibly need different settings.&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	system($reset_color);&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	#following masks are all lowercase&lt;br /&gt;
	@dvdfilemasks = ( '*.v*', '*.mpg', '*.mpeg' );&lt;br /&gt;
	#FIXME os x still usually uses a case-insensitive filesystem&lt;br /&gt;
	if ($os ne 'windows') {&lt;br /&gt;
		#now add the uppercase equivalents for case-sensitive filesystems&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			push(@dvdfilemasks, uc($mask));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#i took out printing the dir even if no mpeg files are found in there because there's no point in showing it if the user can't do anything with it, also clarified that above in the messages to the user (nate)&lt;br /&gt;
	%gooddvddirs = ();&lt;br /&gt;
	opendir(DVDRIPTO, $dvdripto_parentdir);&lt;br /&gt;
	@dvddirs = readdir(DVDRIPTO);&lt;br /&gt;
	closedir(DVDRIPTO);&lt;br /&gt;
	foreach $dvddir (@dvddirs) {&lt;br /&gt;
		if ((-d &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;) and ($dvddir ne '.') and ($dvddir ne '..')) {&lt;br /&gt;
			opendir((DVDDIR), &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;);&lt;br /&gt;
			@dvddircontents = readdir(DVDDIR);&lt;br /&gt;
			closedir(DVDDIR);&lt;br /&gt;
			for (@dvddircontents) {&lt;br /&gt;
				foreach $themask (@dvdfilemasks) {&lt;br /&gt;
					if (m/\.${themask}$/) {&lt;br /&gt;
						$gooddvddirs{$dvddir} = &amp;quot;${dvdripto_parentdir}/${dvddir}&amp;quot;;&lt;br /&gt;
						last;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (!keys(%gooddvddirs)) {&lt;br /&gt;
		&amp;amp;out_error(&amp;quot;No folders with DVD files found!&amp;quot;);&lt;br /&gt;
		&amp;lt;STDIN&amp;gt;;&lt;br /&gt;
		exit 1;&lt;br /&gt;
	} else {&lt;br /&gt;
		while (($key, $value) = each(%gooddvddirs)) {&lt;br /&gt;
			&amp;amp;echo(&amp;quot;${key}\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@dvdchoices = ();&lt;br /&gt;
	print $prompt;&lt;br /&gt;
	while (&amp;lt;STDIN&amp;gt;) {&lt;br /&gt;
		chomp;&lt;br /&gt;
		#have to initialize @errormsgs here because we may be pushing to it later&lt;br /&gt;
		@errormsgs = ();&lt;br /&gt;
		#if (!m/^([0-9]+[ ]+[0-9]+)+$/) { #regex for if more than one input is required on a line&lt;br /&gt;
		if (m/^$/) {&lt;br /&gt;
			push(@errormsgs,&amp;quot;Invalid input.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			for (split(&amp;quot; &amp;quot;)) {&lt;br /&gt;
				if (defined($gooddvddirs{$_})) {&lt;br /&gt;
					push(@dvdchoices,$gooddvddirs{$_});&lt;br /&gt;
				} else {&lt;br /&gt;
					push(@errormsgs,&amp;quot;Invalid selection: ${_}&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			last if @dvdchoices &amp;gt; 0;&lt;br /&gt;
		}&lt;br /&gt;
		&amp;amp;out_error(@errormsgs);&lt;br /&gt;
		print $prompt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;amp;echo(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	&amp;amp;out_info(&amp;quot;Now indexing MPEG-2 ...&amp;quot;);&lt;br /&gt;
	#Start - AVS prep&lt;br /&gt;
	&amp;amp;rm(&amp;quot;${projname}.avs&amp;quot;) if -e &amp;quot;${projname}.avs&amp;quot;;&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;loadplugin(\&amp;quot;${dgmpgdec_dir}/DGDecode.dll\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${anri_dir}/sda.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;import(\&amp;quot;${desktop}/${projname}/plugins.avs\&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	# End - AVS prep&lt;br /&gt;
	&lt;br /&gt;
	$alignedsplice = '';&lt;br /&gt;
	foreach $dvdchoice (@dvdchoices) {&lt;br /&gt;
		foreach $mask (@dvdfilemasks) {&lt;br /&gt;
			$i = 1;&lt;br /&gt;
			foreach $mpegfile (glob(&amp;quot;${dvdchoice}/$mask&amp;quot;)) {&lt;br /&gt;
				#ignore bad files&lt;br /&gt;
				if (-s $mpegfile &amp;gt; 5000) {&lt;br /&gt;
					&amp;amp;echotofile($alignedsplice,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
					#split into basename and extension&lt;br /&gt;
					$mpegfile =~ /^.*[\\\/]([^\\\/.]+)\.([^.]+)$/;&lt;br /&gt;
					# Run current vob through dgindex. Set to demux all tracks. Place vid,aud,delay info into temporary avs file.&lt;br /&gt;
					#I01_001.vob&lt;br /&gt;
					#dvdtest_1_I01_001.d2v&lt;br /&gt;
					#dvdtest_1_I01_001.log&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OF=[${projname}_${i}_${1}] -PREVIEW -exit&amp;quot;);&lt;br /&gt;
					print &amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;;&lt;br /&gt;
					print &amp;quot;\n&amp;quot;;&lt;br /&gt;
					system(&amp;quot;\&amp;quot;${dgmpgdec_dir}/${dgindex}\&amp;quot; -IF=[${mpegfile}] -OM=2 -OF=[${projname}_${i}_${1}] -AT=[infotemplate.avs] -exit&amp;quot;);&lt;br /&gt;
					&amp;amp;mv(&amp;quot;${dvdchoice}/${1}.log&amp;quot;,&amp;quot;${desktop}/${projname}/${projname}_${i}_${1}.log&amp;quot;);&lt;br /&gt;
					#FIXME sorting problems if we have over 9 input files?&lt;br /&gt;
					for (glob(&amp;quot;${projname}_${i}_*&amp;quot;)) {&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;ac3source(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upconv=1),\&amp;quot;${_}\&amp;quot;).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.ac3$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,upConv=1),mpasource(\&amp;quot;${_}\&amp;quot;)).delayaudio(&amp;quot;.($2/1000).&amp;quot;)\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+) .+DELAY (-?[0-9]+)ms.*\.mp.*$/);&lt;br /&gt;
						&amp;amp;echotofile(&amp;quot;audiodub(MPEG2source(\&amp;quot;${1}.d2v\&amp;quot;,wavsource(\&amp;quot;${_}\&amp;quot;))\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;) if (m/^([^ ]+).*\.wav$/);&lt;br /&gt;
						if (defined($3)) {&lt;br /&gt;
							$maxaudiobr = ($3+1000) if $maxaudiobr lt ($3+1000);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					# If there's more than one file to be joined, they must be appended together.&lt;br /&gt;
					$alignedsplice = &amp;quot;\\++\\\n&amp;quot;;&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&amp;amp;echotofile(&amp;quot;\n&amp;quot;,&amp;quot;&amp;gt;&amp;gt;&amp;quot;,&amp;quot;${projname}.avs&amp;quot;);&lt;br /&gt;
	&amp;amp;cp(&amp;quot;${projname}.avs&amp;quot;,&amp;quot;${projname}.bak&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#system(&amp;quot;\&amp;quot;${anri_dir}/${mplayer}\&amp;quot; dvd://${1} -dvd-device ${dvdsource} -dumpstream -dumpfile ${dvdripto}/I${2}_${expandpgc}.vob&amp;quot;);&lt;br /&gt;
############################################################################&lt;br /&gt;
#                               Encoding&lt;br /&gt;
#&lt;br /&gt;
# Encode video in OS-specific ways.&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, output audio bitrate in baud, x264 minimum quantizer, delete tempfiles boolean&lt;br /&gt;
sub onepass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --qp ${_[3]} --ref 8 --mixed-refs --no-fast-pskip --bframes 5 --b-rdo --bime --weightb --nf --direct auto --subme 7 --analyse p8x8,b8x8,i4x4,p4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; \&amp;quot;${_[0]}\&amp;quot; /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[2]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[4]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub twopass {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --bframes 3 --analyse none --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 4.1 --ref 3 --mixed-refs --no-fast-pskip --bframes 3 --b-rdo --bime --weightb --direct auto --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --qpmin ${_[4]} --vbv-bufsize 9000 --vbv-maxrate 25000 --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, x264 minimum quantizer, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub ipod {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 1 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --analyse none --qpmin ${_[4]} --threads auto --thread-input --progress --no-psnr --no-ssim --output NUL ${_[0]}&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${x264}\&amp;quot; --pass 2 --bitrate ${_[2]} --vbv-bufsize 512 --vbv-maxrate 768 --stats \&amp;quot;${_[1]}.stats\&amp;quot; --level 1.3 --no-cabac --no-fast-pskip --subme 7 --trellis 2 --analyse all --qpmin ${_[4]} --me umh --threads auto --thread-input --progress --no-psnr --output \&amp;quot;${_[1]}_video.mp4\&amp;quot; \&amp;quot;${_[0]}\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${vdub_dir}/${vdubcli}\&amp;quot; ${_[0]} /i \&amp;quot;${anri_dir}/audioout.vcf\&amp;quot; \&amp;quot;${_[1]}_temp.wav\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${naac}\&amp;quot; -br ${_[3]} -lc -if \&amp;quot;${_[1]}_temp.wav\&amp;quot; -of \&amp;quot;${_[1]}_audio.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${mp4box}\&amp;quot; -tmp . -new -add \&amp;quot;${_[1]}_video.mp4\&amp;quot; -add \&amp;quot;${_[1]}_audio.mp4\&amp;quot; \&amp;quot;${_[1]}.mp4\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}_video.mp4&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_temp.wav&amp;quot;,&lt;br /&gt;
			&amp;quot;${_[1]}_audio.mp4&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#input filename, output basename, video output bitrate in kbaud, output audio bitrate in baud, empty, delete 2pass statsfile boolean, delete all other tempfiles boolean&lt;br /&gt;
sub xvid {&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass1 \&amp;quot;${_[1]}.stats\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${xvid}\&amp;quot; -i \&amp;quot;${_[0]}\&amp;quot; -bitrate ${_[2]} -pass2 \&amp;quot;${_[1]}.stats\&amp;quot; -avi \&amp;quot;${_[1]}v.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	system(&amp;quot;\&amp;quot;${anri_dir}/${ffmpeg}\&amp;quot; -b &amp;quot;.($_[3]/1000).&amp;quot; -ac 2 -acodec mp3 -y -i \&amp;quot;${_[1]}v.avi\&amp;quot; -vcodec copy -i \&amp;quot;${_[0]}\&amp;quot; \&amp;quot;${_[1]}.avi\&amp;quot;&amp;quot;);&lt;br /&gt;
	if (${_[5]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}.stats&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
	if (${_[6]}) {&lt;br /&gt;
		@todel = (&lt;br /&gt;
			&amp;quot;${_[1]}v.avi&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
		&amp;amp;rm(@todel);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SelbyMD</name></author>	</entry>

	</feed>