Difference between revisions of "Anri-chan/Source/sasami.pl"

From SDA Knowledge Base

Jump to: navigation, search
(beginning of statid)
(multiple trims mostly done with some caveats, statid totally done except for special cropping (gba etc))
Line 20: Line 20:
 
$gb_crop_bottom = 48;
 
$gb_crop_bottom = 48;
  
sub sasami {
+
sub pipe_prepare($) {
 +
$basename = shift;
 +
$avs = "${basename}.pipe";
 +
system("rm ${avs}") if -e $avs;
 +
system("mkfifo ${avs}");
 
open(AVS, "${basename}.avs"); #must be unix text when running sasami under unix ...
 
open(AVS, "${basename}.avs"); #must be unix text when running sasami under unix ...
 
@avs = <AVS>;
 
@avs = <AVS>;
 
close(AVS);
 
close(AVS);
 
@sources = ();
 
@sources = ();
 +
@trims = ();
 
for (@avs) {
 
for (@avs) {
 
chomp;
 
chomp;
Line 39: Line 44:
 
$onepixel = 1 if m/^nate_1_pixel_bob_fix/;
 
$onepixel = 1 if m/^nate_1_pixel_bob_fix/;
 
$nes = 1 if m/^nate_nes$/;
 
$nes = 1 if m/^nate_nes$/;
if (m/trim\(([0-9]+),([0-9]+)\)/) {
+
push(@trims,"$1,$2") if m/trim\(([0-9]+),([0-9]+)\)/;
$trimone=$1;
+
$trimtwo=$2;
+
}
+
 
$gba = 1 if m/^nate_gba$/;
 
$gba = 1 if m/^nate_gba$/;
 
$gb = 1 if m/^nate_gb$/;
 
$gb = 1 if m/^nate_gb$/;
Line 50: Line 52:
 
$statidlines[2] = $1 if m/^statid3="""(.*)"""$/;
 
$statidlines[2] = $1 if m/^statid3="""(.*)"""$/;
 
}
 
}
 
 
die 'sasami: no sources detected in .avs!' if @sources == 0;
 
die 'sasami: no sources detected in .avs!' if @sources == 0;
#get vital info about first source
+
$mplayeridentify = <<SABRAC;
+
@mencoderargslist = ();
mplayer -identify -vo null -slave ${sources[0]} 2>&1 <<ENDOFSCRIPT
+
$previous_sourcelength = 0;
 +
foreach $source (@sources) {
 +
#get vital info about source
 +
my $sourcelength = 0;
 +
$mplayeridentify = <<SABRAC;
 +
mplayer -identify -vo null -slave ${source} 2>&1 <<ENDOFSCRIPT
 
quit
 
quit
 
ENDOFSCRIPT
 
ENDOFSCRIPT
 
SABRAC
 
SABRAC
for (qx($mplayeridentify)) {
+
for (qx($mplayeridentify)) {
chomp;
+
chomp;
$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;
+
$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;
$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;
+
$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;
$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;
+
$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;
$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;
+
$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;
}
+
$sourcelength += ($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;
# print "$width\n";
+
}
# print "$height\n";
+
# print "$width\n";
# print "$framerate\n";
+
# print "$height\n";
# print "$maxaudiobitrate\n";
+
# print "$framerate\n";
$pal = ($height eq "576");
+
# print "$maxaudiobitrate\n";
 +
$pal = ($height eq "576");
 +
 +
#build mencoder command to feed fifo
 +
$mencoderargs = "./mencoder";
 +
 +
#trimming
 +
# $framerate = 29.97;
 +
# $framerate = 25 if $pal;
 
 
#build mencoder command to feed fifo
+
### FIXME do trim(0,0)
$mencoderargs = "./mencoder";
+
### FIXME do multiple trims per source - add to list?
 +
my $source_intermediate = 1;
 +
for (@trims) {
 +
m/^(.*),(.*)$/;
 +
 +
if ($1 || $2) {
 +
$source_intermediate = 0; #for killing trailing unused sources; there are still trim points so don't need to worry about that this time
 +
}
 +
 +
if ($1) {
 +
$source_intermediate = 1; #this source might have been trimmed out - see if ($2) block below for more
 +
if ($1 < $sourcelength) {
 +
$mencoderargs .= " -ss ".abs(($previous_sourcelength - ($1 / $framerate)));
 +
$_ = ",$2"; #wipe this trim point out so we don't accidentally use it twice
 +
$source_intermediate = 0; #this source was not trimmed out
 +
}
 +
}
 +
 +
if ($2) {
 +
if (!($1)) {
 +
$source_intermediate = 1; #this source was trimmed out
 +
}
 +
if ($2 < $sourcelength) {
 +
$mencoderargs .= " -endpos ".abs(($previous_sourcelength - ($2 / $framerate)));
 +
$_ = ","; #wipe this trim point out so we don't accidentally use it twice
 +
$source_intermediate = 0; #this source was not trimmed out
 +
}
 +
}
 +
 +
}
 +
next if $source_intermediate;
 +
 +
#one pixel bob
 +
if ($onepixel) {
 +
$mencoderargs .= " -vf-add crop=${width}:".($height-1).":0:0,expand=${width}:${height}:0:1";
 +
$fieldorder = 0 if $fieldorder == 1;
 +
$fieldorder = 1 if $fieldorder == 0;
 +
}
 +
 +
#nes
 +
$mencoderargs .= " -vf-add crop=".($width-8).":${height}:8:0,expand=${width}:${height}:8:0" if $nes;
 +
#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi
 +
#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.
 +
 +
$mencoderargs .= " -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}" if $d == 1;
 +
$tfields = 0;
 +
$tfields = 4 if $deflicker;
 +
$mencoderargs .= " -vf-add tfields=${tfields}" if $d == 4;
 +
 +
#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters
 +
$mencoderargs .= " -vf-add unsharp=l3x3:0.6:c3x3:0.6" if $deflicker;
 
 
#trimming
+
$mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs;
# $framerate = 29.97;
+
# $framerate = 25 if $pal;
+
if ($gba) {
$mencoderargs .= " -ss ".($trimone * $framerate) if $trimone;
+
$mencoderargs .= " -vf-add scale=320:240";
$mencoderargs .= " -endpos ".($trimtwo * $framerate) if $trimtwo;
+
$mencoderargs .= " -vf-add crop=".(320-$gba_crop_right-$gba_crop_left).":".(240-$gba_crop_bottom-$gba_crop_top).":${gba_crop_left}:${gba_crop_top}";
 +
$mencoderargs .= " -vf-add scale=240:160";
 +
$newwidth = 240;
 +
$newheight = 160;
 +
} elsif ($gb) {
 +
$mencoderargs .= " -vf-add scale=320:240";
 +
$mencoderargs .= " -vf-add crop=".(320-$gb_crop_right-$gb_crop_left).":".(240-$gb_crop_bottom-$gb_crop_top).":${gb_crop_left}:${gb_crop_top}";
 +
$newwidth = (320-$gb_crop_right-$gb_crop_left);
 +
$newheight = (240-$gb_crop_bottom-$gb_crop_top);
 +
}
 
 
#one pixel bob
+
$newframerate = ($pal ? (50/$f) : (59.94/$f));
if ($onepixel) {
+
$x264newframerate = "--fps ${newframerate}";
$mencoderargs .= " -vf-add crop=${width}:".($height-1).":0:0,expand=${width}:${height}:0:1";
+
$mp4boxnewframerate = "-fps ${newframerate}";
$fieldorder = 0 if $fieldorder == 1;
+
$mencoderargs .= " -vf-add framestep=${f}";
$fieldorder = 1 if $fieldorder == 0;
+
 +
$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;
 +
$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;
 +
$mencoderargs .= " -vf-add scale=${newwidth}:${newheight}" if $resize;
 +
 +
$mencoderargs .= " -vf-add format=i420 -ovc raw -of rawvideo -nosound";
 +
 +
$mencoderargs .= " ${source}";
 +
$mencoderargs .= " -o ${avs}";
 +
 +
push(@mencoderargslist,$mencoderargs);
 +
$previous_sourcelength = $sourcelength;
 
}
 
}
 
 
#nes
+
if (defined $statidlines[0]) {
$mencoderargs .= " -vf-add crop=".($width-8).":${height}:8:0,expand=${width}:${height}:8:0" if $nes;
+
#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi
+
#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.
+
+
$mencoderargs .= " -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}" if $d == 1;
+
$tfields = 0;
+
$tfields = 4 if $deflicker;
+
$mencoderargs .= " -vf-add tfields=${tfields}" if $d == 4;
+
+
#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters
+
$mencoderargs .= " -vf-add unsharp=l3x3:0.6:c3x3:0.6" if $deflicker;
+
 
+
$mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs;
+
+
if ($gba) {
+
$mencoderargs .= " -vf-add scale=320:240";
+
$mencoderargs .= " -vf-add crop=".(320-$gba_crop_right-$gba_crop_left).":".(240-$gba_crop_bottom-$gba_crop_top).":${gba_crop_left}:${gba_crop_top}";
+
$mencoderargs .= " -vf-add scale=240:160";
+
$newwidth = 240;
+
$newheight = 160;
+
} elsif ($gb) {
+
$mencoderargs .= " -vf-add scale=320:240";
+
$mencoderargs .= " -vf-add crop=".(320-$gb_crop_right-$gb_crop_left).":".(240-$gb_crop_bottom-$gb_crop_top).":${gb_crop_left}:${gb_crop_top}";
+
$newwidth = (320-$gb_crop_right-$gb_crop_left);
+
$newheight = (240-$gb_crop_bottom-$gb_crop_top);
+
}
+
 
+
$newframerate = ($pal ? (50/$f) : (59.94/$f));
+
$x264newframerate = "--fps ${newframerate}";
+
$mp4boxnewframerate = "-fps ${newframerate}";
+
$mencoderargs .= " -vf-add framestep=${f}";
+
+
$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;
+
$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;
+
$mencoderargs .= " -vf-add scale=${newwidth}:${newheight}" if $resize;
+
+
$mencoderargs .= " -vf-add format=i420 -ovc raw -of rawvideo -nosound";
+
+
$mencoderargs .= " ".join(" ",@sources);
+
$mencoderargs .= " -o ${avs}";
+
+
if ($statidlines[0]) {
+
 
use Imager;
 
use Imager;
 
$img = Imager->new;
 
$img = Imager->new;
 
$img->read(file=>"ntsc_d1.tga") or die "Cannot load statid image: ", $img->errstr;
 
$img->read(file=>"ntsc_d1.tga") or die "Cannot load statid image: ", $img->errstr;
$font = Imager::Font->new(file=>"/Library/Fonts/Verdana.ttf");
+
$font = Imager::Font->new(file=>"/Library/Fonts/Verdana.ttf"); #will need to be changed for non-mac unix ...
&statid_lines_write($statidlines[0], $img->getheight/2, 36, 'white'  ) if $statidlines[0];
+
&statid_lines_write($statidlines[0], $img->getheight/2, 36, 'white'  ) if defined $statidlines[0];
&statid_lines_write($statidlines[1], 360,              36, 'white'  ) if $statidlines[1];
+
&statid_lines_write($statidlines[1], 360,              36, 'white'  ) if defined $statidlines[1];
&statid_lines_write($statidlines[2], 400,              36, 'white'  ) if $statidlines[2];
+
&statid_lines_write($statidlines[2], 400,              36, 'white'  ) if defined $statidlines[2];
&statid_lines_write("Audio commentary on track 2", 460, 28, '#E1CE8B') if $audio_commentary;
+
&statid_lines_write("Audio commentary on track 2", 460, 28, '#E1CE8B') if defined $audio_commentary;
 
$img->write(file=>'statid.tga')
 
$img->write(file=>'statid.tga')
 
or die 'Cannot save statid.tga: ', $img->errstr;
 
or die 'Cannot save statid.tga: ', $img->errstr;
 +
open(MF,">statid.txt") or die "Could not open statid.txt for appending!";
 +
for (1..5) { #once for each second of the statid
 +
for (1..$newframerate) { #once for each frame this second
 +
print MF "statid.tga\n";
 +
}
 +
}
 +
close(MF);
 +
$statidmencoderargs = "./mencoder -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 ${avs}";
 
}
 
}
 
}
 
}
  
$basename = 'pokemon';
+
sub pipe_write {
$avs = "${basename}.pipe";
+
open(FIFO,">${avs}");
#for(my $N = 1; $N le 2 ; $N++) {
+
print("$statidmencoderargs\n") if defined $statidlines[0];
system("rm ${avs}");
+
system($statidmencoderargs) if defined $statidlines[0];
system("mkfifo ${avs}");
+
for (@mencoderargslist) {
# this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile
+
print("$_\n");
if ($N eq 2) {
+
system($_);
 +
}
 +
print("$statidmencoderargs\n") if defined $statidlines[0];
 +
system($statidmencoderargs) if defined $statidlines[0];
 +
close(FIFO);
 +
}
 +
 
 +
 
 +
$basename='pokemon'; #remove in anri
 +
for(my $N = 1; $N <= 2 ; $N++) {
 +
&pipe_prepare($basename);# if $os eq 'unix'; #replace with $_[4] or whatever
 +
if ($N == 2) {
 +
# 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!
 
while (!(-e "${basename}.stats")) {
 
while (!(-e "${basename}.stats")) {
 
print("Waiting for stats file ...\n");
 
print("Waiting for stats file ...\n");
Line 155: Line 217:
 
}
 
}
 
}
 
}
&sasami;# if $os eq 'unix';
+
$x264command = "./x264 --pass ${N} --stats ${basename}.stats --bitrate 5000 --qpmin 0 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &";
print("$mencoderargs\n");
+
# $x264command = "./x264 --pass $N --stats ${basename}.stats --bitrate 5000 --qpmin 19 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &";
+
$x264command = "./x264 --bitrate 5000 --qpmin 0 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &";
+
 
print("$x264command\n");
 
print("$x264command\n");
 
system($x264command);
 
system($x264command);
system($mencoderargs);# if $os eq 'unix';
+
&pipe_write;
#rm -f "$avs"
+
}
#}
+
 
$mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4";
 
$mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4";
 
print ("$mp4boxcommand\n");
 
print ("$mp4boxcommand\n");

Revision as of 17:24, 15 October 2008

#!/usr/bin/perl
#nathan jahnke <njahnke@gmail.com>

use warnings;
use strict 'subs';
package sasami;

#system("export DYLD_LIBRARY_PATH=/Volumes/l/anrix");

#to move to anri config file later
$gba_crop_left = 43;
$gba_crop_top = 39;
$gba_crop_right = 44;
$gba_crop_bottom = 41;

$gb_crop_left = 80;
$gb_crop_top = 48;
$gb_crop_right = 80;
$gb_crop_bottom = 48;

sub pipe_prepare($) {
	$basename = shift;
	$avs = "${basename}.pipe";
	system("rm ${avs}") if -e $avs;
	system("mkfifo ${avs}");
	open(AVS, "${basename}.avs"); #must be unix text when running sasami under unix ...
	@avs = <AVS>;
	close(AVS);
	@sources = ();
	@trims = ();
	for (@avs) {
		chomp;
		push(@sources,"${1}.VOB") if m/^.*MPEG2source\("(.+)\.d2v".*$/;
		push(@sources,$1) if m/^.*avisource\("([^"]+)".*$/;
		push(@sources,$1) if m/^.*directshowsource\("([^"]+)".*$/;
		$fieldorder = 1 if m/^AssumeTFF\(\)/;
		$fieldorder = 0 if m/^AssumeBFF\(\)/;
		$d = 1 if m/^global d1 = true/;
		$d = 4 if m/^global d1 = false/;
		$f = $1 if m/^changefps\(f1\/([0-9])\)/;
		$deflicker = 1 if m/^nate_retard_bob_2/;
		$vhs = 1 if m/^nate_vhs_head_change_erase/;
		$onepixel = 1 if m/^nate_1_pixel_bob_fix/;
		$nes = 1 if m/^nate_nes$/;
		push(@trims,"$1,$2") if m/trim\(([0-9]+),([0-9]+)\)/;
		$gba = 1 if m/^nate_gba$/;
		$gb = 1 if m/^nate_gb$/;
		$resize = 1 if m/^lanczos4resize\(d1,last\.height\)/;
		$statidlines[0] = $1 if m/^statid1="""(.*)"""$/;
		$statidlines[1] = $1 if m/^statid2="""(.*)"""$/;
		$statidlines[2] = $1 if m/^statid3="""(.*)"""$/;
	}
	die 'sasami: no sources detected in .avs!' if @sources == 0;
	
	@mencoderargslist = ();
	$previous_sourcelength = 0;
	foreach $source (@sources) {
		#get vital info about source
		my $sourcelength = 0;
		$mplayeridentify = <<SABRAC;
mplayer -identify -vo null -slave ${source} 2>&1 <<ENDOFSCRIPT
quit
ENDOFSCRIPT
SABRAC
		for (qx($mplayeridentify)) {
			chomp;
			$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;
			$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;
			$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;
			$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;
			$sourcelength += ($framerate * $_) if s/ID_LENGTH=([0-9.]+)/$1/;
		}
	# 	print "$width\n";
	# 	print "$height\n";
	# 	print "$framerate\n";
	# 	print "$maxaudiobitrate\n";
		$pal = ($height eq "576");
		
		#build mencoder command to feed fifo
		$mencoderargs = "./mencoder";
		
		#trimming
	# 	$framerate = 29.97;
	# 	$framerate = 25 if $pal;
	
		### FIXME do trim(0,0)
		### FIXME do multiple trims per source - add to list?
		my $source_intermediate = 1;
		for (@trims) {
			m/^(.*),(.*)$/;
			
			if ($1 || $2) {
				$source_intermediate = 0; #for killing trailing unused sources; there are still trim points so don't need to worry about that this time
			}
			
			if ($1) {
				$source_intermediate = 1; #this source might have been trimmed out - see if ($2) block below for more
				if ($1 < $sourcelength) {
					$mencoderargs .= " -ss ".abs(($previous_sourcelength - ($1 / $framerate)));
					$_ = ",$2"; #wipe this trim point out so we don't accidentally use it twice
					$source_intermediate = 0; #this source was not trimmed out
				}
			}
			
			if ($2) {
				if (!($1)) {
					$source_intermediate = 1; #this source was trimmed out
				}
				if ($2 < $sourcelength) {
					$mencoderargs .= " -endpos ".abs(($previous_sourcelength - ($2 / $framerate)));
					$_ = ","; #wipe this trim point out so we don't accidentally use it twice
					$source_intermediate = 0; #this source was not trimmed out
				}
			}
			
		}
		next if $source_intermediate;
		
		#one pixel bob
		if ($onepixel) {
			$mencoderargs .= " -vf-add crop=${width}:".($height-1).":0:0,expand=${width}:${height}:0:1";
			$fieldorder = 0 if $fieldorder == 1;
			$fieldorder = 1 if $fieldorder == 0;
		}
		
		#nes
		$mencoderargs .= " -vf-add crop=".($width-8).":${height}:8:0,expand=${width}:${height}:8:0" if $nes;
		#-af channels=6:4:0:0:0:1:0:2:0:3 media.avi
		#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.
		
		$mencoderargs .= " -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}" if $d == 1;
		$tfields = 0;
		$tfields = 4 if $deflicker;
		$mencoderargs .= " -vf-add tfields=${tfields}" if $d == 4;
		
		#i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters
		$mencoderargs .= " -vf-add unsharp=l3x3:0.6:c3x3:0.6" if $deflicker;
	
		$mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs;
		
		if ($gba) {
			$mencoderargs .= " -vf-add scale=320:240";
			$mencoderargs .= " -vf-add crop=".(320-$gba_crop_right-$gba_crop_left).":".(240-$gba_crop_bottom-$gba_crop_top).":${gba_crop_left}:${gba_crop_top}";
			$mencoderargs .= " -vf-add scale=240:160";
			$newwidth = 240;
			$newheight = 160;
		} elsif ($gb) {
			$mencoderargs .= " -vf-add scale=320:240";
			$mencoderargs .= " -vf-add crop=".(320-$gb_crop_right-$gb_crop_left).":".(240-$gb_crop_bottom-$gb_crop_top).":${gb_crop_left}:${gb_crop_top}";
			$newwidth = (320-$gb_crop_right-$gb_crop_left);
			$newheight = (240-$gb_crop_bottom-$gb_crop_top);
		}
	
		$newframerate = ($pal ? (50/$f) : (59.94/$f));
		$x264newframerate = "--fps ${newframerate}";
		$mp4boxnewframerate = "-fps ${newframerate}";
		$mencoderargs .= " -vf-add framestep=${f}";
		
		$newwidth  = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320)) unless $newwidth;
		$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight;
		$mencoderargs .= " -vf-add scale=${newwidth}:${newheight}" if $resize;
		
		$mencoderargs .= " -vf-add format=i420 -ovc raw -of rawvideo -nosound";
		
		$mencoderargs .= " ${source}";
		$mencoderargs .= " -o ${avs}";
		
		push(@mencoderargslist,$mencoderargs);
		$previous_sourcelength = $sourcelength;
	}
	
	if (defined $statidlines[0]) {
		use Imager;
		$img = Imager->new;
		$img->read(file=>"ntsc_d1.tga") or die "Cannot load statid image: ", $img->errstr;
		$font = Imager::Font->new(file=>"/Library/Fonts/Verdana.ttf"); #will need to be changed for non-mac unix ...
		&statid_lines_write($statidlines[0], $img->getheight/2, 36, 'white'  ) if defined $statidlines[0];
		&statid_lines_write($statidlines[1], 360,               36, 'white'  ) if defined $statidlines[1];
		&statid_lines_write($statidlines[2], 400,               36, 'white'  ) if defined $statidlines[2];
		&statid_lines_write("Audio commentary on track 2", 460, 28, '#E1CE8B') if defined $audio_commentary;
		$img->write(file=>'statid.tga')
		or die 'Cannot save statid.tga: ', $img->errstr;
		open(MF,">statid.txt") or die "Could not open statid.txt for appending!";
		for (1..5) { #once for each second of the statid
			for (1..$newframerate) { #once for each frame this second
				print MF "statid.tga\n";
			}
		}
		close(MF);
		$statidmencoderargs = "./mencoder -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 ${avs}";
	}
}

sub pipe_write {
	open(FIFO,">${avs}");
	print("$statidmencoderargs\n") if defined $statidlines[0];
	system($statidmencoderargs) if defined $statidlines[0];
	for (@mencoderargslist) {
		print("$_\n");
		system($_);
	}
	print("$statidmencoderargs\n") if defined $statidlines[0];
	system($statidmencoderargs) if defined $statidlines[0];
	close(FIFO);
}


$basename='pokemon'; #remove in anri
for(my $N = 1; $N <= 2 ; $N++) {
	&pipe_prepare($basename);# if $os eq 'unix'; #replace with $_[4] or whatever
	if ($N == 2) {
		# 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!
		while (!(-e "${basename}.stats")) {
			print("Waiting for stats file ...\n");
			sleep(1);
		}
	}
	$x264command = "./x264 --pass ${N} --stats ${basename}.stats --bitrate 5000 --qpmin 0 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &";
	print("$x264command\n");
	system($x264command);
	&pipe_write;
}
$mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4";
print ("$mp4boxcommand\n");
system($mp4boxcommand);

exit 0;


#statid line text, y-offset, text size, color
sub statid_lines_write {
$font->align(string => $_[0],
	aa => 1,
	size => $_[2],
	color => $_[3],
	x => $img->getwidth/2,
	y => $_[1],
	halign => 'center',
	valign => 'center',
	image => $img);
}
Personal tools